[
  {
    "path": "ClassLibrary4.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <AssemblyName>YunBot</AssemblyName>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj\" />\n    <ProjectReference Include=\"G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "ClassLibrary4.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.33927.289\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibrary4\", \"ClassLibrary4.csproj\", \"{D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"TSLib\", \"G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\TSLib.csproj\", \"{66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"TS3AudioBot\", \"G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\TS3AudioBot.csproj\", \"{FFC15959-0725-4B2B-BF06-BFE8403C60A6}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D3D9037A-AD7B-4C9E-9FC0-CA330D8776BD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{66AF7F2B-43B7-41E0-982A-FCD7DA062BAA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FFC15959-0725-4B2B-BF06-BFE8403C60A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FFC15959-0725-4B2B-BF06-BFE8403C60A6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FFC15959-0725-4B2B-BF06-BFE8403C60A6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FFC15959-0725-4B2B-BF06-BFE8403C60A6}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {86AB0697-D2EC-474E-8C8F-67F25BEDB10E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "LICENSE",
    "content": "Open Software License (\"OSL\") v 3.0\n\nThis Open Software License (the \"License\") applies to any original work of\nauthorship (the \"Original Work\") whose owner (the \"Licensor\") has placed the\nfollowing licensing notice adjacent to the copyright notice for the Original\nWork:\n\nLicensed under the Open Software License version 3.0\n\n1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free,\nnon-exclusive, sublicensable license, for the duration of the copyright, to do\nthe following:\n\n  a) to reproduce the Original Work in copies, either alone or as part of a\n  collective work;\n\n  b) to translate, adapt, alter, transform, modify, or arrange the Original\n  Work, thereby creating derivative works (\"Derivative Works\") based upon the\n  Original Work;\n\n  c) to distribute or communicate copies of the Original Work and Derivative\n  Works to the public, with the proviso that copies of Original Work or\n  Derivative Works that You distribute or communicate shall be licensed under\n  this Open Software License;\n\n  d) to perform the Original Work publicly; and\n\n  e) to display the Original Work publicly.\n\n2) Grant of Patent License. Licensor grants You a worldwide, royalty-free,\nnon-exclusive, sublicensable license, under patent claims owned or controlled\nby the Licensor that are embodied in the Original Work as furnished by the\nLicensor, for the duration of the patents, to make, use, sell, offer for sale,\nhave made, and import the Original Work and Derivative Works.\n\n3) Grant of Source Code License. The term \"Source Code\" means the preferred\nform of the Original Work for making modifications to it and all available\ndocumentation describing how to modify the Original Work. Licensor agrees to\nprovide a machine-readable copy of the Source Code of the Original Work along\nwith each copy of the Original Work that Licensor distributes. Licensor\nreserves the right to satisfy this obligation by placing a machine-readable\ncopy of the Source Code in an information repository reasonably calculated to\npermit inexpensive and convenient access by You for as long as Licensor\ncontinues to distribute the Original Work.\n\n4) Exclusions From License Grant. Neither the names of Licensor, nor the names\nof any contributors to the Original Work, nor any of their trademarks or\nservice marks, may be used to endorse or promote products derived from this\nOriginal Work without express prior permission of the Licensor. Except as\nexpressly stated herein, nothing in this License grants any license to\nLicensor's trademarks, copyrights, patents, trade secrets or any other\nintellectual property. No patent license is granted to make, use, sell, offer\nfor sale, have made, or import embodiments of any patent claims other than the\nlicensed claims defined in Section 2. No license is granted to the trademarks\nof Licensor even if such marks are included in the Original Work. Nothing in\nthis License shall be interpreted to prohibit Licensor from licensing under\nterms different from this License any Original Work that Licensor otherwise\nwould have a right to license.\n\n5) External Deployment. The term \"External Deployment\" means the use,\ndistribution, or communication of the Original Work or Derivative Works in any\nway such that the Original Work or Derivative Works may be used by anyone\nother than You, whether those works are distributed or communicated to those\npersons or made available as an application intended for use over a network.\nAs an express condition for the grants of license hereunder, You must treat\nany External Deployment by You of the Original Work or a Derivative Work as a\ndistribution under section 1(c).\n\n6) Attribution Rights. You must retain, in the Source Code of any Derivative\nWorks that You create, all copyright, patent, or trademark notices from the\nSource Code of the Original Work, as well as any notices of licensing and any\ndescriptive text identified therein as an \"Attribution Notice.\" You must cause\nthe Source Code for any Derivative Works that You create to carry a prominent\nAttribution Notice reasonably calculated to inform recipients that You have\nmodified the Original Work.\n\n7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that\nthe copyright in and to the Original Work and the patent rights granted herein\nby Licensor are owned by the Licensor or are sublicensed to You under the\nterms of this License with the permission of the contributor(s) of those\ncopyrights and patent rights. Except as expressly stated in the immediately\npreceding sentence, the Original Work is provided under this License on an \"AS\nIS\" BASIS and WITHOUT WARRANTY, either express or implied, including, without\nlimitation, the warranties of non-infringement, merchantability or fitness for\na particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK\nIS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this\nLicense. No license to the Original Work is granted by this License except\nunder this disclaimer.\n\n8) Limitation of Liability. Under no circumstances and under no legal theory,\nwhether in tort (including negligence), contract, or otherwise, shall the\nLicensor be liable to anyone for any indirect, special, incidental, or\nconsequential damages of any character arising as a result of this License or\nthe use of the Original Work including, without limitation, damages for loss\nof goodwill, work stoppage, computer failure or malfunction, or any and all\nother commercial damages or losses. This limitation of liability shall not\napply to the extent applicable law prohibits such limitation.\n\n9) Acceptance and Termination. If, at any time, You expressly assented to this\nLicense, that assent indicates your clear and irrevocable acceptance of this\nLicense and all of its terms and conditions. If You distribute or communicate\ncopies of the Original Work or a Derivative Work, You must make a reasonable\neffort under the circumstances to obtain the express assent of recipients to\nthe terms of this License. This License conditions your rights to undertake\nthe activities listed in Section 1, including your right to create Derivative\nWorks based upon the Original Work, and doing so without honoring these terms\nand conditions is prohibited by copyright law and international treaty.\nNothing in this License is intended to affect copyright exceptions and\nlimitations (including \"fair use\" or \"fair dealing\"). This License shall\nterminate immediately and You may no longer exercise any of the rights granted\nto You by this License upon your failure to honor the conditions in Section\n1(c).\n\n10) Termination for Patent Action. This License shall terminate automatically\nand You may no longer exercise any of the rights granted to You by this\nLicense as of the date You commence an action, including a cross-claim or\ncounterclaim, against Licensor or any licensee alleging that the Original Work\ninfringes a patent. This termination provision shall not apply for an action\nalleging patent infringement by combinations of the Original Work with other\nsoftware or hardware.\n\n11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this\nLicense may be brought only in the courts of a jurisdiction wherein the\nLicensor resides or in which Licensor conducts its primary business, and under\nthe laws of that jurisdiction excluding its conflict-of-law provisions. The\napplication of the United Nations Convention on Contracts for the\nInternational Sale of Goods is expressly excluded. Any use of the Original\nWork outside the scope of this License or after its termination shall be\nsubject to the requirements and penalties of copyright or patent law in the\nappropriate jurisdiction. This section shall survive the termination of this\nLicense.\n\n12) Attorneys' Fees. In any action to enforce the terms of this License or\nseeking damages relating thereto, the prevailing party shall be entitled to\nrecover its costs and expenses, including, without limitation, reasonable\nattorneys' fees and costs incurred in connection with such action, including\nany appeal of such action. This section shall survive the termination of this\nLicense.\n\n13) Miscellaneous. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent necessary\nto make it enforceable.\n\n14) Definition of \"You\" in This License. \"You\" throughout this License,\nwhether in upper or lower case, means an individual or a legal entity\nexercising rights under, and complying with all of the terms of, this License.\nFor legal entities, \"You\" includes any entity that controls, is controlled by,\nor is under common control with you. For purposes of this definition,\n\"control\" means (i) the power, direct or indirect, to cause the direction or\nmanagement of such entity, whether by contract or otherwise, or (ii) ownership\nof fifty percent (50%) or more of the outstanding shares, or (iii) beneficial\nownership of such entity.\n\n15) Right to Use. You may use the Original Work in all ways not otherwise\nrestricted or conditioned by this License or by law, and Licensor promises not\nto interfere with or be responsible for such uses by You.\n\n16) Modification of This License. This License is Copyright © 2005 Lawrence\nRosen. Permission is granted to copy, distribute, or communicate this License\nwithout modification. Nothing in this License permits You to modify this\nLicense as applied to the Original Work or to Derivative Works. However, You\nmay modify the text of this License and copy, distribute or communicate your\nmodified version (the \"Modified License\") and apply it to other original works\nof authorship subject to the following conditions: (i) You may not indicate in\nany way that your Modified License is the \"Open Software License\" or \"OSL\" and\nyou may not use those names in the name of your Modified License; (ii) You\nmust replace the notice specified in the first paragraph above with the notice\n\"Licensed under <insert your license name here>\" or with a notice of your own\nthat is not confusingly similar to the notice in this License; and (iii) You\nmay not claim that your original works are open source software unless your\nModified License has been approved by Open Source Initiative (OSI) and You\ncomply with its license review and certification process.\n"
  },
  {
    "path": "README.md",
    "content": "# ⚠️ 本项目已停止更新和维护\n\n**请使用最新的项目：[teamspeak-music-bot](https://github.com/ZHANGTIANYAO1/teamspeak-music-bot)**\n\n本仓库将不再进行任何更新或维护，建议所有用户迁移到新项目。\n\n---\n\n# TS3AudioBot-NetEaseCloudmusic-plugin  \n>此插件基于Splamy/TS3AudioBot项目 https://github.com/Splamy/TS3AudioBot   \n>以及网易云音乐 API开发 [https://gitlab.com/Binaryify/neteasecloudmusicapi  ](https://www.npmjs.com/package/NeteaseCloudMusicApi)\n此插件安装方法同样见TS3AudioBot项目wiki  \n**2.0版本之后可以不需要本地部署网易云API了，但是强烈建议自行部署防止隐私泄露  **  \n**最好给音乐机器人超管权限保证能正常更新头像和描述**\n\n这是一个用C#给TS3AudioBot编写网易云插件,让你的TS可以有一个音乐机器人。如果觉得好的话，还请给个星星支持一下\n\n## 关于API和机器人部署\n目前网易云可能有什么改动,导致如果使用部署在海外的API将无法播放部分VIP歌曲,已经在ISSUE中添加新的国内公开API\n\n推荐将API和机器人都部署在国内的服务器上\n\n## 关于 DEV 版本\n此版本基于 Splamy/TS3AudioBot 项目和 NeteaseCloudMusicApi 开发。DEV 版本由 @577fkj 大佬重构和增强，感谢他的贡献！\n\n由于原开发环境的丢失，无法继续之前兼容 stable 版本的音乐机器人插件的开发。此 DEV 版本是在 @577fkj 的重构和增强版本基础上进一步开发的。\n\n此版本新增了多项功能，包括查看播放列表、验证码登录、无人自动暂停、清除歌单、获取歌单最大长度限制、让机器人前往当前频道、播放专辑功能、私人 FM 模式等。\n\n### 链接\n- DEV 版本 GitHub 仓库：https://github.com/ZHANGTIANYAO1/TS3AudioBot-NetEaseCloudmusic-plugin/tree/DEV\n- pre-release(测试版)下载链接：https://github.com/ZHANGTIANYAO1/TS3AudioBot-NetEaseCloudmusic-plugin/releases/tag/3.0.0\n\n### 注意事项\n- 此版本windows系统需要使用新的机器人程序，已经打包在pre-release中\n- 虽然添加了第三方网易云API，但是为了大家的安全考虑，强烈建议自行部署API\n- 需要使用最新版本的网易云API：https://gitlab.com/Binaryify/neteasecloudmusicapi\n- 此版本在开发中，可能会有bug，遇到bug请提交issue，如果有想要添加的功能也可以提交issue\n- 将机器人整合包的音质默认设置为了最高bitrate\n- 权限文件修改为所有人有全部权限\n- 使用版本过新的linux可能会有困难，比如使用Ubuntu（24，22）版本的需要自己去安装老的lib库，例子：（libicu70_70.1-2_amd64.deb libssl1.1_1.1.1f-1ubuntu2_amd64.deb）\n- 推荐使用Ubuntu20\n\n## 关于设置文件YunSettings.ini\n`playMode=`是播放模式   \n`WangYiYunAPI_Address`是网易云API地址，目前默认的是一个大佬的远程API，如果加载速度过慢或者无法访问，请自行部署API并修改API地址。（为了保护你的隐私强烈建议你自行部署API）   \n`cookies1=`是保存在你本地的身份验证，通过二维码登录获取。（不需要修改）   \n\n## 目前的指令：\n正在播放的歌单的图片和名称可以点机器人看它的头像和描述  \nvip音乐想要先登陆才能播放完整版本:（输入指令后扫描机器人头像二维码登陆)  \n`!yun login`  \n\n双击机器人，目前有以下指令（把[xxx]替换成对应信息，**包括中括号**）  \n1.立即播放网易云音乐  \n`!yun play [音乐名称]`  \n  \n2.添加音乐到下一首  \n`!yun add [音乐名称]`  \n  \n3.播放网易云音乐歌单(如果提示Error: Nothing to play...重新输入指令解决)  \n`!yun gedan [歌单名称]`  \n  \n4.播放网易云音乐歌单id  \n`!yun gedanid [歌单名称]`  \n  \n5.立即播放网易云音乐id  \n`!yun playid [歌单id]`  \n  \n6.添加指定音乐id到下一首  \n`!yun add [音乐id]`  \n  \n7.播放列表中的下一首    \n`!yun next`  \n\n8.修改播放模式    \n`!yun mode [模式选择数字0-3]`  \n`0 = 顺序播放`\n`1 = 顺序循环`\n`2 = 随机播放`\n`3 = 随机循环`\n\n需要注意的是如果歌单歌曲过多需要时间加载，期间一定一定不要输入其他指令  \n\n### TS频道描述（复制代码到频道描述）\n```\n[COLOR=#ff5500][B]正在播放的歌单的图片和名称可以点机器人看它的头像和描述[/B][/COLOR]\n[COLOR=#aa00ff]机器人现在可以通过歌单播放vip音乐，如果遇到其他问题可以联系Github[/COLOR]\n\n[COLOR=#0055ff]双击机器人，目前有以下指令（[I]把[xxx]替换成对应信息，包括中括号[/I]）[/COLOR]\n1.立即播放网易云音乐\n[COLOR=#00aa00]!yun play [音乐名称][/COLOR]\n2.添加音乐到下一首\n[COLOR=#00aa00]!yun add [音乐名称][/COLOR]\n3.播放网易云音乐歌单\n[COLOR=#00aa00]!yun gedan [歌单名称][/COLOR]\n4.播放网易云音乐歌单id\n[COLOR=#00aa00]!yun gedanid [歌单名称][/COLOR]\n5.立即播放网易云音乐id\n[COLOR=#00aa00]!yun playid [歌单id][/COLOR]\n6.添加指定音乐id到下一首\n[COLOR=#00aa00]!yun add [音乐id][/COLOR]\n7.播放列表中的下一首\n[COLOR=#00aa00]!yun next[/COLOR]\n8.播放模式选择【0=顺序播放 1=顺序循环 2=随机 3=随即循环】\n[COLOR=#00aa00]!yun mode[/COLOR]\n9.登陆账户\n[COLOR=#00aa00]!yun login[/COLOR]\n[COLOR=#aaaaff]如果想要播放会员音乐需要先登陆会员账户，输入上述命令后扫描机器人头像的二维码登陆（只需要一账户登陆一次即可）[/COLOR]\n需要注意的是如果歌单歌曲过多需要时间加载（重写后应该只需要几秒），期间[B]一定一定不要[/B]输入其他指令\n\n以下例子加粗的就是音乐或者歌单id\n[URL]https://music.163.com/#/my/m/music/playlist?id=[B]2139305008[I][/I][/B][/URL]\n\n```\n\n### 已知问题  \n使用官方构建的ts3aduiobot会报错，因为官方的编译环境有问题。  \n解决方法：1.自行构建 2.使用我打包的版本  \n\n重复卸载加载插件会出现问题，如果需要重新加载请先重启Bot\n\nLinux Docker无法正常显示description\n解决方法：docker版本启用了web管理界面，在里面的Show song in bot description冲突了。关掉就可以正常显示了\n\n#### 写在最后的话\n本人完全不会C#，纯粹是自己花两天自学的，所以请各位大佬轻点喷我。  \n还有很多地方需要完善以及很多功能可以添加，但是本人无法做出任何承诺  \n同时欢迎各位来修改和完善这个插件  \n最后的最后请不要轻易信任使用他人提供的公开服务，以免发生安全问题,泄露自己的账号和密码。如果决定使用默认的远程API请自行承担任何可能的后续风险。\n"
  },
  {
    "path": "TS3AudioBot/Algorithm/IFilterAlgorithm.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace TS3AudioBot.Algorithm\n{\n\tpublic interface IFilter\n\t{\n\t\tIEnumerable<KeyValuePair<string, T>> Filter<T>(IEnumerable<KeyValuePair<string, T>> list, string filter);\n\t}\n\n\tpublic static class Filter\n\t{\n\t\tpublic static IFilter DefaultFilter { get; } = Ic3Filter.Instance;\n\n\t\tpublic static IFilter? GetFilterByName(string filter)\n\t\t{\n\t\t\treturn filter switch\n\t\t\t{\n\t\t\t\t\"exact\" => ExactFilter.Instance,\n\t\t\t\t\"substring\" => SubstringFilter.Instance,\n\t\t\t\t\"ic3\" => Ic3Filter.Instance,\n\t\t\t\t\"hamming\" => HammingFilter.Instance,\n\t\t\t\t_ => null,\n\t\t\t};\n\t\t}\n\n\t\tpublic static IFilter GetFilterByNameOrDefault(string filter) => GetFilterByName(filter) ?? DefaultFilter;\n\t}\n\n\t/// <summary>Interleaved continuous character chain.</summary>\n\tinternal sealed class Ic3Filter : IFilter\n\t{\n\t\tprivate Ic3Filter() { }\n\n\t\tpublic static IFilter Instance { get; } = new Ic3Filter();\n\n\t\tIEnumerable<KeyValuePair<string, T>> IFilter.Filter<T>(IEnumerable<KeyValuePair<string, T>> list, string filter)\n\t\t{\n\t\t\t// Convert result to list because it can be enumerated multiple times\n\t\t\tvar possibilities = list.Select(t => (Name: t.Key, t.Value, Index: 0)).ToList();\n\t\t\t// Filter matching commands\n\t\t\tforeach (var c in filter.ToLowerInvariant())\n\t\t\t{\n\t\t\t\tvar newPossibilities = (from p in possibilities\n\t\t\t\t\t\t\t\t\t\tlet pos = p.Name.ToLowerInvariant().IndexOf(c, p.Index)\n\t\t\t\t\t\t\t\t\t\twhere pos != -1\n\t\t\t\t\t\t\t\t\t\tselect (p.Name, p.Value, Index: pos + 1)).ToList();\n\t\t\t\tif (newPossibilities.Count > 0)\n\t\t\t\t\tpossibilities = newPossibilities;\n\t\t\t}\n\t\t\t// Take command with lowest index\n\t\t\tint minIndex = possibilities.Min(t => t.Index);\n\t\t\tvar cmds = possibilities.Where(t => t.Index == minIndex).ToArray();\n\t\t\t// Take the smallest command\n\t\t\tint minLength = cmds.Min(c => c.Name.Length);\n\n\t\t\treturn cmds.Where(c => c.Name.Length == minLength).Select(fi => new KeyValuePair<string, T>(fi.Name, fi.Value));\n\t\t}\n\t}\n\n\tinternal sealed class ExactFilter : IFilter\n\t{\n\t\tprivate ExactFilter() { }\n\n\t\tpublic static IFilter Instance { get; } = new ExactFilter();\n\n\t\tIEnumerable<KeyValuePair<string, T>> IFilter.Filter<T>(IEnumerable<KeyValuePair<string, T>> list, string filter)\n\t\t{\n\t\t\treturn list.Where(x => x.Key == filter);\n\t\t}\n\t}\n\n\tinternal sealed class HammingFilter : IFilter\n\t{\n\t\tprivate HammingFilter() { }\n\n\t\tpublic static IFilter Instance { get; } = new HammingFilter();\n\n\t\tIEnumerable<KeyValuePair<string, T>> IFilter.Filter<T>(IEnumerable<KeyValuePair<string, T>> list, string filter)\n\t\t{\n\t\t\tthrow new System.NotImplementedException();\n\t\t}\n\t}\n\n\tinternal sealed class SubstringFilter : IFilter\n\t{\n\t\tprivate SubstringFilter() { }\n\n\t\tpublic static IFilter Instance { get; } = new SubstringFilter();\n\n\t\tIEnumerable<KeyValuePair<string, T>> IFilter.Filter<T>(IEnumerable<KeyValuePair<string, T>> list, string filter)\n\t\t{\n\t\t\tvar result = list.Where(x => x.Key.StartsWith(filter));\n\t\t\tusing var enu = result.GetEnumerator();\n\t\t\tif (!enu.MoveNext())\n\t\t\t\tyield break;\n\t\t\tyield return enu.Current;\n\t\t\tif (enu.Current.Key == filter)\n\t\t\t\tyield break;\n\t\t\twhile (enu.MoveNext())\n\t\t\t\tyield return enu.Current;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Algorithm/LruCache.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace TS3AudioBot.Algorithm\n{\n\tpublic class LruCache<TK, TV> where TK : notnull\n\t{\n\t\tprivate readonly int maxCapacity;\n\t\tprivate readonly Dictionary<TK, LinkedListNode<(TK key, TV value)>> cacheDict = new Dictionary<TK, LinkedListNode<(TK, TV)>>();\n\t\tprivate readonly LinkedList<(TK key, TV value)> lruList = new LinkedList<(TK, TV)>();\n\n\t\tpublic LruCache(int capacity)\n\t\t{\n\t\t\tmaxCapacity = capacity;\n\t\t}\n\n\t\tpublic bool TryGetValue(TK key, [MaybeNullWhen(false)] out TV value)\n\t\t{\n\t\t\tif (cacheDict.TryGetValue(key, out var node))\n\t\t\t{\n\t\t\t\tRenew(node);\n\t\t\t\tvalue = node.Value.value;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tvalue = default!;\n\t\t\treturn false;\n\t\t}\n\n\t\tpublic void Set(TK key, TV value)\n\t\t{\n\t\t\tif (cacheDict.TryGetValue(key, out var node))\n\t\t\t{\n\t\t\t\tRenew(node);\n\t\t\t\tnode.Value = (node.Value.key, value);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (cacheDict.Count >= maxCapacity)\n\t\t\t\tRemoveOldest();\n\n\t\t\tnode = lruList.AddLast((key, value));\n\t\t\tcacheDict.Add(key, node);\n\t\t}\n\n\t\tpublic bool Remove(TK key) => cacheDict.Remove(key);\n\n\t\tprivate void Renew(LinkedListNode<(TK, TV)> node)\n\t\t{\n\t\t\tlruList.Remove(node);\n\t\t\tlruList.AddLast(node);\n\t\t}\n\n\t\tprivate void RemoveOldest()\n\t\t{\n\t\t\tvar node = lruList.First;\n\t\t\tif (node is null)\n\t\t\t\treturn;\n\t\t\tlruList.RemoveFirst();\n\t\t\tcacheDict.Remove(node.Value.key);\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tcacheDict.Clear();\n\t\t\tlruList.Clear();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Algorithm/TimedCache.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Concurrent;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Algorithm\n{\n\tpublic class TimedCache<TK, TV> where TK : notnull\n\t{\n\t\tpublic TimeSpan Timeout { get; }\n\t\tprivate readonly ConcurrentDictionary<TK, TimedData> cachedData;\n\n\t\tpublic TimedCache() : this(TimeSpan.FromSeconds(3)) { }\n\n\t\tpublic TimedCache(TimeSpan timeout)\n\t\t{\n\t\t\tTimeout = timeout;\n\t\t\tcachedData = new ConcurrentDictionary<TK, TimedData>();\n\t\t}\n\n\t\tpublic bool TryGetValue(TK key, [MaybeNullWhen(false)] out TV value)\n\t\t{\n\t\t\tif (!cachedData.TryGetValue(key, out var data)\n\t\t\t\t|| Tools.Now - Timeout > data.Timestamp)\n\t\t\t{\n\t\t\t\tCleanCache();\n\t\t\t\tvalue = default!;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvalue = data.Data;\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic void Set(TK key, TV value)\n\t\t{\n\t\t\tcachedData[key] = new TimedData { Data = value, Timestamp = Tools.Now };\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tcachedData.Clear();\n\t\t}\n\n\t\tprivate void CleanCache()\n\t\t{\n\t\t\tvar now = Tools.Now - Timeout;\n\t\t\tforeach (var item in cachedData.Where(kvp => now > kvp.Value.Timestamp).ToList())\n\t\t\t{\n\t\t\t\tcachedData.TryRemove(item.Key, out _);\n\t\t\t}\n\t\t}\n\n\t\tprivate struct TimedData\n\t\t{\n\t\t\tpublic TV Data;\n\t\t\tpublic DateTime Timestamp;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/AudioValues.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic static class AudioValues\n\t{\n\t\tpublic const float MinVolume = 0;\n\t\tpublic const float MaxVolume = 100;\n\n\t\t// Reference explanation for the logarithmic scale\n\t\t// https://www.dr-lex.be/info-stuff/volumecontrols.html#table1\n\t\t// Adjusted values for 40dB\n\n\t\tprivate const float fact_a = 1e-2f;\n\t\tprivate const float fact_b = 4.61512f;\n\n\t\tpublic static float HumanVolumeToFactor(float value)\n\t\t{\n\t\t\tif (value < MinVolume) return 0;\n\t\t\tif (value > MaxVolume) return 1;\n\n\t\t\t// Map input values from [MinVolume, MaxVolume] to [0, 1]\n\t\t\tvalue = (value - MinVolume) / (MaxVolume - MinVolume);\n\n\t\t\t// Scale the value logarithmically\n\t\t\treturn Tools.Clamp((float)(fact_a * Math.Exp(fact_b * value)) - fact_a, 0, 1);\n\t\t}\n\n\t\tpublic static float FactorToHumanVolume(float value)\n\t\t{\n\t\t\tif (value < 0) return MinVolume;\n\t\t\tif (value > 1) return MaxVolume;\n\n\t\t\t// Undo logarithmical scale\n\t\t\tvalue = Tools.Clamp((float)(Math.Log((value + fact_a) / fact_a) / fact_b), 0, 1);\n\n\t\t\t// Map input values from [0, 1] to [MinVolume, MaxVolume]\n\t\t\treturn (value * (MaxVolume - MinVolume)) + MinVolume;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/CustomTargetPipe.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing TSLib;\nusing TSLib.Audio;\nusing TSLib.Full;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Audio\n{\n\tinternal class CustomTargetPipe : IVoiceTarget, IAudioPassiveConsumer\n\t{\n\t\tpublic TargetSendMode SendMode { get; set; } = TargetSendMode.Voice;\n\t\tpublic ulong GroupWhisperTargetId { get; private set; }\n\t\tpublic GroupWhisperType GroupWhisperType { get; private set; }\n\t\tpublic GroupWhisperTarget GroupWhisperTarget { get; private set; }\n\t\tpublic bool Alone { get; set; }\n\n\t\tpublic IReadOnlyCollection<ClientId> WhisperClients\n\t\t{\n\t\t\tget { lock (subscriptionLockObj) { return clientSubscriptionsSetup.ToArray(); } }\n\t\t}\n\t\tpublic IReadOnlyCollection<ChannelId> WhisperChannel\n\t\t{\n\t\t\tget { lock (subscriptionLockObj) { return channelSubscriptionsSetup.Keys.ToArray(); } }\n\t\t}\n\n\t\tpublic bool Active\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tswitch (SendMode)\n\t\t\t\t{\n\t\t\t\tcase TargetSendMode.None:\n\t\t\t\t\treturn false;\n\t\t\t\tcase TargetSendMode.Voice:\n\t\t\t\t\treturn !Alone;\n\t\t\t\tcase TargetSendMode.Whisper:\n\t\t\t\t\tUpdatedSubscriptionCache();\n\t\t\t\t\treturn channelSubscriptionsCache.Length > 0 || clientSubscriptionsCache.Length > 0;\n\t\t\t\tdefault:\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate readonly Dictionary<ChannelId, bool> channelSubscriptionsSetup = new Dictionary<ChannelId, bool>();\n\t\tprivate readonly HashSet<ClientId> clientSubscriptionsSetup = new HashSet<ClientId>();\n\t\tprivate ChannelId[] channelSubscriptionsCache = Array.Empty<ChannelId>();\n\t\tprivate ClientId[] clientSubscriptionsCache = Array.Empty<ClientId>();\n\t\tprivate bool subscriptionSetupChanged;\n\t\tprivate readonly object subscriptionLockObj = new object();\n\n\t\tprivate readonly TsFullClient client;\n\n\t\tpublic CustomTargetPipe(TsFullClient client)\n\t\t{\n\t\t\tthis.client = client;\n\t\t\tsubscriptionSetupChanged = true;\n\t\t}\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tUpdatedSubscriptionCache();\n\n\t\t\tvar codec = meta?.Codec ?? Codec.OpusMusic; // XXX a bit hacky\n\t\t\tswitch (SendMode)\n\t\t\t{\n\t\t\tcase TargetSendMode.None:\n\t\t\t\tbreak;\n\t\t\tcase TargetSendMode.Voice:\n\t\t\t\tclient.SendAudio(data, codec);\n\t\t\t\tbreak;\n\t\t\tcase TargetSendMode.Whisper:\n\t\t\t\tclient.SendAudioWhisper(data, codec, channelSubscriptionsCache, clientSubscriptionsCache);\n\t\t\t\tbreak;\n\t\t\tcase TargetSendMode.WhisperGroup:\n\t\t\t\tclient.SendAudioGroupWhisper(data, codec, GroupWhisperType, GroupWhisperTarget, GroupWhisperTargetId);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(SendMode);\n\t\t\t}\n\t\t}\n\n\t\t#region ITargetManager\n\n\t\tpublic void SetGroupWhisper(GroupWhisperType type, GroupWhisperTarget target, ulong targetId = 0)\n\t\t{\n\t\t\tGroupWhisperType = type;\n\t\t\tGroupWhisperTarget = target;\n\t\t\tGroupWhisperTargetId = targetId;\n\t\t}\n\n\t\tpublic void WhisperChannelSubscribe(bool temp, params ChannelId[] channels)\n\t\t{\n\t\t\tlock (subscriptionLockObj)\n\t\t\t{\n\t\t\t\tforeach (var channel in channels)\n\t\t\t\t{\n\t\t\t\t\tif (channelSubscriptionsSetup.TryGetValue(channel, out var subscriptionTemp))\n\t\t\t\t\t{\n\t\t\t\t\t\tchannelSubscriptionsSetup[channel] = !subscriptionTemp || !temp;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tchannelSubscriptionsSetup[channel] = !temp;\n\t\t\t\t\t\tsubscriptionSetupChanged = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void WhisperChannelUnsubscribe(bool temp, params ChannelId[] channels)\n\t\t{\n\t\t\tlock (subscriptionLockObj)\n\t\t\t{\n\t\t\t\tforeach (var channel in channels)\n\t\t\t\t{\n\t\t\t\t\tif (!temp)\n\t\t\t\t\t{\n\t\t\t\t\t\tsubscriptionSetupChanged |= channelSubscriptionsSetup.Remove(channel);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (channelSubscriptionsSetup.TryGetValue(channel, out bool subscriptionTemp) && subscriptionTemp)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchannelSubscriptionsSetup.Remove(channel);\n\t\t\t\t\t\t\tsubscriptionSetupChanged = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void WhisperClientSubscribe(params ClientId[] userId)\n\t\t{\n\t\t\tlock (subscriptionLockObj)\n\t\t\t{\n\t\t\t\tclientSubscriptionsSetup.UnionWith(userId);\n\t\t\t\tsubscriptionSetupChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tpublic void WhisperClientUnsubscribe(params ClientId[] userId)\n\t\t{\n\t\t\tlock (subscriptionLockObj)\n\t\t\t{\n\t\t\t\tclientSubscriptionsSetup.ExceptWith(userId);\n\t\t\t\tsubscriptionSetupChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tpublic void ClearTemporary()\n\t\t{\n\t\t\tlock (subscriptionLockObj)\n\t\t\t{\n\t\t\t\tvar removeList = channelSubscriptionsSetup\n\t\t\t\t\t.Where(kvp => kvp.Value)\n\t\t\t\t\t.Select(kvp => kvp.Key)\n\t\t\t\t\t.ToArray();\n\t\t\t\tforeach (var chan in removeList)\n\t\t\t\t{\n\t\t\t\t\tchannelSubscriptionsSetup.Remove(chan);\n\t\t\t\t\tsubscriptionSetupChanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate void UpdatedSubscriptionCache()\n\t\t{\n\t\t\tif (!subscriptionSetupChanged)\n\t\t\t\treturn;\n\t\t\tlock (subscriptionLockObj)\n\t\t\t{\n\t\t\t\tif (!subscriptionSetupChanged)\n\t\t\t\t\treturn;\n\t\t\t\tchannelSubscriptionsCache = channelSubscriptionsSetup.Keys.ToArray();\n\t\t\t\tclientSubscriptionsCache = clientSubscriptionsSetup.ToArray();\n\t\t\t\tsubscriptionSetupChanged = false;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/FfmpegProducer.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TSLib.Audio;\nusing TSLib.Helper;\nusing TSLib.Scheduler;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic class FfmpegProducer : IPlayerSource, ISampleInfo, IDisposable\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate readonly Id id;\n\t\tprivate static readonly Regex FindDurationMatch = new Regex(@\"^\\s*Duration: (\\d+):(\\d\\d):(\\d\\d).(\\d\\d)\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex IcyMetadataMacher = new Regex(\"((\\\\w+)='(.*?)';\\\\s*)+\", Util.DefaultRegexConfig);\n\t\tprivate const string PreLinkConf = \"-hide_banner -nostats -threads 1 -i \\\"\";\n\t\tprivate const string PostLinkConf = \"\\\" -ac 2 -ar 48000 -f s16le -acodec pcm_s16le pipe:1\";\n\t\tprivate const string LinkConfIcy = \"-hide_banner -nostats -threads 1 -i pipe:0 -ac 2 -ar 48000 -f s16le -acodec pcm_s16le pipe:1\";\n\t\tprivate static readonly TimeSpan retryOnDropBeforeEnd = TimeSpan.FromSeconds(10);\n\n\t\tprivate readonly ConfToolsFfmpeg config;\n\n\t\tpublic event EventHandler? OnSongEnd;\n\t\tpublic event EventHandler<SongInfoChanged>? OnSongUpdated;\n\n\t\tprivate readonly DedicatedTaskScheduler scheduler;\n\t\tprivate FfmpegInstance? ffmpegInstance;\n\n\t\tpublic int SampleRate { get; } = 48000;\n\t\tpublic int Channels { get; } = 2;\n\t\tpublic int BitsPerSample { get; } = 16;\n\n\t\tpublic FfmpegProducer(ConfToolsFfmpeg config, DedicatedTaskScheduler scheduler, Id id)\n\t\t{\n\t\t\tthis.config = config;\n\t\t\tthis.scheduler = scheduler;\n\t\t\tthis.id = id;\n\t\t}\n\n\t\tpublic Task AudioStart(string url, TimeSpan? startOff = null)\n\t\t{\n\t\t\tStartFfmpegProcess(url, startOff ?? TimeSpan.Zero);\n\t\t\treturn Task.CompletedTask;\n\t\t}\n\n\t\tpublic async Task AudioStartIcy(string url) => await StartFfmpegProcessIcy(url);\n\n\t\tpublic void AudioStop()\n\t\t{\n\t\t\tStopFfmpegProcess();\n\t\t}\n\n\t\tpublic TimeSpan? Length => GetCurrentSongLength();\n\n\t\tpublic TimeSpan? Position => ffmpegInstance?.AudioTimer.SongPosition;\n\n\t\tpublic Task Seek(TimeSpan position) { SetPosition(position); return Task.CompletedTask; }\n\n\t\tpublic int Read(byte[] buffer, int offset, int length, out Meta? meta)\n\t\t{\n\t\t\tmeta = default;\n\t\t\tint read;\n\n\t\t\tvar instance = ffmpegInstance;\n\n\t\t\tif (instance is null)\n\t\t\t\treturn 0;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tread = instance.FfmpegProcess.StandardOutput.BaseStream.Read(buffer, 0, length);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tread = 0;\n\t\t\t\tLog.Debug(ex, \"Can't read ffmpeg\");\n\t\t\t}\n\n\t\t\tif (read == 0)\n\t\t\t{\n\t\t\t\tAssertNotMainScheduler();\n\n\t\t\t\tvar (ret, triggerEndSafe) = instance.IsIcyStream\n\t\t\t\t\t? OnReadEmptyIcy(instance)\n\t\t\t\t\t: OnReadEmpty(instance);\n\t\t\t\tif (ret)\n\t\t\t\t\treturn 0;\n\n\t\t\t\tif (instance.FfmpegProcess.HasExitedSafe())\n\t\t\t\t{\n\t\t\t\t\tLog.Trace(\"Ffmpeg has exited\");\n\t\t\t\t\tAudioStop();\n\t\t\t\t\ttriggerEndSafe = true;\n\t\t\t\t}\n\n\t\t\t\tif (triggerEndSafe)\n\t\t\t\t{\n\t\t\t\t\tOnSongEnd?.Invoke(this, EventArgs.Empty);\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinstance.HasTriedToReconnect = false;\n\t\t\tinstance.AudioTimer.PushBytes(read);\n\t\t\treturn read;\n\t\t}\n\n\t\tprivate (bool ret, bool trigger) OnReadEmpty(FfmpegInstance instance)\n\t\t{\n\t\t\tif (instance.FfmpegProcess.HasExitedSafe() && !instance.HasTriedToReconnect)\n\t\t\t{\n\t\t\t\tvar expectedStopLength = GetCurrentSongLength();\n\t\t\t\tLog.Trace(\"Expected song length {0}\", expectedStopLength);\n\t\t\t\tif (expectedStopLength != TimeSpan.Zero)\n\t\t\t\t{\n\t\t\t\t\tvar actualStopPosition = instance.AudioTimer.SongPosition;\n\t\t\t\t\tLog.Trace(\"Actual song position {0}\", actualStopPosition);\n\t\t\t\t\tif (actualStopPosition + retryOnDropBeforeEnd < expectedStopLength)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Debug(\"Connection to song lost, retrying at {0}\", actualStopPosition);\n\t\t\t\t\t\tinstance.HasTriedToReconnect = true;\n\t\t\t\t\t\tvar newInstance = SetPosition(actualStopPosition);\n\t\t\t\t\t\tif (newInstance.Ok)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnewInstance.Value.HasTriedToReconnect = true;\n\t\t\t\t\t\t\treturn (true, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.Debug(\"Retry failed {0}\", newInstance.Error);\n\t\t\t\t\t\t\treturn (false, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn (false, false);\n\t\t}\n\n\t\tprivate (bool ret, bool trigger) OnReadEmptyIcy(FfmpegInstance instance)\n\t\t{\n\t\t\tAssertNotMainScheduler();\n\n\t\t\tif (instance.FfmpegProcess.HasExitedSafe() && !instance.HasTriedToReconnect)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Connection to stream lost, retrying...\");\n\t\t\t\tinstance.HasTriedToReconnect = true;\n\t\t\t\tvar newInstance = StartFfmpegProcessIcy(instance.ReconnectUrl).Result;\n\t\t\t\tif (newInstance.Ok)\n\t\t\t\t{\n\t\t\t\t\tnewInstance.Value.HasTriedToReconnect = true;\n\t\t\t\t\treturn (true, false);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLog.Debug(\"Retry failed {0}\", newInstance.Error);\n\t\t\t\t\treturn (false, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn (false, false);\n\t\t}\n\n\t\tprivate R<FfmpegInstance, string> SetPosition(TimeSpan value)\n\t\t{\n\t\t\tif (value < TimeSpan.Zero)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(value));\n\t\t\tvar instance = ffmpegInstance;\n\t\t\tif (instance is null)\n\t\t\t\treturn \"No instance running\";\n\t\t\tif (instance.IsIcyStream)\n\t\t\t\treturn \"Cannot seek icy stream\";\n\t\t\tvar lastLink = instance.ReconnectUrl;\n\t\t\tif (lastLink is null)\n\t\t\t\treturn \"No current url active\";\n\t\t\treturn StartFfmpegProcess(lastLink, value);\n\t\t}\n\n\t\tprivate R<FfmpegInstance, string> StartFfmpegProcess(string url, TimeSpan? offsetOpt)\n\t\t{\n\t\t\tStopFfmpegProcess();\n\t\t\tLog.Trace(\"Start request {0}\", url);\n\n\t\t\tstring arguments;\n\t\t\tvar offset = offsetOpt ?? TimeSpan.Zero;\n\t\t\tif (offset > TimeSpan.Zero)\n\t\t\t{\n\t\t\t\tvar seek = string.Format(CultureInfo.InvariantCulture, @\"-ss {0:hh\\:mm\\:ss\\.fff}\", offset);\n\t\t\t\targuments = string.Concat(seek, \" \", PreLinkConf, url, PostLinkConf, \" \", seek);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\targuments = string.Concat(PreLinkConf, url, PostLinkConf);\n\t\t\t}\n\n\t\t\tvar newInstance = new FfmpegInstance(\n\t\t\t\turl,\n\t\t\t\tnew PreciseAudioTimer(this)\n\t\t\t\t{\n\t\t\t\t\tSongPositionOffset = offset,\n\t\t\t\t});\n\n\t\t\treturn StartFfmpegProcessInternal(newInstance, arguments);\n\t\t}\n\n\t\tprivate async Task<R<FfmpegInstance, string>> StartFfmpegProcessIcy(string url)\n\t\t{\n\t\t\tStopFfmpegProcess();\n\t\t\tLog.Trace(\"Start icy-stream request {0}\", url);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar response = await WebWrapper\n\t\t\t\t\t.Request(url)\n\t\t\t\t\t.WithHeader(\"Icy-MetaData\", \"1\")\n\t\t\t\t\t.UnsafeResponse();\n\n\t\t\t\tif (!int.TryParse(response.Headers.GetSingle(\"icy-metaint\"), out var metaint))\n\t\t\t\t{\n\t\t\t\t\tresponse.Dispose();\n\t\t\t\t\treturn \"Invalid icy stream tags\";\n\t\t\t\t}\n\n\t\t\t\tvar stream = await response.Content.ReadAsStreamAsync();\n\t\t\t\tvar newInstance = new FfmpegInstance(\n\t\t\t\t\turl,\n\t\t\t\t\tnew PreciseAudioTimer(this),\n\t\t\t\t\tstream,\n\t\t\t\t\tmetaint)\n\t\t\t\t{\n\t\t\t\t\tOnMetaUpdated = e => OnSongUpdated?.Invoke(this, e)\n\t\t\t\t};\n\n\t\t\t\tnew Thread(() => newInstance.ReadStreamLoop(id))\n\t\t\t\t{\n\t\t\t\t\tName = $\"IcyStreamReader[{id}]\",\n\t\t\t\t}.Start();\n\n\t\t\t\treturn StartFfmpegProcessInternal(newInstance, LinkConfIcy);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tvar error = $\"Unable to create icy-stream ({ex.Message})\";\n\t\t\t\tLog.Warn(ex, error);\n\t\t\t\treturn error;\n\t\t\t}\n\t\t}\n\n\t\tprivate R<FfmpegInstance, string> StartFfmpegProcessInternal(FfmpegInstance instance, string arguments)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tinstance.FfmpegProcess.StartInfo = new ProcessStartInfo\n\t\t\t\t{\n\t\t\t\t\tFileName = config.Path.Value,\n\t\t\t\t\tArguments = arguments,\n\t\t\t\t\tRedirectStandardOutput = true,\n\t\t\t\t\tRedirectStandardInput = true,\n\t\t\t\t\tRedirectStandardError = true,\n\t\t\t\t\tUseShellExecute = false,\n\t\t\t\t\tCreateNoWindow = true,\n\t\t\t\t};\n\t\t\t\tinstance.FfmpegProcess.EnableRaisingEvents = true;\n\n\t\t\t\tLog.Debug(\"Starting ffmpeg with {0}\", arguments);\n\t\t\t\tinstance.FfmpegProcess.ErrorDataReceived += instance.FfmpegProcess_ErrorDataReceived;\n\t\t\t\tinstance.FfmpegProcess.Start();\n\t\t\t\tinstance.FfmpegProcess.BeginErrorReadLine();\n\n\t\t\t\tinstance.AudioTimer.Start();\n\n\t\t\t\tvar oldInstance = Interlocked.Exchange(ref ffmpegInstance, instance);\n\t\t\t\toldInstance?.Close();\n\n\t\t\t\treturn instance;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tvar error = ex is Win32Exception\n\t\t\t\t\t? $\"Ffmpeg could not be found ({ex.Message})\"\n\t\t\t\t\t: $\"Unable to create stream ({ex.Message})\";\n\t\t\t\tLog.Error(ex, error);\n\t\t\t\tinstance.Close();\n\t\t\t\tStopFfmpegProcess();\n\t\t\t\treturn error;\n\t\t\t}\n\t\t}\n\n\t\tprivate void StopFfmpegProcess()\n\t\t{\n\t\t\tvar oldInstance = Interlocked.Exchange(ref ffmpegInstance, null);\n\t\t\tif (oldInstance != null)\n\t\t\t{\n\t\t\t\toldInstance.OnMetaUpdated = null;\n\t\t\t\toldInstance.Close();\n\t\t\t}\n\t\t}\n\n\t\tprivate TimeSpan? GetCurrentSongLength() => ffmpegInstance?.ParsedSongLength;\n\n\t\tprivate void AssertNotMainScheduler()\n\t\t{\n\t\t\tif (TaskScheduler.Current == scheduler)\n\t\t\t\tthrow new Exception(\"Cannot read on own scheduler. Throwing to prevent deadlock\");\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tStopFfmpegProcess();\n\t\t}\n\n\t\tprivate class FfmpegInstance\n\t\t{\n\t\t\tpublic Process FfmpegProcess { get; }\n\t\t\tpublic bool HasTriedToReconnect { get; set; }\n\t\t\tpublic string ReconnectUrl { get; }\n\t\t\tpublic bool IsIcyStream => IcyStream != null;\n\n\t\t\tpublic PreciseAudioTimer AudioTimer { get; }\n\t\t\tpublic TimeSpan? ParsedSongLength { get; set; } = null;\n\n\t\t\tpublic Stream? IcyStream { get; }\n\t\t\tpublic int IcyMetaInt { get; }\n\t\t\tpublic bool Closed { get; set; }\n\n\t\t\tpublic Action<SongInfoChanged>? OnMetaUpdated;\n\n\t\t\tpublic FfmpegInstance(string url, PreciseAudioTimer timer) : this(url, timer, null!, 0) { }\n\t\t\tpublic FfmpegInstance(string url, PreciseAudioTimer timer, Stream icyStream, int icyMetaInt)\n\t\t\t{\n\t\t\t\tFfmpegProcess = new Process();\n\t\t\t\tReconnectUrl = url;\n\t\t\t\tAudioTimer = timer;\n\t\t\t\tIcyStream = icyStream;\n\t\t\t\tIcyMetaInt = icyMetaInt;\n\n\t\t\t\tHasTriedToReconnect = false;\n\t\t\t}\n\n\t\t\tpublic void Close()\n\t\t\t{\n\t\t\t\tClosed = true;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (!FfmpegProcess.HasExitedSafe())\n\t\t\t\t\t\tFfmpegProcess.Kill();\n\t\t\t\t}\n\t\t\t\tcatch { }\n\t\t\t\ttry { FfmpegProcess.CancelErrorRead(); } catch { }\n\t\t\t\ttry { FfmpegProcess.StandardInput.Dispose(); } catch { }\n\t\t\t\ttry { FfmpegProcess.StandardOutput.Dispose(); } catch { }\n\t\t\t\ttry { FfmpegProcess.Dispose(); } catch { }\n\n\t\t\t\tIcyStream?.Dispose();\n\t\t\t}\n\n\t\t\tpublic void FfmpegProcess_ErrorDataReceived(object sender, DataReceivedEventArgs e)\n\t\t\t{\n\t\t\t\tif (e.Data is null)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (sender != FfmpegProcess)\n\t\t\t\t\tthrow new InvalidOperationException(\"Wrong process associated to event\");\n\n\t\t\t\tif (ParsedSongLength is null)\n\t\t\t\t{\n\t\t\t\t\tvar match = FindDurationMatch.Match(e.Data);\n\t\t\t\t\tif (!match.Success)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tint hours = int.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);\n\t\t\t\t\tint minutes = int.Parse(match.Groups[2].Value, CultureInfo.InvariantCulture);\n\t\t\t\t\tint seconds = int.Parse(match.Groups[3].Value, CultureInfo.InvariantCulture);\n\t\t\t\t\tint millisec = int.Parse(match.Groups[4].Value, CultureInfo.InvariantCulture) * 10;\n\t\t\t\t\tParsedSongLength = new TimeSpan(0, hours, minutes, seconds, millisec);\n\t\t\t\t}\n\n\t\t\t\t//if (!HasIcyTag && e.Data.AsSpan().TrimStart().StartsWith(\"icy-\".AsSpan()))\n\t\t\t\t//{\n\t\t\t\t//\tHasIcyTag = true;\n\t\t\t\t//}\n\t\t\t}\n\n\t\t\tpublic void ReadStreamLoop(Id id)\n\t\t\t{\n\t\t\t\tif (IcyStream is null)\n\t\t\t\t\tthrow new InvalidOperationException(\"Instance is not an icy stream\");\n\n\t\t\t\tTools.SetLogId(id.ToString());\n\t\t\t\tconst int IcyMaxMeta = 255 * 16;\n\t\t\t\tconst int ReadBufferSize = 4096;\n\n\t\t\t\tint errorCount = 0;\n\t\t\t\tvar buffer = new byte[Math.Max(ReadBufferSize, IcyMaxMeta)];\n\t\t\t\tint readCount = 0;\n\n\t\t\t\twhile (!Closed)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\twhile (readCount < IcyMetaInt)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint read = IcyStream.Read(buffer, 0, Math.Min(ReadBufferSize, IcyMetaInt - readCount));\n\t\t\t\t\t\t\tif (read == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tClose();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treadCount += read;\n\t\t\t\t\t\t\tFfmpegProcess.StandardInput.BaseStream.Write(buffer, 0, read);\n\t\t\t\t\t\t\terrorCount = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treadCount = 0;\n\n\t\t\t\t\t\tvar metaByte = IcyStream.ReadByte();\n\t\t\t\t\t\tif (metaByte < 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tClose();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (metaByte > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmetaByte *= 16;\n\t\t\t\t\t\t\twhile (readCount < metaByte)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint read = IcyStream.Read(buffer, 0, metaByte - readCount);\n\t\t\t\t\t\t\t\tif (read == 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tClose();\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treadCount += read;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treadCount = 0;\n\n\t\t\t\t\t\t\tvar metaString = Tools.Utf8Encoder.GetString(buffer, 0, metaByte).TrimEnd('\\0');\n\t\t\t\t\t\t\tLog.Debug(\"Meta: {0}\", metaString);\n\t\t\t\t\t\t\tOnMetaUpdated?.Invoke(ParseIcyMeta(metaString));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (Exception ex)\n\t\t\t\t\t{\n\t\t\t\t\t\terrorCount++;\n\t\t\t\t\t\tif (errorCount >= 50)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.Error(ex, \"Failed too many times trying to access ffmpeg. Closing stream.\");\n\t\t\t\t\t\t\tClose();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (ex is InvalidOperationException)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.Debug(ex, \"Waiting for ffmpeg\");\n\t\t\t\t\t\t\tThread.Sleep(100);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.Debug(ex, \"Stream read/write error\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprivate static SongInfoChanged ParseIcyMeta(string metaString)\n\t\t\t{\n\t\t\t\tvar songInfo = new SongInfoChanged();\n\t\t\t\tvar match = IcyMetadataMacher.Match(metaString);\n\t\t\t\tif (match.Success)\n\t\t\t\t{\n\t\t\t\t\tfor (int i = 0; i < match.Groups[1].Captures.Count; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (match.Groups[2].Captures[i].Value.ToUpperInvariant())\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase \"STREAMTITLE\":\n\t\t\t\t\t\t\tsongInfo.Title = match.Groups[3].Captures[i].Value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn songInfo;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/IPlayerSource.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Threading.Tasks;\nusing TSLib.Audio;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic interface IPlayerSource : IAudioPassiveProducer\n\t{\n\t\tevent EventHandler OnSongEnd;\n\t\tevent EventHandler<SongInfoChanged> OnSongUpdated;\n\n\t\tTimeSpan? Length { get; }\n\t\tTimeSpan? Position { get; }\n\n\t\tTask Seek(TimeSpan position);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/IVoiceTarget.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing TSLib;\nusing TSLib.Audio;\n\nnamespace TS3AudioBot.Audio\n{\n\t/// <summary>Used to specify playing mode and active targets to send to.</summary>\n\tpublic interface IVoiceTarget\n\t{\n\t\tTargetSendMode SendMode { get; set; }\n\t\tulong GroupWhisperTargetId { get; }\n\t\tGroupWhisperType GroupWhisperType { get; }\n\t\tGroupWhisperTarget GroupWhisperTarget { get; }\n\t\tvoid SetGroupWhisper(GroupWhisperType type, GroupWhisperTarget target, ulong targetId);\n\n\t\tIReadOnlyCollection<ClientId> WhisperClients { get; }\n\t\tIReadOnlyCollection<ChannelId> WhisperChannel { get; }\n\n\t\t/// <summary>Adds a channel to the audio streaming list.</summary>\n\t\t/// <param name=\"temp\">When set to true this channel will be cleared with\n\t\t/// the next <see cref=\"ClearTemporary\"/> call (unless overwritten with false).</param>\n\t\t/// <param name=\"channel\">The id of the channel.</param>\n\t\tvoid WhisperChannelSubscribe(bool temp, params ChannelId[] channel);\n\t\t/// <summary>Removes a channel from the audio streaming list.</summary>\n\t\t/// <param name=\"temp\">When set to true this channel will be cleared with\n\t\t/// the next <see cref=\"ClearTemporary\"/> call (unless overwritten with false).</param>\n\t\t/// <param name=\"channel\">The id of the channel.</param>\n\t\tvoid WhisperChannelUnsubscribe(bool temp, params ChannelId[] channel);\n\t\tvoid ClearTemporary();\n\t\tvoid WhisperClientSubscribe(params ClientId[] userId);\n\t\tvoid WhisperClientUnsubscribe(params ClientId[] userId);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/PlayInfo.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Diagnostics.CodeAnalysis;\nusing TSLib;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic sealed class PlayInfo\n\t{\n\t\t/// <summary>Defaults to: invoker.Uid - Can be set if the owner of a song differs from the invoker.</summary>\n\t\tpublic Uid? ResourceOwnerUid { get; set; }\n\t\t/// <summary>Starts the song at the specified time if set.</summary>\n\t\tpublic TimeSpan? StartOffset { get; set; }\n\n\t\tpublic PlayInfo(TimeSpan? startOffset = null)\n\t\t{\n\t\t\tStartOffset = startOffset;\n\t\t}\n\n\t\tpublic PlayInfo Merge(PlayInfo other) => Merge(this, other);\n\n\t\t[return: NotNullIfNotNull(\"self\")]\n\t\t[return: NotNullIfNotNull(\"other\")]\n\t\tpublic static PlayInfo? Merge(PlayInfo? self, PlayInfo? other)\n\t\t{\n\t\t\tif (other is null)\n\t\t\t\treturn self;\n\t\t\tif (self is null)\n\t\t\t\treturn other;\n\t\t\tself.ResourceOwnerUid ??= other.ResourceOwnerUid;\n\t\t\tself.StartOffset ??= other.StartOffset;\n\t\t\treturn self;\n\t\t}\n\n\t\tpublic static PlayInfo MergeDefault(PlayInfo? self, PlayInfo? other)\n\t\t\t=> Merge(self, other) ?? new PlayInfo();\n\t}\n\n\tpublic interface IMetaContainer\n\t{\n\t\tpublic PlayInfo? PlayInfo { get; set; }\n\t}\n\n\tpublic static class MetaContainerExtensions\n\t{\n\t\tpublic static T MergeMeta<T>(this T container, PlayInfo? other) where T : IMetaContainer\n\t\t{\n\t\t\tcontainer.PlayInfo = PlayInfo.Merge(container.PlayInfo, other);\n\t\t\treturn container;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/PlayInfoEventArgs.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TS3AudioBot.ResourceFactories;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic sealed class PlayInfoEventArgs : EventArgs\n\t{\n\t\tpublic InvokerData Invoker { get; }\n\t\tpublic PlayResource PlayResource { get; }\n\t\tpublic AudioResource ResourceData => PlayResource.AudioResource;\n\t\tpublic PlayInfo? PlayInfo => PlayResource.PlayInfo;\n\t\tpublic string? SourceLink { get; }\n\n\t\tpublic PlayInfoEventArgs(InvokerData invoker, PlayResource playResource, string? sourceLink)\n\t\t{\n\t\t\tInvoker = invoker;\n\t\t\tPlayResource = playResource;\n\t\t\tSourceLink = sourceLink;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/PlayManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Environment;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Playlists;\nusing TS3AudioBot.ResourceFactories;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Audio\n{\n\t/// <summary>Provides a convenient inferface for enqueing, playing and registering song events.</summary>\n\tpublic class PlayManager\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tprivate readonly ConfBot confBot;\n\t\tprivate readonly Player playerConnection;\n\t\tprivate readonly PlaylistManager playlistManager;\n\t\tprivate readonly ResolveContext resourceResolver;\n\t\tprivate readonly Stats stats;\n\n\t\tpublic PlayInfoEventArgs? CurrentPlayData { get; private set; }\n\t\tpublic bool IsPlaying => CurrentPlayData != null;\n\n\t\tpublic event AsyncEventHandler<PlayInfoEventArgs>? OnResourceUpdated;\n\t\tpublic event AsyncEventHandler<PlayInfoEventArgs>? BeforeResourceStarted;\n\t\tpublic event AsyncEventHandler<PlayInfoEventArgs>? AfterResourceStarted;\n\t\tpublic event AsyncEventHandler<SongEndEventArgs>? ResourceStopped;\n\t\tpublic event AsyncEventHandler? PlaybackStopped;\n\n\t\tpublic PlayManager(ConfBot config, Player playerConnection, PlaylistManager playlistManager, ResolveContext resourceResolver, Stats stats)\n\t\t{\n\t\t\tconfBot = config;\n\t\t\tthis.playerConnection = playerConnection;\n\t\t\tthis.playlistManager = playlistManager;\n\t\t\tthis.resourceResolver = resourceResolver;\n\t\t\tthis.stats = stats;\n\t\t}\n\n\t\tpublic Task Enqueue(InvokerData invoker, AudioResource ar, PlayInfo? meta = null) => Enqueue(invoker, new PlaylistItem(ar, meta));\n\t\tpublic async Task Enqueue(InvokerData invoker, string message, string? audioType = null, PlayInfo? meta = null)\n\t\t{\n\t\t\tPlayResource playResource;\n\t\t\ttry { playResource = await resourceResolver.Load(message, audioType); }\n\t\t\tcatch\n\t\t\t{\n\t\t\t\tstats.TrackSongLoad(audioType, false, true);\n\t\t\t\tthrow;\n\t\t\t}\n\t\t\tawait Enqueue(invoker, PlaylistItem.From(playResource).MergeMeta(meta));\n\t\t}\n\t\tpublic Task Enqueue(InvokerData invoker, IEnumerable<PlaylistItem> items)\n\t\t{\n\t\t\tvar startOff = playlistManager.CurrentList.Items.Count;\n\t\t\tplaylistManager.Queue(items.Select(x => UpdateItem(invoker, x)));\n\t\t\treturn PostEnqueue(invoker, startOff);\n\t\t}\n\t\tpublic Task Enqueue(InvokerData invoker, PlaylistItem item)\n\t\t{\n\t\t\tvar startOff = playlistManager.CurrentList.Items.Count;\n\t\t\tplaylistManager.Queue(UpdateItem(invoker, item));\n\t\t\treturn PostEnqueue(invoker, startOff);\n\t\t}\n\n\t\tprivate static PlaylistItem UpdateItem(InvokerData invoker, PlaylistItem item)\n\t\t{\n\t\t\titem.PlayInfo ??= new PlayInfo();\n\t\t\titem.PlayInfo.ResourceOwnerUid = invoker.ClientUid;\n\t\t\treturn item;\n\t\t}\n\n\t\tprivate async Task PostEnqueue(InvokerData invoker, int startIndex)\n\t\t{\n\t\t\tif (IsPlaying)\n\t\t\t\treturn;\n\t\t\tplaylistManager.Index = startIndex;\n\t\t\tawait StartCurrent(invoker);\n\t\t}\n\n\t\t/// <summary>Tries to play the passed <see cref=\"AudioResource\"/></summary>\n\t\t/// <param name=\"invoker\">The invoker of this resource. Used for responses and association.</param>\n\t\t/// <param name=\"ar\">The resource to load and play.</param>\n\t\t/// <param name=\"meta\">Allows overriding certain settings for the resource. Can be null.</param>\n\t\t/// <returns>Ok if successful, or an error message otherwise.</returns>\n\t\tpublic async Task Play(InvokerData invoker, AudioResource ar, PlayInfo? meta = null)\n\t\t{\n\t\t\tif (ar is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(ar));\n\n\t\t\tPlayResource playResource;\n\t\t\ttry { playResource = await resourceResolver.Load(ar); }\n\t\t\tcatch\n\t\t\t{\n\t\t\t\tstats.TrackSongLoad(ar.AudioType, false, true);\n\t\t\t\tthrow;\n\t\t\t}\n\t\t\tawait Play(invoker, playResource.MergeMeta(meta));\n\t\t}\n\n\t\t/// <summary>Tries to play the passed link.</summary>\n\t\t/// <param name=\"invoker\">The invoker of this resource. Used for responses and association.</param>\n\t\t/// <param name=\"link\">The link to resolve, load and play.</param>\n\t\t/// <param name=\"audioType\">The associated resource type string to a factory.</param>\n\t\t/// <param name=\"meta\">Allows overriding certain settings for the resource. Can be null.</param>\n\t\t/// <returns>Ok if successful, or an error message otherwise.</returns>\n\t\tpublic async Task Play(InvokerData invoker, string link, string? audioType = null, PlayInfo? meta = null)\n\t\t{\n\t\t\tPlayResource playResource;\n\t\t\ttry { playResource = await resourceResolver.Load(link, audioType); }\n\t\t\tcatch\n\t\t\t{\n\t\t\t\tstats.TrackSongLoad(audioType, false, true);\n\t\t\t\tthrow;\n\t\t\t}\n\t\t\tawait Play(invoker, playResource.MergeMeta(meta));\n\t\t}\n\n\t\tpublic Task Play(InvokerData invoker, IEnumerable<PlaylistItem> items, int index = 0)\n\t\t{\n\t\t\tplaylistManager.Clear();\n\t\t\tplaylistManager.Queue(items.Select(x => UpdateItem(invoker, x)));\n\t\t\tplaylistManager.Index = index;\n\t\t\treturn StartCurrent(invoker);\n\t\t}\n\n\t\tpublic Task Play(InvokerData invoker, PlaylistItem item)\n\t\t{\n\t\t\tif (item is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(item));\n\n\t\t\tif (item.AudioResource is null)\n\t\t\t\tthrow new Exception(\"Invalid playlist item\");\n\t\t\tplaylistManager.Clear();\n\t\t\tplaylistManager.Queue(item);\n\t\t\tplaylistManager.Index = 0;\n\t\t\treturn StartResource(invoker, item);\n\t\t}\n\n\t\tpublic Task Play(InvokerData invoker) => StartCurrent(invoker);\n\n\t\t/// <summary>Plays the passed <see cref=\"PlayResource\"/></summary>\n\t\t/// <param name=\"invoker\">The invoker of this resource. Used for responses and association.</param>\n\t\t/// <param name=\"play\">The associated resource type string to a factory.</param>\n\t\t/// <param name=\"meta\">Allows overriding certain settings for the resource.</param>\n\t\t/// <returns>Ok if successful, or an error message otherwise.</returns>\n\t\tpublic Task Play(InvokerData invoker, PlayResource play)\n\t\t{\n\t\t\tplaylistManager.Clear();\n\t\t\tplaylistManager.Queue(PlaylistItem.From(play));\n\t\t\tplaylistManager.Index = 0;\n\t\t\tstats.TrackSongLoad(play.AudioResource.AudioType, true, true);\n\t\t\treturn StartResource(invoker, play);\n\t\t}\n\n\t\tprivate async Task StartResource(InvokerData invoker, PlaylistItem item)\n\t\t{\n\t\t\tPlayResource playResource;\n\t\t\ttry { playResource = await resourceResolver.Load(item.AudioResource); }\n\t\t\tcatch\n\t\t\t{\n\t\t\t\tstats.TrackSongLoad(item.AudioResource.AudioType, false, false);\n\t\t\t\tthrow;\n\t\t\t}\n\t\t\tstats.TrackSongLoad(item.AudioResource.AudioType, true, false);\n\t\t\tawait StartResource(invoker, playResource.MergeMeta(item.PlayInfo));\n\t\t}\n\n\t\tprivate async Task StartResource(InvokerData invoker, PlayResource play)\n\t\t{\n\t\t\tvar sourceLink = resourceResolver.RestoreLink(play.AudioResource);\n\t\t\tvar playInfo = new PlayInfoEventArgs(invoker, play, sourceLink);\n\t\t\tawait BeforeResourceStarted.InvokeAsync(this, playInfo);\n\n\t\t\tif (string.IsNullOrWhiteSpace(play.PlayUri))\n\t\t\t{\n\t\t\t\tLog.Error(\"Internal resource error: link is empty (resource:{0})\", play);\n\t\t\t\tthrow Error.LocalStr(strings.error_playmgr_internal_error);\n\t\t\t}\n\n\t\t\tLog.Debug(\"AudioResource start: {0}\", play);\n\t\t\ttry { await playerConnection.Play(play); }\n\t\t\tcatch (AudioBotException ex)\n\t\t\t{\n\t\t\t\tLog.Error(\"Error return from player: {0}\", ex.Message);\n\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_playmgr_internal_error);\n\t\t\t}\n\n\t\t\tplayerConnection.Volume = Tools.Clamp(playerConnection.Volume, confBot.Audio.Volume.Min, confBot.Audio.Volume.Max);\n\t\t\tCurrentPlayData = playInfo; // TODO meta as readonly\n\t\t\tawait AfterResourceStarted.InvokeAsync(this, playInfo);\n\t\t}\n\n\t\tprivate async Task StartCurrent(InvokerData invoker, bool manually = true)\n\t\t{\n\t\t\tvar pli = playlistManager.Current;\n\t\t\tif (pli is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_playlist_is_empty);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait StartResource(invoker, pli);\n\t\t\t}\n\t\t\tcatch (AudioBotException ex)\n\t\t\t{\n\t\t\t\tLog.Warn(\"Skipping: {0} because {1}\", pli, ex.Message);\n\t\t\t\tawait Next(invoker, manually);\n\t\t\t}\n\t\t}\n\n\t\tpublic async Task Next(InvokerData invoker, bool manually = true)\n\t\t{\n\t\t\tPlaylistItem? pli = null;\n\t\t\tfor (int i = 0; i < 10; i++)\n\t\t\t{\n\t\t\t\tpli = playlistManager.Next(manually);\n\t\t\t\tif (pli is null) break;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tawait StartResource(invoker, pli);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcatch (AudioBotException ex) { Log.Warn(\"Skipping: {0} because {1}\", pli, ex.Message); }\n\t\t\t}\n\t\t\tif (pli is null)\n\t\t\t\tthrow Error.LocalStr(strings.info_playmgr_no_next_song);\n\t\t\telse\n\t\t\t\tthrow Error.LocalStr(string.Format(strings.error_playmgr_many_songs_failed, \"!next\"));\n\t\t}\n\n\t\tpublic async Task Previous(InvokerData invoker, bool manually = true)\n\t\t{\n\t\t\tPlaylistItem? pli = null;\n\t\t\tfor (int i = 0; i < 10; i++)\n\t\t\t{\n\t\t\t\tpli = playlistManager.Previous(manually);\n\t\t\t\tif (pli is null) break;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tawait StartResource(invoker, pli);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcatch (AudioBotException ex) { Log.Warn(\"Skipping: {0} because {1}\", pli, ex.Message); }\n\t\t\t}\n\t\t\tif (pli is null)\n\t\t\t\tthrow Error.LocalStr(strings.info_playmgr_no_previous_song);\n\t\t\telse\n\t\t\t\tthrow Error.LocalStr(string.Format(strings.error_playmgr_many_songs_failed, \"!previous\"));\n\t\t}\n\n\t\tpublic async Task SongStoppedEvent(object? sender, EventArgs e) => await StopInternal(true);\n\n\t\tpublic Task Stop() => StopInternal(false);\n\n\t\tprivate async Task StopInternal(bool songEndedByCallback)\n\t\t{\n\t\t\tawait ResourceStopped.InvokeAsync(this, new SongEndEventArgs(songEndedByCallback));\n\n\t\t\tif (songEndedByCallback)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tawait Next(CurrentPlayData?.Invoker ?? InvokerData.Anonymous, false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcatch (AudioBotException ex) { Log.Info(\"Song queue ended: {0}\", ex.Message); }\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tplayerConnection.Stop();\n\t\t\t}\n\n\t\t\tCurrentPlayData = null;\n\t\t\tPlaybackStopped?.Invoke(this, EventArgs.Empty);\n\t\t}\n\n\t\tpublic async Task Update(SongInfoChanged newInfo)\n\t\t{\n\t\t\tvar data = CurrentPlayData;\n\t\t\tif (data is null)\n\t\t\t\treturn;\n\t\t\tif (newInfo.Title != null)\n\t\t\t\tdata.ResourceData.ResourceTitle = newInfo.Title;\n\t\t\t// further properties...\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait OnResourceUpdated.InvokeAsync(this, data);\n\t\t\t}\n\t\t\tcatch (AudioBotException ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Error in OnResourceUpdated event.\");\n\t\t\t}\n\t\t}\n\n\t\tpublic static PlayInfo? ParseAttributes(string[] attrs)\n\t\t{\n\t\t\tif (attrs is null || attrs.Length == 0)\n\t\t\t\treturn null;\n\n\t\t\tvar meta = new PlayInfo();\n\t\t\tforeach (var attr in attrs)\n\t\t\t{\n\t\t\t\tif (attr.StartsWith(\"@\"))\n\t\t\t\t{\n\t\t\t\t\tmeta.StartOffset = TextUtil.ParseTime(attr.Substring(1));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn meta;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/Player.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.ResourceFactories;\nusing TSLib;\nusing TSLib.Audio;\nusing TSLib.Helper;\nusing TSLib.Scheduler;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic class Player : IDisposable\n\t{\n\t\tprivate const Codec SendCodec = Codec.OpusMusic;\n\t\tprivate readonly DedicatedTaskScheduler scheduler;\n\n\t\tpublic IPlayerSource? CurrentPlayerSource { get; private set; }\n\t\tpublic StallCheckPipe StallCheckPipe { get; }\n\t\tpublic VolumePipe VolumePipe { get; }\n\t\tpublic FfmpegProducer FfmpegProducer { get; }\n\t\tpublic PreciseTimedPipe TimePipe { get; }\n\t\tpublic PassiveMergePipe MergePipe { get; }\n\t\tpublic EncoderPipe EncoderPipe { get; }\n\t\tpublic IAudioPassiveConsumer? PlayerSink { get; private set; }\n\n\t\tpublic Player(ConfRoot confRoot, ConfBot config, DedicatedTaskScheduler scheduler, Id id)\n\t\t{\n\t\t\tthis.scheduler = scheduler;\n\n\t\t\tFfmpegProducer = new FfmpegProducer(confRoot.Tools.Ffmpeg, scheduler, id);\n\t\t\tStallCheckPipe = new StallCheckPipe();\n\t\t\tVolumePipe = new VolumePipe();\n\t\t\tVolume = config.Audio.Volume.Default;\n\t\t\tEncoderPipe = new EncoderPipe(SendCodec) { Bitrate = ScaleBitrate(config.Audio.Bitrate) };\n\t\t\tTimePipe = new PreciseTimedPipe(EncoderPipe, id) { ReadBufferSize = EncoderPipe.PacketSize };\n\t\t\tMergePipe = new PassiveMergePipe();\n\n\t\t\tconfig.Audio.Bitrate.Changed += (s, e) => EncoderPipe.Bitrate = ScaleBitrate(e.NewValue);\n\n\t\t\tMergePipe.Into(TimePipe).Chain<CheckActivePipe>().Chain(StallCheckPipe).Chain(VolumePipe).Chain(EncoderPipe);\n\t\t}\n\n\t\tpublic void SetTarget(IAudioPassiveConsumer target)\n\t\t{\n\t\t\tPlayerSink = target;\n\t\t\tEncoderPipe.Chain(target);\n\t\t}\n\n\t\tprivate static int ScaleBitrate(int value) => Tools.Clamp(value, 1, 255) * 1000;\n\n\t\tpublic event AsyncEventHandler? OnSongEnd;\n\t\tpublic event AsyncEventHandler<SongInfoChanged>? OnSongUpdated;\n\n\t\tprivate void TriggerSongEnd(object? o, EventArgs e) => scheduler.InvokeAsync(() => OnSongEnd.InvokeAsync(this, EventArgs.Empty));\n\t\tprivate void TriggerSongUpdated(object? o, SongInfoChanged e) => scheduler.InvokeAsync(() => OnSongUpdated.InvokeAsync(this, e));\n\n\t\tpublic async Task Play(PlayResource res)\n\t\t{\n\t\t\tif (res is MediaPlayResource mres && mres.IsIcyStream)\n\t\t\t\tawait FfmpegProducer.AudioStartIcy(res.PlayUri);\n\t\t\telse\n\t\t\t\tawait FfmpegProducer.AudioStart(res.PlayUri, res.PlayInfo?.StartOffset);\n\t\t\tPlay(FfmpegProducer);\n\t\t}\n\n\t\tpublic void Play(IPlayerSource source)\n\t\t{\n\t\t\tvar oldSource = CurrentPlayerSource;\n\t\t\tif (oldSource != source)\n\t\t\t{\n\t\t\t\t// Clean up old\n\t\t\t\tCleanSource(oldSource);\n\t\t\t\t// Set events\n\t\t\t\tsource.OnSongEnd += TriggerSongEnd;\n\t\t\t\tsource.OnSongUpdated += TriggerSongUpdated;\n\t\t\t\t// Update pipes\n\t\t\t\tMergePipe.Add(source);\n\t\t\t\tCurrentPlayerSource = source;\n\t\t\t}\n\t\t\t// Start Ticker\n\t\t\tTimePipe.AudioTimer.Reset();\n\t\t\tTimePipe.Paused = false;\n\t\t}\n\n\t\tprivate void CleanSource(IPlayerSource? source)\n\t\t{\n\t\t\tif (source is null)\n\t\t\t\treturn;\n\t\t\tsource.OnSongEnd -= TriggerSongEnd;\n\t\t\tsource.OnSongUpdated -= TriggerSongUpdated;\n\t\t\tMergePipe.Remove(source);\n\t\t\tsource.Dispose();\n\t\t}\n\n\t\tpublic void Stop()\n\t\t{\n\t\t\tCurrentPlayerSource?.Dispose();\n\t\t\tif (MergePipe.Count <= 1)\n\t\t\t\tTimePipe.Paused = true;\n\t\t}\n\n\t\tpublic void StopAll()\n\t\t{\n\t\t\tStop();\n\t\t\tTimePipe.Paused = true;\n\t\t\tMergePipe.Dispose();\n\t\t}\n\n\t\tpublic TimeSpan? Length => CurrentPlayerSource?.Length;\n\n\t\tpublic TimeSpan? Position => CurrentPlayerSource?.Position;\n\n\t\tpublic Task Seek(TimeSpan position) => CurrentPlayerSource?.Seek(position) ?? Task.CompletedTask;\n\n\t\tpublic float Volume\n\t\t{\n\t\t\tget => AudioValues.FactorToHumanVolume(VolumePipe.Volume);\n\t\t\tset => VolumePipe.Volume = AudioValues.HumanVolumeToFactor(value);\n\t\t}\n\n\t\tpublic bool Paused\n\t\t{\n\t\t\tget => TimePipe.Paused;\n\t\t\tset => TimePipe.Paused = value;\n\t\t}\n\n\t\t// Extras\n\n\t\tpublic void SetStall() => StallCheckPipe.SetStall();\n\n\t\t[Obsolete(AttributeStrings.UnderDevelopment)]\n\t\tpublic void MixInStreamOnce(IPlayerSource producer)\n\t\t{\n\t\t\tproducer.OnSongEnd += (s, e) =>\n\t\t\t{\n\t\t\t\tMergePipe.Remove(producer);\n\t\t\t\tproducer.Dispose();\n\t\t\t};\n\t\t\tMergePipe.Add(producer);\n\t\t\tTimePipe.Paused = false;\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tStopAll();\n\t\t\tCleanSource(CurrentPlayerSource);\n\t\t\tTimePipe.Dispose();\n\t\t\tFfmpegProducer.Dispose();\n\t\t\tEncoderPipe.Dispose();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/SongEndEventArgs.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic class SongEndEventArgs : EventArgs\n\t{\n\t\tpublic bool SongEndedByCallback { get; }\n\t\tpublic SongEndEventArgs(bool songEndedByCallback) { SongEndedByCallback = songEndedByCallback; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/SongInfoChanged.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic class SongInfoChanged : EventArgs\n\t{\n\t\tpublic string? Title { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/StallCheckPipe.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TSLib.Audio;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic class StallCheckPipe : IAudioPipe\n\t{\n\t\tprivate const uint StallCountInterval = 10;\n\t\tprivate const uint StallNoErrorCountMax = 5;\n\n\t\tpublic bool Active => OutStream?.Active ?? false;\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\n\t\tprivate bool isStall;\n\t\tprivate uint stallCount;\n\t\tprivate uint stallNoErrorCount;\n\n\t\tpublic StallCheckPipe()\n\t\t{\n\t\t\tisStall = false;\n\t\t\tstallCount = 0;\n\t\t}\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (OutStream is null) return;\n\n\t\t\tif (isStall)\n\t\t\t{\n\t\t\t\t// TODO maybe do time-cooldown instead of call-count-cooldown\n\t\t\t\tif (++stallCount % StallCountInterval == 0)\n\t\t\t\t{\n\t\t\t\t\tstallNoErrorCount++;\n\t\t\t\t\tif (stallNoErrorCount > StallNoErrorCountMax)\n\t\t\t\t\t{\n\t\t\t\t\t\tstallCount = 0;\n\t\t\t\t\t\tisStall = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tOutStream?.Write(data, meta);\n\t\t}\n\n\t\tpublic void SetStall()\n\t\t{\n\t\t\tstallNoErrorCount = 0;\n\t\t\tisStall = true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Audio/StreamAudioPlayerSource.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Threading.Tasks;\nusing TSLib.Audio;\n\nnamespace TS3AudioBot.Audio\n{\n\tpublic class StreamAudioPlayerSource : IPlayerSource, IAudioActiveConsumer\n\t{\n\t\tprivate bool hasFired = false;\n\n\t\tpublic IAudioPassiveProducer? InStream { get; set; }\n\t\tpublic TimeSpan? Length => null;\n\t\tpublic TimeSpan? Position => null;\n\n\t\tpublic event EventHandler? OnSongEnd;\n\t\tevent EventHandler<SongInfoChanged> IPlayerSource.OnSongUpdated { add { } remove { } }\n\n\t\tpublic StreamAudioPlayerSource() { }\n\n\t\tpublic StreamAudioPlayerSource(IAudioPassiveProducer stream) : this()\n\t\t{\n\t\t\tInStream = stream;\n\t\t}\n\n\t\tpublic int Read(byte[] buffer, int offset, int length, out Meta? meta)\n\t\t{\n\t\t\tvar stream = InStream;\n\t\t\tif (stream is null)\n\t\t\t{\n\t\t\t\tmeta = default;\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tvar read = stream.Read(buffer, offset, length, out meta);\n\t\t\tif (read == 0 && !hasFired)\n\t\t\t{\n\t\t\t\thasFired = true;\n\t\t\t\tOnSongEnd?.Invoke(this, EventArgs.Empty);\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn read;\n\t\t}\n\n\t\tpublic void Reset() => hasFired = false;\n\n\t\tpublic void Dispose() => InStream?.Dispose();\n\n\t\tpublic Task Seek(TimeSpan position) { throw new NotSupportedException(); }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Bot.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Algorithm;\nusing TS3AudioBot.Audio;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.CommandSystem.Text;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.Environment;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.History;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Playlists;\nusing TS3AudioBot.Plugins;\nusing TS3AudioBot.ResourceFactories;\nusing TS3AudioBot.Sessions;\nusing TSLib;\nusing TSLib.Full;\nusing TSLib.Helper;\nusing TSLib.Messages;\nusing TSLib.Scheduler;\n\nnamespace TS3AudioBot\n{\n\t/// <summary>Core class managing all bots and utility modules.</summary>\n\tpublic sealed class Bot\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tprivate readonly ConfBot config;\n\t\tprivate readonly TickWorker idleTickWorker;\n\n\t\tprivate bool isClosed;\n\t\tinternal BotInjector Injector { get; }\n\t\tinternal DedicatedTaskScheduler Scheduler { get; }\n\n\t\tpublic Id Id { get; }\n\t\t/// <summary>This is the template name. Can be null.</summary>\n\t\tpublic string? Name => config.Name;\n\t\tpublic bool QuizMode { get; set; }\n\n\t\tprivate readonly ResolveContext resourceResolver;\n\t\tprivate readonly Ts3Client ts3client;\n\t\tprivate readonly TsFullClient ts3FullClient;\n\t\tprivate readonly SessionManager sessionManager;\n\t\tprivate readonly PlayManager playManager;\n\t\tprivate readonly IVoiceTarget targetManager;\n\t\tprivate readonly Player player;\n\t\tprivate readonly Stats stats;\n\t\tprivate readonly LocalizationManager localization;\n\n\t\tpublic Bot(Id id, ConfBot config, BotInjector injector)\n\t\t{\n\t\t\tthis.Id = id;\n\t\t\tthis.config = config;\n\t\t\tthis.Injector = injector;\n\n\t\t\t// Registering config changes\n\t\t\tconfig.Language.Changed += async (s, e) =>\n\t\t\t{\n\t\t\t\tvar langResult = await localization.LoadLanguage(e.NewValue, true);\n\t\t\t\tif (!langResult.Ok)\n\t\t\t\t\tLog.Error(\"Failed to load language file ({0})\", langResult.Error);\n\t\t\t};\n\t\t\tconfig.Events.IdleDelay.Changed += (s, e) => EnableIdleTickWorker();\n\t\t\tconfig.Events.OnIdle.Changed += (s, e) => EnableIdleTickWorker();\n\n\t\t\tvar builder = new DependencyBuilder(Injector);\n\t\t\tInjector.HideParentModule<CommandManager>();\n\t\t\tInjector.HideParentModule<DedicatedTaskScheduler>();\n\t\t\tInjector.AddModule(this);\n\t\t\tInjector.AddModule(config);\n\t\t\tInjector.AddModule(Injector);\n\t\t\tInjector.AddModule(config.Playlists);\n\t\t\tInjector.AddModule(config.History);\n\t\t\tInjector.AddModule(Id);\n\t\t\tbuilder.RequestModule<PlaylistIO>();\n\t\t\tbuilder.RequestModule<PlaylistManager>();\n\t\t\tbuilder.RequestModule<DedicatedTaskScheduler>();\n\t\t\tbuilder.RequestModule<TsFullClient>();\n\t\t\tbuilder.RequestModule<TsBaseFunctions, TsFullClient>();\n\t\t\tbuilder.RequestModule<Ts3Client>();\n\t\t\tbuilder.RequestModule<Player>();\n\t\t\tbuilder.RequestModule<CustomTargetPipe>();\n\t\t\tbuilder.RequestModule<IVoiceTarget, CustomTargetPipe>();\n\t\t\tbuilder.RequestModule<SessionManager>();\n\t\t\tbuilder.RequestModule<ResolveContext>();\n\t\t\tbuilder.RequestModule<CommandManager>();\n\t\t\tbuilder.RequestModule<LocalizationManager>();\n\t\t\tif (config.History.Enabled)\n\t\t\t{\n\t\t\t\tbuilder.RequestModule<HistoryManager>();\n\t\t\t}\n\t\t\tbuilder.RequestModule<PlayManager>();\n\n\t\t\tif (!builder.Build())\n\t\t\t{\n\t\t\t\tLog.Error(\"Missing bot module dependency\");\n\t\t\t\tthrow new Exception(\"Could not load all bot modules\");\n\t\t\t}\n\t\t\tInjector.ClearHiddenParentModules();\n\n\t\t\tresourceResolver = Injector.GetModuleOrThrow<ResolveContext>();\n\t\t\tts3FullClient = Injector.GetModuleOrThrow<TsFullClient>();\n\t\t\tts3client = Injector.GetModuleOrThrow<Ts3Client>();\n\t\t\tplayer = Injector.GetModuleOrThrow<Player>();\n\t\t\tScheduler = Injector.GetModuleOrThrow<DedicatedTaskScheduler>();\n\t\t\tvar customTarget = Injector.GetModuleOrThrow<CustomTargetPipe>();\n\t\t\tplayer.SetTarget(customTarget);\n\t\t\tInjector.AddModule(ts3FullClient.Book);\n\t\t\tplayManager = Injector.GetModuleOrThrow<PlayManager>();\n\t\t\ttargetManager = Injector.GetModuleOrThrow<IVoiceTarget>();\n\t\t\tsessionManager = Injector.GetModuleOrThrow<SessionManager>();\n\t\t\tstats = Injector.GetModuleOrThrow<Stats>();\n\t\t\tvar commandManager = Injector.GetModuleOrThrow<CommandManager>();\n\t\t\tlocalization = Injector.GetModuleOrThrow<LocalizationManager>();\n\n\t\t\tidleTickWorker = Scheduler.Invoke(() => Scheduler.CreateTimer(OnIdle, TimeSpan.MaxValue, false)).Result;\n\n\t\t\tplayer.OnSongEnd += playManager.SongStoppedEvent;\n\t\t\tplayer.OnSongUpdated += (s, e) => playManager.Update(e);\n\t\t\t// Update idle status events\n\t\t\tplayManager.BeforeResourceStarted += (s, e) => { DisableIdleTickWorker(); return Task.CompletedTask; };\n\t\t\tplayManager.PlaybackStopped += (s, e) => { EnableIdleTickWorker(); return Task.CompletedTask; };\n\t\t\t// Used for custom scripts, like voice_mode, onsongstart\n\t\t\tplayManager.BeforeResourceStarted += BeforeResourceStarted;\n\t\t\tplayManager.AfterResourceStarted += AfterResourceStarted;\n\t\t\t// Update the own status text to the current song title\n\t\t\tplayManager.AfterResourceStarted += (s, e) => UpdateBotStatus();\n\t\t\tplayManager.PlaybackStopped += (s, e) => UpdateBotStatus();\n\t\t\tplayManager.OnResourceUpdated += (s, e) => UpdateBotStatus();\n\t\t\t// Log our resource in the history\n\t\t\tif (Injector.TryGet<HistoryManager>(out var historyManager))\n\t\t\t\tplayManager.AfterResourceStarted += (s, e) =>\n\t\t\t\t{\n\t\t\t\t\tif (e.PlayInfo != null)\n\t\t\t\t\t\thistoryManager.LogAudioResource(new HistorySaveData(e.PlayResource.AudioResource, e.PlayInfo.ResourceOwnerUid));\n\t\t\t\t\treturn Task.CompletedTask;\n\t\t\t\t};\n\t\t\t// Update our thumbnail\n\t\t\tplayManager.AfterResourceStarted += (s, e) => GenerateStatusImage(true, e);\n\t\t\tplayManager.PlaybackStopped += (s, e) => GenerateStatusImage(false, null);\n\t\t\t// Stats\n\t\t\tplayManager.AfterResourceStarted += (s, e) => { stats.TrackSongStart(Id, e.ResourceData.AudioType); return Task.CompletedTask; };\n\t\t\tplayManager.ResourceStopped += (s, e) => { stats.TrackSongStop(Id); return Task.CompletedTask; };\n\t\t\t// Register callback for all messages happening\n\t\t\tts3client.OnMessageReceived += OnMessageReceived;\n\t\t\t// Register callback to remove open private sessions, when user disconnects\n\t\t\tts3FullClient.OnEachClientLeftView += OnClientLeftView;\n\t\t\tts3client.OnBotConnected += OnBotConnected;\n\t\t\tts3client.OnBotDisconnected += OnBotDisconnected;\n\t\t\tts3client.OnBotStoppedReconnecting += OnBotStoppedReconnecting;\n\t\t\t// Alone mode\n\t\t\tts3client.OnAloneChanged += OnAloneChanged;\n\t\t\tts3client.OnAloneChanged += (s, e) => { customTarget.Alone = e.Alone; return Task.CompletedTask; };\n\t\t\t// Whisper stall\n\t\t\tts3client.OnWhisperNoTarget += (s, e) => player.SetStall();\n\n\t\t\tcommandManager.RegisterCollection(MainCommands.Bag);\n\t\t\t// TODO remove after plugin rework\n\t\t\tvar pluginManager = Injector.GetModuleOrThrow<PluginManager>();\n\t\t\tforeach (var plugin in pluginManager.Plugins)\n\t\t\t\tif (plugin.Type == PluginType.CorePlugin || plugin.Type == PluginType.Commands)\n\t\t\t\t\tcommandManager.RegisterCollection(plugin.CorePlugin.Bag);\n\t\t\t// Restore all alias from the config\n\t\t\tforeach (var alias in config.Commands.Alias.GetAllItems())\n\t\t\t\tcommandManager.RegisterAlias(alias.Key, alias.Value).UnwrapToLog(Log);\n\t\t}\n\n\t\tpublic Task<E<string>> Run()\n\t\t{\n\t\t\tScheduler.VerifyOwnThread();\n\n\t\t\tLog.Info(\"Bot \\\"{0}\\\" connecting to \\\"{1}\\\"\", config.Name, config.Connect.Address);\n\t\t\treturn Task.FromResult(ts3client.Connect());\n\t\t}\n\n\t\tpublic async Task Stop()\n\t\t{\n\t\t\tScheduler.VerifyOwnThread();\n\n\t\t\tInjector.GetModule<BotManager>()?.RemoveBot(this);\n\n\t\t\tif (!isClosed) isClosed = true;\n\t\t\telse return;\n\n\t\t\tLog.Info(\"Bot ({0}) disconnecting.\", Id);\n\n\t\t\tDisableIdleTickWorker();\n\n\t\t\tInjector.GetModule<PluginManager>()?.StopPlugins(this);\n\t\t\tInjector.GetModule<PlayManager>()?.Stop();\n\t\t\tInjector.GetModule<Player>()?.Dispose();\n\t\t\tvar tsClient = Injector.GetModule<Ts3Client>();\n\t\t\tif (tsClient != null)\n\t\t\t\tawait tsClient.Disconnect();\n\t\t\tInjector.GetModule<DedicatedTaskScheduler>()?.Dispose();\n\t\t\tconfig.ClearEvents();\n\t\t}\n\n\t\tprivate async Task OnBotConnected(object? sender, EventArgs e)\n\t\t{\n\t\t\tEnableIdleTickWorker();\n\n\t\t\tvar badges = config.Connect.Badges.Value;\n\t\t\tif (!string.IsNullOrEmpty(badges))\n\t\t\t\tts3client?.ChangeBadges(badges);\n\n\t\t\tvar onStart = config.Events.OnConnect.Value;\n\t\t\tif (!string.IsNullOrEmpty(onStart))\n\t\t\t{\n\t\t\t\tvar info = CreateExecInfo();\n\t\t\t\tawait CallScript(info, onStart, false, true);\n\t\t\t}\n\t\t}\n\n\t\tprivate async Task OnBotDisconnected(object? sender, DisconnectEventArgs e)\n\t\t{\n\t\t\tDisableIdleTickWorker();\n\n\t\t\tvar onStop = config.Events.OnDisconnect.Value;\n\t\t\tif (!string.IsNullOrEmpty(onStop))\n\t\t\t{\n\t\t\t\tvar info = CreateExecInfo();\n\t\t\t\tawait CallScript(info, onStop, false, true);\n\t\t\t}\n\t\t}\n\n\t\tprivate Task OnBotStoppedReconnecting(object? sender, EventArgs e)\n\t\t{\n\t\t\treturn Stop();\n\t\t}\n\n\t\tprivate async Task OnMessageReceived(object? sender, TextMessage textMessage)\n\t\t{\n\t\t\tif (textMessage?.Message == null)\n\t\t\t{\n\t\t\t\tLog.Warn(\"Invalid TextMessage: {@textMessage}\", textMessage);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tLog.Debug(\"TextMessage: {@textMessage}\", textMessage);\n\n\t\t\tif (!localization.LanguageLoaded)\n\t\t\t{\n\t\t\t\tvar langResult = await localization.LoadLanguage(config.Language, false);\n\t\t\t\tif (!langResult.Ok)\n\t\t\t\t\tLog.Error(\"Failed to load language file ({0})\", langResult.Error);\n\t\t\t}\n\t\t\tlocalization.ApplyLanguage();\n\n\t\t\ttextMessage.Message = textMessage.Message.TrimStart(' ');\n\t\t\tif (!textMessage.Message.StartsWith(\"!\", StringComparison.Ordinal))\n\t\t\t\treturn;\n\n\t\t\tLog.Info(\"User {0} requested: {1}\", textMessage.InvokerName, textMessage.Message);\n\n\t\t\tts3client.InvalidateClientBuffer();\n\n\t\t\tChannelId? channelId = null;\n\t\t\tClientDbId? databaseId = null;\n\t\t\tChannelGroupId? channelGroup = null;\n\t\t\tServerGroupId[]? serverGroups = null;\n\n\t\t\tif (ts3FullClient.Book.Clients.TryGetValue(textMessage.InvokerId, out var bookClient))\n\t\t\t{\n\t\t\t\tchannelId = bookClient.Channel;\n\t\t\t\tdatabaseId = bookClient.DatabaseId;\n\t\t\t\tserverGroups = bookClient.ServerGroups.ToArray();\n\t\t\t\tchannelGroup = bookClient.ChannelGroup;\n\t\t\t}\n\t\t\telse if ((await ts3FullClient.ClientInfo(textMessage.InvokerId)).Get(out var infoClient, out var infoClientError))\n\t\t\t{\n\t\t\t\tchannelId = infoClient.ChannelId;\n\t\t\t\tdatabaseId = infoClient.DatabaseId;\n\t\t\t\tserverGroups = infoClient.ServerGroups;\n\t\t\t\tchannelGroup = infoClient.ChannelGroup;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar cachedClient = await ts3client.GetCachedClientById(textMessage.InvokerId);\n\t\t\t\t\tchannelId = cachedClient.ChannelId;\n\t\t\t\t\tdatabaseId = cachedClient.DatabaseId;\n\t\t\t\t\tchannelGroup = cachedClient.ChannelGroup;\n\t\t\t\t}\n\t\t\t\tcatch (AudioBotException cachedClientError)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(\n\t\t\t\t\t\t\"The bot is missing teamspeak permissions to view the communicating client. \" +\n\t\t\t\t\t\t\"Some commands or permission checks might not work \" +\n\t\t\t\t\t\t\"(clientlist:{0}, clientinfo:{1}).\",\n\t\t\t\t\t\tcachedClientError.Message, infoClientError.ErrorFormat());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar invoker = new ClientCall(textMessage.InvokerUid ?? Uid.Anonymous, textMessage.Message,\n\t\t\t\tclientId: textMessage.InvokerId,\n\t\t\t\tvisibiliy: textMessage.Target,\n\t\t\t\tnickName: textMessage.InvokerName,\n\t\t\t\tchannelId: channelId,\n\t\t\t\tdatabaseId: databaseId,\n\t\t\t\tserverGroups: serverGroups,\n\t\t\t\tchannelGroup: channelGroup);\n\n\t\t\tvar session = sessionManager.GetOrCreateSession(textMessage.InvokerId);\n\t\t\tvar info = CreateExecInfo(invoker, session);\n\n\t\t\t// check if the user has an open request\n\t\t\tif (session.ResponseProcessor != null)\n\t\t\t{\n\t\t\t\tawait TryCatchCommand(info, answer: true, async () =>\n\t\t\t\t{\n\t\t\t\t\tvar msg = await session.ResponseProcessor(textMessage.Message);\n\t\t\t\t\tif (!string.IsNullOrEmpty(msg))\n\t\t\t\t\t\tawait info.Write(msg).CatchToLog(Log);\n\t\t\t\t});\n\t\t\t\tsession.ClearResponse();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait CallScript(info, textMessage.Message, answer: true, false);\n\t\t}\n\n\t\tprivate void OnClientLeftView(object? sender, ClientLeftView eventArgs)\n\t\t{\n\t\t\ttargetManager.WhisperClientUnsubscribe(eventArgs.ClientId);\n\t\t\tsessionManager.RemoveSession(eventArgs.ClientId);\n\t\t}\n\n\t\tprivate async Task BeforeResourceStarted(object? sender, PlayInfoEventArgs e)\n\t\t{\n\t\t\tconst string DefaultVoiceScript = \"!whisper off\";\n\t\t\tconst string DefaultWhisperScript = \"!xecute (!whisper subscription) (!unsubscribe temporary) (!subscribe channeltemp (!getmy channel))\";\n\n\t\t\tvar mode = config.Audio.SendMode.Value;\n\t\t\tstring script;\n\t\t\tif (mode.StartsWith(\"!\", StringComparison.Ordinal))\n\t\t\t\tscript = mode;\n\t\t\telse if (mode.Equals(\"voice\", StringComparison.OrdinalIgnoreCase))\n\t\t\t\tscript = DefaultVoiceScript;\n\t\t\telse if (mode.Equals(\"whisper\", StringComparison.OrdinalIgnoreCase))\n\t\t\t\tscript = DefaultWhisperScript;\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.Error(\"Invalid voice mode\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar info = CreateExecInfo(e.Invoker);\n\t\t\tawait CallScript(info, script, false, true);\n\t\t}\n\n\t\tprivate async Task AfterResourceStarted(object? sender, PlayInfoEventArgs e)\n\t\t{\n\t\t\tvar onSongStart = config.Events.OnSongStart.Value;\n\t\t\tif (!string.IsNullOrEmpty(onSongStart))\n\t\t\t{\n\t\t\t\tvar info = CreateExecInfo();\n\t\t\t\tawait CallScript(info, onSongStart, false, true);\n\t\t\t}\n\t\t}\n\n\t\t#region Status: Description, Avatar\n\n\t\tpublic Task UpdateBotStatus()\n\t\t{\n\t\t\treturn Scheduler.InvokeAsync(UpdateBotStatusInternal);\n\t\t}\n\n\t\tprivate async Task UpdateBotStatusInternal()\n\t\t{\n\t\t\tScheduler.VerifyOwnThread();\n\n\t\t\tif (isClosed)\n\t\t\t\treturn;\n\n\t\t\tif (!config.SetStatusDescription)\n\t\t\t\treturn;\n\n\t\t\tstring? setString;\n\t\t\tif (playManager.IsPlaying)\n\t\t\t{\n\t\t\t\tsetString = QuizMode\n\t\t\t\t\t? strings.info_botstatus_quiztime\n\t\t\t\t\t: playManager.CurrentPlayData?.ResourceData?.ResourceTitle;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsetString = strings.info_botstatus_sleeping;\n\t\t\t}\n\t\t}\n\n\t\tpublic Task GenerateStatusImage(bool playing, PlayInfoEventArgs? startEvent)\n\t\t{\n\t\t\treturn Scheduler.InvokeAsync(() => GenerateStatusImageInternal(playing, startEvent));\n\t\t}\n\n\t\tprivate async Task GenerateStatusImageInternal(bool playing, PlayInfoEventArgs? startEvent)\n\t\t{\n\t\t\tScheduler.VerifyOwnThread();\n\n\t\t\tif (!config.GenerateStatusAvatar || isClosed)\n\t\t\t\treturn;\n\n\t\t\tstatic Stream? GetRandomFile(string? basePath, string prefix)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (string.IsNullOrEmpty(basePath))\n\t\t\t\t\t\treturn null;\n\t\t\t\t\tvar avatarPath = new DirectoryInfo(Path.Combine(basePath, BotPaths.Avatars));\n\t\t\t\t\tif (!avatarPath.Exists)\n\t\t\t\t\t\treturn null;\n\t\t\t\t\tvar avatars = avatarPath.EnumerateFiles(prefix).ToArray();\n\t\t\t\t\tif (avatars.Length == 0)\n\t\t\t\t\t\treturn null;\n\t\t\t\t\tvar pickedAvatar = Tools.PickRandom(avatars);\n\t\t\t\t\treturn pickedAvatar.Open(FileMode.Open, FileAccess.Read, FileShare.Read);\n\t\t\t\t}\n\t\t\t\tcatch (Exception ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(ex, \"Failed to load local avatar\");\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tStream? setStream = null;\n\t\t\tif (playing)\n\t\t\t{\n\t\t\t\tif (startEvent != null && !QuizMode)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tawait resourceResolver.GetThumbnail(startEvent.PlayResource,\n\t\t\t\t\t\t\tasync thumbStream => setStream = (await ImageUtil.ResizeImageSave(thumbStream)).Stream);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (AudioBotException ex) { Log.Debug(ex, \"Failed to fetch thumbnail image\"); }\n\t\t\t\t}\n\t\t\t\tsetStream ??= GetRandomFile(config.LocalConfigDir, \"play*\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsetStream ??= GetRandomFile(config.LocalConfigDir, \"sleep*\");\n\t\t\t\tsetStream ??= Util.GetEmbeddedFile(\"TS3AudioBot.Media.SleepingKitty.png\");\n\t\t\t\tvar result = await ts3FullClient.UploadAvatar(setStream);\n\t\t\t\tresult.UnwrapToLog(Log);\n\t\t\t}\n\n\t\t\tif (setStream != null)\n\t\t\t{\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar result = await ts3FullClient.DeleteAvatar();\n\t\t\t\tresult.UnwrapToLog(Log);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\t#region Script Execution\n\n\t\tprivate async Task CallScript(ExecutionInformation info, string command, bool answer, bool skipRights)\n\t\t{\n\t\t\tLog.Debug(\"Calling script (skipRights:{0}, answer:{1}): {2}\", skipRights, answer, command);\n\t\t\tstats.TrackCommandCall(answer);\n\n\t\t\tinfo.AddModule(new CallerInfo(false)\n\t\t\t{\n\t\t\t\tSkipRightsChecks = skipRights,\n\t\t\t\tCommandComplexityMax = config.Commands.CommandComplexity,\n\t\t\t\tIsColor = config.Commands.Color,\n\t\t\t});\n\n\t\t\tawait TryCatchCommand(info, answer, async () =>\n\t\t\t{\n\t\t\t\t// parse and execute the command\n\t\t\t\tvar res = await CommandManager.Execute(info, command);\n\n\t\t\t\tif (!answer)\n\t\t\t\t\treturn;\n\n\t\t\t\t// Write result to user\n\t\t\t\tvar s = res.AsString();\n\t\t\t\tif (!string.IsNullOrEmpty(s))\n\t\t\t\t\tawait info.Write(s).CatchToLog(Log);\n\t\t\t});\n\t\t}\n\n\t\tprivate ExecutionInformation CreateExecInfo(InvokerData? invoker = null, UserSession? session = null)\n\t\t{\n\t\t\tvar info = new ExecutionInformation(Injector);\n\t\t\tif (invoker is ClientCall ci)\n\t\t\t\tinfo.AddModule(ci);\n\t\t\tinfo.AddModule(invoker ?? InvokerData.Anonymous);\n\t\t\tinfo.AddModule(session ?? new AnonymousSession());\n\t\t\tinfo.AddModule(Filter.GetFilterByNameOrDefault(config.Commands.Matcher));\n\t\t\treturn info;\n\t\t}\n\n\t\tprivate async Task TryCatchCommand(ExecutionInformation info, bool answer, Func<Task> action)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait action.Invoke();\n\t\t\t}\n\t\t\tcatch (AudioBotException ex)\n\t\t\t{\n\t\t\t\tNLog.LogLevel commandErrorLevel = answer ? NLog.LogLevel.Debug : NLog.LogLevel.Warn;\n\t\t\t\tLog.Log(commandErrorLevel, ex, \"Command Error ({0})\", ex.Message);\n\t\t\t\tif (answer)\n\t\t\t\t{\n\t\t\t\t\tawait info.Write(TextMod.Format(config.Commands.Color, strings.error_call_error.Mod().Color(Color.Red).Bold(), ex.Message))\n\t\t\t\t\t\t.CatchToLog(Log);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Unexpected command error: {0}\", ex.Message);\n\t\t\t\tif (answer)\n\t\t\t\t{\n\t\t\t\t\tawait info.Write(TextMod.Format(config.Commands.Color, strings.error_call_unexpected_error.Mod().Color(Color.Red).Bold(), ex.Message))\n\t\t\t\t\t\t.CatchToLog(Log);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\t#region Event: Idle\n\n\t\tprivate async void OnIdle()\n\t\t{\n\t\t\t// DisableIdleTickWorker(); // fire once only ??\n\n\t\t\tvar onIdle = config.Events.OnIdle.Value;\n\t\t\tif (!string.IsNullOrEmpty(onIdle))\n\t\t\t{\n\t\t\t\tvar info = CreateExecInfo();\n\t\t\t\tawait CallScript(info, onIdle, false, true);\n\t\t\t}\n\t\t}\n\n\t\tprivate void EnableIdleTickWorker()\n\t\t{\n\t\t\tvar idleTime = config.Events.IdleDelay.Value;\n\t\t\tif (idleTime <= TimeSpan.Zero || string.IsNullOrEmpty(config.Events.OnIdle.Value))\n\t\t\t{\n\t\t\t\tDisableIdleTickWorker();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tidleTickWorker.Interval = idleTime;\n\t\t\tidleTickWorker.Enable();\n\t\t}\n\n\t\tprivate void DisableIdleTickWorker() => idleTickWorker.Disable();\n\n\t\t#endregion\n\n\t\t#region Event: Alone/Party\n\n\t\tprivate async Task OnAloneChanged(object? sender, AloneChanged e)\n\t\t{\n\t\t\tScheduler.VerifyOwnThread();\n\n\t\t\tstring script;\n\t\t\tTimeSpan delay;\n\t\t\tif (e.Alone)\n\t\t\t{\n\t\t\t\tscript = config.Events.OnAlone.Value;\n\t\t\t\tdelay = config.Events.AloneDelay.Value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tscript = config.Events.OnParty.Value;\n\t\t\t\tdelay = config.Events.PartyDelay.Value;\n\t\t\t}\n\t\t\tif (string.IsNullOrEmpty(script))\n\t\t\t\treturn;\n\n\t\t\tif (delay > TimeSpan.Zero) // TODO: Async (Add cancellation token for better consistency)\n\t\t\t\tawait Task.Delay(delay);\n\n\t\t\tvar info = CreateExecInfo();\n\t\t\tawait CallScript(info, script, false, true);\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic BotInfo GetInfo() => new BotInfo\n\t\t{\n\t\t\tId = Id,\n\t\t\tName = config.Name,\n\t\t\tServer = ts3FullClient.ConnectionData?.Address,\n\t\t\tStatus = ts3FullClient.Connected ? BotStatus.Connected : BotStatus.Connecting,\n\t\t};\n\t}\n\n\tpublic class BotInfo\n\t{\n\t\tpublic int? Id { get; set; }\n\t\tpublic string? Name { get; set; }\n\t\tpublic string? Server { get; set; }\n\t\tpublic BotStatus Status { get; set; }\n\n\t\tpublic override string ToString() => $\"Id: {Id} Name: {Name} Server: {Server} Status: {Status}\"; // LOC: TODO\n\t}\n\n\tpublic enum BotStatus\n\t{\n\t\tOffline,\n\t\tConnecting,\n\t\tConnected,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/BotManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.Helper;\nusing TSLib;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot\n{\n\tpublic class BotManager\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tprivate List<Bot?>? activeBots = new List<Bot?>();\n\t\tprivate readonly object lockObj = new object();\n\n\t\tprivate readonly ConfRoot confRoot;\n\t\tprivate readonly CoreInjector coreInjector;\n\n\t\tpublic BotManager(ConfRoot confRoot, CoreInjector coreInjector)\n\t\t{\n\t\t\tthis.confRoot = confRoot;\n\t\t\tthis.coreInjector = coreInjector;\n\t\t}\n\n\t\tpublic async Task RunBots(bool interactive)\n\t\t{\n\t\t\tvar botConfigList = confRoot.GetAllBots();\n\t\t\tif (botConfigList is null)\n\t\t\t\treturn;\n\n\t\t\tif (botConfigList.Length == 0)\n\t\t\t{\n\t\t\t\tif (!interactive)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(\"No bots are configured in the load list.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tConsole.WriteLine(\"It seems like there are no bots configured.\");\n\t\t\t\tConsole.WriteLine(\"Fill out this quick setup to get started.\");\n\n\t\t\t\tvar newBot = CreateNewBot();\n\t\t\t\tnewBot.Run.Value = true;\n\n\t\t\t\tvar address = await Interactive.LoopActionAsync(\"Please enter the ip, domain or nickname (with port; default: 9987) where to connect to:\", async addr =>\n\t\t\t\t{\n\t\t\t\t\tif (await TsDnsResolver.TryResolve(addr) != null)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tConsole.WriteLine(\"The address seems invalid or could not be resolved, continue anyway? [y/N]\");\n\t\t\t\t\treturn Interactive.UserAgree(defaultTo: false);\n\t\t\t\t});\n\t\t\t\tif (address is null)\n\t\t\t\t\treturn;\n\t\t\t\tnewBot.Connect.Address.Value = address;\n\t\t\t\tConsole.WriteLine(\"Please enter the server password (or leave empty for none):\");\n\t\t\t\tnewBot.Connect.ServerPassword.Password.Value = Console.ReadLine();\n\n\t\t\t\tif (!newBot.SaveNew(ConfigHelper.DefaultBotName))\n\t\t\t\t{\n\t\t\t\t\tLog.Error(\"Could not save new bot. Ensure that the bot has access to the directory.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!confRoot.Save())\n\t\t\t\t\tLog.Error(\"Could not save root config. The bot won't start by default.\");\n\n\t\t\t\tvar runResult = await RunBot(newBot);\n\t\t\t\tif (!runResult.Ok)\n\t\t\t\t\tLog.Error(\"Could not run bot ({0})\", runResult.Error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar launchBotTasks = new List<Task<R<BotInfo, string>>>(botConfigList.Length);\n\t\t\tforeach (var instance in botConfigList)\n\t\t\t{\n\t\t\t\tif (!instance.Run)\n\t\t\t\t\tcontinue;\n\t\t\t\tlaunchBotTasks.Add(RunBot(instance).ContinueWith(async t =>\n\t\t\t\t{\n\t\t\t\t\tvar result = await t;\n\t\t\t\t\tif (!result.Ok)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Error(\"Could not instantiate bot: {0}\", result.Error);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}).Unwrap());\n\t\t\t}\n\t\t\tawait Task.WhenAll(launchBotTasks);\n\t\t}\n\n\t\tpublic ConfBot CreateNewBot() => confRoot.CreateBot();\n\n\t\tpublic Task<R<BotInfo, string>> CreateAndRunNewBot()\n\t\t{\n\t\t\tvar botConf = CreateNewBot();\n\t\t\treturn RunBot(botConf);\n\t\t}\n\n\t\tpublic async Task<R<BotInfo, string>> RunBotTemplate(string name)\n\t\t{\n\t\t\tvar config = confRoot.GetBotConfig(name);\n\t\t\tif (!config.Ok)\n\t\t\t\treturn config.Error.Message;\n\t\t\treturn await RunBot(config.Value);\n\t\t}\n\n\t\tpublic async Task<R<BotInfo, string>> RunBot(ConfBot config)\n\t\t{\n\t\t\tvar (bot, info) = InstantiateNewBot(config);\n\t\t\tif (info != null)\n\t\t\t\treturn info;\n\n\t\t\tif (bot is null)\n\t\t\t\treturn \"Failed to create new Bot\";\n\n\t\t\treturn await bot.Scheduler.InvokeAsync<R<BotInfo, string>>(async () =>\n\t\t\t{\n\t\t\t\tvar initializeResult = await bot.Run();\n\t\t\t\tif (!initializeResult.Ok)\n\t\t\t\t{\n\t\t\t\t\tawait StopBot(bot);\n\t\t\t\t\treturn $\"Bot failed to initialize ({initializeResult.Error})\";\n\t\t\t\t}\n\t\t\t\treturn bot.GetInfo();\n\t\t\t});\n\t\t}\n\n\t\tprivate (Bot? bot, BotInfo? info) InstantiateNewBot(ConfBot config)\n\t\t{\n\t\t\tlock (lockObj)\n\t\t\t{\n\t\t\t\tif (!string.IsNullOrEmpty(config.Name))\n\t\t\t\t{\n\t\t\t\t\tvar maybeBot = GetBotSave(config.Name);\n\t\t\t\t\tif (maybeBot != null)\n\t\t\t\t\t\treturn (null, maybeBot.GetInfo());\n\t\t\t\t}\n\n\t\t\t\tvar id = GetFreeId();\n\t\t\t\tif (id == null)\n\t\t\t\t\treturn (null, null); // \"BotManager is shutting down\"\n\n\t\t\t\tvar botInjector = new BotInjector(coreInjector);\n\t\t\t\tbotInjector.AddModule(botInjector);\n\t\t\t\tbotInjector.AddModule(new Id(id.Value));\n\t\t\t\tbotInjector.AddModule(config);\n\t\t\t\tif (!botInjector.TryCreate<Bot>(out var bot))\n\t\t\t\t\treturn (null, null); // \"Failed to create new Bot\"\n\t\t\t\tInsertBot(bot);\n\t\t\t\treturn (bot, null);\n\t\t\t}\n\t\t}\n\n\t\t// !! This method must be called with a lock on lockObj\n\t\tprivate void InsertBot(Bot bot)\n\t\t{\n\t\t\tif (activeBots is null)\n\t\t\t\treturn;\n\t\t\tactiveBots[bot.Id] = bot;\n\t\t}\n\n\t\t// !! This method must be called with a lock on lockObj\n\t\t// !! The id must be either used withing the same lock or considered invalid.\n\t\tprivate int? GetFreeId()\n\t\t{\n\t\t\tif (activeBots is null)\n\t\t\t\treturn null;\n\n\t\t\tfor (int i = 0; i < activeBots.Count; i++)\n\t\t\t{\n\t\t\t\tif (activeBots[i] is null)\n\t\t\t\t{\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// All slots are full, get a new slot\n\t\t\tactiveBots.Add(null);\n\t\t\treturn activeBots.Count - 1;\n\t\t}\n\n\t\t// !! This method must be called with a lock on lockObj\n\t\tprivate Bot? GetBotSave(int id)\n\t\t{\n\t\t\tif (activeBots is null || id < 0 || id >= activeBots.Count)\n\t\t\t\treturn null;\n\t\t\treturn activeBots[id];\n\t\t}\n\n\t\t// !! This method must be called with a lock on lockObj\n\t\tprivate Bot? GetBotSave(string name)\n\t\t{\n\t\t\tif (name is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(name));\n\t\t\tif (activeBots is null)\n\t\t\t\treturn null;\n\t\t\treturn activeBots.Find(x => x?.Name == name);\n\t\t}\n\n\t\tpublic Bot? GetBotLock(int id)\n\t\t{\n\t\t\tBot? bot;\n\t\t\tlock (lockObj)\n\t\t\t{\n\t\t\t\tbot = GetBotSave(id);\n\t\t\t\tif (bot is null)\n\t\t\t\t\treturn null;\n\t\t\t\tif (bot.Id != id)\n\t\t\t\t\tthrow new Exception(\"Got not matching bot id\");\n\t\t\t}\n\t\t\treturn bot;\n\t\t}\n\n\t\tpublic Bot? GetBotLock(string name)\n\t\t{\n\t\t\tBot? bot;\n\t\t\tlock (lockObj)\n\t\t\t{\n\t\t\t\tbot = GetBotSave(name);\n\t\t\t\tif (bot is null)\n\t\t\t\t\treturn null;\n\t\t\t\tif (bot.Name != name)\n\t\t\t\t\tthrow new Exception(\"Got not matching bot name\");\n\t\t\t}\n\t\t\treturn bot;\n\t\t}\n\n\t\tinternal void IterateAll(Action<Bot> body)\n\t\t{\n\t\t\tlock (lockObj)\n\t\t\t{\n\t\t\t\tif (activeBots is null)\n\t\t\t\t\treturn;\n\t\t\t\tforeach (var bot in activeBots)\n\t\t\t\t{\n\t\t\t\t\tif (bot is null) continue;\n\t\t\t\t\tbody(bot);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic async Task StopBot(Bot bot)\n\t\t{\n\t\t\tRemoveBot(bot);\n\t\t\tawait bot.Scheduler.InvokeAsync(async () => await bot.Stop());\n\t\t}\n\n\t\tinternal void RemoveBot(Bot bot)\n\t\t{\n\t\t\tlock (lockObj)\n\t\t\t{\n\t\t\t\tBot? botInList;\n\t\t\t\tif (activeBots != null\n\t\t\t\t\t&& (botInList = GetBotSave(bot.Id)) != null\n\t\t\t\t\t&& botInList == bot)\n\t\t\t\t{\n\t\t\t\t\tactiveBots[bot.Id] = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic BotInfo[] GetBotInfolist()\n\t\t{\n\t\t\tlock (lockObj)\n\t\t\t{\n\t\t\t\tif (activeBots is null)\n\t\t\t\t\treturn Array.Empty<BotInfo>();\n\t\t\t\treturn activeBots.Where(x => x != null).Select(x => x!.GetInfo()).ToArray();\n\t\t\t}\n\t\t}\n\n\t\tpublic uint GetRunningBotCount()\n\t\t{\n\t\t\tlock (lockObj)\n\t\t\t{\n\t\t\t\tif (activeBots is null)\n\t\t\t\t\treturn 0;\n\t\t\t\treturn (uint)activeBots.Count(x => x != null);\n\t\t\t}\n\t\t}\n\n\t\tpublic async Task StopBots()\n\t\t{\n\t\t\tList<Bot?> disposeBots;\n\t\t\tlock (lockObj)\n\t\t\t{\n\t\t\t\tif (activeBots is null)\n\t\t\t\t\treturn;\n\n\t\t\t\tdisposeBots = activeBots;\n\t\t\t\tactiveBots = null;\n\t\t\t}\n\n\t\t\tawait Task.WhenAll(disposeBots.Where(x => x != null).Select(x => StopBot(x!)));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CallerInfo.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot\n{\n\tpublic class CallerInfo\n\t{\n\t\t/// <summary>Whether this call was initiated from the api.</summary>\n\t\tpublic bool ApiCall { get; }\n\t\t/// <summary>Skips all permission checks when set to true.</summary>\n\t\tpublic bool SkipRightsChecks { get; set; } = false;\n\t\t/// <summary>Counts execution token for a single call to prevent endless loops.</summary>\n\t\tpublic int CommandComplexityCurrent { get; set; } = 0;\n\t\t/// <summary>The maximum execution token count for a single call.</summary>\n\t\tpublic int CommandComplexityMax { get; set; } = 0;\n\t\t/// <summary>Whether the caller wants a colored output.</summary>\n\t\tpublic bool IsColor { get; set; }\n\n\t\tpublic CallerInfo(bool isApi)\n\t\t{\n\t\t\tApiCall = isApi;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ClientCall.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TSLib;\n\nnamespace TS3AudioBot\n{\n\tpublic class ClientCall : InvokerData\n\t{\n\t\t/// <summary>The original unmodified string which was received by the client.</summary>\n\t\tpublic string TextMessage { get; }\n\n\t\tpublic ClientDbId? DatabaseId { get; }\n\t\tpublic ChannelId? ChannelId { get; }\n\t\tpublic ClientId? ClientId { get; }\n\t\tpublic string? NickName { get; }\n\t\tpublic ServerGroupId[]? ServerGroups { get; }\n\t\tpublic ChannelGroupId? ChannelGroup { get; }\n\t\tpublic TextMessageTargetMode? Visibiliy { get; internal set; }\n\n\t\tpublic ClientCall(Uid clientUid, string textMessage, ClientDbId? databaseId = null,\n\t\t\tChannelId? channelId = null, ClientId? clientId = null, string? nickName = null,\n\t\t\tTextMessageTargetMode? visibiliy = null, ServerGroupId[]? serverGroups = null,\n\t\t\tChannelGroupId? channelGroup = null) : base(clientUid)\n\t\t{\n\t\t\tTextMessage = textMessage;\n\t\t\tDatabaseId = databaseId;\n\t\t\tChannelId = channelId;\n\t\t\tClientId = clientId;\n\t\t\tNickName = nickName;\n\t\t\tVisibiliy = visibiliy;\n\t\t\tServerGroups = serverGroups;\n\t\t\tChannelGroup = channelGroup;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Ast/AstCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace TS3AudioBot.CommandSystem.Ast\n{\n\tinternal class AstCommand : AstNode\n\t{\n\t\tpublic override AstType Type => AstType.Command;\n\n\t\tpublic List<AstNode> Parameter { get; } = new List<AstNode>();\n\n\t\tpublic AstCommand(string fullRequest) : base(fullRequest) { }\n\n\t\tpublic override void Write(StringBuilder strb, int depth)\n\t\t{\n\t\t\tstrb.Space(depth);\n\t\t\tif (Parameter.Count == 0)\n\t\t\t{\n\t\t\t\tstrb.Append(\"<Invalid empty command>\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (Parameter[0] is AstValue comName)\n\t\t\t\t\tstrb.Append(\"!\").Append(comName.Value);\n\t\t\t\telse\n\t\t\t\t\tstrb.Append(\"<Invalid command name>\");\n\n\t\t\t\tfor (int i = 1; i < Parameter.Count; i++)\n\t\t\t\t{\n\t\t\t\t\tstrb.AppendLine();\n\t\t\t\t\tParameter[i].Write(strb, depth + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Ast/AstError.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Text;\n\nnamespace TS3AudioBot.CommandSystem.Ast\n{\n\tinternal class AstError : AstNode\n\t{\n\t\tpublic override AstType Type => AstType.Error;\n\n\t\tpublic string Description { get; }\n\n\t\tpublic AstError(AstNode referenceNode, string description)\n\t\t\t: this(referenceNode.FullRequest, referenceNode.Position, referenceNode.Length, description) { }\n\n\t\tpublic AstError(string request, int pos, int len, string description) : base(request)\n\t\t{\n\t\t\tPosition = pos;\n\t\t\tLength = len;\n\t\t\tDescription = description;\n\t\t}\n\n\t\tpublic override void Write(StringBuilder strb, int depth)\n\t\t{\n\t\t\tstrb.AppendLine(FullRequest);\n\t\t\tif (Position == 1) strb.Append('.');\n\t\t\telse if (Position > 1) strb.Append(' ', Position);\n\t\t\tstrb.Append('~', Length).Append('^').AppendLine();\n\t\t\tstrb.Append(\"Error: \").AppendLine(Description);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Ast/AstNode.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Text;\n\nnamespace TS3AudioBot.CommandSystem.Ast\n{\n\tpublic abstract class AstNode\n\t{\n\t\tpublic abstract AstType Type { get; }\n\n\t\tpublic string FullRequest { get; }\n\t\tpublic int Position { get; set; }\n\t\tpublic int Length { get; set; }\n\n\t\tprotected AstNode(string fullRequest)\n\t\t{\n\t\t\tFullRequest = fullRequest;\n\t\t}\n\n\t\tpublic abstract void Write(StringBuilder strb, int depth);\n\t\tpublic sealed override string ToString()\n\t\t{\n\t\t\tvar strb = new StringBuilder();\n\t\t\tWrite(strb, 0);\n\t\t\treturn strb.ToString();\n\t\t}\n\t}\n\n\tinternal static class AstNodeExtensions\n\t{\n\t\tpublic const int SpacePerTab = 2;\n\t\tpublic static StringBuilder Space(this StringBuilder strb, int depth) => strb.Append(' ', depth * SpacePerTab);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Ast/AstType.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.CommandSystem.Ast\n{\n\tpublic enum AstType\n\t{\n\t\tCommand,\n\t\tValue,\n\t\tError,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Ast/AstValue.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Text;\n\nnamespace TS3AudioBot.CommandSystem.Ast\n{\n\tinternal class AstValue : AstNode\n\t{\n\t\tprivate string? value;\n\t\tprivate string? tailString;\n\n\t\tpublic override AstType Type => AstType.Value;\n\t\tpublic StringType StringType { get; }\n\t\tpublic int TailLength { get; set; }\n\n\t\tpublic string Value\n\t\t{\n\t\t\tget => value ??= FullRequest.Substring(Position, Length);\n\t\t\tset { this.value = value; tailString = value; }\n\t\t}\n\n\t\tpublic string TailString\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (tailString is null)\n\t\t\t\t{\n\t\t\t\t\tif (TailLength == 0)\n\t\t\t\t\t\ttailString = FullRequest.Substring(Position);\n\t\t\t\t\telse\n\t\t\t\t\t\ttailString = FullRequest.Substring(Position, TailLength);\n\t\t\t\t}\n\t\t\t\treturn tailString;\n\t\t\t}\n\t\t}\n\n\t\tpublic AstValue(string fullRequest, StringType stringType) : base(fullRequest)\n\t\t{\n\t\t\tStringType = stringType;\n\t\t}\n\n\t\tpublic override void Write(StringBuilder strb, int depth) => strb.Space(depth).Append(Value);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Ast/StringType.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.CommandSystem.Ast\n{\n\tinternal enum StringType\n\t{\n\t\tFreeString,\n\t\tQuotedString,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/BotCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\nusing TS3AudioBot.CommandSystem.Commands;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\t[DebuggerDisplay(\"{DebuggerDisplay, nq}\")]\n\t[JsonObject(MemberSerialization.OptIn)]\n\tpublic class BotCommand : FunctionCommand\n\t{\n\t\tprivate readonly string helpLookupName;\n\t\tprivate string? cachedFullQualifiedName;\n\n\t\t[JsonProperty(PropertyName = \"Name\")]\n\t\tpublic string InvokeName { get; }\n\t\tprivate readonly string[] requiredRights;\n\t\tpublic string RequiredRight => requiredRights[0];\n\t\t[JsonProperty(PropertyName = \"Description\")]\n\t\tpublic string? Description => LocalizationManager.GetString(helpLookupName);\n\t\tpublic UsageAttribute[] UsageList { get; }\n\t\tpublic string FullQualifiedName\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (cachedFullQualifiedName is null)\n\t\t\t\t{\n\t\t\t\t\tvar strb = new StringBuilder();\n\t\t\t\t\tstrb.Append(InvokeName);\n\t\t\t\t\tstrb.Append(\" (\");\n\t\t\t\t\tstrb.Append(string.Join(\", \", CommandParameter.Where(p => !p.Kind.IsNormal()).Select(p => p.Type.FullName).OrderBy(p => p)));\n\t\t\t\t\tstrb.Append(\"|\");\n\t\t\t\t\tstrb.Append(string.Join(\", \", CommandParameter.Where(p => p.Kind.IsNormal()).Select(p => p.Type.FullName)));\n\t\t\t\t\tstrb.Append(\")\");\n\t\t\t\t\tcachedFullQualifiedName = strb.ToString();\n\t\t\t\t}\n\t\t\t\treturn cachedFullQualifiedName;\n\t\t\t}\n\t\t}\n\n\t\t[JsonProperty(PropertyName = \"Return\")]\n\t\tpublic string Return { get; set; }\n\t\t[JsonProperty(PropertyName = \"Parameter\")]\n\t\tpublic (string name, string type, bool optional)[] Parameter { get; }\n\t\t[JsonProperty(PropertyName = \"Modules\")]\n\t\tpublic (string type, bool optional)[] Modules { get; }\n\n\t\tpublic string DebuggerDisplay\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar strb = new StringBuilder();\n\t\t\t\tstrb.Append('!').Append(InvokeName);\n\t\t\t\tstrb.Append(\" : \");\n\t\t\t\tforeach (var param in UsageList)\n\t\t\t\t\tstrb.Append(param.UsageSyntax).Append('/');\n\t\t\t\treturn strb.ToString();\n\t\t\t}\n\t\t}\n\n\t\tpublic BotCommand(CommandBuildInfo buildInfo) : base(buildInfo.Method, buildInfo.Parent)\n\t\t{\n\t\t\tInvokeName = buildInfo.CommandData.CommandNameSpace;\n\t\t\thelpLookupName = buildInfo.CommandData.OverrideHelpName ?? (\"cmd_\" + InvokeName.Replace(\" \", \"_\") + \"_help\");\n\t\t\trequiredRights = new[] { \"cmd.\" + string.Join(\".\", InvokeName.Split(' ')) };\n\t\t\tUsageList = buildInfo.UsageList;\n\t\t\t// Serialization\n\t\t\tReturn = UnwrapReturnType(CommandReturn).Name;\n\t\t\tParameter = (\n\t\t\t\tfrom x in CommandParameter\n\t\t\t\twhere x.Kind.IsNormal()\n\t\t\t\tselect (x.Name, UnwrapParamType(x.Type).Name, x.Optional)).ToArray();\n\t\t\tModules = (\n\t\t\t\tfrom x in CommandParameter\n\t\t\t\twhere x.Kind == ParamKind.Dependency\n\t\t\t\tselect (x.Type.Name, x.Optional)).ToArray();\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tvar strb = new StringBuilder();\n\t\t\tstrb.Append(\"\\n!\")\n\t\t\t\t.Append(InvokeName);\n\n\t\t\tforeach (var (name, _, optional) in Parameter)\n\t\t\t{\n\t\t\t\tstrb.Append(' ');\n\t\t\t\tif (optional)\n\t\t\t\t\tstrb.Append(\"[<\").Append(name).Append(\">]\");\n\t\t\t\telse\n\t\t\t\t\tstrb.Append('<').Append(name).Append('>');\n\t\t\t}\n\n\t\t\tstrb.Append(\": \")\n\t\t\t\t.Append(Description ?? strings.error_no_help ?? \"<No help found>\");\n\n\t\t\tif (UsageList.Length > 0)\n\t\t\t{\n\t\t\t\tint longest = UsageList.Max(p => p.UsageSyntax.Length) + 1;\n\t\t\t\tforeach (var para in UsageList)\n\t\t\t\t\tstrb.Append(\"\\n!\").Append(InvokeName).Append(\" \").Append(para.UsageSyntax)\n\t\t\t\t\t\t.Append(' ', longest - para.UsageSyntax.Length).Append(para.UsageHelp);\n\t\t\t}\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tpublic override async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\t// Check call complexity\n\t\t\tinfo.UseComplexityTokens(1);\n\n\t\t\t// Check permissions\n\t\t\tif (!await info.HasRights(requiredRights))\n\t\t\t\tthrow new CommandException(string.Format(strings.error_missing_right, InvokeName, RequiredRight), CommandExceptionReason.MissingRights);\n\n\t\t\treturn await base.Execute(info, arguments);\n\t\t}\n\t}\n\n\tpublic class CommandBuildInfo\n\t{\n\t\tpublic object? Parent { get; }\n\t\tpublic MethodInfo Method { get; }\n\t\tpublic CommandAttribute CommandData { get; }\n\t\tpublic UsageAttribute[] UsageList { get; set; }\n\n\t\tpublic CommandBuildInfo(object? p, MethodInfo m, CommandAttribute comAtt)\n\t\t{\n\t\t\tParent = p;\n\t\t\tMethod = m;\n\t\t\tif (!m.IsStatic && p is null)\n\t\t\t\tthrow new ArgumentException(\"Got instance method without accociated object\");\n\t\t\tCommandData = comAtt;\n\t\t\tUsageList = Array.Empty<UsageAttribute>();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandAttribute.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\t/// <summary>\n\t/// Marks a method as callable from the CommandSystem.\n\t/// The containing class must be registered in the CommandSystem to use this method.\n\t/// </summary>\n\t[AttributeUsage(AttributeTargets.Method, Inherited = false)]\n\tpublic sealed class CommandAttribute : Attribute\n\t{\n\t\tpublic string CommandNameSpace { get; }\n\t\tpublic string? OverrideHelpName { get; }\n\n\t\tpublic CommandAttribute(string commandNameSpace, string? overrideHelpName = null)\n\t\t{\n\t\t\tCommandNameSpace = commandNameSpace;\n\t\t\tOverrideHelpName = overrideHelpName;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Gives an example on how to use this method.\n\t/// Can be used to clarify different functionality from various overloads.\n\t/// </summary>\n\t[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]\n\tpublic sealed class UsageAttribute : Attribute\n\t{\n\t\tpublic string UsageSyntax { get; }\n\t\tpublic string UsageHelp { get; }\n\n\t\tpublic UsageAttribute(string syntax, string help)\n\t\t{\n\t\t\tUsageSyntax = syntax;\n\t\t\tUsageHelp = help;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandException.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Runtime.Serialization;\nusing TSLib.Messages;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\t[Serializable]\n\tpublic class CommandException : AudioBotException\n\t{\n\t\tpublic CommandExceptionReason Reason { get; }\n\n\t\tprotected CommandException()\n\t\t\t: this(CommandExceptionReason.Unknown)\n\t\t{ }\n\n\t\tpublic CommandException(string message)\n\t\t\t: base(message)\n\t\t{ Reason = CommandExceptionReason.CommandError; }\n\n\t\tprotected CommandException(CommandExceptionReason reason)\n\t\t{ Reason = reason; }\n\n\t\tpublic CommandException(string message, CommandExceptionReason reason)\n\t\t\t: base(message)\n\t\t{ Reason = reason; }\n\n\t\tpublic CommandException(string message, Exception inner, CommandExceptionReason reason)\n\t\t\t: base(message, inner)\n\t\t{ Reason = reason; }\n\n\t\tprotected CommandException(SerializationInfo info, StreamingContext context)\n\t\t\t: base(info, context)\n\t\t{ }\n\t}\n\n\t[Serializable]\n\tpublic class MissingContextCommandException : CommandException\n\t{\n\t\tpublic Type MissingType { get; }\n\n\t\tprotected MissingContextCommandException(Type missingType)\n\t\t\t: base(CommandExceptionReason.MissingContext)\n\t\t{ MissingType = missingType; }\n\n\t\tpublic MissingContextCommandException(string message, Type missingType)\n\t\t\t: base(message, CommandExceptionReason.MissingContext)\n\t\t{ MissingType = missingType; }\n\n\t\tpublic MissingContextCommandException(string message, Exception inner, Type missingType)\n\t\t\t: base(message, inner, CommandExceptionReason.MissingContext)\n\t\t{ MissingType = missingType; }\n\t}\n\n\t[Serializable]\n\tpublic class TeamSpeakErrorCommandException : CommandException\n\t{\n\t\tpublic CommandError Error { get; }\n\n\t\tprotected TeamSpeakErrorCommandException(CommandError error)\n\t\t\t: base(CommandExceptionReason.MissingContext)\n\t\t{ Error = error; }\n\n\t\tpublic TeamSpeakErrorCommandException(string message, CommandError error)\n\t\t\t: base(message, CommandExceptionReason.MissingContext)\n\t\t{ Error = error; }\n\n\t\tpublic TeamSpeakErrorCommandException(string message, Exception inner, CommandError error)\n\t\t\t: base(message, inner, CommandExceptionReason.MissingContext)\n\t\t{ Error = error; }\n\t}\n\n\tpublic enum CommandExceptionReason\n\t{\n\t\tUnknown = 0,\n\t\tInternalError,\n\t\tUnauthorized,\n\n\t\tCommandError = 10,\n\t\tMissingRights,\n\t\tAmbiguousCall,\n\t\tMissingParameter,\n\t\tNoReturnMatch,\n\t\tFunctionNotFound,\n\t\tNotSupported,\n\t\tMissingContext,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing TS3AudioBot.CommandSystem.Ast;\nusing TS3AudioBot.CommandSystem.CommandResults;\nusing TS3AudioBot.CommandSystem.Commands;\nusing TS3AudioBot.CommandSystem.Text;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Rights;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\t/// <summary>Mangement for the bot command system.</summary>\n\tpublic class CommandManager\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate static readonly Regex CommandNamespaceValidator =\n\t\t\tnew Regex(@\"^[a-z\\d]+( [a-z\\d]+)*$\", Util.DefaultRegexConfig & ~RegexOptions.IgnoreCase);\n\n\t\tprivate readonly Dictionary<string, AliasCommand> aliasPaths = new Dictionary<string, AliasCommand>();\n\t\tprivate readonly HashSet<string> commandPaths = new HashSet<string>();\n\t\tprivate readonly HashSet<ICommandBag> baggedCommands = new HashSet<ICommandBag>();\n\t\tprivate readonly RightsManager? rightsManager;\n\n\t\tpublic CommandGroup RootGroup { get; } = new CommandGroup();\n\n\t\tpublic CommandManager(RightsManager? rightsManager)\n\t\t{\n\t\t\tthis.rightsManager = rightsManager;\n\t\t}\n\n\t\tpublic IEnumerable<BotCommand> AllCommands => baggedCommands.SelectMany(x => x.BagCommands);\n\n\t\tpublic IEnumerable<string> AllRights => AllCommands.Select(x => x.RequiredRight).Concat(baggedCommands.SelectMany(x => x.AdditionalRights));\n\n\t\t#region Management\n\n\t\tpublic void RegisterCollection(ICommandBag bag)\n\t\t{\n\t\t\tif (baggedCommands.Contains(bag))\n\t\t\t\treturn;\n\n\t\t\tCheckDistinct(bag.BagCommands);\n\t\t\tbaggedCommands.Add(bag);\n\n\t\t\tforeach (var command in bag.BagCommands)\n\t\t\t{\n\t\t\t\tvar result = LoadCommand(command);\n\t\t\t\tif (!result.Ok)\n\t\t\t\t{\n\t\t\t\t\tLog.Error(\"Failed to load command bag: \" + result.Error);\n\t\t\t\t\tUnregisterCollection(bag);\n\t\t\t\t\tthrow new InvalidOperationException(result.Error);\n\t\t\t\t}\n\t\t\t}\n\t\t\trightsManager?.SetRightsList(AllRights);\n\t\t}\n\n\t\tpublic void UnregisterCollection(ICommandBag bag)\n\t\t{\n\t\t\tif (baggedCommands.Remove(bag))\n\t\t\t{\n\t\t\t\tforeach (var com in bag.BagCommands)\n\t\t\t\t{\n\t\t\t\t\tUnloadCommand(com);\n\t\t\t\t}\n\t\t\t\trightsManager?.SetRightsList(AllRights);\n\t\t\t}\n\t\t}\n\n\t\tpublic E<LocalStr> RegisterAlias(string path, string command)\n\t\t{\n\t\t\tif (aliasPaths.ContainsKey(path))\n\t\t\t\treturn new LocalStr(\"Already exists\"); // TODO\n\n\t\t\tvar dac = new AliasCommand(command);\n\t\t\tvar res = LoadICommand(dac, path);\n\t\t\tif (!res)\n\t\t\t\treturn new LocalStr(res.Error); // TODO\n\n\t\t\taliasPaths.Add(path, dac);\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tpublic E<LocalStr> UnregisterAlias(string path)\n\t\t{\n\t\t\tif (!aliasPaths.TryGetValue(path, out var com))\n\t\t\t\treturn new LocalStr(\"Does not exist\"); // TODO\n\n\t\t\tUnloadICommand(com, path);\n\n\t\t\taliasPaths.Remove(path);\n\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tpublic IEnumerable<string> AllAlias => aliasPaths.Keys;\n\n\t\tpublic AliasCommand? GetAlias(string path) => aliasPaths.TryGetValue(path, out var ali) ? ali : null;\n\n\t\tpublic static IEnumerable<BotCommand> GetBotCommands(object? obj, Type? type = null) => GetBotCommands(GetCommandMethods(obj, type));\n\n\t\tpublic static IEnumerable<BotCommand> GetBotCommands(IEnumerable<CommandBuildInfo> methods)\n\t\t{\n\t\t\tforeach (var botData in methods)\n\t\t\t{\n\t\t\t\tbotData.UsageList = botData.Method.GetCustomAttributes<UsageAttribute>().ToArray();\n\t\t\t\tyield return new BotCommand(botData);\n\t\t\t}\n\t\t}\n\n\t\tpublic static IEnumerable<CommandBuildInfo> GetCommandMethods(object? obj, Type? type = null)\n\t\t{\n\t\t\tif (obj is null && type is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(type), \"No type information given.\");\n\t\t\treturn GetCommandMethodsIterator();\n\t\t\tIEnumerable<CommandBuildInfo> GetCommandMethodsIterator()\n\t\t\t{\n\t\t\t\tvar objType = type ?? obj!.GetType();\n\n\t\t\t\tforeach (var method in objType.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance))\n\t\t\t\t{\n\t\t\t\t\tvar comAtt = method.GetCustomAttribute<CommandAttribute>();\n\t\t\t\t\tif (comAtt is null) continue;\n\t\t\t\t\tif (obj is null && !method.IsStatic)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Warn(\"Method '{0}' needs an instance, but no instance was provided. It will be ignored.\", method.Name);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tyield return new CommandBuildInfo(obj, method, comAtt);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate static void CheckDistinct(IReadOnlyCollection<BotCommand> list)\n\t\t{\n\t\t\tif (list.Select(c => c.FullQualifiedName).Distinct().Count() < list.Count)\n\t\t\t{\n\t\t\t\tvar duplicates = list.GroupBy(c => c.FullQualifiedName).Where(g => g.Count() > 1).Select(g => g.Key);\n\t\t\t\tthrow new InvalidOperationException(\"The object contains duplicates: \" + string.Join(\", \", duplicates));\n\t\t\t}\n\t\t}\n\n\t\tprivate E<string> LoadCommand(BotCommand com)\n\t\t{\n\t\t\tif (commandPaths.Contains(com.FullQualifiedName))\n\t\t\t\treturn \"Command already exists: \" + com.InvokeName;\n\n\t\t\tcommandPaths.Add(com.FullQualifiedName);\n\t\t\treturn LoadICommand(com, com.InvokeName);\n\t\t}\n\n\t\tprivate E<string> LoadICommand(ICommand com, string path)\n\t\t{\n\t\t\tif (!CommandNamespaceValidator.IsMatch(path))\n\t\t\t\treturn \"Command has an invalid invoke name: \" + path;\n\n\t\t\tstring[] comPath = path.Split(' ');\n\n\t\t\tvar buildResult = BuildAndGet(comPath.Take(comPath.Length - 1));\n\t\t\tif (!buildResult)\n\t\t\t\treturn GenerateError(buildResult.Error, com as BotCommand);\n\n\t\t\tvar result = InsertInto(buildResult.Value, com, comPath.Last());\n\t\t\tif (!result)\n\t\t\t\treturn GenerateError(result.Error, com as BotCommand);\n\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tprivate R<CommandGroup, string> BuildAndGet(IEnumerable<string> comPath)\n\t\t{\n\t\t\tCommandGroup group = RootGroup;\n\t\t\t// this for loop iterates through the separate names of\n\t\t\t// the command to be added.\n\t\t\tforeach (var comPathPart in comPath)\n\t\t\t{\n\t\t\t\tswitch (group.GetCommand(comPathPart))\n\t\t\t\t{\n\t\t\t\t// if a group to hold the next level command doesn't exist\n\t\t\t\t// it will be created here\n\t\t\t\tcase null:\n\t\t\t\t\tvar nextGroup = new CommandGroup();\n\t\t\t\t\tgroup.AddCommand(comPathPart, nextGroup);\n\t\t\t\t\tgroup = nextGroup;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// if the group already exists we can take it.\n\t\t\t\tcase CommandGroup cgCommand:\n\t\t\t\t\tgroup = cgCommand;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// if the element is anything else, we have to replace it\n\t\t\t\t// with a group and put the old element back into it.\n\t\t\t\tcase FunctionCommand fnCommand:\n\t\t\t\t\tvar subGroup = new CommandGroup();\n\t\t\t\t\tgroup.RemoveCommand(comPathPart);\n\t\t\t\t\tgroup.AddCommand(comPathPart, subGroup);\n\t\t\t\t\tvar insertResult = InsertInto(group, fnCommand, comPathPart);\n\t\t\t\t\tif (!insertResult.Ok)\n\t\t\t\t\t\treturn insertResult.Error;\n\t\t\t\t\tgroup = subGroup;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"An overloaded command cannot be replaced by a CommandGroup\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn group;\n\t\t}\n\n\t\tprivate static E<string> InsertInto(CommandGroup group, ICommand com, string name)\n\t\t{\n\t\t\tvar subCommand = group.GetCommand(name);\n\n\t\t\tswitch (subCommand)\n\t\t\t{\n\t\t\tcase null:\n\t\t\t\t// the group we are trying to insert has no element with the current\n\t\t\t\t// name, so just insert it\n\t\t\t\tgroup.AddCommand(name, com);\n\t\t\t\treturn R.Ok;\n\n\t\t\tcase CommandGroup insertCommand:\n\t\t\t\t// to add a command to CommandGroup will have to treat it as a subcommand\n\t\t\t\t// with an empty string as a name\n\t\t\t\tvar noparamCommand = insertCommand.GetCommand(string.Empty);\n\t\t\t\tif (noparamCommand is null)\n\t\t\t\t{\n\t\t\t\t\tinsertCommand.AddCommand(string.Empty, com);\n\t\t\t\t\tif (com is BotCommand botCom && botCom.NormalParameters > 0)\n\t\t\t\t\t\tLog.Warn(\"\\\"{0}\\\" has at least one parameter and won't be reachable due to an overloading function.\", botCom.FullQualifiedName);\n\t\t\t\t\treturn R.Ok;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn \"An empty named function under a group cannot be overloaded.\";\n\t\t\t}\n\n\t\t\tif (!(com is FunctionCommand funcCom))\n\t\t\t\treturn $\"The command cannot be inserted into a complex node ({name}).\";\n\n\t\t\tswitch (subCommand)\n\t\t\t{\n\t\t\tcase FunctionCommand subFuncCommand:\n\t\t\t\t// if we have is a simple function, we need to create a overloader\n\t\t\t\t// and then add both functions to it\n\t\t\t\tgroup.RemoveCommand(name);\n\t\t\t\tvar overloader = new OverloadedFunctionCommand();\n\t\t\t\toverloader.AddCommand(subFuncCommand);\n\t\t\t\toverloader.AddCommand(funcCom);\n\t\t\t\tgroup.AddCommand(name, overloader);\n\t\t\t\tbreak;\n\n\t\t\tcase OverloadedFunctionCommand insertCommand:\n\t\t\t\t// if we have a overloaded function, we can simply add it\n\t\t\t\tinsertCommand.AddCommand(funcCom);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn \"Unknown node to insert to.\";\n\t\t\t}\n\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tprivate static E<string> GenerateError(string msg, BotCommand? involvedCom)\n\t\t{\n\t\t\treturn $\"Command error path: {involvedCom?.InvokeName}\"\n\t\t\t\t+ $\"Command: {involvedCom?.FullQualifiedName}\"\n\t\t\t\t+ $\"Error: {msg}\";\n\t\t}\n\n\t\tprivate void UnloadCommand(BotCommand com)\n\t\t{\n\t\t\tif (!commandPaths.Remove(com.FullQualifiedName))\n\t\t\t\treturn;\n\n\t\t\tUnloadICommand(com, com.InvokeName);\n\t\t}\n\n\t\tprivate void UnloadICommand(ICommand com, string path)\n\t\t{\n\t\t\tvar comPath = path.Split(' ');\n\n\t\t\tvar node = new CommandUnloadNode(null, RootGroup);\n\n\t\t\t// build up the list to our desired node\n\t\t\tfor (int i = 0; i < comPath.Length - 1; i++)\n\t\t\t{\n\t\t\t\tif (!(node.Self.GetCommand(comPath[i]) is CommandGroup nextGroup))\n\t\t\t\t\tbreak;\n\n\t\t\t\tnode = new CommandUnloadNode(node, nextGroup);\n\t\t\t}\n\n\t\t\tvar subGroup = node.Self.GetCommand(comPath.Last());\n\n\t\t\tswitch (subGroup)\n\t\t\t{\n\t\t\t// nothing to remove\n\t\t\tcase null:\n\t\t\t\treturn;\n\t\t\t// if the subnode is a plain FunctionCommand then we found our command to delete\n\t\t\tcase FunctionCommand _:\n\t\t\tcase AliasCommand _:\n\t\t\t\tnode.Self.RemoveCommand(com);\n\t\t\t\tbreak;\n\t\t\t// here we can delete our command from the overloader\n\t\t\tcase OverloadedFunctionCommand subOverloadGroup:\n\t\t\t\tif (com is FunctionCommand funcCom)\n\t\t\t\t\tsubOverloadGroup.RemoveCommand(funcCom);\n\t\t\t\telse\n\t\t\t\t\treturn;\n\t\t\t\tbreak;\n\t\t\t// now to the special case when a command gets inserted with an empty string\n\t\t\tcase CommandGroup insertGroup:\n\t\t\t\t// since we check precisely that only one command and only a simple FunctionCommand\n\t\t\t\t// can be added with an empty string, wen can delete it safely this way\n\t\t\t\tinsertGroup.RemoveCommand(string.Empty);\n\t\t\t\t// add the node for cleanup\n\t\t\t\tnode = new CommandUnloadNode(node, insertGroup);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// and finally clean all empty nodes up\n\t\t\twhile (node != null)\n\t\t\t{\n\t\t\t\tif (node.Self.IsEmpty)\n\t\t\t\t\tnode.ParentNode?.Self.RemoveCommand(node.Self);\n\t\t\t\tif (node.ParentNode is null)\n\t\t\t\t\tbreak;\n\t\t\t\tnode = node.ParentNode;\n\t\t\t}\n\t\t}\n\n\t\tprivate class CommandUnloadNode\n\t\t{\n\t\t\tpublic CommandUnloadNode? ParentNode { get; set; }\n\t\t\tpublic CommandGroup Self { get; set; }\n\t\t\tpublic CommandUnloadNode(CommandUnloadNode? parentNode, CommandGroup self)\n\t\t\t{\n\t\t\t\tParentNode = parentNode;\n\t\t\t\tSelf = self;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\t#region Execution\n\n\t\tinternal static ICommand AstToCommandResult(AstNode node)\n\t\t{\n\t\t\tswitch (node.Type)\n\t\t\t{\n\t\t\tcase AstType.Error:\n\t\t\t\tthrow new CommandException(\"Found an unconvertable ASTNode of type Error\", CommandExceptionReason.InternalError);\n\t\t\tcase AstType.Command:\n\t\t\t\tvar cmd = (AstCommand)node;\n\t\t\t\tvar arguments = new ICommand[cmd.Parameter.Count];\n\t\t\t\tint tailCandidates = 0;\n\t\t\t\tfor (int i = cmd.Parameter.Count - 1; i >= 1; i--)\n\t\t\t\t{\n\t\t\t\t\tvar para = cmd.Parameter[i];\n\t\t\t\t\tif (!(para is AstValue astVal) || astVal.StringType != StringType.FreeString)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\targuments[i] = new ResultCommand(new TailString(astVal.Value, astVal.TailString));\n\t\t\t\t\ttailCandidates++;\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i < cmd.Parameter.Count - tailCandidates; i++)\n\t\t\t\t\targuments[i] = AstToCommandResult(cmd.Parameter[i]);\n\t\t\t\treturn new RootCommand(arguments);\n\t\t\tcase AstType.Value:\n\t\t\t\tvar astNode = (AstValue)node;\n\t\t\t\treturn new ResultCommand(astNode.Value);\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(node.Type);\n\t\t\t}\n\t\t}\n\n\t\tpublic static async Task<ICmdResult> Execute(ExecutionInformation info, string command)\n\t\t{\n\t\t\tvar ast = CommandParser.ParseCommandRequest(command);\n\t\t\tvar cmd = AstToCommandResult(ast);\n\t\t\treturn new ICmdResult(await cmd.Execute(info, Array.Empty<ICommand>()));\n\t\t}\n\n\t\tpublic static async Task<ICmdResult> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t\t=> new ICmdResult(await info.GetModuleOrThrow<CommandManager>().RootGroup.Execute(info, arguments));\n\n\t\tpublic static string GetTree(ICommand com)\n\t\t{\n\t\t\tvar strb = new TextModBuilder();\n\t\t\tGetTree(com, strb, 0);\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tprivate static void GetTree(ICommand com, TextModBuilder strb, int indent)\n\t\t{\n\t\t\tswitch (com)\n\t\t\t{\n\t\t\tcase CommandGroup group:\n\t\t\t\tstrb.AppendFormat(\"<group>\\n\".Mod().Color(Color.Red));\n\t\t\t\tforeach (var subCom in group.Commands)\n\t\t\t\t{\n\t\t\t\t\tstrb.Append(new string(' ', (indent + 1) * 2)).Append(subCom.Key);\n\t\t\t\t\tGetTree(subCom.Value, strb, indent + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase FunctionCommand _:\n\t\t\t\tstrb.AppendFormat(\"<func>\\n\".Mod().Color(Color.Green));\n\t\t\t\tbreak;\n\n\t\t\tcase OverloadedFunctionCommand ofunc:\n\t\t\t\tstrb.AppendFormat($\"<overload({ofunc.Functions.Count})>\\n\".Mod().Color(Color.Blue));\n\t\t\t\tbreak;\n\n\t\t\tcase AliasCommand _:\n\t\t\t\tstrb.AppendFormat($\"<alias>\\n\".Mod().Color(Color.Yellow));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tstrb.AppendFormat(\"\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n\n\tpublic readonly struct ICmdResult\n\t{\n\t\tprivate readonly object? result;\n\n\t\tpublic ICmdResult(object? result)\n\t\t{\n\t\t\tthis.result = result;\n\t\t}\n\n\t\tpublic object? AsRaw() => result;\n\n\t\tpublic string? AsString() => result?.ToString();\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandParser.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing TS3AudioBot.CommandSystem.Ast;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\tinternal static class CommandParser\n\t{\n\t\tpublic const char DefaultCommandChar = '!';\n\t\tpublic const char DefaultDelimeterChar = ' ';\n\n\t\t// This switch follows more or less a DEA to this EBNF\n\t\t// COMMAND-EBNF := <COMMAND> | $.*^\n\n\t\t// COMMAND      := '!' <ARGUMENT> (\\s+ <ARGUMENT>)*\n\t\t// ARGUMENT     := '(' <COMMAND> ')'? | <FREESTRING> | <QUOTESTRING>\n\t\t// FREESTRING   := [^)]+\n\t\t// QUOTESTRING  := '\"' [<anything but \", \\\" is ok>]* '\"'\n\n\t\tpublic static AstNode ParseCommandRequest(string request, char commandChar = DefaultCommandChar, char delimeterChar = DefaultDelimeterChar)\n\t\t{\n\t\t\tAstCommand? root = null;\n\t\t\tvar comAst = new Stack<AstCommand>();\n\t\t\tvar build = BuildStatus.ParseCommand;\n\t\t\tvar strb = new StringBuilder();\n\t\t\tvar strPtr = new StringPtr(request);\n\n\t\t\tvar startTrim = request.AsSpan().TrimStart();\n\t\t\tif (startTrim.IsEmpty || startTrim[0] != commandChar)\n\t\t\t{\n\t\t\t\treturn new AstValue(request, StringType.FreeString)\n\t\t\t\t{\n\t\t\t\t\tLength = request.Length,\n\t\t\t\t\tPosition = 0,\n\t\t\t\t\tValue = request,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\twhile (!strPtr.End)\n\t\t\t{\n\t\t\t\tAstCommand buildCom;\n\t\t\t\tswitch (build)\n\t\t\t\t{\n\t\t\t\tcase BuildStatus.ParseCommand:\n\t\t\t\t\t// Got a command\n\t\t\t\t\tbuildCom = new AstCommand(request);\n\t\t\t\t\t// Consume CommandChar if left over\n\t\t\t\t\tif (strPtr.Char == commandChar)\n\t\t\t\t\t\tstrPtr.Next(commandChar);\n\n\t\t\t\t\tif (root is null) root = buildCom;\n\t\t\t\t\telse comAst.Peek().Parameter.Add(buildCom);\n\t\t\t\t\tcomAst.Push(buildCom);\n\t\t\t\t\tbuild = BuildStatus.SelectParam;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase BuildStatus.SelectParam:\n\t\t\t\t\tstrPtr.SkipChar(delimeterChar);\n\n\t\t\t\t\tif (strPtr.End)\n\t\t\t\t\t{\n\t\t\t\t\t\tbuild = BuildStatus.End;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (strPtr.Char)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase '\"':\n\t\t\t\t\t\tcase '\\'':\n\t\t\t\t\t\t\tbuild = BuildStatus.ParseQuotedString;\n\t\t\t\t\t\t\t//goto case BuildStatus.ParseQuotedString;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase '(':\n\t\t\t\t\t\t\tif (!strPtr.HasNext)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbuild = BuildStatus.ParseFreeString;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (strPtr.IsNext(commandChar))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstrPtr.Next('(');\n\t\t\t\t\t\t\t\tbuild = BuildStatus.ParseCommand;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbuild = BuildStatus.ParseFreeString;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase ')':\n\t\t\t\t\t\t\tif (comAst.Count <= 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbuild = BuildStatus.End;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbuildCom = comAst.Pop();\n\t\t\t\t\t\t\t\tforeach (var param in buildCom.Parameter)\n\t\t\t\t\t\t\t\t\tif (param is AstValue astVal)\n\t\t\t\t\t\t\t\t\t\tastVal.TailLength = strPtr.Index - param.Position;\n\t\t\t\t\t\t\t\tif (comAst.Count <= 0)\n\t\t\t\t\t\t\t\t\tbuild = BuildStatus.End;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstrPtr.Next();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbuild = BuildStatus.ParseFreeString;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase BuildStatus.ParseFreeString:\n\t\t\t\t\tvar valFreeAst = new AstValue(request, StringType.FreeString);\n\t\t\t\t\tusing (strPtr.TrackNode(valFreeAst))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (; !strPtr.End; strPtr.Next())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((strPtr.Char == '(' && strPtr.HasNext && strPtr.IsNext(commandChar))\n\t\t\t\t\t\t\t\t|| strPtr.Char == ')'\n\t\t\t\t\t\t\t\t|| strPtr.Char == delimeterChar)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbuildCom = comAst.Peek();\n\t\t\t\t\tbuildCom.Parameter.Add(valFreeAst);\n\t\t\t\t\tbuild = BuildStatus.SelectParam;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase BuildStatus.ParseQuotedString:\n\t\t\t\t\tstrb.Clear();\n\n\t\t\t\t\tchar quoteChar;\n\t\t\t\t\tif (strPtr.TryNext('\"'))\n\t\t\t\t\t\tquoteChar = '\"';\n\t\t\t\t\telse if (strPtr.TryNext('\\''))\n\t\t\t\t\t\tquoteChar = '\\'';\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new Exception(\"Parser error\");\n\n\t\t\t\t\tvar valQuoAst = new AstValue(request, StringType.QuotedString);\n\t\t\t\t\tusing (strPtr.TrackNode(valQuoAst))\n\t\t\t\t\t{\n\t\t\t\t\t\tbool escaped = false;\n\t\t\t\t\t\tfor (; !strPtr.End; strPtr.Next())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (strPtr.Char == '\\\\')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tescaped = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (strPtr.Char == quoteChar)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (!escaped)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstrPtr.Next();\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstrb.Length--;\n\t\t\t\t\t\t\t\t\tescaped = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tescaped = false;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tstrb.Append(strPtr.Char);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvalQuoAst.Value = strb.ToString();\n\t\t\t\t\tbuildCom = comAst.Peek();\n\t\t\t\t\tbuildCom.Parameter.Add(valQuoAst);\n\t\t\t\t\tbuild = BuildStatus.SelectParam;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase BuildStatus.End:\n\t\t\t\t\tstrPtr.JumpToEnd();\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: throw new InvalidOperationException();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn root ?? throw new InvalidOperationException(\"No ast was built\");\n\t\t}\n\n\t\tprivate class StringPtr\n\t\t{\n\t\t\tprivate readonly string text;\n\n\t\t\tpublic char Char => text[Index];\n\t\t\tpublic bool End => Index >= text.Length;\n\t\t\tpublic bool HasNext => Index + 1 < text.Length;\n\t\t\tpublic int Index { get; private set; }\n\n\t\t\tpublic StringPtr(string str)\n\t\t\t{\n\t\t\t\ttext = str;\n\t\t\t\tIndex = 0;\n\t\t\t}\n\n\t\t\tpublic void Next()\n\t\t\t{\n\t\t\t\tIndex++;\n\t\t\t}\n\n\t\t\tpublic void Next(char mustBe)\n\t\t\t{\n\t\t\t\tif (Char != mustBe)\n\t\t\t\t\tthrow new InvalidOperationException();\n\t\t\t\tNext();\n\t\t\t}\n\n\t\t\tpublic bool TryNext(char mustBe)\n\t\t\t{\n\t\t\t\tif (Char != mustBe)\n\t\t\t\t\treturn false;\n\t\t\t\tNext();\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tpublic bool IsNext(char what) => HasNext && text[Index + 1] == what;\n\n\t\t\tpublic void SkipChar(char c = ' ')\n\t\t\t{\n\t\t\t\twhile (Index < text.Length && text[Index] == c)\n\t\t\t\t\tIndex++;\n\t\t\t}\n\n\t\t\tpublic void JumpToEnd() => Index = text.Length + 1;\n\n\t\t\tpublic NodeTracker TrackNode(AstNode? node = null)\n\t\t\t{\n\t\t\t\treturn new NodeTracker(this, node);\n\t\t\t}\n\n\t\t\tpublic readonly ref struct NodeTracker\n\t\t\t{\n\t\t\t\tprivate readonly int indexStart;\n\t\t\t\tprivate readonly StringPtr parent;\n\t\t\t\tprivate readonly AstNode? node;\n\t\t\t\tpublic NodeTracker(StringPtr p, AstNode? node = null)\n\t\t\t\t{\n\t\t\t\t\tparent = p;\n\t\t\t\t\tindexStart = parent.Index;\n\t\t\t\t\tthis.node = node;\n\t\t\t\t}\n\n\t\t\t\tpublic readonly void Apply(AstNode node)\n\t\t\t\t{\n\t\t\t\t\tnode.Position = indexStart;\n\t\t\t\t\tnode.Length = parent.Index - indexStart;\n\t\t\t\t}\n\n\t\t\t\tpublic readonly (int start, int end) Done() => (indexStart, parent.Index);\n\n\t\t\t\tpublic readonly void Dispose() { if (node != null) Apply(node); }\n\t\t\t}\n\t\t}\n\n\t\tprivate enum BuildStatus\n\t\t{\n\t\t\tParseCommand,\n\t\t\tSelectParam,\n\t\t\tParseFreeString,\n\t\t\tParseQuotedString,\n\t\t\tEnd,\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandResults/IAudioResourceResult.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TS3AudioBot.ResourceFactories;\n\nnamespace TS3AudioBot.CommandSystem.CommandResults\n{\n\tpublic interface IAudioResourceResult\n\t{\n\t\tAudioResource AudioResource { get; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandResults/IWrappedResult.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.CommandSystem.CommandResults\n{\n\tpublic interface IWrappedResult\n\t{\n\t\tobject? Content { get; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandResults/PickObjectCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Reflection;\n\nnamespace TS3AudioBot.CommandSystem.CommandResults\n{\n\tpublic class Pick<T> : IWrappedResult\n\t{\n\t\tprivate readonly string pickPath;\n\t\tprivate readonly T baseObj;\n\t\tprivate bool isPicked;\n\t\tprivate object? pickedValue;\n\n\t\tpublic object? Content\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (!isPicked)\n\t\t\t\t{\n\t\t\t\t\tisPicked = true;\n\t\t\t\t\tpickedValue = null;\n\t\t\t\t\tpickedValue = DoPick();\n\t\t\t\t}\n\t\t\t\treturn pickedValue;\n\t\t\t}\n\t\t}\n\n\t\tpublic Pick(T obj, string pickPath)\n\t\t{\n\t\t\tbaseObj = obj;\n\t\t\tthis.pickPath = pickPath;\n\t\t}\n\n\t\tprivate object? DoPick()\n\t\t{\n\t\t\tif (baseObj == null)\n\t\t\t\treturn null; // TODO maybe error ?\n\t\t\tif (string.IsNullOrEmpty(pickPath))\n\t\t\t\treturn baseObj;\n\t\t\tvar type = baseObj.GetType();\n\t\t\tvar prop = type.GetProperty(pickPath, BindingFlags.Public | BindingFlags.Instance);\n\t\t\tif (prop is null)\n\t\t\t\tthrow new CommandException(\"Property not found\" /* TODO LOC */);\n\t\t\treturn prop.GetValue(baseObj);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandResults/TailString.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.CommandSystem.CommandResults\n{\n\tpublic class TailString : IWrappedResult\n\t{\n\t\tpublic string Content { get; }\n\t\tpublic string Tail { get; }\n\t\tobject? IWrappedResult.Content => Content;\n\n\t\tpublic TailString(string contentArg, string tailArg)\n\t\t{\n\t\t\tContent = contentArg;\n\t\t\tTail = tailArg;\n\t\t}\n\n\t\tpublic override string ToString() => Content;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandSystemExtensions.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Algorithm;\nusing TS3AudioBot.CommandSystem.Commands;\nusing TS3AudioBot.Dependency;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\tpublic static class CommandSystemExtensions\n\t{\n\t\tpublic static IFilter GetFilter(this IInjector injector)\n\t\t{\n\t\t\tif (injector.TryGet<IFilter>(out var filter))\n\t\t\t\treturn filter;\n\t\t\treturn Filter.DefaultFilter;\n\t\t}\n\n\t\tpublic static Lazy<IFilter> GetFilterLazy(this IInjector injector)\n\t\t\t=> new Lazy<IFilter>(() => injector.GetFilter(), false);\n\n\t\tpublic static async ValueTask<string> ExecuteToString(this ICommand com, ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tvar res = await com.Execute(info, arguments);\n\t\t\treturn res?.ToString() ?? \"\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/CommandSystemTypes.cs",
    "content": "// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing TS3AudioBot.CommandSystem.CommandResults;\nusing TSLib;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\tpublic static class CommandSystemTypes\n\t{\n\t\t/// <summary>\n\t\t/// The order of types, the first item has the highest priority,\n\t\t/// items not in the list have higher priority as they are special types.\n\t\t/// </summary>\n\t\tpublic static readonly Type[] TypeOrder = {\n\t\t\ttypeof(bool),\n\t\t\ttypeof(sbyte), typeof(byte),\n\t\t\ttypeof(short), typeof(ushort),\n\t\t\ttypeof(int), typeof(uint),\n\t\t\ttypeof(long), typeof(ulong),\n\t\t\ttypeof(float), typeof(double),\n\t\t\ttypeof(TimeSpan), typeof(DateTime),\n\t\t\ttypeof(string) };\n\t\tpublic static readonly HashSet<Type> BasicTypes = new HashSet<Type>(TypeOrder);\n\n\t\tpublic static readonly HashSet<Type> AdvancedTypes = new HashSet<Type>(new Type[] {\n\t\t\ttypeof(IAudioResourceResult),\n\t\t\ttypeof(System.Collections.IEnumerable),\n\t\t\ttypeof(ResourceFactories.AudioResource),\n\t\t\ttypeof(History.AudioLogEntry),\n\t\t\ttypeof(Playlists.PlaylistItem),\n\t\t}.Concat(TsTypes.All));\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/AliasCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Dependency;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\tpublic class AliasCommand : ICommand\n\t{\n\t\tprivate readonly ICommand aliasCommand;\n\t\tpublic string AliasString { get; }\n\n\t\tpublic AliasCommand(string command)\n\t\t{\n\t\t\tvar ast = CommandParser.ParseCommandRequest(command);\n\t\t\taliasCommand = CommandManager.AstToCommandResult(ast);\n\t\t\tAliasString = command;\n\t\t}\n\n\t\tpublic async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tinfo.UseComplexityTokens(1);\n\n\t\t\tIReadOnlyList<ICommand>? backupArguments = null;\n\t\t\tif (!info.TryGet<AliasContext>(out var aliasContext))\n\t\t\t{\n\t\t\t\taliasContext = new AliasContext();\n\t\t\t\tinfo.AddModule(aliasContext);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbackupArguments = aliasContext.Arguments;\n\t\t\t}\n\n\t\t\taliasContext.Arguments = arguments.Select(c => new LazyCommand(c)).ToArray();\n\t\t\tvar ret = await aliasCommand.Execute(info, Array.Empty<ICommand>());\n\t\t\taliasContext.Arguments = backupArguments;\n\t\t\treturn ret;\n\t\t}\n\t}\n\n\tpublic class AliasContext\n\t{\n\t\tpublic IReadOnlyList<ICommand>? Arguments { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/AppliedCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\tpublic class AppliedCommand : ICommand\n\t{\n\t\tprivate readonly ICommand internCommand;\n\t\tprivate readonly IReadOnlyList<ICommand> internArguments;\n\n\t\tpublic AppliedCommand(ICommand command, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tinternCommand = command;\n\t\t\tinternArguments = arguments;\n\t\t}\n\n\t\tpublic virtual async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tvar merged = new ICommand[internArguments.Count + arguments.Count];\n\t\t\tinternArguments.CopyTo(0, merged, 0);\n\t\t\targuments.CopyTo(0, merged, internArguments.Count);\n\t\t\treturn await internCommand.Execute(info, merged);\n\t\t}\n\n\t\tpublic override string ToString() => $\"F\\\"{internCommand}\\\"({string.Join(\", \", internArguments)})\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/CommandGroup.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\tpublic class CommandGroup : ICommand\n\t{\n\t\tprivate readonly IDictionary<string, ICommand> commands = new Dictionary<string, ICommand>();\n\n\t\tpublic void AddCommand(string name, ICommand command) => commands.Add(name, command ?? throw new ArgumentNullException(nameof(command)));\n\t\tpublic bool RemoveCommand(string name) => commands.Remove(name);\n\t\tpublic bool RemoveCommand(ICommand command)\n\t\t{\n\t\t\tvar com = commands.FirstOrDefault(kvp => kvp.Value == command);\n\t\t\tif (com.Key is null || com.Value is null)\n\t\t\t\treturn false;\n\t\t\treturn commands.Remove(com.Key);\n\t\t}\n\t\tpublic bool ContainsCommand(string name) => commands.ContainsKey(name);\n\t\tpublic ICommand? GetCommand(string name) => commands.TryGetValue(name, out var com) ? com : null;\n\t\tpublic bool IsEmpty => commands.Count == 0;\n\t\tpublic IEnumerable<KeyValuePair<string, ICommand>> Commands => commands;\n\n\t\tpublic virtual async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tstring result;\n\t\t\tif (arguments.Count == 0)\n\t\t\t\tresult = string.Empty;\n\t\t\telse\n\t\t\t\tresult = await arguments[0].ExecuteToString(info, Array.Empty<ICommand>());\n\n\t\t\tvar filter = info.GetFilter();\n\t\t\tvar commandResults = filter.Filter(commands, result).ToArray();\n\n\t\t\t// The special case when the command is empty and only might match because of fuzzy matching.\n\t\t\t// We only allow this if the command explicitly allows an empty overload.\n\t\t\tif (string.IsNullOrEmpty(result)\n\t\t\t\t&& (commandResults.Length == 0 || commandResults.Length > 1 || (commandResults.Length == 1 && !string.IsNullOrEmpty(commandResults[0].Key))))\n\t\t\t{\n\t\t\t\tthrow new CommandException(string.Format(strings.cmd_help_info_contains_subfunctions, SuggestionsJoinTrim(commands.Keys)), CommandExceptionReason.AmbiguousCall);\n\t\t\t}\n\n\t\t\t// We found too many matching commands\n\t\t\tif (commandResults.Length > 1)\n\t\t\t\tthrow new CommandException(string.Format(strings.cmd_help_error_ambiguous_command, SuggestionsJoinTrim(commandResults.Select(g => g.Key))), CommandExceptionReason.AmbiguousCall);\n\t\t\t// We either found no matching command\n\t\t\tif (commandResults.Length == 0)\n\t\t\t\tthrow new CommandException(string.Format(strings.cmd_help_info_contains_subfunctions, SuggestionsJoinTrim(commands.Keys)), CommandExceptionReason.AmbiguousCall);\n\n\t\t\tvar argSubList = arguments.TrySegment(1);\n\t\t\treturn await commandResults[0].Value.Execute(info, argSubList);\n\t\t}\n\n\t\tprivate static string SuggestionsJoinTrim(IEnumerable<string> commands)\n\t\t\t=> string.Join(\", \", commands.Where(x => !string.IsNullOrEmpty(x)));\n\n\t\tpublic override string ToString() => \"<group>\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/FunctionCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing System.Reflection.Emit;\nusing System.Threading.Tasks;\nusing TS3AudioBot.CommandSystem.CommandResults;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Web.Api;\nusing TSLib.Helper;\nusing static TS3AudioBot.CommandSystem.CommandSystemTypes;\nusing TryFromFn = System.Func<object?, object?>;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\tpublic class FunctionCommand : ICommand\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\t// Needed for non-static member methods\n\t\tprivate readonly object? callee;\n\t\t/// <summary>The method that will be called internally by this command.</summary>\n\t\tprivate readonly MethodInfo internCommand;\n\t\tprivate readonly bool isPlainTask;\n\t\tprivate readonly PropertyInfo? taskValueProp;\n\n\t\t/// <summary>All parameter types, including special types.</summary>\n\t\tpublic ParamInfo[] CommandParameter { get; }\n\t\t/// <summary>Return type of method.</summary>\n\t\tpublic Type CommandReturn { get; }\n\t\t/// <summary>Count of parameter, without special types.</summary>\n\t\tpublic int NormalParameters { get; }\n\t\t/// <summary>\n\t\t/// How many free arguments have to be applied to this function.\n\t\t/// This includes only user-supplied arguments, e.g. the <see cref=\"ExecutionInformation\"/> is not included.\n\t\t/// </summary>\n\t\tprivate int RequiredParameters { get; }\n\n\t\tpublic FunctionCommand(MethodInfo command, object? obj = null, int? requiredParameters = null)\n\t\t{\n\t\t\tinternCommand = command;\n\t\t\tCommandParameter = PrecomputeTypes(command.GetParameters());\n\t\t\tCommandReturn = command.ReturnType;\n\t\t\tif (CommandReturn.IsConstructedGenericType && CommandReturn.GetGenericTypeDefinition() == typeof(Task<>))\n\t\t\t\ttaskValueProp = CommandReturn.GetProperty(nameof(Task<object>.Result));\n\t\t\tisPlainTask = CommandReturn == typeof(Task);\n\n\t\t\tcallee = obj;\n\n\t\t\tNormalParameters = CommandParameter.Count(p => p.Kind.IsNormal());\n\t\t\tRequiredParameters = requiredParameters ?? CommandParameter.Count(p => !p.Optional && p.Kind.IsNormal());\n\t\t}\n\n\t\t// Provide some constructors that take lambda expressions directly\n\t\tpublic FunctionCommand(Delegate command, int? requiredParameters = null) : this(command.Method, command.Target, requiredParameters) { }\n\t\tpublic FunctionCommand(Action command) : this(command.Method, command.Target) { }\n\t\tpublic FunctionCommand(Func<string> command) : this(command.Method, command.Target) { }\n\t\tpublic FunctionCommand(Action<string> command) : this(command.Method, command.Target) { }\n\t\tpublic FunctionCommand(Func<string, string> command) : this(command.Method, command.Target) { }\n\n\t\tprotected virtual async ValueTask<object?> ExecuteFunction(object?[] parameters)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar ret = internCommand.Invoke(callee, parameters);\n\t\t\t\tif (ret is Task task)\n\t\t\t\t{\n\t\t\t\t\tawait task;\n\t\t\t\t\tif (isPlainTask)\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\tvar taskProp = taskValueProp;\n\t\t\t\t\tif (taskValueProp is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Warn(\"Performing really slow Task get, declare your command better to prevent this\");\n\t\t\t\t\t\tvar taskType = task.GetType();\n\t\t\t\t\t\tif (taskType.IsConstructedGenericType && taskType.GetGenericTypeDefinition() == typeof(Task<>))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttaskProp = taskType.GetProperty(nameof(Task<object>.Result)) ?? throw new Exception(\"Result not found on Task\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (taskProp is null)\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\treturn taskProp.GetValue(task);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (TargetInvocationException ex) when (!(ex.InnerException is null))\n\t\t\t{\n\t\t\t\tSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex.InnerException).Throw();\n\t\t\t\tthrow ex.InnerException;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Try to fit the given arguments to the underlying function.\n\t\t/// This function will throw an exception if the parameters can't be applied.\n\t\t/// The parameters that are extracted from the arguments will be returned if they can be applied successfully.\n\t\t/// </summary>\n\t\t/// <param name=\"info\">The current call <see cref=\"ExecutionInformation\"/>.</param>\n\t\t/// <param name=\"arguments\">The arguments that are applied to this function.</param>\n\t\t/// <param name=\"returnTypes\">The possible return types.</param>\n\t\t/// <param name=\"takenArguments\">How many arguments could be set.</param>\n\t\tprivate async ValueTask<(object?[] paramObjs, int takenArguments)> FitArguments(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tvar parameters = new object?[CommandParameter.Length];\n\t\t\tvar filterLazy = info.GetFilterLazy();\n\n\t\t\t// takenArguments: Index through arguments which have been moved into a parameter\n\t\t\t// p: Iterate through parameters\n\t\t\tvar takenArguments = 0;\n\t\t\tfor (int p = 0; p < parameters.Length; p++)\n\t\t\t{\n\t\t\t\tvar arg = CommandParameter[p];\n\t\t\t\tvar argType = arg.Type;\n\t\t\t\tswitch (arg.Kind)\n\t\t\t\t{\n\t\t\t\tcase ParamKind.SpecialArguments:\n\t\t\t\t\tparameters[p] = arguments;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ParamKind.Dependency:\n\t\t\t\t\tif (info.TryGet(argType, out var obj))\n\t\t\t\t\t\tparameters[p] = obj;\n\t\t\t\t\telse if (arg.Optional)\n\t\t\t\t\t\tparameters[p] = null;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new MissingContextCommandException($\"Command '{internCommand.Name}' missing execution context '{argType.Name}'\", argType);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ParamKind.NormalCommand:\n\t\t\t\t\tif (takenArguments >= arguments.Count) { parameters[p] = GetDefault(argType); break; }\n\t\t\t\t\tparameters[p] = arguments[takenArguments];\n\t\t\t\t\ttakenArguments++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ParamKind.NormalParam:\n\t\t\t\tcase ParamKind.NormalTailString:\n\t\t\t\t\tif (takenArguments >= arguments.Count) { parameters[p] = GetDefault(argType); break; }\n\n\t\t\t\t\tvar argResultP = await arguments[takenArguments].Execute(info, Array.Empty<ICommand>());\n\t\t\t\t\tif (arg.Kind == ParamKind.NormalTailString && argResultP is TailString tailString)\n\t\t\t\t\t\tparameters[p] = tailString.Tail;\n\t\t\t\t\telse\n\t\t\t\t\t\tparameters[p] = ConvertParam(argResultP, argType, arg, filterLazy);\n\n\t\t\t\t\ttakenArguments++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ParamKind.NormalArray:\n\t\t\t\t\tif (takenArguments >= arguments.Count) { parameters[p] = GetDefault(argType); break; }\n\n\t\t\t\t\tvar typeArr = argType.GetElementType()!;\n\t\t\t\t\tvar args = Array.CreateInstance(typeArr, arguments.Count - takenArguments);\n\t\t\t\t\tfor (int i = 0; i < args.Length; i++, takenArguments++)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar argResultA = await arguments[takenArguments].Execute(info, Array.Empty<ICommand>());\n\t\t\t\t\t\tvar convResult = ConvertParam(argResultA, typeArr, arg, filterLazy);\n\t\t\t\t\t\targs.SetValue(convResult, i);\n\t\t\t\t\t}\n\n\t\t\t\t\tparameters[p] = args;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(arg.Kind);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if we were able to set enough arguments\n\t\t\tint wantArgumentCount = Math.Min(parameters.Length, RequiredParameters);\n\t\t\tif (takenArguments < wantArgumentCount)\n\t\t\t\tthrow ThrowAtLeastNArguments(wantArgumentCount);\n\n\t\t\treturn (parameters, takenArguments);\n\t\t}\n\n\t\tpublic virtual async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tvar (parameters, availableArguments) = await FitArguments(info, arguments);\n\n\t\t\t// Check if we were able to set enough arguments\n\t\t\tint wantArgumentCount = Math.Min(parameters.Length, RequiredParameters);\n\t\t\tif (availableArguments < wantArgumentCount)\n\t\t\t\tthrow ThrowAtLeastNArguments(wantArgumentCount);\n\n\t\t\treturn await ExecuteFunction(parameters);\n\t\t}\n\n\t\tprivate static ParamInfo[] PrecomputeTypes(ParameterInfo[] parameterInfos)\n\t\t{\n\t\t\tvar precomputed = new ParamInfo[parameterInfos.Length];\n\t\t\tbool foundTail = false;\n\n\t\t\tfor (int i = parameterInfos.Length - 1; i >= 0; i--)\n\t\t\t{\n\t\t\t\tvar parameterInfo = parameterInfos[i];\n\t\t\t\tvar arg = parameterInfo.ParameterType;\n\t\t\t\tParamKind kind;\n\n\t\t\t\tif (arg == typeof(IReadOnlyList<ICommand>))\n\t\t\t\t\tkind = ParamKind.SpecialArguments;\n\t\t\t\telse if (arg == typeof(ICommand))\n\t\t\t\t\tkind = ParamKind.NormalCommand;\n\t\t\t\telse if (arg.IsArray)\n\t\t\t\t\tkind = ParamKind.NormalArray;\n\t\t\t\telse if (arg.IsEnum\n\t\t\t\t\t|| BasicTypes.Contains(arg)\n\t\t\t\t\t|| BasicTypes.Contains(UnwrapParamType(arg))\n\t\t\t\t\t|| AdvancedTypes.Contains(arg)\n\t\t\t\t\t|| AdvancedTypes.Contains(UnwrapParamType(arg)))\n\t\t\t\t\tkind = ParamKind.NormalParam;\n\t\t\t\t// TODO How to distinguish between special type and dependency?\n\t\t\t\telse\n\t\t\t\t\tkind = ParamKind.Dependency;\n\n\t\t\t\tTryFromFn? tryFrom = null;\n\t\t\t\tif (kind == ParamKind.NormalParam || kind == ParamKind.NormalArray)\n\t\t\t\t{\n\t\t\t\t\tvar finalType = arg;\n\t\t\t\t\tif (kind == ParamKind.NormalArray)\n\t\t\t\t\t\tfinalType = finalType.GetElementType() ?? throw new InvalidOperationException(\"Not an array?\");\n\t\t\t\t\tfinalType = UnwrapParamType(finalType);\n\t\t\t\t\tvar method = finalType.GetMethod(\"TryFrom\", BindingFlags.Public | BindingFlags.Static);\n\t\t\t\t\tif (method != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (method.ReturnType == typeof(object))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// return directly: (object) -> object\n\t\t\t\t\t\t\ttryFrom = (TryFromFn)method.CreateDelegate(typeof(TryFromFn));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (method.ReturnType.IsClass)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// have: [object]->class\n\t\t\t\t\t\t\t// can be casted with covariance to [object]->object\n\t\t\t\t\t\t\ttryFrom = (TryFromFn)method.CreateDelegate(typeof(Func<,>).MakeGenericType(typeof(object), method.ReturnType));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(method.ReturnType.IsValueType)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatic TryFromFn? TryCreateWith(MethodInfo method, Type retType)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (method.ReturnType != retType) return null;\n\t\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tvar tryFromToObjectWrapper = new DynamicMethod(\n\t\t\t\t\t\t\t\t\t\t\"TryFromToObjectWrapper\", typeof(object), new[] { typeof(object) }, typeof(FunctionCommand).Module);\n\t\t\t\t\t\t\t\t\tvar il = tryFromToObjectWrapper.GetILGenerator();\n\t\t\t\t\t\t\t\t\til.Emit(OpCodes.Ldarg_0);\n\t\t\t\t\t\t\t\t\til.Emit(OpCodes.Call, method);\n\t\t\t\t\t\t\t\t\til.Emit(OpCodes.Box, retType);\n\t\t\t\t\t\t\t\t\til.Emit(OpCodes.Ret);\n\t\t\t\t\t\t\t\t\treturn (TryFromFn)tryFromToObjectWrapper.CreateDelegate(typeof(TryFromFn));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcatch { return null; }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// have: [object]->value\n\t\t\t\t\t\t\t// box with (object)([object]->value)\n\t\t\t\t\t\t\ttryFrom ??= TryCreateWith(method, method.ReturnType);\n\t\t\t\t\t\t\t// have: [object]->value?\n\t\t\t\t\t\t\t// box with (object)([object]->value?)\n\t\t\t\t\t\t\ttryFrom ??= TryCreateWith(method, typeof(Nullable<>).MakeGenericType(method.ReturnType));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (kind.IsNormal())\n\t\t\t\t{\n\t\t\t\t\t// If we have the last normal parameter, check if it fits the criteria\n\t\t\t\t\t// to be extened to a tail string.\n\t\t\t\t\t// If it does not, we set foundTail to true anyway, since no other\n\t\t\t\t\t// fitting parameter would be a tail anymore\n\t\t\t\t\tif (!foundTail && arg == typeof(string))\n\t\t\t\t\t\tkind = ParamKind.NormalTailString;\n\t\t\t\t\tfoundTail = true;\n\t\t\t\t}\n\n\t\t\t\tprecomputed[i] = new ParamInfo(\n\t\t\t\t\tparameterInfo,\n\t\t\t\t\tkind,\n\t\t\t\t\tparameterInfo.IsOptional || parameterInfo.GetCustomAttribute<ParamArrayAttribute>() != null,\n\t\t\t\t\ttryFrom);\n\t\t\t}\n\n\t\t\treturn precomputed;\n\t\t}\n\n\t\tpublic static Type UnwrapParamType(Type type)\n\t\t{\n\t\t\tif (type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))\n\t\t\t\treturn type.GenericTypeArguments[0];\n\t\t\treturn type;\n\t\t}\n\n\t\tpublic static Type UnwrapReturnType(Type type)\n\t\t{\n\t\t\tif (type.IsConstructedGenericType)\n\t\t\t{\n\t\t\t\tvar genDef = type.GetGenericTypeDefinition();\n\t\t\t\tif (genDef == typeof(Nullable<>))\n\t\t\t\t\treturn type.GenericTypeArguments[0];\n\t\t\t\tif (genDef == typeof(JsonValue<>))\n\t\t\t\t\treturn type.GenericTypeArguments[0];\n\t\t\t\tif (genDef == typeof(JsonArray<>))\n\t\t\t\t\treturn type.GenericTypeArguments[0].MakeArrayType();\n\t\t\t}\n\t\t\treturn type;\n\t\t}\n\n\t\t[return: NotNullIfNotNull(\"value\")]\n\t\tprivate static object? UnwrapReturn(object? value)\n\t\t{\n\t\t\tif (value is null)\n\t\t\t\treturn null;\n\n\t\t\tif (value is IWrappedResult wrapped)\n\t\t\t\treturn wrapped.Content;\n\n\t\t\tvar type = value.GetType();\n\t\t\tif (type.IsConstructedGenericType)\n\t\t\t{\n\t\t\t\tvar genDef = type.GetGenericTypeDefinition();\n\t\t\t\tif (genDef == typeof(Nullable<>))\n\t\t\t\t\treturn type.GetProperty(\"Value\")!.GetValue(value);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tpublic static CommandException ThrowAtLeastNArguments(int count)\n\t\t{\n\t\t\tif (count <= 0)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(count), count, \"The count must be at least 1\");\n\t\t\tvar throwString = count switch\n\t\t\t{\n\t\t\t\t1 => strings.error_cmd_at_least_one_argument,\n\t\t\t\t2 => strings.error_cmd_at_least_two_argument,\n\t\t\t\t3 => strings.error_cmd_at_least_three_argument,\n\t\t\t\t4 => strings.error_cmd_at_least_four_argument,\n\t\t\t\t_ => string.Format(strings.error_cmd_at_least_n_arguments, count),\n\t\t\t};\n\t\t\treturn new CommandException(throwString, CommandExceptionReason.MissingParameter);\n\t\t}\n\n\t\t[return: NotNullIfNotNull(\"value\")]\n\t\tpublic static object? ConvertParam(object? value, Type targetType, ParamInfo param, Lazy<Algorithm.IFilter> filter)\n\t\t{\n\t\t\tif (value is null)\n\t\t\t\treturn null;\n\t\t\tif (targetType == typeof(string))\n\t\t\t\treturn value.ToString();\n\n\t\t\tvar valueType = value.GetType();\n\t\t\tif (targetType == valueType || targetType.IsAssignableFrom(valueType))\n\t\t\t\treturn value;\n\t\t\tvalue = UnwrapReturn(value);\n\t\t\tvalueType = value.GetType();\n\t\t\tif (targetType == valueType || targetType.IsAssignableFrom(valueType))\n\t\t\t\treturn value;\n\n\t\t\tif (param.TryFrom != null)\n\t\t\t{\n\t\t\t\tvar tryResult = param.TryFrom(value);\n\t\t\t\tif (tryResult != null)\n\t\t\t\t{\n\t\t\t\t\treturn tryResult;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (targetType.IsEnum)\n\t\t\t{\n\t\t\t\tvar strValue = value.ToString() ?? throw new ArgumentNullException(nameof(value));\n\t\t\t\tvar enumVals = Enum.GetValues(targetType).Cast<Enum>();\n\t\t\t\tvar result = filter.Value.Filter(enumVals.Select(x => new KeyValuePair<string, Enum>(x.ToString(), x)), strValue).Select(x => x.Value).FirstOrDefault();\n\t\t\t\tif (result is null)\n\t\t\t\t\tthrow new CommandException(string.Format(strings.error_cmd_could_not_convert_to, strValue, targetType.Name), CommandExceptionReason.MissingParameter);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tvar unwrappedTargetType = UnwrapParamType(targetType);\n\t\t\tif (valueType == typeof(string) && unwrappedTargetType == typeof(TimeSpan))\n\t\t\t{\n\t\t\t\tvar time = TextUtil.ParseTime((string)value);\n\t\t\t\tif (time is null)\n\t\t\t\t\tthrow new CommandException(string.Format(strings.error_cmd_could_not_convert_to, value, nameof(TimeSpan)), CommandExceptionReason.MissingParameter);\n\t\t\t\treturn time.Value;\n\t\t\t}\n\n\t\t\t// Autoconvert\n\t\t\ttry { return Convert.ChangeType(value, unwrappedTargetType, CultureInfo.InvariantCulture); }\n\t\t\tcatch (FormatException ex) { throw new CommandException(string.Format(strings.error_cmd_could_not_convert_to, value, unwrappedTargetType.Name), ex, CommandExceptionReason.MissingParameter); }\n\t\t\tcatch (OverflowException ex) { throw new CommandException(strings.error_cmd_number_too_big, ex, CommandExceptionReason.MissingParameter); }\n\t\t\tcatch (InvalidCastException ex) { throw new CommandException(string.Format(strings.error_cmd_could_not_convert_to, value, unwrappedTargetType.Name), ex, CommandExceptionReason.MissingParameter); }\n\t\t}\n\n\t\tprivate static object? GetDefault(Type type)\n\t\t{\n\t\t\tif (type.IsArray)\n\t\t\t{\n\t\t\t\tvar typeArr = type.GetElementType()!;\n\t\t\t\treturn Array.CreateInstance(typeArr, 0);\n\t\t\t}\n\t\t\tif (type.IsValueType)\n\t\t\t{\n\t\t\t\treturn Activator.CreateInstance(type);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic enum ParamKind\n\t{\n\t\tUnknown,\n\t\tSpecialArguments,\n\t\tDependency,\n\t\tNormalCommand,\n\t\tNormalParam,\n\t\tNormalArray,\n\t\tNormalTailString,\n\t}\n\n\t[DebuggerDisplay(\"{Kind} {Name,nq}{Optional ? \\\"?\\\" : \\\"\\\",nq} ({Type.Name,nq})\")]\n\tpublic class ParamInfo\n\t{\n\t\tpublic ParamKind Kind { get; }\n\t\tpublic bool Optional { get; }\n\t\tpublic ParameterInfo Param { get; }\n\t\tpublic TryFromFn? TryFrom { get; }\n\t\tpublic Type Type => Param.ParameterType;\n\t\tpublic string Name => Param.Name ?? \"<no name>\";\n\n\t\tpublic ParamInfo(ParameterInfo param, ParamKind kind, bool optional, TryFromFn? tryFrom)\n\t\t{\n\t\t\tParam = param;\n\t\t\tKind = kind;\n\t\t\tOptional = optional;\n\t\t\tTryFrom = tryFrom;\n\t\t}\n\t}\n\n\tpublic static class FunctionCommandExtensions\n\t{\n\t\tpublic static bool IsNormal(this ParamKind kind)\n\t\t\t=> kind == ParamKind.NormalParam\n\t\t\t|| kind == ParamKind.NormalArray\n\t\t\t|| kind == ParamKind.NormalCommand\n\t\t\t|| kind == ParamKind.NormalTailString;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/ICommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\tpublic interface ICommand\n\t{\n\t\t/// <summary>Execute this command.</summary>\n\t\t/// <param name=\"info\">All global informations for this execution.</param>\n\t\t/// <param name=\"arguments\">\n\t\t/// The arguments for this command.\n\t\t/// They are evaluated lazy which means they will only be evaluated if needed.\n\t\t/// </param>\n\t\t/// <param name=\"returnTypes\">\n\t\t/// The possible return types that should be returned by this execution.\n\t\t/// They are ordered by priority so, if possible, the first return type should be picked, then the second and so on.\n\t\t///\n\t\t/// These types can contain primitive types, the actual return value will then be wrapped into a <see cref=\"CommandResults.IPrimitiveResult{T}\"/>.\n\t\t/// null inside the list allows an empty result.\n\t\t/// </param>\n\t\t/// <returns>\n\t\t/// <para>The result of this command.</para>\n\t\t/// <para>null is an empty result.</para>\n\t\t/// </returns>\n\t\tValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/LazyCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\tpublic class LazyCommand : ICommand\n\t{\n\t\tprivate readonly ICommand innerCommand;\n\t\tprivate bool executed = false;\n\t\t/// <summary>\n\t\t/// The cached result, if available.\n\t\t/// </summary>\n\t\tprivate object? result;\n\n\t\tpublic LazyCommand(ICommand innerCommandArg)\n\t\t{\n\t\t\tinnerCommand = innerCommandArg;\n\t\t}\n\n\t\tpublic virtual async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tif (!executed)\n\t\t\t{\n\t\t\t\tresult = await innerCommand.Execute(info, arguments);\n\t\t\t\texecuted = true;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tpublic override string ToString() => $\"L({innerCommand})\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/OverloadedFunctionCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\tpublic class OverloadedFunctionCommand : ICommand\n\t{\n\t\tpublic List<FunctionCommand> Functions { get; }\n\n\t\tpublic OverloadedFunctionCommand() : this(Array.Empty<FunctionCommand>()) { }\n\t\tpublic OverloadedFunctionCommand(IEnumerable<FunctionCommand> functionsArg)\n\t\t{\n\t\t\tFunctions = functionsArg.ToList();\n\t\t}\n\n\t\tpublic void AddCommand(FunctionCommand command)\n\t\t{\n\t\t\tFunctions.Add(command);\n\t\t\tSortList();\n\t\t}\n\t\tpublic bool RemoveCommand(FunctionCommand command) => Functions.Remove(command);\n\n\t\tprivate void SortList()\n\t\t{\n\t\t\tFunctions.Sort((f1, f2) =>\n\t\t\t{\n\t\t\t\t// The first function in the list should be the most specialized.\n\t\t\t\t// If the execute the command we will iterate through the list from the beginning\n\t\t\t\t// and choose the first matching function.\n\n\t\t\t\t// Sort out special arguments\n\t\t\t\t// and remove the nullable wrapper\n\t\t\t\tvar params1 = (from p in f1.CommandParameter\n\t\t\t\t\t\t\t   where p.Kind.IsNormal()\n\t\t\t\t\t\t\t   select FunctionCommand.UnwrapParamType(p.Type)).ToList();\n\n\t\t\t\tvar params2 = (from p in f2.CommandParameter\n\t\t\t\t\t\t\t   where p.Kind.IsNormal()\n\t\t\t\t\t\t\t   select FunctionCommand.UnwrapParamType(p.Type)).ToList();\n\n\t\t\t\tfor (int i = 0; i < params1.Count; i++)\n\t\t\t\t{\n\t\t\t\t\t// Prefer functions with higher parameter count\n\t\t\t\t\tif (i >= params2.Count)\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t// Not found returns -1, so more important than any found index\n\t\t\t\t\tint i1 = Array.IndexOf(CommandSystemTypes.TypeOrder, params1[i]);\n\t\t\t\t\tint i2 = Array.IndexOf(CommandSystemTypes.TypeOrder, params2[i]);\n\t\t\t\t\t// Prefer lower argument\n\t\t\t\t\tif (i1 < i2)\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\tif (i1 > i2)\n\t\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\tif (params2.Count > params1.Count)\n\t\t\t\t\treturn 1;\n\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t}\n\n\t\tpublic virtual async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\t// Make arguments lazy, we only want to execute them once\n\t\t\targuments = arguments.Select(c => new LazyCommand(c)).ToArray();\n\t\t\tCommandException? contextException = null;\n\t\t\tforeach (var f in Functions)\n\t\t\t{\n\t\t\t\t// Try to call each overload\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\treturn await f.Execute(info, arguments);\n\t\t\t\t}\n\t\t\t\tcatch (CommandException cmdEx)\n\t\t\t\t\twhen (cmdEx.Reason == CommandExceptionReason.MissingParameter\n\t\t\t\t\t\t|| cmdEx.Reason == CommandExceptionReason.MissingContext)\n\t\t\t\t{\n\t\t\t\t\t// When we encounter a missing module problem we store it for later, as it is more helpful\n\t\t\t\t\t// im most cases to know that some commands *could* have matched if the module were there.\n\t\t\t\t\tif (cmdEx.Reason == CommandExceptionReason.MissingContext)\n\t\t\t\t\t\tcontextException = cmdEx;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (contextException != null)\n\t\t\t\tSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(contextException).Throw();\n\t\t\tthrow new CommandException(strings.error_cmd_no_matching_overload, CommandExceptionReason.MissingParameter);\n\t\t}\n\n\t\tpublic override string ToString() => \"<overload>\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/ResultCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\t/// <summary>\n\t/// A command that stores a result and returns it.\n\t/// </summary>\n\tpublic class ResultCommand : ICommand\n\t{\n\t\tpublic object? Content { get; }\n\n\t\tpublic ResultCommand(object? contentArg)\n\t\t{\n\t\t\tContent = contentArg;\n\t\t}\n\n#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously\n\t\tpublic virtual async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously\n\t\t{\n\t\t\treturn Content;\n\t\t}\n\n\t\tpublic override string ToString() => \"<result>\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Commands/RootCommand.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Dependency;\n\nnamespace TS3AudioBot.CommandSystem.Commands\n{\n\t/// <summary>\n\t/// A special group founction that extracts the root group from the current execution context\n\t/// </summary>\n\tpublic class RootCommand : ICommand\n\t{\n\t\tprivate readonly IReadOnlyList<ICommand> internArguments;\n\n\t\tpublic RootCommand(IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tinternArguments = arguments;\n\t\t}\n\n\t\tpublic virtual async ValueTask<object?> Execute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tif (!info.TryGet<CommandManager>(out var cmdSys))\n\t\t\t\tthrow new CommandException(\"Could not find local commandsystem tree\", CommandExceptionReason.MissingContext);\n\n\t\t\tIReadOnlyList<ICommand> merged;\n\t\t\tif (arguments.Count == 0)\n\t\t\t\tmerged = internArguments;\n\t\t\telse if (internArguments.Count == 0)\n\t\t\t\tmerged = arguments;\n\t\t\telse\n\t\t\t\tmerged = internArguments.Concat(arguments).ToArray();\n\t\t\treturn await cmdSys.RootGroup.Execute(info, merged);\n\t\t}\n\n\t\tpublic override string ToString() => $\"RootCmd({string.Join(\", \", internArguments)})\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/ExecutionInformation.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TS3AudioBot.Dependency;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\tpublic class ExecutionInformation : ChainedInjector<BasicInjector>\n\t{\n\t\tpublic ExecutionInformation() : this(NullInjector.Instance) { }\n\t\tpublic ExecutionInformation(IInjector parent) : base(parent, new BasicInjector())\n\t\t{\n\t\t\tthis.AddModule(this);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/ICommandBag.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\tpublic interface ICommandBag\n\t{\n\t\tIReadOnlyCollection<BotCommand> BagCommands { get; }\n\t\tIReadOnlyCollection<string> AdditionalRights { get; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/StaticList.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace TS3AudioBot.CommandSystem\n{\n\tinternal static class StaticList\n\t{\n\t\tpublic static IReadOnlyList<T> TrySegment<T>(this IReadOnlyList<T> list, int start)\n\t\t{\n\t\t\tif (start == 0)\n\t\t\t\treturn list;\n\t\t\tif (start >= list.Count)\n\t\t\t\treturn Array.Empty<T>();\n\t\t\treturn list switch\n\t\t\t{\n\t\t\t\tT[] array => new ArraySegment<T>(array, start, array.Length - start),\n\t\t\t\tArraySegment<T> arrayseg => arrayseg[start..],\n\t\t\t\t_ => list.Skip(start).ToArray(),\n\t\t\t};\n\t\t}\n\n\t\tpublic static IReadOnlyList<T> TrySegment<T>(this IReadOnlyList<T> list, int start, int length)\n\t\t{\n\t\t\treturn list switch\n\t\t\t{\n\t\t\t\tT[] array => new ArraySegment<T>(array, start, length),\n\t\t\t\tArraySegment<T> arrayseg => arrayseg.Slice(start, length),\n\t\t\t\t_ => list.Skip(start).Take(length).ToArray(),\n\t\t\t};\n\t\t}\n\n\t\tpublic static void CopyTo<T>(this IReadOnlyList<T> list, int srcOffset, T[] target, int dstOffset)\n\t\t\t=> CopyTo(list, srcOffset, target, dstOffset, list.Count - srcOffset);\n\n\t\tpublic static void CopyTo<T>(this IReadOnlyList<T> list, int srcOffset, T[] target, int dstOffset, int length)\n\t\t{\n\t\t\tswitch (list)\n\t\t\t{\n\t\t\tcase T[] array:\n\t\t\t\tArray.Copy(array, srcOffset, target, dstOffset, length);\n\t\t\t\tbreak;\n\n\t\t\tcase ArraySegment<T> segArray:\n\t\t\t\tif (srcOffset + length > segArray.Count)\n\t\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(length));\n\t\t\t\tArray.Copy(segArray.Array!, segArray.Offset + srcOffset, target, dstOffset, length);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tfor (int i = 0; i < length; i++)\n\t\t\t\t\ttarget[dstOffset + i] = list[srcOffset + i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Text/AppliedTextMod.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.CommandSystem.Text\n{\n\tpublic readonly struct AppliedTextMod\n\t{\n\t\tpublic string? Text { get; }\n\t\tpublic TextMod Mod { get; }\n\n\t\tpublic AppliedTextMod(string? text)\n\t\t{\n\t\t\tText = text;\n\t\t\tMod = TextMod.None;\n\t\t}\n\n\t\tpublic AppliedTextMod(string? text, TextMod mod)\n\t\t{\n\t\t\tText = text;\n\t\t\tMod = mod;\n\t\t}\n\n\t\tpublic readonly AppliedTextMod Color(Color color) => new AppliedTextMod(Text, Mod.Color(color));\n\t\tpublic readonly AppliedTextMod Bold() => new AppliedTextMod(Text, Mod.Bold());\n\t\tpublic readonly AppliedTextMod Italic() => new AppliedTextMod(Text, Mod.Italic());\n\t\tpublic readonly AppliedTextMod Underline() => new AppliedTextMod(Text, Mod.Underline());\n\t\tpublic readonly AppliedTextMod Strike() => new AppliedTextMod(Text, Mod.Strike());\n\n\t\tpublic static implicit operator AppliedTextMod(string? text) => new AppliedTextMod(text);\n\n\t\tpublic override readonly string? ToString() => Text;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Text/Color.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace TS3AudioBot.CommandSystem.Text\n{\n\tpublic readonly struct Color\n\t{\n\t\tpublic byte R { get; }\n\t\tpublic byte G { get; }\n\t\tpublic byte B { get; }\n\t\tpublic ColorFlags Flags { get; }\n\n\t\tpublic static readonly Color Black = new Color(0, 0, 0);\n\t\tpublic static readonly Color DarkGray = new Color(64, 64, 64);\n\t\tpublic static readonly Color Gray = new Color(128, 128, 128);\n\t\tpublic static readonly Color LightGray = new Color(192, 192, 192);\n\t\tpublic static readonly Color Red = new Color(255, 0, 0);\n\t\tpublic static readonly Color Green = new Color(0, 255, 0);\n\t\tpublic static readonly Color Blue = new Color(0, 0, 255);\n\t\tpublic static readonly Color Yellow = new Color(255, 255, 0);\n\t\tpublic static readonly Color Cyan = new Color(0, 255, 255);\n\t\tpublic static readonly Color Pink = new Color(255, 0, 255);\n\t\tpublic static readonly Color Orange = new Color(255, 128, 0);\n\t\tpublic static readonly Color White = new Color(255, 255, 255);\n\t\tpublic static readonly Color Transparent = new Color(0, 0, 0, ColorFlags.Transparent);\n\n\t\tprivate static readonly Dictionary<Color, string> ColorOptimizer = new Dictionary<Color, string>();\n\n\t\tstatic Color()\n\t\t{\n\t\t\tvar colors = new[] {\n\t\t\t\t( new Color(0, 255, 255), \"aqua\" ),\n\t\t\t\t( new Color(240, 255, 255), \"azure\" ),\n\t\t\t\t( new Color(245, 245, 220), \"beige\" ),\n\t\t\t\t( new Color(255, 228, 196), \"bisque\" ),\n\t\t\t\t( new Color(0, 0, 0), \"black\" ),\n\t\t\t\t( new Color(0, 0, 255), \"blue\" ),\n\t\t\t\t( new Color(165, 42, 42), \"brown\" ),\n\t\t\t\t( new Color(255, 127, 80), \"coral\" ),\n\t\t\t\t( new Color(0, 255, 255), \"cyan\" ),\n\t\t\t\t( new Color(255, 215, 0), \"gold\" ),\n\t\t\t\t( new Color(128, 128, 128), \"gray\" ),\n\t\t\t\t( new Color(0, 128, 0), \"green\" ),\n\t\t\t\t( new Color(75, 0, 130), \"indigo\" ),\n\t\t\t\t( new Color(255, 255, 240), \"ivory\" ),\n\t\t\t\t( new Color(240, 230, 140), \"khaki\" ),\n\t\t\t\t( new Color(0, 255, 0), \"lime\" ),\n\t\t\t\t( new Color(250, 240, 230), \"linen\" ),\n\t\t\t\t( new Color(128, 0, 0), \"maroon\" ),\n\t\t\t\t( new Color(0, 0, 128), \"navy\" ),\n\t\t\t\t( new Color(128, 128, 0), \"olive\" ),\n\t\t\t\t( new Color(255, 165, 0), \"orange\" ),\n\t\t\t\t( new Color(218, 112, 214), \"orchid\" ),\n\t\t\t\t( new Color(205, 133, 63), \"peru\" ),\n\t\t\t\t( new Color(255, 192, 203), \"pink\" ),\n\t\t\t\t( new Color(221, 160, 221), \"plum\" ),\n\t\t\t\t( new Color(128, 0, 128), \"purple\" ),\n\t\t\t\t( new Color(255, 0, 0), \"red\" ),\n\t\t\t\t( new Color(250, 128, 114), \"salmon\" ),\n\t\t\t\t( new Color(160, 82, 45), \"sienna\" ),\n\t\t\t\t( new Color(192, 192, 192), \"silver\" ),\n\t\t\t\t( new Color(255, 250, 250), \"snow\" ),\n\t\t\t\t( new Color(210, 180, 140), \"tan\" ),\n\t\t\t\t( new Color(0, 128, 128), \"teal\" ),\n\t\t\t\t( new Color(255, 99, 71), \"tomato\" ),\n\t\t\t\t( new Color(238, 130, 238), \"violet\" ),\n\t\t\t\t( new Color(245, 222, 179), \"wheat\" ),\n\t\t\t\t( new Color(255, 255, 255), \"white\" ),\n\t\t\t\t( new Color(255, 255, 0), \"yellow\" ),\n\t\t\t};\n\n\t\t\tforeach (var values in colors)\n\t\t\t{\n\t\t\t\tvar col = values.Item1;\n\t\t\t\tif (values.Item2.Length < 4\n\t\t\t\t\t|| (values.Item2.Length < 7 && (!IsDouble(col.R) || !IsDouble(col.G) || !IsDouble(col.B))))\n\t\t\t\t{\n\t\t\t\t\tif (!ColorOptimizer.TryGetValue(col, out var name) || name.Length > values.Item2.Length)\n\t\t\t\t\t{\n\t\t\t\t\t\tColorOptimizer[col] = values.Item2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic Color(byte r, byte g, byte b) : this(r, g, b, ColorFlags.Solid) { }\n\t\tpublic Color(byte r, byte g, byte b, ColorFlags flags)\n\t\t{\n\t\t\tR = r;\n\t\t\tG = g;\n\t\t\tB = b;\n\t\t\tFlags = flags;\n\t\t}\n\n\t\tprivate static bool IsDouble(byte num) => (num & 0x0F) == (num >> 4);\n\n\t\tpublic readonly void GetL(StringBuilder strb)\n\t\t{\n\t\t\tif (Flags.HasFlag(ColorFlags.Transparent))\n\t\t\t\tstrb.Append(\"[COLOR=transparent]\");\n\t\t\telse if (ColorOptimizer.TryGetValue(this, out var optValue))\n\t\t\t\tstrb.AppendFormat(\"[COLOR={0}]\", optValue);\n\t\t\telse if (IsDouble(R) && IsDouble(G) && IsDouble(B))\n\t\t\t\tstrb.AppendFormat(\"[COLOR=#{0:X}{1:X}{2:X}]\", R & 0x0F, G & 0x0F, B & 0x0F);\n\t\t\telse\n\t\t\t\tstrb.AppendFormat(\"[COLOR=#{0:X2}{1:X2}{2:X2}]\", R, G, B);\n\t\t}\n\n\t\tpublic override readonly bool Equals(object? obj)\n\t\t{\n\t\t\tif (obj is Color col)\n\t\t\t{\n\t\t\t\treturn this == col;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tpublic override readonly int GetHashCode() => (int)Flags << 24 | R << 16 | G << 8 | B;\n\n\t\tpublic override readonly string ToString()\n\t\t{\n\t\t\tvar strb = new StringBuilder();\n\t\t\tGetL(strb);\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tpublic static bool operator ==(Color a, Color b) => a.R == b.R && a.G == b.G && a.B == b.B && a.Flags == b.Flags;\n\n\t\tpublic static bool operator !=(Color a, Color b) => a.R != b.R || a.G != b.G || a.B != b.B || a.Flags != b.Flags;\n\t}\n\n\t[Flags]\n\tpublic enum ColorFlags : byte\n\t{\n\t\tSolid = 0,\n\t\tTransparent = 1 << 0,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Text/LongTextBehaviour.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.CommandSystem.Text\n{\n\tpublic enum LongTextBehaviour\n\t{\n\t\t/// <summary>Splits the message preferably at line breaks.</summary>\n\t\tSplit,\n\t\t/// <summary>Splits at exact maximum length per message.</summary>\n\t\tSplitHard,\n\t\t/// <summary>Discards the message.</summary>\n\t\tDrop,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Text/LongTextTransform.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing TSLib.Commands;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.CommandSystem.Text\n{\n\tpublic static class LongTextTransform\n\t{\n\t\tprivate static readonly byte[] SeparatorWeight = new byte[] { (byte)'\\n', (byte)',', (byte)' ' };\n\n\t\tpublic static IEnumerable<string> Split(string text, LongTextBehaviour behaviour, int maxMessageSize, int limit = int.MaxValue)\n\t\t{\n\t\t\tif (maxMessageSize < 4)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(maxMessageSize), \"The minimum split length must be at least 4 bytes to fit all utf8 characters\");\n\n\t\t\t// Assuming worst case that each UTF-8 character which epands to 4 bytes.\n\t\t\t// If the message is still shorter we can safely return in 1 block.\n\t\t\tif (text.Length * 4 <= maxMessageSize)\n\t\t\t\treturn new[] { text };\n\n\t\t\tvar bytes = Tools.Utf8Encoder.GetBytes(text);\n\n\t\t\t// If the entire text UTF-8 encoded fits in one message we can return early.\n\t\t\tif (bytes.Length * 2 < maxMessageSize)\n\t\t\t\treturn new[] { text };\n\n\t\t\tvar list = new List<string>();\n\t\t\tSpan<Ind> splitIndices = stackalloc Ind[SeparatorWeight.Length];\n\n\t\t\tvar block = bytes.AsSpan();\n\t\t\twhile (block.Length > 0)\n\t\t\t{\n\t\t\t\tint tokenCnt = 0;\n\t\t\t\tint i = 0;\n\t\t\t\tbool filled = false;\n\n\t\t\t\tfor (; i < block.Length; i++)\n\t\t\t\t{\n\t\t\t\t\ttokenCnt += TsString.IsDoubleChar(block[i]) ? 2 : 1;\n\n\t\t\t\t\tif (tokenCnt > maxMessageSize)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (behaviour == LongTextBehaviour.Drop)\n\t\t\t\t\t\t\treturn Enumerable.Empty<string>();\n\n\t\t\t\t\t\tfilled = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (int j = 0; j < SeparatorWeight.Length; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (block[i] == SeparatorWeight[j])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsplitIndices[j] = new Ind(i, tokenCnt);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!filled)\n\t\t\t\t{\n\t\t\t\t\tlist.Add(block.NewUtf8String());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbool hasSplit = false;\n\t\t\t\tif (behaviour != LongTextBehaviour.SplitHard)\n\t\t\t\t{\n\t\t\t\t\tfor (int j = 0; j < SeparatorWeight.Length; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!hasSplit && splitIndices[j].i > 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlist.Add(block.Slice(0, splitIndices[j].i + 1).NewUtf8String());\n\t\t\t\t\t\t\tblock = block.Slice(splitIndices[j].i + 1);\n\t\t\t\t\t\t\thasSplit = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsplitIndices.Fill(new Ind());\n\t\t\t\t}\n\n\t\t\t\tif (!hasSplit)\n\t\t\t\t{\n\t\t\t\t\t// UTF-8 adjustment\n\t\t\t\t\twhile (i > 0 && (block[i] & 0xC0) == 0x80)\n\t\t\t\t\t\ti--;\n\n\t\t\t\t\tlist.Add(block.Slice(0, i).NewUtf8String());\n\t\t\t\t\tblock = block.Slice(i);\n\t\t\t\t}\n\n\t\t\t\tif (--limit == 0)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\n\t\tprivate readonly struct Ind\n\t\t{\n\t\t\tpublic readonly int i;\n\t\t\tpublic readonly int tok;\n\n\t\t\tpublic Ind(int i, int tok)\n\t\t\t{\n\t\t\t\tthis.i = i;\n\t\t\t\tthis.tok = tok;\n\t\t\t}\n\n\t\t\tpublic override readonly string ToString() => $\"i:{i} tok:{tok}\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Text/TextMod.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.CommandSystem.Text\n{\n\tpublic readonly struct TextMod : IEquatable<TextMod>\n\t{\n\t\tpublic static readonly TextMod None = new TextMod(0, null);\n\n\t\tpublic TextModFlag Flags { get; }\n\t\tpublic Color? HasColor { get; }\n\n\t\tpublic TextMod(TextModFlag flags, Color? color = null)\n\t\t{\n\t\t\tFlags = flags;\n\t\t\tHasColor = color;\n\t\t}\n\n\t\tpublic readonly TextMod Color(Color color) => new TextMod(Flags | TextModFlag.Color, color);\n\t\tpublic readonly TextMod Bold() => new TextMod(Flags | TextModFlag.Bold, HasColor);\n\t\tpublic readonly TextMod Italic() => new TextMod(Flags | TextModFlag.Italic, HasColor);\n\t\tpublic readonly TextMod Strike() => new TextMod(Flags | TextModFlag.Strike, HasColor);\n\t\tpublic readonly TextMod Underline() => new TextMod(Flags | TextModFlag.Underline, HasColor);\n\n\t\tpublic static string Format(AppliedTextMod format, params AppliedTextMod[] para)\n\t\t\t=> new TextModBuilder().AppendFormat(format, para).ToString();\n\n\t\tpublic static string Format(bool color, AppliedTextMod format, params AppliedTextMod[] para)\n\t\t{\n\t\t\tif (color)\n\t\t\t\treturn Format(format, para);\n\t\t\tif (string.IsNullOrEmpty(format.Text))\n\t\t\t\treturn string.Empty;\n\t\t\treturn string.Format(format.Text, para);\n\t\t}\n\n\t\tpublic readonly bool Equals(TextMod other) => Flags == other.Flags && HasColor == other.HasColor;\n\t\tpublic override readonly bool Equals(object? obj) => obj is TextMod tm && Equals(tm);\n\t\tpublic static bool operator ==(TextMod a, TextMod b) => a.Flags == b.Flags && a.HasColor == b.HasColor;\n\t\tpublic static bool operator !=(TextMod a, TextMod b) => a.Flags != b.Flags || a.HasColor != b.HasColor;\n\t\tpublic override readonly int GetHashCode() => ((int)Flags << 28) | HasColor.GetHashCode();\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Text/TextModBuilder.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace TS3AudioBot.CommandSystem.Text\n{\n\tpublic class TextModBuilder\n\t{\n\t\tprivate readonly bool color;\n\t\tprivate readonly StringBuilder strb;\n\t\tprivate TextMod cur = TextMod.None;\n\n\t\tpublic int Length { get => strb.Length; set => strb.Length = value; }\n\n\t\tpublic TextModBuilder(bool color = true)\n\t\t\t: this(new StringBuilder(), color) { }\n\n\t\tpublic TextModBuilder(StringBuilder strb, bool color = true)\n\t\t{\n\t\t\tthis.strb = strb ?? throw new ArgumentNullException(nameof(strb));\n\t\t\tthis.color = color;\n\t\t}\n\n\t\tpublic TextModBuilder Append(AppliedTextMod atm) => Append(atm.Text, atm.Mod);\n\n\t\tpublic TextModBuilder Append(string? text, TextMod mod)\n\t\t{\n\t\t\tif (color)\n\t\t\t\tStartText(strb, text, ref cur, mod);\n\t\t\telse\n\t\t\t\tstrb.Append(text);\n\t\t\treturn this;\n\t\t}\n\n\t\tpublic TextModBuilder AppendLine(AppliedTextMod atm)\n\t\t{\n\t\t\tAppend(atm.Text, atm.Mod);\n\t\t\tstrb.Append('\\n');\n\t\t\treturn this;\n\t\t}\n\n\t\tpublic TextModBuilder AppendLine(string? text, TextMod mod)\n\t\t{\n\t\t\tAppend(text, mod);\n\t\t\tstrb.Append('\\n');\n\t\t\treturn this;\n\t\t}\n\n\t\tpublic TextModBuilder AppendFormat(AppliedTextMod format, params AppliedTextMod[] para)\n\t\t{\n\t\t\tif (para.Length == 0)\n\t\t\t{\n\t\t\t\tAppend(format);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar parts = Regex.Split(format.Text, @\"{\\d+}\");\n\n\t\t\t\tfor (int i = 0; i < parts.Length - 1; i++)\n\t\t\t\t{\n\t\t\t\t\tAppend(parts[i], format.Mod);\n\t\t\t\t\tAppend(para[i]);\n\t\t\t\t}\n\t\t\t\tAppend(parts[^1], format.Mod);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\tprivate static void StartText(StringBuilder strb, string? text, ref TextMod cur, TextMod mod)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(text))\n\t\t\t\treturn;\n\t\t\tvar curFlags = cur.Flags;\n\t\t\tvar modFlags = mod.Flags;\n\t\t\tvar close = curFlags & ~modFlags;\n\t\t\tif ((curFlags & modFlags).HasFlag(TextModFlag.Color) && cur.HasColor != mod.HasColor) close |= TextModFlag.Color;\n\t\t\tvar trimClose = GetShortest(close);\n\t\t\tcurFlags = End(strb, curFlags, trimClose);\n\t\t\tcurFlags &= (~(trimClose - 1) | modFlags);\n\t\t\tcurFlags = Start(strb, curFlags, mod);\n\t\t\tcur = new TextMod(curFlags, mod.HasColor);\n\t\t\tstrb.Append(text);\n\t\t}\n\n\t\tprivate static TextModFlag Start(StringBuilder strb, TextModFlag cur, TextMod mod)\n\t\t{\n\t\t\tvar flag = ~cur & mod.Flags;\n\t\t\tif (flag.HasFlag(TextModFlag.Bold))\n\t\t\t\tstrb.Append(\"[B]\");\n\t\t\tif (flag.HasFlag(TextModFlag.Italic))\n\t\t\t\tstrb.Append(\"[I]\");\n\t\t\tif (flag.HasFlag(TextModFlag.Strike))\n\t\t\t\tstrb.Append(\"[S]\");\n\t\t\tif (flag.HasFlag(TextModFlag.Underline))\n\t\t\t\tstrb.Append(\"[U]\");\n\t\t\tif (flag.HasFlag(TextModFlag.Color))\n\t\t\t\tmod.HasColor!.Value.GetL(strb);\n\t\t\treturn cur | mod.Flags;\n\t\t}\n\n\t\tprivate static TextModFlag End(StringBuilder strb, TextModFlag cur, TextModFlag mod)\n\t\t{\n\t\t\tvar flag = mod;\n\t\t\tif (flag.HasFlag(TextModFlag.Bold))\n\t\t\t\tstrb.Append(\"[/B]\");\n\t\t\tif (flag.HasFlag(TextModFlag.Italic))\n\t\t\t\tstrb.Append(\"[/I]\");\n\t\t\tif (flag.HasFlag(TextModFlag.Strike))\n\t\t\t\tstrb.Append(\"[/S]\");\n\t\t\tif (flag.HasFlag(TextModFlag.Underline))\n\t\t\t\tstrb.Append(\"[/U]\");\n\t\t\tif (flag.HasFlag(TextModFlag.Color))\n\t\t\t\tstrb.Append(\"[/COLOR]\");\n\t\t\treturn cur & ~mod;\n\t\t}\n\n\t\tprivate static TextModFlag GetShortest(TextModFlag mod)\n\t\t{\n\t\t\tif (mod.HasFlag(TextModFlag.Bold)) return TextModFlag.Bold;\n\t\t\tif (mod.HasFlag(TextModFlag.Italic)) return TextModFlag.Italic;\n\t\t\tif (mod.HasFlag(TextModFlag.Strike)) return TextModFlag.Strike;\n\t\t\tif (mod.HasFlag(TextModFlag.Underline)) return TextModFlag.Underline;\n\t\t\tif (mod.HasFlag(TextModFlag.Color)) return TextModFlag.Color;\n\t\t\treturn 0;\n\t\t}\n\n\t\tpublic override string ToString() => strb.ToString();\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Text/TextModFlag.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.CommandSystem.Text\n{\n\t[Flags]\n\tpublic enum TextModFlag\n\t{\n\t\tNone = 0,\n\t\tColor = 1 << 0,\n\t\tUnderline = 1 << 1,\n\t\tStrike = 1 << 2,\n\t\tItalic = 1 << 3,\n\t\tBold = 1 << 4,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/CommandSystem/Text/TextModHelper.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.CommandSystem.Text\n{\n\tpublic static class TextModHelper\n\t{\n\t\tpublic static AppliedTextMod Mod(this string str) => str;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/Config.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.Config\n{\n\tpublic partial class ConfRoot\n\t{\n\t\tprivate string? fileName;\n\t\tprivate readonly Dictionary<string, ConfBot> botConfCache = new Dictionary<string, ConfBot>();\n\n\t\tpublic static ConfRoot? Open(string file)\n\t\t{\n\t\t\tvar loadResult = Load<ConfRoot>(file);\n\t\t\tif (!loadResult.Ok)\n\t\t\t{\n\t\t\t\tLog.Error(loadResult.Error, \"Could not load core config.\");\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (!loadResult.Value.CheckAndSet(file))\n\t\t\t\treturn null;\n\t\t\treturn loadResult.Value;\n\t\t}\n\n\t\tpublic static ConfRoot? Create(string file)\n\t\t{\n\t\t\tvar newFile = CreateRoot<ConfRoot>();\n\t\t\tif (!newFile.CheckAndSet(file))\n\t\t\t\treturn newFile;\n\t\t\tvar saveResult = newFile.Save(file, true);\n\t\t\tif (!saveResult.Ok)\n\t\t\t{\n\t\t\t\tLog.Error(saveResult.Error, \"Failed to save config file '{0}'.\", file);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn newFile;\n\t\t}\n\n\t\tpublic static ConfRoot? OpenOrCreate(string file) => File.Exists(file) ? Open(file) : Create(file);\n\n\t\tprivate bool CheckAndSet(string file)\n\t\t{\n\t\t\tfileName = file;\n\t\t\tif (!CheckPaths())\n\t\t\t\treturn false;\n\t\t\t// further checks...\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate bool CheckPaths()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (!Directory.Exists(Configs.BotsPath.Value))\n\t\t\t\t\tDirectory.CreateDirectory(Configs.BotsPath.Value);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Could not create bot config subdirectory.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic bool Save() => Save(fileName!, true);\n\n\t\t// apply root_path to input path\n\t\tpublic string GetFilePath(string _)\n\t\t{\n\t\t\tthrow new NotImplementedException();\n\t\t}\n\n\t\tinternal R<FileInfo, LocalStr> NameToPath(string name)\n\t\t{\n\t\t\tvar nameResult = Util.IsSafeFileName(name);\n\t\t\tif (!nameResult.Ok)\n\t\t\t\treturn nameResult.Error;\n\t\t\treturn new FileInfo(Path.Combine(Configs.BotsPath.Value, name, FilesConst.BotConfig));\n\t\t}\n\n\t\tpublic ConfBot CreateBot()\n\t\t{\n\t\t\tvar config = CreateRoot<ConfBot>();\n\t\t\tInitializeBotConfig(config);\n\t\t\treturn config;\n\t\t}\n\n\t\tpublic ConfBot[]? GetAllBots()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn Directory.EnumerateDirectories(Configs.BotsPath.Value)\n\t\t\t\t\t.Select(filePath => new DirectoryInfo(filePath).Name)\n\t\t\t\t\t.SelectOk(GetBotConfig)\n\t\t\t\t\t.ToArray();\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Could not access bot config subdirectory.\");\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tpublic R<ConfBot, Exception> GetBotConfig(string name)\n\t\t{\n\t\t\tvar file = NameToPath(name);\n\t\t\tif (!file.Ok)\n\t\t\t\treturn new Exception(file.Error.Str);\n\t\t\tif (!botConfCache.TryGetValue(name, out var botConf))\n\t\t\t{\n\t\t\t\tvar botConfResult = Load<ConfBot>(file.Value.FullName);\n\t\t\t\tif (!botConfResult.Ok)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(botConfResult.Error, \"Failed to load bot config \\\"{0}\\\"\", name);\n\t\t\t\t\treturn botConfResult.Error;\n\t\t\t\t}\n\t\t\t\tbotConf = botConfResult.Value;\n\t\t\t\tInitializeBotConfig(botConf);\n\t\t\t\tbotConf.Name = name;\n\t\t\t\tbotConfCache[name] = botConf;\n\t\t\t}\n\t\t\treturn botConf;\n\t\t}\n\n\t\tprivate void InitializeBotConfig(ConfBot config)\n\t\t{\n\t\t\tBot.Derive(config);\n\t\t\tconfig.Parent = this;\n\t\t}\n\n\t\tpublic void ClearBotConfigCache()\n\t\t{\n\t\t\tbotConfCache.Clear();\n\t\t}\n\n\t\tpublic void ClearBotConfigCache(string name)\n\t\t{\n\t\t\tbotConfCache.Remove(name);\n\t\t}\n\n\t\tinternal void AddToConfigCache(ConfBot config)\n\t\t{\n\t\t\tvar name = config.Name;\n\t\t\tif (!string.IsNullOrEmpty(name) && !botConfCache.ContainsKey(name))\n\t\t\t\tbotConfCache[name] = config;\n\t\t}\n\n\t\tpublic E<LocalStr> CreateBotConfig(string name)\n\t\t{\n\t\t\tvar file = NameToPath(name);\n\t\t\tif (!file.Ok)\n\t\t\t\treturn file.Error;\n\t\t\tif (file.Value.Exists)\n\t\t\t\treturn new LocalStr(\"The file already exists.\"); // LOC: TODO\n\t\t\ttry\n\t\t\t{\n\t\t\t\tfile.Value.Directory.Create();\n\t\t\t\tusing (File.Open(file.Value.FullName, FileMode.CreateNew))\n\t\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Debug(ex, \"Config file could not be created\");\n\t\t\t\treturn new LocalStr(\"Could not create config.\"); // LOC: TODO\n\t\t\t}\n\t\t}\n\n\t\tpublic E<LocalStr> DeleteBotConfig(string name)\n\t\t{\n\t\t\tvar file = NameToPath(name);\n\t\t\tif (!file.Ok)\n\t\t\t\treturn file.Error;\n\t\t\tif (botConfCache.Remove(name, out var conf))\n\t\t\t\tconf.Name = null;\n\t\t\tif (!file.Value.Exists)\n\t\t\t\treturn R.Ok;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tfile.Value.Delete();\n\t\t\t\tfile.Value.Directory.Delete(true);\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Debug(ex, \"Config file could not be deleted\");\n\t\t\t\treturn new LocalStr(\"Could not delete config.\"); // LOC: TODO\n\t\t\t}\n\t\t}\n\n\t\tpublic E<LocalStr> CopyBotConfig(string from, string to)\n\t\t{\n\t\t\tvar fileFrom = NameToPath(from);\n\t\t\tif (!fileFrom.Ok)\n\t\t\t\treturn fileFrom.Error;\n\t\t\tvar fileTo = NameToPath(to);\n\t\t\tif (!fileTo.Ok)\n\t\t\t\treturn fileTo.Error;\n\n\t\t\tif (!fileFrom.Value.Exists)\n\t\t\t\treturn new LocalStr(\"The source bot does not exist.\");\n\t\t\tif (fileTo.Value.Exists)\n\t\t\t\treturn new LocalStr(\"The target bot already exists, delete it before to overwrite.\");\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tfileTo.Value.Directory.Create();\n\t\t\t\tFile.Copy(fileFrom.Value.FullName, fileTo.Value.FullName, false);\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Config file could not be copied\");\n\t\t\t\treturn new LocalStr(\"Could not copy config.\"); // LOC: TODO\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic partial class ConfBot\n\t{\n\t\tpublic string? Name { get; set; }\n\n\t\tpublic string? LocalConfigDir => Name is null ? null : Path.Combine(GetParent().Configs.BotsPath.Value, Name);\n\n\t\tpublic E<LocalStr> SaveNew(string name)\n\t\t{\n\t\t\tvar parent = GetParent();\n\t\t\tvar file = parent.NameToPath(name);\n\t\t\tif (!file.Ok)\n\t\t\t\treturn file.Error;\n\t\t\tif (file.Value.Exists)\n\t\t\t\treturn new LocalStr(\"The file already exists.\"); // LOC: TODO\n\t\t\tvar result = SaveInternal(file.Value.FullName);\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result;\n\t\t\tName = name;\n\t\t\tparent.AddToConfigCache(this);\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tpublic E<LocalStr> SaveWhenExists()\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(Name))\n\t\t\t\treturn R.Ok;\n\n\t\t\tvar file = GetParent().NameToPath(Name);\n\t\t\tif (!file.Ok)\n\t\t\t\treturn file.Error;\n\t\t\tif (!file.Value.Exists)\n\t\t\t\treturn R.Ok;\n\t\t\treturn SaveInternal(file.Value.FullName);\n\t\t}\n\n\t\tprivate E<LocalStr> SaveInternal(string file)\n\t\t{\n\t\t\tvar result = Save(file, false);\n\t\t\tif (!result.Ok)\n\t\t\t{\n\t\t\t\tLog.Error(result.Error, \"An error occoured saving the bot config.\");\n\t\t\t\treturn new LocalStr(string.Format(\"An error occoured saving the bot config.\")); // LOC: TODO\n\t\t\t}\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tinternal ConfRoot GetParent() => (Parent as ConfRoot) ?? throw new InvalidOperationException(\"Bot is not under root\");\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigArray.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing TS3AudioBot.Helper;\n\nnamespace TS3AudioBot.Config\n{\n\tpublic class ConfigArray<T> : ConfigValue<IReadOnlyList<T>> where T : notnull\n\t{\n\t\tpublic ConfigArray(string key, IReadOnlyList<T> defaultVal, string doc = \"\") : base(key, defaultVal, doc) { }\n\n\t\tpublic override void FromToml(TomlObject? tomlObject)\n\t\t{\n\t\t\tif (tomlObject != null && tomlObject.TryGetValueArray<T>(out var array))\n\t\t\t{\n\t\t\t\tValue = array;\n\t\t\t}\n\t\t}\n\n\t\tpublic override void ToJson(JsonWriter writer)\n\t\t{\n\t\t\twriter.WriteStartArray();\n\t\t\tforeach (var item in Value)\n\t\t\t{\n\t\t\t\twriter.WriteValue(item);\n\t\t\t}\n\t\t\twriter.WriteEndArray();\n\t\t}\n\n\t\tpublic override E<string> FromJson(JsonReader reader)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (reader.Read()\n\t\t\t\t\t&& (reader.TokenType == JsonToken.StartArray))\n\t\t\t\t{\n\t\t\t\t\tvar list = new List<T>();\n\t\t\t\t\twhile (reader.TryReadValue<T>(out var value))\n\t\t\t\t\t{\n\t\t\t\t\t\tlist.Add(value);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (reader.TokenType != JsonToken.EndArray)\n\t\t\t\t\t\treturn $\"Expected end of array but found {reader.TokenType}\";\n\n\t\t\t\t\tValue = list;\n\t\t\t\t\treturn R.Ok;\n\t\t\t\t}\n\t\t\t\treturn $\"Wrong type, expected {typeof(T).Name}, got {reader.TokenType}\";\n\t\t\t}\n\t\t\tcatch (JsonReaderException ex) { return $\"Could not read value: {ex.Message}\"; }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigDynamicTable.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\n\nnamespace TS3AudioBot.Config\n{\n\t[DebuggerDisplay(\"dyntable:{Key}\")]\n\tpublic class ConfigDynamicTable<T> : ConfigEnumerable, IDynamicTable where T : ConfigPart\n\t{\n\t\tprivate readonly Dictionary<string, T> dynamicTables = new Dictionary<string, T>();\n\t\tprivate readonly Func<string, T> createFactory;\n\n\t\tpublic ConfigDynamicTable(Func<string, T> createFactory)\n\t\t{\n\t\t\tthis.createFactory = createFactory;\n\t\t}\n\n\t\tpublic override void FromToml(TomlObject? tomlObject)\n\t\t{\n\t\t\tbase.FromToml(tomlObject);\n\n\t\t\tdynamicTables.Clear();\n\n\t\t\tif (tomlObject != null)\n\t\t\t{\n\t\t\t\tif (!(tomlObject is TomlTable tomlTable))\n\t\t\t\t\tthrow new InvalidCastException();\n\n\t\t\t\tforeach (var child in tomlTable.Rows)\n\t\t\t\t{\n\t\t\t\t\tvar childConfig = Init(createFactory(child.Key), this, child.Value);\n\t\t\t\t\tdynamicTables.Add(child.Key, childConfig);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic override IEnumerable<ConfigPart> GetAllChildren() => GetAllItems();\n\n\t\tpublic override ConfigPart? GetChild(string key) => GetItem(key);\n\n\t\tpublic ConfigPart GetOrCreateChild(string key) => GetOrCreateItem(key);\n\n\t\tpublic override void Derive(ConfigPart derived)\n\t\t{\n\t\t\t// TODO (or rather probably ignore, as deriving is a bit ambiguous)\n\t\t}\n\n\t\tpublic T? GetItem(string key) => dynamicTables.TryGetValue(key, out var item) ? item : null;\n\n\t\tpublic IEnumerable<T> GetAllItems() => dynamicTables.Values;\n\n\t\tpublic T CreateItem(string key)\n\t\t{\n\t\t\tvar childConfig = Init(createFactory(key), this, null);\n\t\t\tdynamicTables.Add(key, childConfig);\n\t\t\treturn childConfig;\n\t\t}\n\n\t\tpublic T GetOrCreateItem(string key) => GetItem(key) ?? CreateItem(key);\n\n\t\tpublic void RemoveItem(string key)\n\t\t{\n\t\t\tdynamicTables.Remove(key);\n\t\t\tTomlObject.Remove(key);\n\t\t}\n\t}\n\n\tpublic interface IDynamicTable\n\t{\n\t\tConfigPart GetOrCreateChild(string key);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigEnumerable.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\n\nnamespace TS3AudioBot.Config\n{\n\tpublic abstract class ConfigEnumerable : ConfigPart\n\t{\n\t\tprivate static readonly object EmptyObject = new object();\n\n\t\tprotected virtual TomlTable.TableTypes TableType { get => TomlTable.TableTypes.Default; }\n#pragma warning disable CS8618 // !NRT loaded in FromToml\n\t\tpublic TomlTable TomlObject { get; set; }\n#pragma warning restore CS8618\n\t\tpublic override bool ExpectsString => false;\n\n\t\tpublic override void ClearEvents()\n\t\t{\n\t\t\tforeach (var child in GetAllChildren())\n\t\t\t\tchild.ClearEvents();\n\t\t}\n\n\t\tpublic override void FromToml(TomlObject? tomlObject)\n\t\t{\n\t\t\tif (tomlObject is null)\n\t\t\t{\n\t\t\t\tif (Parent is null)\n\t\t\t\t\tTomlObject = Toml.Create();\n\t\t\t\telse\n\t\t\t\t\tTomlObject = Parent.TomlObject.Add(Key, EmptyObject, TableType).Added;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (tomlObject is TomlTable tomlTable)\n\t\t\t\t\tTomlObject = tomlTable;\n\t\t\t\telse\n\t\t\t\t\tthrow new InvalidCastException();\n\t\t\t}\n\t\t}\n\n\t\tpublic override void ToToml(bool writeDefaults, bool writeDocumentation)\n\t\t{\n\t\t\tif (writeDocumentation)\n\t\t\t\tCreateDocumentation(TomlObject);\n\t\t\tforeach (var part in GetAllChildren())\n\t\t\t{\n\t\t\t\tpart.ToToml(writeDefaults, writeDocumentation);\n\t\t\t}\n\t\t}\n\n\t\tpublic override void ToJson(JsonWriter writer)\n\t\t{\n\t\t\twriter.WriteStartObject();\n\t\t\tforeach (var item in GetAllChildren())\n\t\t\t{\n\t\t\t\twriter.WritePropertyName(item.Key);\n\t\t\t\titem.ToJson(writer);\n\t\t\t}\n\t\t\twriter.WriteEndObject();\n\t\t}\n\n\t\tpublic override E<string> FromJson(JsonReader reader)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (!reader.Read() || (reader.TokenType != JsonToken.StartObject))\n\t\t\t\t\treturn $\"Wrong type, expected start of object but found {reader.TokenType}\";\n\n\t\t\t\twhile (reader.Read()\n\t\t\t\t\t&& (reader.TokenType == JsonToken.PropertyName))\n\t\t\t\t{\n\t\t\t\t\tvar childName = (string?)reader.Value;\n\t\t\t\t\tif (childName is null)\n\t\t\t\t\t\treturn \"No child found\";\n\t\t\t\t\tvar child = GetChild(childName);\n\t\t\t\t\tif (child is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (this is IDynamicTable dynTable)\n\t\t\t\t\t\t\tchild = dynTable.GetOrCreateChild(childName);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\treturn \"No child found\";\n\t\t\t\t\t}\n\n\t\t\t\t\tchild.FromJson(reader);\n\t\t\t\t}\n\n\t\t\t\tif (reader.TokenType != JsonToken.EndObject)\n\t\t\t\t\treturn $\"Expected end of array but found {reader.TokenType}\";\n\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\tcatch (JsonReaderException ex) { return $\"Could not read value: {ex.Message}\"; }\n\t\t}\n\n\t\t// Virtual table methods\n\n\t\tpublic abstract ConfigPart? GetChild(string key);\n\n\t\tpublic abstract IEnumerable<ConfigPart> GetAllChildren();\n\n\t\t// Static factory methods\n\n\t\tprotected static T Create<T>(string key, string doc = \"\") where T : ConfigEnumerable, new()\n\t\t{\n\t\t\treturn new T\n\t\t\t{\n\t\t\t\tKey = key,\n\t\t\t\tDocumentation = doc,\n\t\t\t};\n\t\t}\n\n\t\tprotected static T Create<T>(string key, ConfigEnumerable? parent, TomlObject? fromToml, string doc = \"\") where T : ConfigEnumerable, new()\n\t\t{\n\t\t\treturn Init(Create<T>(key, doc), parent, fromToml);\n\t\t}\n\n\t\tprotected static T Init<T>(T part, ConfigEnumerable? parent, TomlObject? fromToml) where T : ConfigPart\n\t\t{\n\t\t\tpart.Parent = parent;\n\t\t\tpart.FromToml(fromToml);\n\t\t\treturn part;\n\t\t}\n\n\t\tpublic static T CreateRoot<T>() where T : ConfigEnumerable, new() => Create<T>(null!, null, null, \"\");\n\n\t\tpublic static R<T, Exception> Load<T>(string path) where T : ConfigEnumerable, new()\n\t\t{\n\t\t\tTomlTable rootToml;\n\t\t\ttry { rootToml = Toml.ReadFile(path); }\n\t\t\tcatch (Exception ex) { return ex; }\n\t\t\treturn Create<T>(null!, null, rootToml);\n\t\t}\n\n\t\tpublic E<Exception> Save(string path, bool writeDefaults, bool writeDocumentation = true)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tlock (this)\n\t\t\t\t{\n\t\t\t\t\tToToml(writeDefaults, writeDocumentation);\n\t\t\t\t\tToml.WriteFile(TomlObject, path);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex) { return ex; }\n\t\t\treturn R.Ok;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigHelper.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\nusing System.Linq;\nusing System.Xml;\nusing TS3AudioBot.CommandSystem;\n\nnamespace TS3AudioBot.Config\n{\n\tpublic static class ConfigHelper\n\t{\n\t\tpublic const string DefaultBotName = \"default\";\n\n\t\tpublic static ConfigPart[] ByPathAsArray(this ConfigPart config, string path)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn config.ByPath(path).ToArray();\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tthrow new CommandException(\"Invalid TomlPath expression\", ex, CommandExceptionReason.CommandError);\n\t\t\t}\n\t\t}\n\n\t\tpublic static E<string> TryReadValue<T>(this JsonReader reader, out T value)\n\t\t{\n\t\t\tif (reader.Read()\n\t\t\t\t&& (reader.TokenType == JsonToken.Boolean\n\t\t\t\t|| reader.TokenType == JsonToken.Date\n\t\t\t\t|| reader.TokenType == JsonToken.Float\n\t\t\t\t|| reader.TokenType == JsonToken.Integer\n\t\t\t\t|| reader.TokenType == JsonToken.String))\n\t\t\t{\n\t\t\t\tvar jValue = reader.Value;\n\t\t\t\tif (jValue is null)\n\t\t\t\t{\n\t\t\t\t\tvalue = default!;\n\t\t\t\t\treturn \"Read null\";\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (typeof(T) == typeof(TimeSpan))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (reader.TokenType == JsonToken.String)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar timeStr = ((string)jValue).ToUpperInvariant();\n\t\t\t\t\t\t\tif (!timeStr.StartsWith(\"P\"))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (!timeStr.Contains(\"T\"))\n\t\t\t\t\t\t\t\t\ttimeStr = \"PT\" + timeStr;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttimeStr = \"P\" + timeStr;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvalue = (T)(object)XmlConvert.ToTimeSpan(timeStr);\n\t\t\t\t\t\t\treturn R.Ok;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (typeof(T).IsEnum)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (reader.TokenType == JsonToken.String)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvalue = (T)Enum.Parse(typeof(T), (string)jValue, true);\n\t\t\t\t\t\t\treturn R.Ok;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = (T)Convert.ChangeType(jValue, typeof(T));\n\t\t\t\t\t\treturn R.Ok;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (Exception ex) when\n\t\t\t\t\t(ex is InvalidCastException\n\t\t\t\t\t|| ex is OverflowException\n\t\t\t\t\t|| ex is FormatException)\n\t\t\t\t{ }\n\t\t\t}\n\t\t\tvalue = default!;\n\t\t\treturn $\"Wrong type, expected {typeof(T).Name}, got {reader.TokenType}\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigPart.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing TS3AudioBot.Helper;\nusing static TS3AudioBot.Helper.TomlTools;\n\nnamespace TS3AudioBot.Config\n{\n\t[DebuggerDisplay(\"unknown:{Key}\")]\n\tpublic abstract class ConfigPart : IJsonSerializable\n\t{\n\t\tprotected static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tpublic string? Documentation { get; protected set; }\n\t\tpublic string Key { get; protected set; }\n\t\t// must be a field otherwise it will be found as a child for ConfigTable\n\t\tpublic ConfigEnumerable? Parent;\n\n#pragma warning disable CS8618 // !NRT, all ConfigParts are create via Create<T>\n\t\tprotected ConfigPart() { }\n#pragma warning restore CS8618\n\t\tprotected ConfigPart(string key)\n\t\t{\n\t\t\tKey = key;\n\t\t}\n\n\t\tpublic abstract bool ExpectsString { get; }\n\t\tpublic abstract void FromToml(TomlObject? tomlObject);\n\t\tpublic abstract void ToToml(bool writeDefaults, bool writeDocumentation);\n\t\tpublic abstract void Derive(ConfigPart derived);\n\t\tpublic abstract E<string> FromJson(JsonReader reader);\n\t\tpublic abstract void ToJson(JsonWriter writer);\n\t\tpublic abstract void ClearEvents();\n\n\t\tprotected void CreateDocumentation(TomlObject tomlObject)\n\t\t{\n\t\t\tvar docs = tomlObject.Comments.Where(x => x.Text.StartsWith(\"#\")).ToArray();\n\t\t\ttomlObject.ClearComments();\n\t\t\tif (!string.IsNullOrEmpty(Documentation))\n\t\t\t\ttomlObject.AddComment(Documentation);\n\t\t\tif (docs.Length > 0)\n\t\t\t\ttomlObject.AddComments(docs);\n\t\t}\n\n\t\tpublic override string ToString() => this.ToJson();\n\n\t\t// *** Path accessor ***\n\n\t\tpublic IEnumerable<ConfigPart> ByPath(string path)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(path))\n\t\t\t\treturn new[] { this };\n\t\t\tvar pathM = path.AsMemory();\n\t\t\treturn ProcessIdentifier(pathM);\n\t\t}\n\n\t\tprivate IEnumerable<ConfigPart> ProcessIdentifier(ReadOnlyMemory<char> pathM)\n\t\t{\n\t\t\tif (pathM.IsEmpty)\n\t\t\t\treturn Enumerable.Empty<ConfigPart>();\n\n\t\t\tvar path = pathM.Span;\n\t\t\tswitch (path[0])\n\t\t\t{\n\t\t\tcase '*':\n\t\t\t\t{\n\t\t\t\t\tvar rest = pathM[1..];\n\t\t\t\t\tif (rest.IsEmpty)\n\t\t\t\t\t\treturn GetAllSubItems();\n\n\t\t\t\t\tif (IsArray(rest.Span))\n\t\t\t\t\t\treturn GetAllSubItems().SelectMany(x => x.ProcessArray(rest));\n\t\t\t\t\telse if (IsDot(rest.Span))\n\t\t\t\t\t\treturn GetAllSubItems().SelectMany(x => x.ProcessDot(rest));\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ArgumentException(\"Invalid expression after wildcard\", nameof(pathM));\n\t\t\t\t}\n\n\t\t\tcase '[':\n\t\t\t\tthrow new ArgumentException(\"Invalid array open bracket\", nameof(pathM));\n\t\t\tcase ']':\n\t\t\t\tthrow new ArgumentException(\"Invalid array close bracket\", nameof(pathM));\n\t\t\tcase '.':\n\t\t\t\tthrow new ArgumentException(\"Invalid dot\", nameof(pathM));\n\n\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tvar subItemName = path;\n\t\t\t\t\tvar rest = ReadOnlyMemory<char>.Empty;\n\t\t\t\t\tbool cont = false;\n\t\t\t\t\tfor (int i = 0; i < path.Length; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// todo allow in future\n\t\t\t\t\t\tif (path[i] == '*')\n\t\t\t\t\t\t\tthrow new ArgumentException(\"Invalid wildcard position\", nameof(pathM));\n\n\t\t\t\t\t\tvar currentSub = path[i..];\n\t\t\t\t\t\tif (!IsIdentifier(currentSub)) // if (!IsName)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcont = true;\n\t\t\t\t\t\t\tsubItemName = path[..i];\n\t\t\t\t\t\t\trest = pathM[i..];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvar item = GetSubItemByName(subItemName);\n\t\t\t\t\tif (item is null)\n\t\t\t\t\t\treturn Enumerable.Empty<ConfigPart>();\n\n\t\t\t\t\tif (cont)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (IsArray(rest.Span))\n\t\t\t\t\t\t\treturn item.ProcessArray(rest);\n\t\t\t\t\t\telse if (IsDot(rest.Span))\n\t\t\t\t\t\t\treturn item.ProcessDot(rest);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow new ArgumentException(\"Invalid expression name identifier\", nameof(pathM));\n\t\t\t\t\t}\n\t\t\t\t\treturn new[] { item };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate IEnumerable<ConfigPart> ProcessArray(ReadOnlyMemory<char> pathM)\n\t\t{\n\t\t\tvar path = pathM.Span;\n\t\t\tif (path[0] != '[')\n\t\t\t\tthrow new ArgumentException(\"Expected array open breacket\", nameof(pathM));\n\t\t\tfor (int i = 1; i < path.Length; i++)\n\t\t\t{\n\t\t\t\tif (path[i] == ']')\n\t\t\t\t{\n\t\t\t\t\tif (i == 0)\n\t\t\t\t\t\tthrow new ArgumentException(\"Empty array indexer\", nameof(pathM));\n\t\t\t\t\tvar indexer = path[1..i];\n\t\t\t\t\tvar rest = pathM.Slice(i + 1);\n\t\t\t\t\tbool cont = rest.Length > 0;\n\n\t\t\t\t\t// select\n\t\t\t\t\tif (indexer.Length == 1 && indexer[0] == '*')\n\t\t\t\t\t{\n\t\t\t\t\t\tvar ret = GetAllArrayItems();\n\t\t\t\t\t\tif (cont)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IsArray(rest.Span))\n\t\t\t\t\t\t\t\treturn ret.SelectMany(x => x.ProcessArray(rest));\n\t\t\t\t\t\t\telse if (IsDot(rest.Span))\n\t\t\t\t\t\t\t\treturn ret.SelectMany(x => x.ProcessDot(rest));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tthrow new ArgumentException(\"Invalid expression after array indexer\", nameof(pathM));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ret;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvar ret = GetArrayItemByIndex(indexer);\n\t\t\t\t\t\tif (ret is null)\n\t\t\t\t\t\t\treturn Enumerable.Empty<ConfigPart>();\n\n\t\t\t\t\t\tif (cont)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IsArray(rest.Span))\n\t\t\t\t\t\t\t\treturn ret.ProcessArray(rest);\n\t\t\t\t\t\t\telse if (IsDot(rest.Span))\n\t\t\t\t\t\t\t\treturn ret.ProcessDot(rest);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tthrow new ArgumentException(\"Invalid expression after array indexer\", nameof(pathM));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new[] { ret };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new ArgumentException(\"Missing array close bracket\", nameof(pathM));\n\t\t}\n\n\t\tprivate IEnumerable<ConfigPart> ProcessDot(ReadOnlyMemory<char> pathM)\n\t\t{\n\t\t\tvar path = pathM.Span;\n\t\t\tif (!IsDot(path))\n\t\t\t\tthrow new ArgumentException(\"Expected dot\", nameof(pathM));\n\n\t\t\tvar rest = pathM[1..];\n\t\t\tif (!IsIdentifier(rest.Span))\n\t\t\t\tthrow new ArgumentException(\"Expected identifier after dot\", nameof(pathM));\n\n\t\t\treturn ProcessIdentifier(rest);\n\t\t}\n\n\t\tprivate ConfigPart? GetArrayItemByIndex(ReadOnlySpan<char> index)\n\t\t{\n\t\t\tvar indexNum = new string(index.ToArray());\n\n\t\t\t//if (!System.Buffers.Text.Utf8Parser.TryParse(index, out int indexNum, out int bytesConsumed))\n\t\t\t//throw new ArgumentException(\"Invalid array indexer\");\n\t\t\tif (this is ConfigEnumerable table)\n\t\t\t{\n\t\t\t\treturn table.GetChild(indexNum);\n\t\t\t}\n\t\t\t/*else if (this is ConfigValue<[]ARRAY> array)\n\t\t\t{\n\t\t\t\t// TODO\n\t\t\t}*/\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate IEnumerable<ConfigPart> GetAllArrayItems()\n\t\t{\n\t\t\tif (this is ConfigEnumerable table)\n\t\t\t\treturn table.GetAllChildren();\n\t\t\treturn Enumerable.Empty<ConfigPart>();\n\t\t}\n\n\t\tprivate ConfigPart? GetSubItemByName(ReadOnlySpan<char> name)\n\t\t{\n\t\t\tvar indexNum = new string(name.ToArray());\n\t\t\tif (this is ConfigEnumerable table)\n\t\t\t\treturn table.GetChild(indexNum);\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate IEnumerable<ConfigPart> GetAllSubItems()\n\t\t{\n\t\t\tif (this is ConfigEnumerable table)\n\t\t\t\treturn table.GetAllChildren();\n\t\t\treturn Enumerable.Empty<ConfigPart>();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigStructs.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing System;\nusing System.Collections.Generic;\nusing TS3AudioBot.CommandSystem.Text;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.ResourceFactories.Youtube;\n\nnamespace TS3AudioBot.Config\n{\n\tpublic partial class ConfRoot : ConfigTable\n\t{\n\t\tpublic ConfBot Bot { get; } = Create<ConfBot>(\"bot\",\n\t\t\t\"! IMPORTANT !\\n\" +\n\t\t\t\"All config tables here starting with 'bot.*' will only be used as default values for each bot.\\n\" +\n\t\t\t\"To make bot-instance specific changes go to the 'Bots' folder (configs.bots_path) and set your configuration values in the desired bot config.\");\n\t\tpublic ConfConfigs Configs { get; } = Create<ConfConfigs>(\"configs\");\n\t\tpublic ConfDb Db { get; } = Create<ConfDb>(\"db\");\n\t\tpublic ConfFactories Factories { get; } = Create<ConfFactories>(\"factories\");\n\t\tpublic ConfTools Tools { get; } = Create<ConfTools>(\"tools\");\n\t\tpublic ConfRights Rights { get; } = Create<ConfRights>(\"rights\");\n\t\tpublic ConfPlugins Plugins { get; } = Create<ConfPlugins>(\"plugins\");\n\t\tpublic ConfWeb Web { get; } = Create<ConfWeb>(\"web\");\n\n\t\t//public ConfigValue<bool> ActiveDocumentation { get; } = new ConfigValue<bool>(\"_active_doc\", true);\n\t}\n\n\tpublic class ConfConfigs : ConfigTable\n\t{\n\t\t//public ConfigValue<string> RootPath { get; } = new ConfigValue<string>(\"root_path\", \".\"); // TODO enable when done\n\t\tpublic ConfigValue<string> BotsPath { get; } = new ConfigValue<string>(\"bots_path\", \"bots\",\n\t\t\t\"Path to a folder where the configuration files for each bot template will be stored.\");\n\t\tpublic ConfigValue<bool> SendStats { get; } = new ConfigValue<bool>(\"send_stats\", true,\n\t\t\t\"Enable to contribute to the global stats tracker to help us improve our service.\\n\" +\n\t\t\t\"We do NOT send/store any IPs, identifiable information or logs for this.\\n\" +\n\t\t\t\"If you want to check how a stats packet looks like you can run the bot with 'TS3AudioBot --stats-example'.\\n\" +\n\t\t\t\"To disable contributing without config you can run the bot with 'TS3AudioBot --stats-disabled'. This will ignore the config value.\");\n\t}\n\n\tpublic class ConfDb : ConfigTable\n\t{\n\t\tpublic ConfigValue<string> Path { get; } = new ConfigValue<string>(\"path\", \"ts3audiobot.db\",\n\t\t\t\"The path to the database file for persistent data.\");\n\t}\n\n\tpublic class ConfFactories : ConfigTable\n\t{\n\t\tpublic ConfPath Media { get; } = Create<ConfPath>(\"media\",\n\t\t\t\"The default path to look for local resources.\");\n\t\tpublic ConfResolverYoutube Youtube { get; } = Create<ConfResolverYoutube>(\"youtube\");\n\t}\n\n\tpublic class ConfResolverYoutube : ConfigTable\n\t{\n\t\tpublic ConfigValue<LoaderPriority> ResolverPriority { get; } = new ConfigValue<LoaderPriority>(\n\t\t\t\"prefer_resolver\", LoaderPriority.Internal, \"Changes how to try to resolve youtube songs\\n\" +\n\t\t\t\" - youtubedl : uses youtube-dl only\\n\" +\n\t\t\t\" - internal : uses the internal resolver, then youtube-dl\");\n\t\tpublic ConfigValue<string> ApiKey { get; } = new ConfigValue<string>(\"youtube_api_key\", \"\",\n\t\t\t\"Set your own youtube api key to keep using the old youtube factory loader.\\n\" +\n\t\t\t\"This feature is unsupported and may break at any time\");\n\t}\n\n\tpublic class ConfTools : ConfigTable\n\t{\n\t\t// youtube-dl can be empty by default as we make some thorough lookups.\n\t\tpublic ConfPath YoutubeDl { get; } = Create<ConfPath>(\"youtube-dl\",\n\t\t\t\"Path to the youtube-dl binary or local git repository.\");\n\t\tpublic ConfToolsFfmpeg Ffmpeg { get; } = Create<ConfToolsFfmpeg>(\"ffmpeg\",\n\t\t\t\"The path to ffmpeg.\");\n\t\t//public ConfPath Ffprobe { get; } = Create<ConfPath>(\"ffprobe\");\n\t}\n\n\tpublic class ConfToolsFfmpeg : ConfigTable\n\t{\n\t\tpublic ConfigValue<string> Path { get; } = new ConfigValue<string>(\"path\", \"ffmpeg\");\n\t}\n\n\tpublic class ConfRights : ConfigTable\n\t{\n\t\tpublic ConfigValue<string> Path { get; } = new ConfigValue<string>(\"path\", \"rights.toml\",\n\t\t\t\"Path to the permission file. The file will be generated if it doesn't exist.\");\n\t}\n\n\tpublic class ConfPlugins : ConfigTable\n\t{\n\t\tpublic ConfigValue<string> Path { get; } = new ConfigValue<string>(\"path\", \"plugins\",\n\t\t\t\"The path to the plugins folder.\");\n\n\t\tpublic ConfPluginsLoad Load { get; } = Create<ConfPluginsLoad>(\"load\");\n\t}\n\n\tpublic class ConfPluginsLoad : ConfigTable\n\t{\n\t\t// TODO: dynamic table\n\t}\n\n\tpublic class ConfWeb : ConfigTable\n\t{\n\t\tpublic ConfigArray<string> Hosts { get; } = new ConfigArray<string>(\"hosts\", new[] { \"*\" },\n\t\t\t\"An array of all urls the web api should be possible to be accessed with.\");\n\t\tpublic ConfigValue<ushort> Port { get; } = new ConfigValue<ushort>(\"port\", 58913,\n\t\t\t\"The port for the web server.\");\n\n\t\tpublic ConfWebApi Api { get; } = Create<ConfWebApi>(\"api\");\n\t\tpublic ConfWebInterface Interface { get; } = Create<ConfWebInterface>(\"interface\");\n\t}\n\n\tpublic class ConfWebApi : ConfigTable\n\t{\n\t\tpublic ConfigValue<bool> Enabled { get; } = new ConfigValue<bool>(\"enabled\", true,\n\t\t\t\"If you want to enable the web api.\");\n\t\tpublic ConfigValue<int> CommandComplexity { get; } = new ConfigValue<int>(\"command_complexity\", 64,\n\t\t\t\"Limits the maximum command complexity to prevent endless loops.\");\n\t\tpublic ConfigValue<string> Matcher { get; } = new ConfigValue<string>(\"matcher\", \"exact\", \"See: bot.commands.matcher\");\n\t}\n\n\tpublic class ConfWebInterface : ConfigTable\n\t{\n\t\tpublic ConfigValue<bool> Enabled { get; } = new ConfigValue<bool>(\"enabled\", true,\n\t\t\t\"If you want to enable the webinterface.\");\n\t\tpublic ConfigValue<string> Path { get; } = new ConfigValue<string>(\"path\", \"\",\n\t\t\t\"The webinterface folder to host. Leave empty to let the bot look for default locations.\");\n\t}\n\n\tpublic partial class ConfBot : ConfigTable\n\t{\n\t\tpublic ConfigValue<ulong> BotGroupId { get; } = new ConfigValue<ulong>(\"bot_group_id\", 0,\n\t\t\t\"This field will be automatically set when you call '!bot setup'.\\n\" +\n\t\t\t\"The bot will use the specified group to set/update the required permissions and add himself into it.\\n\" +\n\t\t\t\"You can set this field manually if you already have a preexisting group the bot should add himself to.\");\n\t\tpublic ConfigValue<bool> GenerateStatusAvatar { get; } = new ConfigValue<bool>(\"generate_status_avatar\", true,\n\t\t\t\"Tries to fetch a cover image when playing.\");\n\t\tpublic ConfigValue<bool> SetStatusDescription { get; } = new ConfigValue<bool>(\"set_status_description\", true,\n\t\t\t\"Sets the description of the bot to the current song title.\");\n\t\tpublic ConfigValue<string> Language { get; } = new ConfigValue<string>(\"language\", \"en\",\n\t\t\t\"The language the bot should use to respond to users. (Make sure you have added the required language packs)\");\n\t\tpublic ConfigValue<bool> Run { get; } = new ConfigValue<bool>(\"run\", false,\n\t\t\t\"Starts the instance when the TS3AudioBot is launched.\");\n\n\t\tpublic ConfCommands Commands { get; } = Create<ConfCommands>(\"commands\");\n\t\tpublic ConfConnect Connect { get; } = Create<ConfConnect>(\"connect\");\n\t\tpublic ConfReconnect Reconnect { get; } = Create<ConfReconnect>(\"reconnect\");\n\t\tpublic ConfAudio Audio { get; } = Create<ConfAudio>(\"audio\");\n\t\tpublic ConfPlaylists Playlists { get; } = Create<ConfPlaylists>(\"playlists\");\n\t\tpublic ConfHistory History { get; } = Create<ConfHistory>(\"history\");\n\t\tpublic ConfEvents Events { get; } = Create<ConfEvents>(\"events\");\n\t}\n\n\tpublic class ConfCommands : ConfigTable\n\t{\n\t\tpublic ConfigValue<string> Matcher { get; } = new ConfigValue<string>(\"matcher\", \"ic3\",\n\t\t\t\"Defines how the bot tries to match your !commands. Possible types:\\n\" +\n\t\t\t\" - exact : Only when the command matches exactly.\\n\" +\n\t\t\t\" - substring : The shortest command starting with the given prefix.\\n\" +\n\t\t\t\" - ic3 : 'interleaved continuous character chain' A fuzzy algorithm similar to hamming distance but preferring characters at the start.\"\n\t\t\t/* \"hamming : \" */);\n\t\tpublic ConfigValue<LongTextBehaviour> LongMessage { get; } = new ConfigValue<LongTextBehaviour>(\"long_message\", LongTextBehaviour.Split,\n\t\t\t\"Defines how the bot handles messages which are too long for a single ts3 message. Options are:\\n\" +\n\t\t\t\" - split : The message will be split up into multiple messages.\\n\" +\n\t\t\t\" - drop : Does not send the message.\");\n\t\tpublic ConfigValue<int> LongMessageSplitLimit { get; } = new ConfigValue<int>(\"long_message_split_limit\", 1,\n\t\t\t\"Limits the split count for long messages. When for example set to 1 the message will simply be trimmed to one message.\");\n\t\tpublic ConfigValue<bool> Color { get; } = new ConfigValue<bool>(\"color\", true,\n\t\t\t\"Enables colors and text highlights for respones.\");\n\t\tpublic ConfigValue<int> CommandComplexity { get; } = new ConfigValue<int>(\"command_complexity\", 64,\n\t\t\t\"Limits the maximum command complexity to prevent endless loops.\");\n\n\t\tpublic ConfCommandsAlias Alias { get; } = Create<ConfCommandsAlias>(\"alias\");\n\t}\n\n\tpublic class ConfCommandsAlias : ConfigDynamicTable<ConfigValue<string>>\n\t{\n\t\tpublic ConfCommandsAlias() : base(key => new ConfigValue<string>(key, \"\")) { }\n\t}\n\n\tpublic class ConfConnect : ConfigTable\n\t{\n\t\tpublic ConfigValue<string> Address { get; } = new ConfigValue<string>(\"address\", \"\",\n\t\t\t\"The address, ip or nickname (and port; default: 9987) of the TeamSpeak3 server\");\n\t\tpublic ConfigValue<string> Channel { get; } = new ConfigValue<string>(\"channel\", \"\",\n\t\t\t\"Default channel when connecting. Use a channel path or \\\"/<id>\\\".\\n\" +\n\t\t\t\"Examples: \\\"Home/Lobby\\\", \\\"/5\\\", \\\"Home/Afk \\\\\\\\/ Not Here\\\".\");\n\t\tpublic ConfigValue<string> Badges { get; } = new ConfigValue<string>(\"badges\", \"\",\n\t\t\t\"The client badges. You can set a comma seperated string with max three GUID's. Here is a list: http://yat.qa/ressourcen/abzeichen-badges/\");\n\t\tpublic ConfigValue<string> Name { get; } = new ConfigValue<string>(\"name\",\n\t\t\t\"TS3AudioBot\", \"Client nickname when connecting.\");\n\n\t\tpublic ConfPassword ServerPassword { get; } = Create<ConfPassword>(\"server_password\",\n\t\t\t\"The server password. Leave empty for none.\");\n\t\tpublic ConfPassword ChannelPassword { get; } = Create<ConfPassword>(\"channel_password\",\n\t\t\t\"The default channel password. Leave empty for none.\");\n\t\tpublic ConfTsVersion ClientVersion { get; } = Create<ConfTsVersion>(\"client_version\",\n\t\t\t\"Overrides the displayed version for the ts3 client. Leave empty for default.\");\n\t\tpublic ConfIdentity Identity { get; } = Create<ConfIdentity>(\"identity\");\n\t}\n\n\tpublic class ConfReconnect : ConfigTable\n\t{\n\t\tpublic ConfigArray<string> OnTimeout { get; } = new ConfigArray<string>(\"ontimeout\", new[] { \"1s\", \"2s\", \"5s\", \"10s\", \"30s\", \"1m\", \"5m\", \"repeat last\" }) { Validator = ConfTimeExtensions.ValidateTime };\n\t\tpublic ConfigArray<string> OnKick { get; } = new ConfigArray<string>(\"onkick\", Array.Empty<string>()) { Validator = ConfTimeExtensions.ValidateTime };\n\t\tpublic ConfigArray<string> OnBan { get; } = new ConfigArray<string>(\"onban\", Array.Empty<string>()) { Validator = ConfTimeExtensions.ValidateTime };\n\t\tpublic ConfigArray<string> OnError { get; } = new ConfigArray<string>(\"onerror\", new[] { \"30s\", \"repeat last\" }) { Validator = ConfTimeExtensions.ValidateTime };\n\t\tpublic ConfigArray<string> OnShutdown { get; } = new ConfigArray<string>(\"onshutdown\", new[] { \"5m\" }) { Validator = ConfTimeExtensions.ValidateTime };\n\t\t//public ConfigValue<int> MaxReconnect { get; } = new ConfigValue<int>(\"max_combined_reconnects\", -1, \"Each reconnect kind has an own counter and resets when \");\n\t}\n\n\tpublic class ConfIdentity : ConfigTable\n\t{\n\t\tpublic ConfigValue<string> PrivateKey { get; } = new ConfigValue<string>(\"key\", \"\",\n\t\t\t\"||| DO NOT MAKE THIS KEY PUBLIC ||| The client identity. You can import a teamspeak3 identity here too.\");\n\t\tpublic ConfigValue<ulong> Offset { get; } = new ConfigValue<ulong>(\"offset\", 0,\n\t\t\t\"The client identity offset determining the security level.\");\n\t\tpublic ConfigValue<int> Level { get; } = new ConfigValue<int>(\"level\", -1,\n\t\t\t\"The client identity security level which should be calculated before connecting\\n\" +\n\t\t\t\"or -1 to generate on demand when connecting.\");\n\t}\n\n\tpublic class ConfAudio : ConfigTable\n\t{\n\t\tpublic ConfAudioVolume Volume { get; } = Create<ConfAudioVolume>(\"volume\",\n\t\t\t\"When a new song starts the volume will be trimmed to between min and max.\\n\" +\n\t\t\t\"When the current volume already is between min and max nothing will happen.\\n\" +\n\t\t\t\"To completely or partially disable this feature, set min to 0 and/or max to 100.\");\n\t\tpublic ConfigValue<float> MaxUserVolume { get; } = new ConfigValue<float>(\"max_user_volume\", 100,\n\t\t\t\"The maximum volume a normal user can request. Only user with the 'ts3ab.admin.volume' permission can request higher volumes.\");\n\t\tpublic ConfigValue<int> Bitrate { get; } = new ConfigValue<int>(\"bitrate\", 48,\n\t\t\t\"Specifies the bitrate (in kbps) for sending audio.\\n\" +\n\t\t\t\"Values between 8 and 98 are supported, more or less can work but without guarantees.\\n\" +\n\t\t\t\"Reference values: 16 - very poor (~3KiB/s), 24 - poor (~4KiB/s), 32 - okay (~5KiB/s), 48 - good (~7KiB/s), 64 - very good (~9KiB/s), 96 - deluxe (~13KiB/s)\");\n\t\tpublic ConfigValue<string> SendMode { get; } = new ConfigValue<string>(\"send_mode\", \"voice\",\n\t\t\t\"How the bot should play music. Options are:\\n\" +\n\t\t\t\" - whisper : Whispers to the channel where the request came from. Other users can join with '!subscribe'.\\n\" +\n\t\t\t\" - voice : Sends via normal voice to the current channel. '!subscribe' will not work in this mode.\\n\" +\n\t\t\t\" - !... : A custom command. Use '!xecute (!a) (!b)' for example to execute multiple commands.\");\n\t}\n\n\tpublic class ConfAudioVolume : ConfigTable\n\t{\n\t\tprotected override TomlTable.TableTypes TableType => TomlTable.TableTypes.Inline;\n\n\t\tpublic ConfigValue<float> Default { get; } = new ConfigValue<float>(\"default\", 50);\n\t\tpublic ConfigValue<float> Min { get; } = new ConfigValue<float>(\"min\", 25);\n\t\tpublic ConfigValue<float> Max { get; } = new ConfigValue<float>(\"max\", 75);\n\t}\n\n\tpublic class ConfPlaylists : ConfigTable\n\t{\n\t\t//public ConfigValue<int> MaxItemCount { get; } = new ConfigValue<int>(\"max_item_count\", 1000); // TODO\n\t}\n\n\tpublic class ConfHistory : ConfigTable\n\t{\n\t\tpublic ConfigValue<bool> Enabled { get; } = new ConfigValue<bool>(\"enabled\", true,\n\t\t\t\"Enable or disable history features completely to save resources.\");\n\t\tpublic ConfigValue<bool> FillDeletedIds { get; } = new ConfigValue<bool>(\"fill_deleted_ids\", true,\n\t\t\t\"Whether or not deleted history ids should be filled up with new songs.\");\n\t}\n\n\tpublic class ConfData : ConfigTable\n\t{\n\t\t//public ConfigValue<string> MaxItemCount { get; } = new ConfigValue<string>(\"disk_data\", \"1M\"); // TODO\n\t}\n\n\tpublic class ConfEvents : ConfigTable\n\t{\n\t\tpublic ConfigValue<string> OnConnect { get; } = new ConfigValue<string>(\"onconnect\", \"\",\n\t\t\t\"Called when the bot is connected.\");\n\t\tpublic ConfigValue<string> OnDisconnect { get; } = new ConfigValue<string>(\"ondisconnect\", \"\",\n\t\t\t\"Called when the bot gets disconnected.\");\n\t\tpublic ConfigValue<string> OnIdle { get; } = new ConfigValue<string>(\"onidle\", \"\",\n\t\t\t\"Called when the bot does not play anything for a certain amount of time.\");\n\t\tpublic ConfigValue<TimeSpan> IdleDelay { get; } = new ConfigValue<TimeSpan>(\"idletime\", TimeSpan.Zero,\n\t\t\t\"Specifies how long the bot has to be idle until the 'onidle' event gets fired.\\n\" +\n\t\t\t\"You can specify the time in the ISO-8601 format \\\"PT30S\\\" or like: 15s, 1h, 3m30s\");\n\t\tpublic ConfigValue<string> OnAlone { get; } = new ConfigValue<string>(\"onalone\", \"\",\n\t\t\t\"Called when the last client leaves the channel of the bot. Delay can be specified\");\n\t\tpublic ConfigValue<TimeSpan> AloneDelay { get; } = new ConfigValue<TimeSpan>(\"alone_delay\", TimeSpan.Zero,\n\t\t\t\"Specifies how long the bot has to be alone until the 'onalone' event gets fired.\\n\" +\n\t\t\t\"You can specify the time in the ISO-8601 format \\\"PT30S\\\" or like: 15s, 1h, 3m30s\");\n\t\tpublic ConfigValue<string> OnParty { get; } = new ConfigValue<string>(\"onparty\", \"\",\n\t\t\t\"Called when the bot was alone and a client joins his channel. Delay can be specified.\");\n\t\tpublic ConfigValue<TimeSpan> PartyDelay { get; } = new ConfigValue<TimeSpan>(\"party_delay\", TimeSpan.Zero,\n\t\t\t\"Specifies how long the bot has to be alone until the 'onalone' event gets fired.\\n\" +\n\t\t\t\"You can specify the time in the ISO-8601 format \\\"PT30S\\\" or like: 15s, 1h, 3m30s\");\n\t\tpublic ConfigValue<string> OnSongStart { get; } = new ConfigValue<string>(\"onsongstart\", \"\",\n\t\t\t\"Called when a new song starts.\");\n\t}\n\n\t// Utility config structs\n\n\tpublic class ConfPath : ConfigTable\n\t{\n\t\tprotected override TomlTable.TableTypes TableType => TomlTable.TableTypes.Inline;\n\n\t\tpublic ConfigValue<string> Path { get; } = new ConfigValue<string>(\"path\", string.Empty);\n\t}\n\n\tpublic class ConfPassword : ConfigTable\n\t{\n\t\tprotected override TomlTable.TableTypes TableType => TomlTable.TableTypes.Inline;\n\n\t\tpublic ConfigValue<string> Password { get; } = new ConfigValue<string>(\"pw\", string.Empty);\n\t\tpublic ConfigValue<bool> Hashed { get; } = new ConfigValue<bool>(\"hashed\", false);\n\t\tpublic ConfigValue<bool> AutoHash { get; } = new ConfigValue<bool>(\"autohash\", false);\n\n\t\tpublic TSLib.Password Get()\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(Password))\n\t\t\t\treturn TSLib.Password.Empty;\n\t\t\tvar pass = Hashed\n\t\t\t\t? TSLib.Password.FromHash(Password)\n\t\t\t\t: TSLib.Password.FromPlain(Password);\n\t\t\tif (AutoHash && !Hashed)\n\t\t\t{\n\t\t\t\tPassword.Value = pass.HashedPassword;\n\t\t\t\tHashed.Value = true;\n\t\t\t}\n\t\t\treturn pass;\n\t\t}\n\t}\n\n\tpublic class ConfTsVersion : ConfigTable\n\t{\n\t\tprotected override TomlTable.TableTypes TableType => TomlTable.TableTypes.Inline;\n\n\t\tpublic ConfigValue<string> Build { get; } = new ConfigValue<string>(\"build\", string.Empty);\n\t\tpublic ConfigValue<string> Platform { get; } = new ConfigValue<string>(\"platform\", string.Empty);\n\t\tpublic ConfigValue<string> Sign { get; } = new ConfigValue<string>(\"sign\", string.Empty);\n\t}\n\n\tpublic static class ConfTimeExtensions\n\t{\n\t\tpublic static TimeSpan? GetValueAsTime(this ConfigArray<string> conf, int index)\n\t\t{\n\t\t\tvar value = conf.Value;\n\t\t\tif (value.Count == 0)\n\t\t\t\treturn null;\n\t\t\tvar last = value[^1];\n\t\t\tvar repeat = last == \"repeat\" || last == \"repeat last\"; // \"repeat\" might get removed for other loops, but for now keep as hidden alternative\n\t\t\tvar max = repeat ? value.Count - 2 : value.Count - 1;\n\t\t\tif (index <= max)\n\t\t\t\treturn TextUtil.ParseTime(value[index]);\n\t\t\telse\n\t\t\t\treturn TextUtil.ParseTime(value[max]);\n\t\t}\n\n\t\tpublic static E<string> ValidateTime(IReadOnlyList<string> value)\n\t\t{\n\t\t\tif (value.Count == 0)\n\t\t\t\treturn R.Ok;\n\t\t\tvar last = value[^1];\n\t\t\tvar repeat = last == \"repeat\" || last == \"repeat last\";\n\t\t\tif (repeat && value.Count == 1)\n\t\t\t\treturn $\"Specified 'repeat' without any previous value.\";\n\n\t\t\tvar max = repeat ? value.Count - 2 : value.Count - 1;\n\t\t\tfor (int i = 0; i <= max; i++)\n\t\t\t{\n\t\t\t\tvar r = TextUtil.ValidateTime(value[i]);\n\t\t\t\tif (!r.Ok)\n\t\t\t\t\treturn r;\n\t\t\t}\n\t\t\treturn R.Ok;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigTable.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\n\nnamespace TS3AudioBot.Config\n{\n\t[DebuggerDisplay(\"table:{Key}\")]\n\tpublic abstract class ConfigTable : ConfigEnumerable\n\t{\n\t\tprotected List<ConfigPart> Properties { get; } = new List<ConfigPart>();\n\n\t\tprotected ConfigTable()\n\t\t{\n\t\t\tGetMember();\n\t\t\tforeach (var configPart in Properties)\n\t\t\t\tconfigPart.Parent = this;\n\t\t}\n\n\t\tprivate IEnumerable<System.Reflection.PropertyInfo> GetConfigPartProperties()\n\t\t{\n\t\t\treturn GetType()\n\t\t\t\t.GetProperties()\n\t\t\t\t.Where(x => typeof(ConfigPart).IsAssignableFrom(x.PropertyType));\n\t\t}\n\n\t\tprivate void GetMember()\n\t\t{\n\t\t\tProperties.Clear();\n\t\t\tProperties.AddRange(GetConfigPartProperties().Select(x => (ConfigPart)x.GetValue(this)!));\n\t\t}\n\n\t\tpublic override void FromToml(TomlObject? tomlObject)\n\t\t{\n\t\t\tbase.FromToml(tomlObject);\n\n\t\t\tforeach (var part in Properties)\n\t\t\t{\n\t\t\t\tvar child = TomlObject.TryGetValue(part.Key);\n\t\t\t\tpart.FromToml(child);\n\t\t\t}\n\t\t}\n\n\t\tpublic override void Derive(ConfigPart derived)\n\t\t{\n\t\t\tforeach (var prop in GetConfigPartProperties())\n\t\t\t{\n\t\t\t\tvar self = (ConfigPart)prop.GetValue(this)!;\n\t\t\t\tvar other = (ConfigPart)prop.GetValue(derived)!;\n\t\t\t\tself.Derive(other);\n\t\t\t}\n\t\t}\n\n\t\tpublic override ConfigPart? GetChild(string key) => Properties.Find(x => x.Key == key);\n\n\t\tpublic override IEnumerable<ConfigPart> GetAllChildren() => Properties;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigUpgrade2.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing TS3AudioBot.Helper;\n\nnamespace TS3AudioBot.Config\n{\n\t/// <summary>\n\t/// Upgrades the /bots/ folder structure from each Bot being a 'bot_(name).toml'\n\t/// file to each bot having its own folder with '/(name)/bot.toml'.\n\t/// </summary>\n\tinternal static class ConfigUpgrade2\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate static readonly Regex BotFileMatcher = new Regex(@\"^bot_(.+)\\.toml$\", Util.DefaultRegexConfig);\n\t\tprivate const string NewBotConfigFileName = \"bot.toml\";\n\n\t\tpublic static void Upgrade(string path)\n\t\t{\n\t\t\tstring[] files;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tfiles = Directory.GetFiles(path);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Failed to get 'Bots' directory. Your bots might not be available. Refer to our GitHub for upgrade actions.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tforeach (var file in files)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar fi = new FileInfo(file);\n\t\t\t\t\tvar match = BotFileMatcher.Match(fi.Name);\n\t\t\t\t\tif (match.Success)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar name = match.Groups[1].Value;\n\t\t\t\t\t\tDirectory.CreateDirectory(Path.Combine(path, name));\n\t\t\t\t\t\tfi.MoveTo(Path.Combine(path, name, NewBotConfigFileName));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (Exception ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Error(ex, \"Failed to move Bot '{0}' to the new folder structure.\", file);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Config/ConfigValue.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing TS3AudioBot.Helper;\n\nnamespace TS3AudioBot.Config\n{\n\t[DebuggerDisplay(\"{Key}:{Value}\")]\n\tpublic class ConfigValue<T> : ConfigPart where T : notnull\n\t{\n\t\tpublic override bool ExpectsString => typeof(T) == typeof(string) || typeof(T) == typeof(TimeSpan) || typeof(T).IsEnum;\n\t\tprivate ConfigValue<T>? backingValue;\n\t\tprivate bool hasValue = false;\n\t\tpublic T Default { get; }\n\t\tprivate T value;\n\t\tpublic T Value\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (hasValue)\n\t\t\t\t\treturn value;\n\t\t\t\tif (backingValue != null)\n\t\t\t\t\treturn backingValue.Value;\n\t\t\t\treturn Default;\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\thasValue = true;\n\t\t\t\tif (EqualityComparer<T>.Default.Equals(this.value, value))\n\t\t\t\t\treturn;\n\t\t\t\tthis.value = value;\n\t\t\t\tif (Changed != null)\n\t\t\t\t{\n\t\t\t\t\tvar args = new ConfigChangedEventArgs<T>(value);\n\t\t\t\t\tChanged?.Invoke(this, args);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpublic Func<T, E<string>>? Validator { get; set; }\n\n\t\tpublic event EventHandler<ConfigChangedEventArgs<T>>? Changed;\n\n\t\tpublic ConfigValue(string key, T defaultVal, string doc = \"\") : base(key)\n\t\t{\n\t\t\tDocumentation = doc;\n\t\t\tDefault = defaultVal;\n\t\t\tvalue = default!;\n\t\t}\n\n\t\tprivate void InvokeChange(object? sender, ConfigChangedEventArgs<T> args) => Changed?.Invoke(sender, args);\n\n\t\tpublic override void ClearEvents() => Changed = null;\n\n\t\tpublic override void FromToml(TomlObject? tomlObject)\n\t\t{\n\t\t\tif (tomlObject == null)\n\t\t\t\treturn;\n\n\t\t\tif (!tomlObject.TryGetValue<T>(out var tomlValue))\n\t\t\t{\n\t\t\t\tLog.Warn(\"Failed to read '{0}', got {1} with {2}\", Key, tomlObject.ReadableTypeName, tomlObject.DumpToJson());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar validate = Validator?.Invoke(tomlValue) ?? R.Ok;\n\t\t\tif (!validate.Ok)\n\t\t\t{\n\t\t\t\tLog.Warn(\"Invalid value in '{0}', {1}\", Key, validate.Error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tValue = tomlValue;\n\t\t}\n\n\t\tpublic override void ToToml(bool writeDefaults, bool writeDocumentation)\n\t\t{\n\t\t\t// Keys with underscore are read-only\n\t\t\tif (Key.StartsWith(\"_\"))\n\t\t\t\treturn;\n\n\t\t\tif (Parent is null)\n\t\t\t\tthrow new InvalidOperationException(\"Value is not in a tree\");\n\n\t\t\t// Set field if either\n\t\t\t// - this value is set\n\t\t\t// - or we explicitely want to write out default values\n\t\t\tvar selfToml = Parent.TomlObject.TryGetValue(Key);\n\t\t\tif (hasValue || (writeDefaults && selfToml is null))\n\t\t\t{\n\t\t\t\tselfToml = Parent.TomlObject.Set(Key, Value);\n\t\t\t}\n\t\t\tif (writeDocumentation && selfToml != null)\n\t\t\t{\n\t\t\t\tCreateDocumentation(selfToml);\n\t\t\t}\n\t\t}\n\n\t\tpublic override void Derive(ConfigPart derived)\n\t\t{\n\t\t\tif (derived is ConfigValue<T> derivedValue)\n\t\t\t{\n\t\t\t\tderivedValue.backingValue = this;\n\t\t\t\tChanged -= derivedValue.InvokeChange;\n\t\t\t\tChanged += derivedValue.InvokeChange;\n\t\t\t}\n\t\t}\n\n\t\tpublic override void ToJson(JsonWriter writer)\n\t\t{\n\t\t\twriter.WriteValue(Value);\n\t\t}\n\n\t\tpublic override E<string> FromJson(JsonReader reader)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar err = reader.TryReadValue<T>(out var tomlValue);\n\t\t\t\tif (err.Ok)\n\t\t\t\t{\n\t\t\t\t\tValue = tomlValue;\n\t\t\t\t\treturn R.Ok;\n\t\t\t\t}\n\t\t\t\treturn err;\n\t\t\t}\n\t\t\tcatch (JsonReaderException ex) { return $\"Could not read value: {ex.Message}\"; }\n\t\t}\n\n\t\tpublic override string ToString() => Value.ToString() ?? \"<null>\";\n\n\t\tpublic static implicit operator T(ConfigValue<T> conf) => conf.Value;\n\t}\n\n\tpublic class ConfigChangedEventArgs<T> : EventArgs\n\t{\n\t\tpublic T NewValue { get; }\n\n\t\tpublic ConfigChangedEventArgs(T newValue)\n\t\t{\n\t\t\tNewValue = newValue;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Core.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing NLog;\nusing System;\nusing System.Threading.Tasks;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.Environment;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Plugins;\nusing TS3AudioBot.ResourceFactories;\nusing TS3AudioBot.Rights;\nusing TS3AudioBot.Sessions;\nusing TS3AudioBot.Web;\nusing TSLib.Scheduler;\n\nnamespace TS3AudioBot\n{\n\tpublic sealed class Core\n\t{\n\t\tprivate static readonly Logger Log = LogManager.GetCurrentClassLogger();\n\t\tprivate readonly string configFilePath;\n\t\tprivate bool forceNextExit;\n\t\tprivate readonly DedicatedTaskScheduler scheduler;\n\t\tprivate readonly CoreInjector injector;\n\n\t\tpublic Core(DedicatedTaskScheduler scheduler, string? configFilePath = null)\n\t\t{\n\t\t\tthis.scheduler = scheduler;\n\t\t\t// setting defaults\n\t\t\tthis.configFilePath = configFilePath ?? FilesConst.CoreConfig;\n\n\t\t\tinjector = new CoreInjector();\n\t\t}\n\n\t\tpublic async Task Run(ParameterData setup)\n\t\t{\n\t\t\tscheduler.VerifyOwnThread();\n\n\t\t\tAppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;\n\t\t\tTaskScheduler.UnobservedTaskException += UnobservedTaskExceptionHandler;\n\t\t\tConsole.CancelKeyPress += ConsoleInterruptHandler;\n\n\t\t\tvar config = ConfRoot.OpenOrCreate(configFilePath);\n\t\t\tif (config is null)\n\t\t\t\tthrow new Exception(\"Could not create config\");\n\t\t\tConfigUpgrade2.Upgrade(config.Configs.BotsPath.Value);\n\t\t\tconfig.Save();\n\n\t\t\tvar builder = new DependencyBuilder(injector);\n\n\t\t\tinjector.AddModule(this);\n\t\t\tinjector.AddModule(scheduler);\n\t\t\tinjector.AddModule(injector);\n\t\t\tinjector.AddModule(config);\n\t\t\tinjector.AddModule(config.Db);\n\t\t\tinjector.AddModule(config.Plugins);\n\t\t\tinjector.AddModule(config.Web);\n\t\t\tinjector.AddModule(config.Web.Interface);\n\t\t\tinjector.AddModule(config.Web.Api);\n\t\t\tinjector.AddModule(config.Rights);\n\t\t\tinjector.AddModule(config.Factories);\n\t\t\tbuilder.RequestModule<SystemMonitor>();\n\t\t\tbuilder.RequestModule<DbStore>();\n\t\t\tbuilder.RequestModule<PluginManager>();\n\t\t\tbuilder.RequestModule<WebServer>();\n\t\t\tbuilder.RequestModule<RightsManager>();\n\t\t\tbuilder.RequestModule<BotManager>();\n\t\t\tbuilder.RequestModule<TokenManager>();\n\t\t\tbuilder.RequestModule<CommandManager>();\n\t\t\tbuilder.RequestModule<ResourceResolver>();\n\t\t\tbuilder.RequestModule<Stats>();\n\n\t\t\tif (!builder.Build())\n\t\t\t\tthrow new Exception(\"Could not load all core modules\");\n\n\t\t\tUpgrader.PerformUpgrades(injector);\n\t\t\tYoutubeDlHelper.DataObj = config.Tools.YoutubeDl;\n\n\t\t\tinjector.GetModuleOrThrow<CommandManager>().RegisterCollection(MainCommands.Bag);\n\t\t\tinjector.GetModuleOrThrow<RightsManager>().CreateConfigIfNotExists(setup.Interactive);\n\t\t\tinjector.GetModuleOrThrow<WebServer>().StartWebServer();\n\t\t\tinjector.GetModuleOrThrow<Stats>().StartTimer(setup.SendStats);\n\t\t\tawait injector.GetModuleOrThrow<BotManager>().RunBots(setup.Interactive);\n\t\t}\n\n\t\tpublic void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)\n\t\t{\n\t\t\tLog.Fatal(e.ExceptionObject as Exception, \"Critical program failure!\");\n\t\t\tStopAsync().RunSynchronously();\n\t\t}\n\n\t\tpublic static void UnobservedTaskExceptionHandler(object? sender, UnobservedTaskExceptionEventArgs e)\n\t\t{\n\t\t\tLog.Error(e.Exception, \"Unobserved Task error!\");\n\t\t}\n\n\t\tpublic void ConsoleInterruptHandler(object sender, ConsoleCancelEventArgs e)\n\t\t{\n\t\t\tif (e.SpecialKey == ConsoleSpecialKey.ControlC)\n\t\t\t{\n\t\t\t\tif (!forceNextExit)\n\t\t\t\t{\n\t\t\t\t\tLog.Info(\"Got interrupt signal, trying to soft-exit.\");\n\t\t\t\t\te.Cancel = true;\n\t\t\t\t\tforceNextExit = true;\n\t\t\t\t\tStop();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLog.Info(\"Got multiple interrupt signals, trying to force-exit.\");\n\t\t\t\t\tSystem.Environment.Exit(0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void Stop() => _ = scheduler.InvokeAsync(StopAsync);\n\n\t\tprivate async Task StopAsync()\n\t\t{\n\t\t\tLog.Info(\"TS3AudioBot shutting down.\");\n\n\t\t\tvar botManager = injector.GetModule<BotManager>();\n\t\t\tif (botManager != null)\n\t\t\t\tawait botManager.StopBots();\n\t\t\tinjector.GetModule<PluginManager>()?.Dispose();\n\t\t\tinjector.GetModule<WebServer>()?.Dispose();\n\t\t\tinjector.GetModule<DbStore>()?.Dispose();\n\t\t\tinjector.GetModule<ResourceResolver>()?.Dispose();\n\t\t\tinjector.GetModule<DedicatedTaskScheduler>()?.Dispose();\n\n\t\t\tLog.Info(\"Bye\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/DbStore.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing LiteDB;\nusing System;\nusing System.IO;\nusing TS3AudioBot.Config;\n\nnamespace TS3AudioBot\n{\n\tpublic class DbStore : IDisposable\n\t{\n\t\tprivate const string DbMetaInformationTable = \"dbmeta\";\n\n\t\tprivate readonly LiteDatabase database;\n\t\tprivate readonly LiteCollection<DbMetaData> metaTable;\n\n\t\tpublic DbStore(ConfDb config)\n\t\t{\n\t\t\tvar historyFile = Path.GetFullPath(config.Path);\n\t\t\tdatabase = new LiteDatabase(historyFile);\n\n\t\t\tmetaTable = database.GetCollection<DbMetaData>(DbMetaInformationTable);\n\t\t}\n\n\t\tpublic DbMetaData GetMetaData(string table)\n\t\t{\n\t\t\tvar meta = metaTable.FindById(table);\n\t\t\tif (meta is null)\n\t\t\t{\n\t\t\t\tmeta = new DbMetaData { Id = table, Version = 0, CustomData = null };\n\t\t\t\tmetaTable.Insert(meta);\n\t\t\t}\n\t\t\treturn meta;\n\t\t}\n\n\t\tpublic void UpdateMetaData(DbMetaData metaData)\n\t\t{\n\t\t\tmetaTable.Upsert(metaData);\n\t\t}\n\n\t\tpublic LiteCollection<T> GetCollection<T>(string name)\n\t\t{\n\t\t\treturn database.GetCollection<T>(name);\n\t\t}\n\n\t\tpublic void DropCollection(string name) => database.DropCollection(name);\n\n\t\tpublic void CleanFile()\n\t\t{\n\t\t\tdatabase.Shrink();\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tdatabase.Dispose();\n\t\t}\n\t}\n\n\tpublic class DbMetaData\n\t{\n\t\tpublic string? Id { get; set; }\n\t\tpublic int Version { get; set; }\n\t\tpublic string? CustomData { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Dependency/BasicInjector.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace TS3AudioBot.Dependency\n{\n\tpublic class BasicInjector : IInjector\n\t{\n\t\tprivate readonly Dictionary<Type, object> dynamicObjects;\n\t\tpublic BasicInjector() { dynamicObjects = new Dictionary<Type, object>(); }\n\t\tpublic object? GetModule(Type type) => dynamicObjects.TryGetValue(type, out var mod) ? mod : null;\n\t\tpublic void AddModule(Type type, object obj) => dynamicObjects[type] = obj;\n\t\tpublic IEnumerable<object> GetAllModules() => dynamicObjects.Values;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Dependency/ChainedInjector.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.Dependency\n{\n\tpublic class ChainedInjector<T> : IInjector where T : class, IInjector\n\t{\n\t\tpublic IInjector ParentInjector { get; set; }\n\t\tpublic T OwnInjector { get; protected set; }\n\n\t\tpublic ChainedInjector(IInjector parent, T own)\n\t\t{\n\t\t\tParentInjector = parent ?? throw new ArgumentNullException(nameof(parent));\n\t\t\tOwnInjector = own ?? throw new ArgumentNullException(nameof(parent));\n\t\t}\n\n\t\tpublic virtual object? GetModule(Type type)\n\t\t\t=> OwnInjector.GetModule(type) ?? ParentInjector.GetModule(type);\n\n\t\tpublic virtual void AddModule(Type type, object obj)\n\t\t\t=> OwnInjector.AddModule(type, obj);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Dependency/DependencyBuilder.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace TS3AudioBot.Dependency\n{\n\tpublic sealed class CoreInjector : BasicInjector { }\n\tpublic sealed class BotInjector : ChainedInjector<BasicInjector>\n\t{\n\t\tprivate HashSet<Type>? hiddenParentModules = null;\n\n\t\tpublic BotInjector(IInjector parent) : base(parent, new BasicInjector())\n\t\t{\n\t\t}\n\n\t\tpublic override object? GetModule(Type type)\n\t\t{\n\t\t\tvar ownObj = OwnInjector.GetModule(type);\n\t\t\tif (ownObj != null)\n\t\t\t\treturn ownObj;\n\t\t\tif (hiddenParentModules != null && hiddenParentModules.Contains(type))\n\t\t\t\treturn null;\n\t\t\treturn ParentInjector.GetModule(type);\n\t\t}\n\n\t\tpublic void HideParentModule(Type type)\n\t\t{\n\t\t\thiddenParentModules ??= new HashSet<Type>();\n\t\t\thiddenParentModules.Add(type);\n\t\t}\n\t\tpublic void HideParentModule<T>() => HideParentModule(typeof(T));\n\t\tpublic void ClearHiddenParentModules() => hiddenParentModules = null;\n\t}\n\n\t/// <summary>\n\t/// The DependencyBuilder will try to create a dependency graph of all Modules\n\t/// which are available or requested and instantitate them (if possible).\n\t/// </summary>\n\tpublic class DependencyBuilder\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tprivate readonly IInjector injector;\n\t\tprivate readonly LinkedList<Module> modules = new LinkedList<Module>();\n\n\t\tpublic DependencyBuilder(IInjector injector)\n\t\t{\n\t\t\tthis.injector = injector;\n\t\t}\n\n\t\tpublic DependencyBuilder RequestModule<TService>() where TService : class => RequestModule<TService, TService>();\n\n\t\tpublic DependencyBuilder RequestModule<TService, TImplementation>() where TImplementation : class, TService => RequestModule(typeof(TService), typeof(TImplementation));\n\n\t\tprivate DependencyBuilder RequestModule(Type tService, Type tImplementation)\n\t\t{\n\t\t\tLog.Trace(\"Requested Service {0} with {1}\", tService.Name, tImplementation.Name);\n\t\t\tvar mod = new Module(tService, tImplementation);\n\n\t\t\tfor (var cur = modules.First; cur != null; cur = cur.Next)\n\t\t\t{\n\t\t\t\tif (mod.ConstructorParam.Contains(cur.Value.TService) || mod.TImplementation == cur.Value.TService)\n\t\t\t\t{\n\t\t\t\t\tmodules.AddBefore(cur, mod);\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmodules.AddLast(mod);\n\t\t\treturn this;\n\t\t}\n\n\t\t/// <summary>Creates all modules.</summary>\n\t\t/// <returns>True if all are initialized, false otherwise.</returns>\n\t\tpublic bool Build()\n\t\t{\n\t\t\tfor (var curNode = modules.Last; curNode != null; curNode = curNode.Previous, modules.RemoveLast())\n\t\t\t{\n\t\t\t\tvar cur = curNode.Value;\n\t\t\t\tvar obj = injector.GetModule(cur.TImplementation);\n\t\t\t\tif (obj != null)\n\t\t\t\t{\n\t\t\t\t\tinjector.AddModule(cur.TService, obj);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (!injector.TryCreate(cur.TImplementation, out obj))\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tinjector.AddModule(cur.TService, obj);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tinternal static Type[]? GetContructorParam(Type type)\n\t\t{\n\t\t\tvar fod = type.GetConstructors().FirstOrDefault();\n\t\t\tif (fod == null)\n\t\t\t\treturn null;\n\t\t\treturn fod.GetParameters().Select(p => p.ParameterType).ToArray();\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn $\"Unresolved: {modules.Count}\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Dependency/IInjector.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.Dependency\n{\n\t/// <summary>\n\t/// This provides the base contract for 'injector' classes.\n\t/// An injector is basically a dictionary to look up objects by type.\n\t/// </summary>\n\tpublic interface IInjector\n\t{\n\t\tobject? GetModule(Type type);\n\t\tvoid AddModule(Type type, object obj);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Dependency/InjectorExtensions.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace TS3AudioBot.Dependency\n{\n\tpublic static class InjectorExtensions\n\t{\n\t\tpublic static T? GetModule<T>(this IInjector injector) where T : class\n\t\t{\n\t\t\treturn (T?)injector.GetModule(typeof(T));\n\t\t}\n\n\t\tpublic static T GetModuleOrThrow<T>(this IInjector injector) where T : class\n\t\t{\n\t\t\tvar t = (T?)injector.GetModule(typeof(T));\n\t\t\tif (t is null) throw new Exception($\"{typeof(T).Name} was not found\");\n\t\t\treturn t;\n\t\t}\n\n\t\tpublic static bool TryGet<T>(this IInjector injector, [NotNullWhen(true)] out T? obj) where T : class\n\t\t{\n\t\t\tobj = injector.GetModule<T>();\n\t\t\treturn obj != null;\n\t\t}\n\n\t\tpublic static bool TryGet(this IInjector injector, Type t, [NotNullWhen(true)] out object? obj)\n\t\t{\n\t\t\tobj = injector.GetModule(t);\n\t\t\treturn obj != null;\n\t\t}\n\n\t\tpublic static void AddModule<T>(this IInjector injector, T obj) where T : notnull\n\t\t{\n\t\t\tinjector.AddModule(typeof(T), obj);\n\t\t}\n\n\t\tpublic static bool TryCreate<T>(this IInjector injector, [NotNullWhen(true)] out T? obj) where T : class\n\t\t{\n\t\t\tif (injector.TryCreate(typeof(T), out var oobj))\n\t\t\t{\n\t\t\t\tobj = (T)oobj;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tobj = default;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tpublic static bool TryCreate(this IInjector injector, Type type, [NotNullWhen(true)] out object? obj)\n\t\t{\n\t\t\tvar param = DependencyBuilder.GetContructorParam(type);\n\t\t\tif (param == null)\n\t\t\t\tthrow new ArgumentException(\"Invalid type, no constructors\");\n\n\t\t\tvar call = new object[param.Length];\n\t\t\tfor (int i = 0; i < param.Length; i++)\n\t\t\t{\n\t\t\t\tif (!injector.TryGet(param[i], out var dep))\n\t\t\t\t{\n\t\t\t\t\tobj = default;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcall[i] = dep;\n\t\t\t}\n\t\t\tobj = Activator.CreateInstance(type, call) ?? throw new ArgumentException(\"Activator didn't do his job...\");\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic static void FillProperties(this IInjector injector, object obj)\n\t\t{\n\t\t\tvar type = obj.GetType();\n\t\t\tvar props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)\n\t\t\t\t.Where(p => p.CanRead && p.CanWrite);\n\t\t\tforeach (var prop in props)\n\t\t\t{\n\t\t\t\tif (injector.TryGet(prop.PropertyType, out var dep))\n\t\t\t\t\tprop.SetValue(obj, dep);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Dependency/Module.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Linq;\n\nnamespace TS3AudioBot.Dependency\n{\n\tinternal class Module\n\t{\n\t\tpublic Type TImplementation { get; }\n\t\tpublic Type TService { get; }\n\t\tpublic Type[] ConstructorParam { get; }\n\n\t\tpublic Module(Type tService, Type tImplementation)\n\t\t{\n\t\t\tTService = tService;\n\t\t\tTImplementation = tImplementation;\n\t\t\tConstructorParam = DependencyBuilder.GetContructorParam(TImplementation) ?? throw new ArgumentException(\"Invalid type\");\n\t\t}\n\n\t\tpublic override string ToString() => $\"{TService.Name}({(TService != TImplementation ? TImplementation.Name : \"-\")}) => {string.Join(\",\", ConstructorParam.Select(x => x.Name))}\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Dependency/NullInjector.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.Dependency\n{\n\tpublic sealed class NullInjector : IInjector\n\t{\n\t\tpublic static readonly IInjector Instance = new NullInjector();\n\t\tprivate NullInjector() { }\n\t\tpublic object? GetModule(Type type) => null;\n\t\tpublic void AddModule(Type type, object obj) { }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Environment/Stats.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing LiteDB;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TSLib.Helper;\nusing TSLib.Scheduler;\n\nnamespace TS3AudioBot.Environment\n{\n\tpublic class Stats\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate const string StatsTable = \"stats\";\n\t\tprivate const string StatsTableAcc = \"stats_acc\";\n\t\tprivate const int OverallId = 1;\n\t\tprivate const int StatsVersion = 1;\n\t\tprivate static readonly TimeSpan CheckInterval = TimeSpan.FromMinutes(1);\n\t\tprivate static readonly TimeSpan SendInterval = TimeSpan.FromDays(1);\n\t\tprivate static readonly JsonSerializerSettings JsonSettings = new JsonSerializerSettings\n\t\t{\n\t\t\tNullValueHandling = NullValueHandling.Ignore,\n\t\t\tFormatting = Formatting.None,\n\t\t};\n\n\t\tprivate readonly ConfRoot conf;\n\t\tprivate readonly DbStore database;\n\t\tprivate readonly BotManager botManager;\n\t\tprivate readonly TickWorker ticker;\n\t\tprivate bool uploadParamEnabled;\n\t\tprivate bool UploadEnabled => uploadParamEnabled && conf.Configs.SendStats;\n\n\t\tprivate readonly DbMetaData meta;\n\t\tprivate readonly StatsData overallStats;\n\t\tprivate readonly StatsMeta statsPoints;\n\t\tprivate readonly LiteCollection<StatsData> trackEntries;\n\t\tprivate readonly LiteCollection<StatsData> accEntries;\n\t\tprivate readonly StatsData CurrentStatsData = new StatsData()\n\t\t{\n\t\t\tSongStats = new ConcurrentDictionary<string, StatsFactory>()\n\t\t};\n\t\tprivate DateTime runtimeLastTrack;\n\t\t// bot id -> factory\n\t\tprivate readonly ConcurrentDictionary<Id, string> runningSongsPerFactory = new ConcurrentDictionary<Id, string>();\n\n\t\tpublic Stats(ConfRoot conf, DbStore database, BotManager botManager, DedicatedTaskScheduler scheduler)\n\t\t{\n\t\t\tthis.conf = conf;\n\t\t\tthis.database = database;\n\t\t\tthis.botManager = botManager;\n\t\t\tuploadParamEnabled = true;\n\t\t\truntimeLastTrack = Tools.Now;\n\t\t\tticker = scheduler.CreateTimer(TrackPoint, CheckInterval, false);\n\n\t\t\tmeta = database.GetMetaData(StatsTable);\n\t\t\ttrackEntries = database.GetCollection<StatsData>(StatsTable);\n\t\t\ttrackEntries.EnsureIndex(x => x.Id, true);\n\t\t\ttrackEntries.EnsureIndex(x => x.Time);\n\t\t\taccEntries = database.GetCollection<StatsData>(StatsTableAcc);\n\t\t\taccEntries.EnsureIndex(x => x.Id, true);\n\n\t\t\tif (meta.Version != StatsVersion || meta.CustomData is null)\n\t\t\t{\n\t\t\t\tstatsPoints = new StatsMeta\n\t\t\t\t{\n\t\t\t\t\tLastSend = Tools.Now,\n\t\t\t\t};\n\t\t\t\tmeta.Version = StatsVersion;\n\t\t\t\tUpdateMeta();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatsPoints = JsonConvert.DeserializeObject<StatsMeta>(meta.CustomData, JsonSettings) ?? new StatsMeta();\n\t\t\t\t// Upgrade steps here\n\t\t\t}\n\n\t\t\toverallStats = accEntries.FindById(OverallId) ?? new StatsData\n\t\t\t{\n\t\t\t\tId = OverallId\n\t\t\t};\n\t\t}\n\n\t\tprivate void UpdateMeta()\n\t\t{\n\t\t\tmeta.CustomData = JsonConvert.SerializeObject(statsPoints, JsonSettings);\n\t\t\tdatabase.UpdateMetaData(meta);\n\t\t}\n\n\t\tpublic void StartTimer(bool upload)\n\t\t{\n\t\t\tuploadParamEnabled = upload;\n\t\t\tticker.Enable();\n\t\t}\n\n\t\tprivate async Task SendStats(StatsPing sendPacket)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tLog.Debug(\"Send: {@data}\", sendPacket);\n\t\t\t\tvar request = WebWrapper\n\t\t\t\t\t.Request(\"https://splamy.de/api/tab/stats\")\n\t\t\t\t\t.WithMethod(HttpMethod.Post);\n\t\t\t\trequest.Content = new StringContent(JsonConvert.SerializeObject(sendPacket), Tools.Utf8Encoder, \"application/json\");\n\t\t\t\tawait request.ToAction(response =>\n\t\t\t\t{\n\t\t\t\t\tLog.Debug(\"Stats response {0}\", response.StatusCode);\n\t\t\t\t\treturn Task.CompletedTask;\n\t\t\t\t});\n\t\t\t}\n\t\t\tcatch (Exception ex) { Log.Debug(ex, \"Could not upload stats\"); }\n\t\t}\n\n\t\tprivate StatsPing GetStatsTill(DateTime date)\n\t\t{\n\t\t\tvar sendPacket = GetDefaultStatsPing();\n\n\t\t\tuint count = 0;\n\t\t\tuint avgBots = 0;\n\t\t\tvar entries = trackEntries.Find(x => x.Time > date);\n\t\t\tforeach (var entry in entries)\n\t\t\t{\n\t\t\t\tcount++;\n\t\t\t\tsendPacket.Add(entry);\n\t\t\t\tavgBots += entry.RunningBots;\n\t\t\t}\n\t\t\tsendPacket.RunningBots = count == 0 ? 0 : (uint)(avgBots / (float)count + .5f);\n\t\t\treturn sendPacket;\n\t\t}\n\n\t\tprivate async void TrackPoint()\n\t\t{\n\t\t\tvar nextId = statsPoints.GenNextIndex();\n\n\t\t\tvar now = Tools.Now;\n\t\t\tCurrentStatsData.Time = now;\n\t\t\tCurrentStatsData.Id = nextId;\n\t\t\tvar trackTime = now - runtimeLastTrack;\n\t\t\truntimeLastTrack = now;\n\t\t\tCurrentStatsData.TotalUptime += trackTime;\n\t\t\tCurrentStatsData.RunningBots = botManager.GetRunningBotCount();\n\t\t\tCurrentStatsData.BotsRuntime = TimeSpan.FromTicks(trackTime.Ticks * CurrentStatsData.RunningBots);\n\t\t\tforeach (var factory in runningSongsPerFactory.Values)\n\t\t\t\tCurrentStatsData.SongStats.GetOrNew(factory).Playtime += trackTime;\n\n\t\t\tLog.Debug(\"Track: {@data}\", CurrentStatsData);\n\t\t\ttrackEntries.Upsert(CurrentStatsData);\n\t\t\toverallStats.Add(CurrentStatsData);\n\t\t\taccEntries.Upsert(overallStats);\n\t\t\tCurrentStatsData.Reset();\n\n\t\t\tif (UploadEnabled && statsPoints.LastSend + SendInterval < now)\n\t\t\t{\n\t\t\t\tvar sendData = GetStatsTill(statsPoints.LastSend);\n\t\t\t\tawait SendStats(sendData);\n\t\t\t\tstatsPoints.LastSend = now;\n\t\t\t}\n\n\t\t\tUpdateMeta();\n\t\t}\n\n\t\t// Track operations\n\n\t\tpublic void TrackSongLoad(string? factory, bool successful, bool fromUser)\n\t\t{\n\t\t\tvar statsFactory = CurrentStatsData.SongStats.GetOrNew(factory ?? \"\");\n\t\t\tstatsFactory.PlayRequests++;\n\t\t\tif (successful) statsFactory.PlaySucessful++;\n\t\t\tif (fromUser) statsFactory.PlayFromUser++;\n\t\t}\n\n\t\tpublic void TrackCommandCall(bool byUser)\n\t\t{\n\t\t\tCurrentStatsData.CommandCalls++;\n\t\t\tif (byUser) CurrentStatsData.CommandFromUser++;\n\t\t}\n\n\t\tpublic void TrackCommandApiCall()\n\t\t{\n\t\t\tCurrentStatsData.CommandCalls++;\n\t\t\tCurrentStatsData.CommandFromApi++;\n\t\t}\n\n\t\tpublic void TrackSongStart(Id bot, string factory)\n\t\t{\n\t\t\tfactory ??= \"\";\n\t\t\trunningSongsPerFactory[bot] = factory;\n\t\t\tvar statsFactory = CurrentStatsData.SongStats.GetOrNew(factory);\n\t\t\tstatsFactory.Playtime -= (Tools.Now - runtimeLastTrack);\n\t\t}\n\n\t\tpublic void TrackSongStop(Id bot)\n\t\t{\n\t\t\tif (runningSongsPerFactory.TryRemove(bot, out var factory))\n\t\t\t{\n\t\t\t\tvar statsFactory = CurrentStatsData.SongStats.GetOrNew(factory);\n\t\t\t\tstatsFactory.Playtime += (Tools.Now - runtimeLastTrack);\n\t\t\t}\n\t\t}\n\n\t\tprivate static StatsPing GetDefaultStatsPing()\n\t\t{\n\t\t\treturn new StatsPing\n\t\t\t{\n\t\t\t\tBotVersion = SystemData.AssemblyData.ToString(),\n\t\t\t\tPlatform = SystemData.PlatformData,\n\t\t\t\tRuntime = SystemData.RuntimeData.FullName,\n\t\t\t};\n\t\t}\n\n\t\tpublic static string CreateExample()\n\t\t{\n\t\t\tvar sendData = GetDefaultStatsPing();\n\t\t\tsendData.TotalUptime = TimeSpan.FromHours(12.34);\n\t\t\tsendData.BotsRuntime = TimeSpan.FromHours(4.20);\n\t\t\tsendData.CommandCalls = 1234;\n\t\t\tsendData.CommandFromApi = 100;\n\t\t\tsendData.RunningBots = 3;\n\t\t\tsendData.SongStats = new Dictionary<string, StatsFactory>()\n\t\t\t{\n\t\t\t\t{ \"youtube\", new StatsFactory {\n\t\t\t\t\tPlayRequests = 100,\n\t\t\t\t\tPlayFromUser = 42,\n\t\t\t\t\tPlaytime = TimeSpan.FromMinutes(12.34),\n\t\t\t\t\tSearchRequests = 5,\n\t\t\t\t}}\n\t\t\t};\n\n\t\t\treturn JsonConvert.SerializeObject(sendData, Formatting.Indented);\n\t\t}\n\t}\n\n\tinternal class StatsPing : StatsData\n\t{\n\t\t// Meta\n\t\tpublic string? BotVersion { get; set; }\n\t\tpublic string? Platform { get; set; }\n\t\tpublic string? Runtime { get; set; }\n\t}\n\n\tinternal class StatsMeta\n\t{\n\t\tpublic const int RingOff = 1;\n\t\tpublic const int RingSize = 60 * 24 * 7; /* min * day * week */\n\n\t\tpublic int CurrentIndex { get; set; } = 0;\n\t\tpublic DateTime LastSend = DateTime.MinValue;\n\n\t\tpublic int GenNextIndex()\n\t\t{\n\t\t\tCurrentIndex = (CurrentIndex + 1) % RingSize;\n\t\t\treturn CurrentIndex + RingOff;\n\t\t}\n\t}\n\n\tinternal class StatsData\n\t{\n\t\t[JsonIgnore]\n\t\tpublic int Id { get; set; }\n\t\t[JsonIgnore]\n\t\tpublic DateTime Time { get; set; }\n\t\tpublic uint RunningBots { get; set; }\n\t\tpublic TimeSpan BotsRuntime { get; set; } = TimeSpan.Zero;\n\n\t\tpublic TimeSpan TotalUptime { get; set; } = TimeSpan.Zero;\n\t\tpublic IDictionary<string, StatsFactory> SongStats { get; set; } = new Dictionary<string, StatsFactory>();\n\n\t\tpublic uint CommandCalls { get; set; }\n\t\t///<summary>How many actually were started by a user (and not i.e. by event)</summary>\n\t\tpublic uint CommandFromUser { get; set; }\n\t\tpublic uint CommandFromApi { get; set; }\n\n\t\tpublic bool ShouldSerializeSongStats() => SongStats.Count > 0;\n\t\tpublic bool ShouldSerializeCommandCalls() => CommandCalls != 0;\n\t\tpublic bool ShouldSerializeCommandFromUser() => CommandFromUser != 0;\n\t\tpublic bool ShouldSerializeCommandFromApi() => CommandFromApi != 0;\n\n\t\tpublic void Add(StatsData other)\n\t\t{\n\t\t\tTotalUptime += other.TotalUptime;\n\t\t\tBotsRuntime += other.BotsRuntime;\n\t\t\tforeach (var kvp in other.SongStats)\n\t\t\t\tSongStats.GetOrNew(kvp.Key).Add(kvp.Value);\n\t\t\tCommandCalls += other.CommandCalls;\n\t\t\tCommandFromUser += other.CommandFromUser;\n\t\t\tCommandFromApi += other.CommandFromApi;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tTotalUptime = TimeSpan.Zero;\n\t\t\tRunningBots = 0;\n\t\t\tBotsRuntime = TimeSpan.Zero;\n\t\t\tSongStats.Clear();\n\t\t\tCommandCalls = 0;\n\t\t\tCommandFromUser = 0;\n\t\t\tCommandFromApi = 0;\n\t\t}\n\t}\n\n\tinternal class StatsFactory\n\t{\n\t\tpublic uint PlayRequests { get; set; }\n\t\tpublic uint PlaySucessful { get; set; }\n\t\t///<summary>How many actually were started by a user (and not i.e. from a playlist)</summary>\n\t\tpublic uint PlayFromUser { get; set; }\n\t\tpublic uint SearchRequests { get; set; }\n\t\tpublic TimeSpan Playtime { get; set; }\n\n\t\tpublic bool ShouldSerializePlayRequests() => PlayRequests != 0;\n\t\tpublic bool ShouldSerializePlaySucessful() => PlaySucessful != 0;\n\t\tpublic bool ShouldSerializePlayFromUser() => PlayFromUser != 0;\n\t\tpublic bool ShouldSerializeSearchRequests() => SearchRequests != 0;\n\t\tpublic bool ShouldSerializePlaytime() => Playtime != TimeSpan.Zero;\n\n\t\tpublic void Add(StatsFactory other)\n\t\t{\n\t\t\tPlayRequests += other.PlayRequests;\n\t\t\tPlaySucessful += other.PlaySucessful;\n\t\t\tPlayFromUser += other.PlayFromUser;\n\t\t\tSearchRequests += other.SearchRequests;\n\t\t\tPlaytime += other.Playtime;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tPlayRequests = 0;\n\t\t\tPlaySucessful = 0;\n\t\t\tPlayFromUser = 0;\n\t\t\tSearchRequests = 0;\n\t\t\tPlaytime = TimeSpan.Zero;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Environment/SystemData.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing TS3AudioBot.Helper;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Environment\n{\n\tpublic static class SystemData\n\t{\n\t\tprivate static readonly Regex PlatformRegex = new Regex(@\"(\\w+)=(.*)\", RegexOptions.IgnoreCase | RegexOptions.ECMAScript | RegexOptions.Multiline);\n\t\tprivate static readonly Regex SemVerRegex = new Regex(@\"(\\d+)(?:\\.(\\d+)){1,3}\", RegexOptions.IgnoreCase | RegexOptions.ECMAScript | RegexOptions.Multiline);\n\n\t\tpublic static BuildData AssemblyData { get; } = new BuildData();\n\n\t\tpublic static string PlatformData { get; } = GenPlatformDat();\n\t\tprivate static string GenPlatformDat()\n\t\t{\n\t\t\tstring? platform = null;\n\t\t\tstring? version = null;\n\t\t\tstring bitness = System.Environment.Is64BitProcess ? \"64bit\" : \"32bit\";\n\n\t\t\tif (Tools.IsLinux)\n\t\t\t{\n\t\t\t\tvar values = new Dictionary<string, string>();\n\n\t\t\t\tRunBash(\"cat /etc/*[_-][Rr]elease\", x =>\n\t\t\t\t{\n\t\t\t\t\tvar lines = x.ReadToEnd().Split(new[] { '\\n', '\\r' }, StringSplitOptions.RemoveEmptyEntries);\n\t\t\t\t\tforeach (var line in lines)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar match = PlatformRegex.Match(line);\n\t\t\t\t\t\tif (!match.Success)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tvalues[match.Groups[1].Value.ToUpperInvariant()] = TextUtil.StripQuotes(match.Groups[2].Value);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (values.Count > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tplatform = values.TryGetValue(\"NAME\", out string? value) ? value\n\t\t\t\t\t\t\t\t: values.TryGetValue(\"ID\", out value) ? value\n\t\t\t\t\t\t\t\t: values.TryGetValue(\"DISTRIB_ID\", out value) ? value\n\t\t\t\t\t\t\t\t: values.TryGetValue(\"PRETTY_NAME\", out value) ? value\n\t\t\t\t\t\t\t\t: null;\n\n\t\t\t\t\t\tversion = values.TryGetValue(\"VERSION\", out value) ? value\n\t\t\t\t\t\t\t\t: values.TryGetValue(\"VERSION_ID\", out value) ? value\n\t\t\t\t\t\t\t\t: values.TryGetValue(\"DISTRIB_RELEASE\", out value) ? value\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (platform is null && version is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tforeach (var line in lines)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar match = SemVerRegex.Match(line);\n\t\t\t\t\t\t\tif (match.Success)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tversion = line;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tplatform ??= \"Linux\";\n\t\t\t\t\tversion ??= \"<?>\";\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tplatform = \"Windows\";\n\t\t\t\tversion = System.Environment.OSVersion.Version.ToString();\n\t\t\t}\n\n\t\t\treturn $\"{platform} {version} ({bitness})\";\n\t\t}\n\n\t\tprivate static void RunBash(string param, Action<StreamReader> action)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing var p = new Process\n\t\t\t\t{\n\t\t\t\t\tStartInfo = new ProcessStartInfo\n\t\t\t\t\t{\n\t\t\t\t\t\tFileName = \"bash\",\n\t\t\t\t\t\tArguments = $\"-c \\\"{param}\\\"\",\n\t\t\t\t\t\tCreateNoWindow = true,\n\t\t\t\t\t\tUseShellExecute = false,\n\t\t\t\t\t\tRedirectStandardOutput = true,\n\t\t\t\t\t},\n\t\t\t\t\tEnableRaisingEvents = true,\n\t\t\t\t};\n\t\t\t\tp.Start();\n\t\t\t\tp.WaitForExit(200);\n\n\t\t\t\taction.Invoke(p.StandardOutput);\n\t\t\t}\n\t\t\tcatch { }\n\t\t}\n\n\t\tpublic static PlatformVersion RuntimeData { get; } = GenRuntimeData();\n\t\tprivate static PlatformVersion GenRuntimeData()\n\t\t{\n\t\t\tvar ver = GetNetCoreVersion();\n\t\t\tif (ver != null)\n\t\t\t\treturn ver;\n\n\t\t\tver = GetMonoVersion();\n\t\t\tif (ver != null)\n\t\t\t\treturn ver;\n\n\t\t\tver = GetNetFrameworkVersion();\n\t\t\tif (ver != null)\n\t\t\t\treturn ver;\n\n\t\t\treturn new PlatformVersion(Runtime.Unknown, \"? (?)\", null);\n\t\t}\n\n\t\tprivate static PlatformVersion? GetNetCoreVersion()\n\t\t{\n\t\t\tvar assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;\n\t\t\tvar assemblyPath = assembly.CodeBase?.Split(new[] { '/', '\\\\' }, StringSplitOptions.RemoveEmptyEntries);\n\t\t\tif (assemblyPath is null)\n\t\t\t\treturn null;\n\t\t\tint netCoreAppIndex = Array.IndexOf(assemblyPath, \"Microsoft.NETCore.App\");\n\t\t\tif (netCoreAppIndex <= 0 || netCoreAppIndex >= assemblyPath.Length - 2)\n\t\t\t\treturn null;\n\t\t\tvar version = assemblyPath[netCoreAppIndex + 1];\n\t\t\tvar semVer = ParseToSemVer(version);\n\t\t\treturn new PlatformVersion(Runtime.Core, $\".NET Core ({version})\", semVer);\n\t\t}\n\n\t\tprivate static PlatformVersion? GetMonoVersion()\n\t\t{\n\t\t\tvar type = Type.GetType(\"Mono.Runtime\");\n\t\t\tif (type is null)\n\t\t\t\treturn null;\n\t\t\tvar displayName = type.GetMethod(\"GetDisplayName\", BindingFlags.NonPublic | BindingFlags.Static);\n\t\t\tif (displayName is null)\n\t\t\t\treturn new PlatformVersion(Runtime.Mono, \"Mono (?)\", null);\n\t\t\tvar version = displayName.Invoke(null, null) as string;\n\t\t\tvar semVer = ParseToSemVer(version);\n\t\t\treturn new PlatformVersion(Runtime.Mono, $\"Mono ({version})\", semVer);\n\t\t}\n\n\t\tprivate static PlatformVersion GetNetFrameworkVersion()\n\t\t{\n\t\t\tvar version = System.Environment.Version.ToString();\n\t\t\tvar semVer = ParseToSemVer(version);\n\t\t\treturn new PlatformVersion(Runtime.Net, $\".NET Framework {version}\", semVer);\n\t\t}\n\n\t\tprivate static Version? ParseToSemVer(string? version)\n\t\t{\n\t\t\tif (version is null)\n\t\t\t\treturn null;\n\t\t\tvar semMatch = SemVerRegex.Match(version);\n\t\t\tif (!semMatch.Success)\n\t\t\t\treturn null;\n\n\t\t\tif (!int.TryParse(semMatch.Groups[1].Value, out var major)) major = 0;\n\t\t\tif (!int.TryParse(semMatch.Groups[2].Captures[0].Value, out var minor)) minor = 0;\n\t\t\tif (semMatch.Groups[2].Captures.Count <= 1\n\t\t\t\t|| !int.TryParse(semMatch.Groups[2].Captures[1].Value, out var patch)) patch = 0;\n\t\t\tif (semMatch.Groups[2].Captures.Count <= 2\n\t\t\t\t|| int.TryParse(semMatch.Groups[2].Captures[2].Value, out var revision)) revision = 0;\n\t\t\treturn new Version(major, minor, patch, revision);\n\t\t}\n\t}\n\n\tpublic enum Runtime\n\t{\n\t\tUnknown,\n\t\tNet,\n\t\tCore,\n\t\tMono,\n\t}\n\n\tpublic partial class BuildData\n\t{\n\t\tpublic string Version = \"<?>\";\n\t\tpublic string Branch = \"<?>\";\n\t\tpublic string CommitSha = \"<?>\";\n\n\t\tpublic string BuildConfiguration = \"<?>\";\n\n\t\tpublic BuildData()\n\t\t{\n\t\t\tGetDataInternal();\n\t\t}\n\n\t\tpublic string ToLongString() => $\"\\nVersion: {Version}\\nBranch: {Branch}\\nCommitHash: {CommitSha}\";\n\t\tpublic override string ToString() => $\"{Version}/{Branch}/{(CommitSha.Length > 8 ? CommitSha.Substring(0, 8) : CommitSha)}\";\n\n\t\tpartial void GetDataInternal();\n\t}\n\n\tpublic class PlatformVersion\n\t{\n\t\tpublic Runtime Runtime;\n\t\tpublic string FullName;\n\t\tpublic Version? SemVer;\n\n\t\tpublic PlatformVersion(Runtime runtime, string fullName, Version? semVer)\n\t\t{\n\t\t\tRuntime = runtime;\n\t\t\tFullName = fullName;\n\t\t\tSemVer = semVer;\n\t\t}\n\n\t\tpublic override string ToString() => FullName;\n\t}\n\n\tpublic static class SemVerExtension\n\t{\n\t\tpublic static string AsSemVer(this Version version) => $\"{version.Major}.{version.Minor}.{version.Build}\" + (version.Revision != 0 ? $\".{version.Revision}\" : null);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Environment/SystemMonitor.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Threading;\nusing TSLib.Helper;\nusing TSLib.Scheduler;\n\nnamespace TS3AudioBot.Environment\n{\n\tpublic class SystemMonitor\n\t{\n\t\tprivate static readonly Process CurrentProcess = Process.GetCurrentProcess();\n\t\tprivate readonly ReaderWriterLockSlim historyLock = new ReaderWriterLockSlim();\n\t\tprivate readonly Queue<SystemMonitorSnapshot> history = new Queue<SystemMonitorSnapshot>();\n\n\t\tprivate bool historyChanged = true;\n\t\tprivate SystemMonitorReport? lastReport = null;\n\t\tprivate DateTime lastSnapshotTime = DateTime.MinValue;\n\t\tprivate TimeSpan lastCpuTime = TimeSpan.Zero;\n\n\t\tpublic DateTime StartTime { get; } = Tools.Now;\n\n\t\tpublic SystemMonitor(DedicatedTaskScheduler scheduler)\n\t\t{\n\t\t\t_ = scheduler.CreateTimer(CreateSnapshot, TimeSpan.FromSeconds(1), true);\n\t\t}\n\n\t\tpublic void CreateSnapshot()\n\t\t{\n\t\t\tCurrentProcess.Refresh();\n\n\t\t\t//TODO: foreach (ProcessThread thread in CurrentProcess.Threads)\n\t\t\t{\n\t\t\t}\n\n\t\t\tvar currentSnapshotTime = Tools.Now;\n\t\t\tvar currentCpuTime = CurrentProcess.TotalProcessorTime;\n\n\t\t\tvar timeDiff = currentSnapshotTime - lastSnapshotTime;\n\t\t\tvar cpuDiff = currentCpuTime - lastCpuTime;\n\t\t\tvar cpu = cpuDiff.Ticks / (float)timeDiff.Ticks;\n\n\t\t\tlastSnapshotTime = currentSnapshotTime;\n\t\t\tlastCpuTime = currentCpuTime;\n\n\t\t\thistoryLock.EnterWriteLock();\n\t\t\ttry\n\t\t\t{\n\t\t\t\thistory.Enqueue(new SystemMonitorSnapshot\n\t\t\t\t{\n\t\t\t\t\tMemory = CurrentProcess.WorkingSet64,\n\t\t\t\t\tCpu = cpu,\n\t\t\t\t});\n\n\t\t\t\twhile (history.Count > 60)\n\t\t\t\t\thistory.Dequeue();\n\n\t\t\t\thistoryChanged = true;\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\thistoryLock.ExitWriteLock();\n\t\t\t}\n\t\t}\n\n\t\tpublic SystemMonitorReport GetReport()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\thistoryLock.EnterReadLock();\n\t\t\t\tif (historyChanged || lastReport == null)\n\t\t\t\t{\n\t\t\t\t\tlastReport = new SystemMonitorReport\n\t\t\t\t\t(\n\t\t\t\t\t\t memory: history.Select(x => x.Memory).ToArray(),\n\t\t\t\t\t\t cpu: history.Select(x => x.Cpu).ToArray()\n\t\t\t\t\t);\n\t\t\t\t\thistoryChanged = false;\n\t\t\t\t}\n\t\t\t\treturn lastReport;\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\thistoryLock.ExitReadLock();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic class SystemMonitorReport\n\t{\n\t\tpublic long[] Memory { get; }\n\t\tpublic float[] Cpu { get; }\n\n\t\tpublic SystemMonitorReport(long[] memory, float[] cpu)\n\t\t{\n\t\t\tMemory = memory;\n\t\t\tCpu = cpu;\n\t\t}\n\t}\n\n\tpublic struct SystemMonitorSnapshot\n\t{\n\t\tpublic float Cpu { get; set; }\n\t\tpublic long Memory { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Error.cs",
    "content": "using System;\nusing System.Runtime.Serialization;\n\nnamespace TS3AudioBot\n{\n\tpublic static class Error\n\t{\n\t\tpublic static AudioBotException LocalStr(string text) => new AudioBotException().LocalStr(text);\n\t\tpublic static AudioBotException Exception(Exception ex) => new AudioBotException(ex);\n\t\tpublic static AudioBotException Str(string text) => new AudioBotException().Str(text);\n\n\t\tpublic static AudioBotException LocalStr(this AudioBotException ex, string text) { ex.LocalStr = text; return ex; }\n\t\tpublic static AudioBotException Str(this AudioBotException ex, string text) { ex.Str = text; return ex; }\n\t\tpublic static void Throw(this AudioBotException ex) => throw ex;\n\t}\n\n\t[Serializable]\n\tpublic class AudioBotException : Exception\n\t{\n\t\tpublic string? LocalStr { get; set; }\n\t\tpublic string? Str { get; set; }\n\t\tpublic Exception? InnerCustomException { get; set; }\n\n\t\tpublic override string Message => LocalStr ?? Str ?? \"\";\n\n\t\tpublic AudioBotException(Exception? ex = null)\n\t\t\t: base(null, ex)\n\t\t{ }\n\n\t\tpublic AudioBotException(string message, Exception? inner = null)\n\t\t\t: base(null, inner)\n\t\t{\n\t\t\tLocalStr = message;\n\t\t}\n\n\t\tprotected AudioBotException(SerializationInfo info, StreamingContext context)\n\t\t\t: base(info, context)\n\t\t{ }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/AttributeStrings.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Helper\n{\n\tinternal static class AttributeStrings\n\t{\n\t\tpublic const string UnderDevelopment = \"This feature is unstable and might change\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/Const.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Helper\n{\n\tinternal static class SessionConst\n\t{\n\t\tpublic const string SearchResult = \"tab_searchresult\";\n\t}\n\n\tpublic static class BotPaths\n\t{\n\t\tpublic const string Playlists = \"playlists\";\n\t\tpublic const string Avatars = \"avatars\";\n\t\tpublic const string Music = \"music\";\n\t}\n\n\tpublic static class FilesConst\n\t{\n\t\tpublic const string CoreConfig = \"ts3audiobot.toml\";\n\t\tpublic const string BotConfig = \"bot.toml\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/Diagnose/SelfDiagnoseLevel.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Helper.Diagnose\n{\n\tpublic enum SelfDiagnoseLevel\n\t{\n\t\tInfo,\n\t\tWarning,\n\t\tError\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/Diagnose/SelfDiagnoseMessage.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\n\nnamespace TS3AudioBot.Helper.Diagnose\n{\n\tpublic class SelfDiagnoseMessage\n\t{\n\t\tpublic string Description { get; }\n\t\tpublic string Category { get; }\n\t\tpublic string Level => LevelValue.ToString();\n\t\t[JsonIgnore]\n\t\tpublic SelfDiagnoseLevel LevelValue { get; }\n\n\t\tpublic SelfDiagnoseMessage(string description, string category, SelfDiagnoseLevel levelValue)\n\t\t{\n\t\t\tDescription = description;\n\t\t\tCategory = category;\n\t\t\tLevelValue = levelValue;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/IJsonConfig.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\nusing System.IO;\nusing System.Text;\n\nnamespace TS3AudioBot.Helper\n{\n\tpublic interface IJsonSerializable\n\t{\n\t\tbool ExpectsString { get; }\n\t\tvoid ToJson(JsonWriter writer);\n\t\tE<string> FromJson(JsonReader reader);\n\t}\n\n\tpublic static class JsonSerializableExtensions\n\t{\n\t\tpublic static E<string> FromJson(this IJsonSerializable jsonConfig, string json)\n\t\t{\n\t\t\tif (jsonConfig.ExpectsString)\n\t\t\t\tjson = JsonConvert.SerializeObject(json);\n\n\t\t\tusing var sr = new StringReader(json);\n\t\t\tusing var reader = new JsonTextReader(sr);\n\t\t\treturn jsonConfig.FromJson(reader);\n\t\t}\n\n\t\tpublic static string ToJson(this IJsonSerializable jsonConfig)\n\t\t{\n\t\t\tvar sb = new StringBuilder();\n\t\t\tvar sw = new StringWriter(sb);\n\t\t\tusing (var writer = new JsonTextWriter(sw))\n\t\t\t{\n\t\t\t\twriter.Formatting = Formatting.Indented;\n\t\t\t\tjsonConfig.ToJson(writer);\n\t\t\t}\n\t\t\treturn sb.ToString();\n\t\t}\n\t}\n\n\tpublic class IJsonSerializableConverter : JsonConverter\n\t{\n\t\tpublic override bool CanRead => false;\n\t\tpublic override bool CanWrite => true;\n\n\t\tpublic override bool CanConvert(Type objectType)\n\t\t{\n\t\t\treturn typeof(IJsonSerializable).IsAssignableFrom(objectType);\n\t\t}\n\n\t\tpublic override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)\n\t\t{\n\t\t\tthrow new NotImplementedException();\n\t\t}\n\n\t\tpublic override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)\n\t\t{\n\t\t\tif (value is null)\n\t\t\t{\n\t\t\t\twriter.WriteNull();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar obj = (IJsonSerializable)value;\n\t\t\t\tobj.ToJson(writer);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/ImageUtil.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing SixLabors.ImageSharp;\nusing SixLabors.ImageSharp.Formats;\nusing SixLabors.ImageSharp.Formats.Gif;\nusing SixLabors.ImageSharp.Formats.Jpeg;\nusing SixLabors.ImageSharp.Processing;\nusing System;\nusing System.IO;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.Helper\n{\n\tinternal static class ImageUtil\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tpublic const int ResizeMaxWidthDefault = 320;\n\n\t\tpublic static async Task<ImageHolder> ResizeImageSave(Stream imgStream, int resizeMaxWidth = ResizeMaxWidthDefault)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing var limitStream = new LimitStream(imgStream, Limits.MaxImageStreamSize);\n\t\t\t\tusing var mem = new MemoryStream();\n\t\t\t\tawait limitStream.CopyToAsync(mem);\n\t\t\t\tmem.Seek(0, SeekOrigin.Begin);\n\t\t\t\treturn ResizeImage(mem, resizeMaxWidth);\n\t\t\t}\n\t\t\tcatch (ImageFormatException)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Dropping image because of unknown format\");\n\t\t\t\tthrow Error.LocalStr(\"Dropping image because of unknown format\"); // TODO\n\t\t\t}\n\t\t\tcatch (EntityTooLargeException)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Dropping image because too large\");\n\t\t\t\tthrow Error.LocalStr(\"Dropping image because too large\"); // TODO\n\t\t\t}\n\t\t}\n\n\t\tprivate static ImageHolder ResizeImage(Stream imgStream, int resizeMaxWidth)\n\t\t{\n\t\t\tusing var img = Image.Load(imgStream);\n\t\t\tif (img.Width > Limits.MaxImageDimension || img.Height > Limits.MaxImageDimension\n\t\t\t\t|| img.Width == 0 || img.Height == 0)\n\t\t\t\tthrow Error.LocalStr(\"Dropping image because too large\"); // TODO\n\n\t\t\tif (img.Width <= resizeMaxWidth)\n\t\t\t\treturn SaveAdaptive(img);\n\n\t\t\tfloat ratio = img.Width / (float)img.Height;\n\t\t\timg.Mutate(x => x.Resize(resizeMaxWidth, (int)(resizeMaxWidth / ratio)));\n\n\t\t\treturn SaveAdaptive(img);\n\t\t}\n\n\t\tprivate static ImageHolder SaveAdaptive(Image img)\n\t\t{\n\t\t\tIImageFormat format;\n\t\t\tif (img.Frames.Count > 1)\n\t\t\t{\n\t\t\t\tformat = GifFormat.Instance;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tformat = JpegFormat.Instance;\n\t\t\t}\n\t\t\tvar mime = format.DefaultMimeType;\n\t\t\tvar mem = new MemoryStream();\n\t\t\timg.Save(mem, format);\n\t\t\tmem.Seek(0, SeekOrigin.Begin);\n\t\t\treturn new ImageHolder(mem, mime);\n\t\t}\n\t}\n\n\tclass ImageHolder : IDisposable\n\t{\n\t\tpublic Stream Stream { get; }\n\t\tpublic string Mime { get; }\n\n\t\tpublic ImageHolder(Stream stream, string mime)\n\t\t{\n\t\t\tStream = stream;\n\t\t\tMime = mime;\n\t\t}\n\n\t\tpublic void Dispose() => Stream.Dispose();\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/Interactive.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.Helper\n{\n\tpublic static class Interactive\n\t{\n\t\tpublic static bool UserAgree(bool defaultTo = true)\n\t\t{\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tvar key = Console.ReadKey(true).Key;\n\t\t\t\tif (key == ConsoleKey.Y || (defaultTo && key == ConsoleKey.Enter))\n\t\t\t\t\treturn true;\n\t\t\t\tif (key == ConsoleKey.N || (!defaultTo && key == ConsoleKey.Enter))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tpublic static string? LoopAction(string question, Func<string, bool> action)\n\t\t{\n\t\t\tstring text;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tConsole.WriteLine(question);\n\t\t\t\ttext = Console.ReadLine();\n\t\t\t\tif (text is null)\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t\twhile (!action(text));\n\t\t\treturn text;\n\t\t}\n\n\t\tpublic static async Task<string?> LoopActionAsync(string question, Func<string, Task<bool>> action)\n\t\t{\n\t\t\tstring text;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tConsole.WriteLine(question);\n\t\t\t\ttext = Console.ReadLine();\n\t\t\t\tif (text is null)\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t\twhile (!await action(text));\n\t\t\treturn text;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/LimitStream.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.IO;\n\nnamespace TS3AudioBot.Helper\n{\n\tpublic class LimitStream : Stream\n\t{\n\t\tprivate readonly Stream baseStream;\n\n\t\tpublic LimitStream(Stream baseStream, long maxLength)\n\t\t{\n\t\t\tthis.baseStream = baseStream;\n\t\t\tMaxLength = maxLength;\n\t\t}\n\n\t\tpublic long MaxLength { get; }\n\t\tpublic long IOBytes { get; private set; }\n\n\t\tpublic override bool CanRead => baseStream.CanRead;\n\t\tpublic override bool CanSeek => false;\n\t\tpublic override bool CanWrite => baseStream.CanWrite;\n\t\tpublic override long Length => baseStream.Length;\n\t\tpublic override long Position { get => baseStream.Position; set => baseStream.Position = value; }\n\n\t\tpublic override void Flush() => baseStream.Flush();\n\n\t\tpublic override int Read(byte[] buffer, int offset, int count)\n\t\t{\n\t\t\tif (IOBytes + count > MaxLength)\n\t\t\t{\n\t\t\t\tcount = (int)(MaxLength - IOBytes);\n\t\t\t\tif (count <= 0)\n\t\t\t\t\tthrow new EntityTooLargeException(MaxLength);\n\t\t\t}\n\t\t\tint read = baseStream.Read(buffer, offset, count);\n\t\t\tIOBytes += read;\n\t\t\treturn read;\n\t\t}\n\n\t\tpublic override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException();\n\n\t\tpublic override void SetLength(long value) => baseStream.SetLength(value);\n\n\t\tpublic override void Write(byte[] buffer, int offset, int count)\n\t\t{\n\t\t\tif (IOBytes + count > MaxLength)\n\t\t\t\tthrow new EntityTooLargeException(MaxLength);\n\t\t\tIOBytes += count;\n\t\t\tbaseStream.Write(buffer, offset, count);\n\t\t}\n\n\t\tprotected override void Dispose(bool disposing)\n\t\t{\n\t\t\tif (disposing)\n\t\t\t{\n\t\t\t\tbaseStream.Dispose();\n\t\t\t}\n\t\t}\n\t}\n\n\t[Serializable]\n\tpublic class EntityTooLargeException : Exception\n\t{\n\t\tprivate const string ErrMsg = \"Content exceeds the limit of {0} bytes\";\n\n\t\tpublic EntityTooLargeException() { }\n\t\tpublic EntityTooLargeException(long maxLen) : base(string.Format(ErrMsg, maxLen)) { }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/TextUtil.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Globalization;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Xml;\n\nnamespace TS3AudioBot.Helper\n{\n\tpublic static class TextUtil\n\t{\n\t\tpublic static Answer GetAnswer(string answer)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(answer))\n\t\t\t\treturn Answer.Unknown;\n\t\t\tif (answer.StartsWith(\"!y\", StringComparison.OrdinalIgnoreCase))\n\t\t\t\treturn Answer.Yes;\n\t\t\telse if (answer.StartsWith(\"!n\", StringComparison.OrdinalIgnoreCase))\n\t\t\t\treturn Answer.No;\n\t\t\telse\n\t\t\t\treturn Answer.Unknown;\n\t\t}\n\n\t\tprivate static readonly Regex BbMatch = new Regex(@\"\\[URL\\](.+?)\\[\\/URL\\]\", Util.DefaultRegexConfig);\n\t\tpublic static string ExtractUrlFromBb(string ts3Link)\n\t\t{\n\t\t\tif (ts3Link.Contains(\"[URL]\"))\n\t\t\t{\n\t\t\t\tvar match = BbMatch.Match(ts3Link);\n\t\t\t\tif (match.Success)\n\t\t\t\t\treturn match.Groups[1].Value;\n\t\t\t}\n\n\t\t\treturn ts3Link;\n\t\t}\n\n\t\tpublic static string StripQuotes(string quotedString, bool throwWhenIncorrect = false)\n\t\t{\n\t\t\tif (quotedString.Length <= 1\n\t\t\t\t|| !quotedString.StartsWith(\"\\\"\", StringComparison.Ordinal)\n\t\t\t\t|| !quotedString.EndsWith(\"\\\"\", StringComparison.Ordinal))\n\t\t\t{\n\t\t\t\tif (throwWhenIncorrect)\n\t\t\t\t\tthrow new ArgumentException(\"The string is not properly quoted\");\n\t\t\t\telse\n\t\t\t\t\treturn quotedString;\n\t\t\t}\n\n\t\t\treturn quotedString[1..^1];\n\t\t}\n\n\t\tpublic static string GenToken(int length)\n\t\t{\n\t\t\tconst string tokenChars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\t\t\tusing var rng = RandomNumberGenerator.Create();\n\t\t\tvar buffer = new byte[length];\n\t\t\trng.GetBytes(buffer);\n\t\t\tvar strb = new StringBuilder(buffer.Length);\n\t\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\t\tstrb.Append(tokenChars[((tokenChars.Length - 1) * buffer[i]) / 255]);\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tprivate static readonly Regex TimeReg = new Regex(@\"^(?:(\\d+)d)?(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?(?:(\\d+)ms)?$\", Util.DefaultRegexConfig);\n\n\t\tpublic static TimeSpan? ParseTime(string value)\n\t\t{\n\t\t\tif (value is null) return null;\n\t\t\treturn ParseTimeAsSimple(value)\n\t\t\t\t?? ParseTimeAsDigital(value)\n\t\t\t\t?? ParseTimeAsXml(value);\n\t\t}\n\n\t\tprivate static TimeSpan? ParseTimeAsSimple(string value)\n\t\t{\n\t\t\tstatic int AsNum(string svalue)\n\t\t\t{\n\t\t\t\tif (string.IsNullOrEmpty(svalue))\n\t\t\t\t\treturn 0;\n\t\t\t\treturn int.TryParse(svalue, out var num) ? num : 0;\n\t\t\t}\n\n\t\t\tvar match = TimeReg.Match(value);\n\t\t\tif (match.Success)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\treturn new TimeSpan(\n\t\t\t\t\t\tAsNum(match.Groups[1].Value),\n\t\t\t\t\t\tAsNum(match.Groups[2].Value),\n\t\t\t\t\t\tAsNum(match.Groups[3].Value),\n\t\t\t\t\t\tAsNum(match.Groups[4].Value),\n\t\t\t\t\t\tAsNum(match.Groups[5].Value));\n\t\t\t\t}\n\t\t\t\tcatch { }\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate static TimeSpan? ParseTimeAsDigital(string value)\n\t\t{\n\t\t\tif (value.Contains(\":\"))\n\t\t\t{\n\t\t\t\tstring[] splittime = value.Split(':');\n\n\t\t\t\tif (splittime.Length == 2\n\t\t\t\t\t&& int.TryParse(splittime[0], out var minutes)\n\t\t\t\t\t&& double.TryParse(splittime[1], NumberStyles.Integer | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var seconds))\n\t\t\t\t{\n\t\t\t\t\treturn TimeSpan.FromSeconds(seconds) + TimeSpan.FromMinutes(minutes);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (double.TryParse(value, NumberStyles.Integer | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var seconds))\n\t\t\t\t\treturn TimeSpan.FromSeconds(seconds);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate static TimeSpan? ParseTimeAsXml(string value)\n\t\t{\n\t\t\ttry { return XmlConvert.ToTimeSpan(value); }\n\t\t\tcatch (FormatException) { return null; }\n\t\t}\n\n\t\tpublic static E<string> ValidateTime(string value)\n\t\t{\n\t\t\tif (ParseTime(value) != null)\n\t\t\t\treturn R.Ok;\n\t\t\treturn $\"Value '{value}' is not a valid time.\";\n\t\t}\n\t}\n\n\tpublic enum Answer\n\t{\n\t\tUnknown,\n\t\tYes,\n\t\tNo\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/TomlTools.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace TS3AudioBot.Helper\n{\n\tpublic static class TomlTools\n\t{\n\t\t// *** Convenience method for getting values out of a toml object. ***\n\n\t\tpublic static bool TryGetValueArray<T>(this TomlObject tomlObj, [NotNullWhen(true)] out T[]? value) where T : notnull\n\t\t{\n\t\t\tif (tomlObj.TomlType == TomlObjectType.Array)\n\t\t\t{\n\t\t\t\tvar tomlArray = (TomlArray)tomlObj;\n\t\t\t\tvalue = new T[tomlArray.Length];\n\t\t\t\tfor (int i = 0; i < tomlArray.Length; i++)\n\t\t\t\t{\n\t\t\t\t\tif (!tomlArray.Items[i].TryGetValue(out value[i]!))\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = null;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse if (tomlObj.TryGetValue(out T retSingleVal))\n\t\t\t{\n\t\t\t\tvalue = new[] { retSingleVal };\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tvalue = null;\n\t\t\treturn false;\n\t\t}\n\n\t\tpublic static bool TryGetValue<T>(this TomlObject tomlObj, [MaybeNullWhen(false)] out T value) where T : notnull\n\t\t{\n\t\t\tswitch (tomlObj.TomlType)\n\t\t\t{\n\t\t\tcase TomlObjectType.Int:\n\t\t\t\tif (typeof(T) == typeof(long))\n\t\t\t\t{\n\t\t\t\t\t// The base storage type for TomlInt is long, so we can simply return it.\n\t\t\t\t\tvalue = (T)(object)((TomlInt)tomlObj).Value;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse if (typeof(T) == typeof(ulong))\n\t\t\t\t{\n\t\t\t\t\t// ulong is the only type which needs to be casted so we can use it.\n\t\t\t\t\t// This might not be the greatest solution, but we can express ulong.MaxValue with -1 for example.\n\t\t\t\t\tvalue = (T)(object)(ulong)((TomlInt)tomlObj).Value;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse if (typeof(T) == typeof(uint) || typeof(T) == typeof(int)\n\t\t\t\t\t|| typeof(T) == typeof(ushort) || typeof(T) == typeof(short)\n\t\t\t\t\t|| typeof(T) == typeof(byte) || typeof(T) == typeof(sbyte)\n\t\t\t\t\t|| typeof(T) == typeof(float) || typeof(T) == typeof(double))\n\t\t\t\t{\n\t\t\t\t\t// All other types will be converted to catch overflow issues.\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = (T)Convert.ChangeType(((TomlInt)tomlObj).Value, typeof(T));\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (OverflowException) { }\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase TomlObjectType.Float:\n\t\t\t\tif (typeof(T) == typeof(double))\n\t\t\t\t{\n\t\t\t\t\t// Same here, double is the base type for TomlFloat.\n\t\t\t\t\tvalue = (T)(object)((TomlFloat)tomlObj).Value;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse if (typeof(T) == typeof(float))\n\t\t\t\t{\n\t\t\t\t\t// double -> float cast works as we expect it.\n\t\t\t\t\tvalue = (T)(object)(float)((TomlFloat)tomlObj).Value;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase TomlObjectType.Bool:\n\t\t\tcase TomlObjectType.DateTime:\n\t\t\tcase TomlObjectType.TimeSpan:\n\t\t\t\tif (tomlObj is TomlValue<T> tomlValue && typeof(T) == tomlValue.Value.GetType())\n\t\t\t\t{\n\t\t\t\t\tvalue = tomlValue.Value;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase TomlObjectType.String:\n\t\t\t\tif (typeof(T).IsEnum)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = (T)Enum.Parse(typeof(T), ((TomlString)tomlObj).Value, true);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (ArgumentException) { }\n\t\t\t\t\tcatch (OverflowException) { }\n\t\t\t\t}\n\t\t\t\telse if (typeof(T) == typeof(string))\n\t\t\t\t{\n\t\t\t\t\tvalue = ((TomlValue<T>)tomlObj).Value;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse if (typeof(T) == typeof(TimeSpan))\n\t\t\t\t{\n\t\t\t\t\tvar timeSpanMaybe = TextUtil.ParseTime(((TomlString)tomlObj).Value);\n\t\t\t\t\tif (timeSpanMaybe != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue = (T)(object)timeSpanMaybe.Value;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvalue = default!;\n\t\t\treturn false;\n\t\t}\n\n\t\tpublic static string SerializeTime(TimeSpan time)\n\t\t{\n\t\t\tif (time.TotalMilliseconds < 1)\n\t\t\t\treturn \"0s\";\n\t\t\tvar strb = new StringBuilder();\n\t\t\tif (time.TotalDays >= 1)\n\t\t\t{\n\t\t\t\tstrb.Append(time.TotalDays.ToString(\"F0\")).Append('d');\n\t\t\t\ttime -= TimeSpan.FromDays(time.Days);\n\t\t\t}\n\t\t\tif (time.Hours > 0)\n\t\t\t\tstrb.Append(time.Hours).Append(\"h\");\n\t\t\tif (time.Minutes > 0)\n\t\t\t\tstrb.Append(time.Minutes).Append(\"m\");\n\t\t\tif (time.Seconds > 0)\n\t\t\t\tstrb.Append(time.Seconds).Append(\"s\");\n\t\t\tif (time.Milliseconds > 0)\n\t\t\t\tstrb.Append(time.Milliseconds).Append(\"ms\");\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\t// *** Convenience method for setting values to a toml object. ***\n\n\t\tpublic static TomlObject Set<T>(this TomlTable tomlTable, string key, T value)\n\t\t{\n\t\t\tif (tomlTable is null) throw new ArgumentNullException(nameof(tomlTable));\n\t\t\tif (key is null) throw new ArgumentNullException(nameof(key));\n\t\t\tif (value is null) throw new ArgumentNullException(nameof(value));\n\n\t\t\t// I literally have no idea how to write it better with this toml library.\n\n\t\t\t// Note for TimeSpan: since TimeSpan as Nett (de)serializes it is not standartized we have to cast it manually\n\n\t\t\tTomlObject retobj = tomlTable.TryGetValue(key);\n\t\t\tif (retobj is null)\n\t\t\t{\n\t\t\t\tif (typeof(T) == typeof(bool)) return tomlTable.Add(key, (bool)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(string)) return tomlTable.Add(key, (string)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(double)) return tomlTable.Add(key, (double)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(float)) return tomlTable.Add(key, (float)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(ushort)) return tomlTable.Add(key, /*auto*/(ushort)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(int)) return tomlTable.Add(key, (int)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(long)) return tomlTable.Add(key, (long)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(ulong)) return tomlTable.Add(key, (long)(ulong)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(TimeSpan)) return tomlTable.Add(key, SerializeTime((TimeSpan)(object)value)).Added;\n\t\t\t\telse if (typeof(T) == typeof(DateTime)) return tomlTable.Add(key, (DateTime)(object)value).Added;\n\t\t\t\telse if (typeof(T).IsEnum) return tomlTable.Add(key, value.ToString()).Added;\n\t\t\t\telse if (value is IEnumerable<bool> enubool) return tomlTable.Add(key, enubool).Added;\n\t\t\t\telse if (value is IEnumerable<string> enustring) return tomlTable.Add(key, enustring).Added;\n\t\t\t\telse if (value is IEnumerable<double> enudouble) return tomlTable.Add(key, enudouble).Added;\n\t\t\t\telse if (value is IEnumerable<float> enufloat) return tomlTable.Add(key, enufloat).Added;\n\t\t\t\telse if (value is IEnumerable<ushort> enuushort) return tomlTable.Add(key, enuushort.Select(x => (int)x)).Added;\n\t\t\t\telse if (value is IEnumerable<int> enuint) return tomlTable.Add(key, enuint).Added;\n\t\t\t\telse if (value is IEnumerable<long> enulong) return tomlTable.Add(key, enulong).Added;\n\t\t\t\telse if (value is IEnumerable<ulong> enuulong) return tomlTable.Add(key, enuulong.Select(x => (long)x)).Added;\n\t\t\t\telse if (value is IEnumerable<TimeSpan> enuTimeSpan) return tomlTable.Add(key, enuTimeSpan.Select(SerializeTime)).Added;\n\t\t\t\telse if (value is IEnumerable<DateTime> enuDateTime) return tomlTable.Add(key, enuDateTime).Added;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTomlComment[]? docs = null;\n\t\t\t\tif (retobj.Comments.Any())\n\t\t\t\t\tdocs = retobj.Comments.ToArray();\n\t\t\t\tif (typeof(T) == typeof(bool)) retobj = tomlTable.Update(key, (bool)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(string)) retobj = tomlTable.Update(key, (string)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(double)) retobj = tomlTable.Update(key, (double)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(float)) retobj = tomlTable.Update(key, (float)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(ushort)) retobj = tomlTable.Update(key, /*auto*/(ushort)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(int)) retobj = tomlTable.Update(key, /*auto*/(int)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(long)) retobj = tomlTable.Update(key, (long)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(ulong)) retobj = tomlTable.Update(key, (long)(ulong)(object)value).Added;\n\t\t\t\telse if (typeof(T) == typeof(TimeSpan)) retobj = tomlTable.Update(key, SerializeTime((TimeSpan)(object)value)).Added;\n\t\t\t\telse if (typeof(T) == typeof(DateTime)) retobj = tomlTable.Update(key, (DateTime)(object)value).Added;\n\t\t\t\telse if (typeof(T).IsEnum) retobj = tomlTable.Update(key, value.ToString()).Added;\n\t\t\t\telse if (value is IEnumerable<bool> enubool) return tomlTable.Update(key, enubool).Added;\n\t\t\t\telse if (value is IEnumerable<string> enustring) return tomlTable.Update(key, enustring).Added;\n\t\t\t\telse if (value is IEnumerable<double> enudouble) return tomlTable.Update(key, enudouble).Added;\n\t\t\t\telse if (value is IEnumerable<float> enufloat) return tomlTable.Update(key, enufloat).Added;\n\t\t\t\telse if (value is IEnumerable<ushort> enuushort) return tomlTable.Update(key, enuushort.Select(x => (int)x)).Added;\n\t\t\t\telse if (value is IEnumerable<int> enuint) return tomlTable.Update(key, enuint).Added;\n\t\t\t\telse if (value is IEnumerable<long> enulong) return tomlTable.Update(key, enulong).Added;\n\t\t\t\telse if (value is IEnumerable<ulong> enuulong) return tomlTable.Update(key, enuulong.Select(x => (long)x)).Added;\n\t\t\t\telse if (value is IEnumerable<TimeSpan> enuTimeSpan) return tomlTable.Update(key, enuTimeSpan.Select(SerializeTime)).Added;\n\t\t\t\telse if (value is IEnumerable<DateTime> enuDateTime) return tomlTable.Update(key, enuDateTime).Added;\n\t\t\t\telse throw new NotSupportedException(\"The type is not supported\");\n\t\t\t\tif (docs != null)\n\t\t\t\t\tretobj.AddComments(docs);\n\t\t\t\treturn retobj;\n\t\t\t}\n\t\t\tthrow new NotSupportedException(\"The type is not supported\");\n\t\t}\n\n\t\t// *** TomlPath engine ***\n\n\t\tpublic static IEnumerable<TomlObject> ByPath(this TomlObject obj, string path)\n\t\t{\n\t\t\tvar pathM = path.AsMemory();\n\t\t\treturn ProcessIdentifier(obj, pathM);\n\t\t}\n\n\t\tprivate static IEnumerable<TomlObject> ProcessIdentifier(TomlObject obj, ReadOnlyMemory<char> pathM)\n\t\t{\n\t\t\tif (pathM.IsEmpty)\n\t\t\t\treturn Enumerable.Empty<TomlObject>();\n\n\t\t\tvar path = pathM.Span;\n\t\t\tswitch (path[0])\n\t\t\t{\n\t\t\tcase '*':\n\t\t\t\t{\n\t\t\t\t\tvar rest = pathM[1..];\n\t\t\t\t\tif (rest.IsEmpty)\n\t\t\t\t\t\treturn obj.GetAllSubItems();\n\n\t\t\t\t\tif (IsArray(rest.Span))\n\t\t\t\t\t\treturn obj.GetAllSubItems().SelectMany(x => ProcessArray(x, rest));\n\t\t\t\t\telse if (IsDot(rest.Span))\n\t\t\t\t\t\treturn obj.GetAllSubItems().SelectMany(x => ProcessDot(x, rest));\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new ArgumentException(\"Invalid expression after wildcard\", nameof(pathM));\n\t\t\t\t}\n\n\t\t\tcase '[':\n\t\t\t\tthrow new ArgumentException(\"Invalid array open bracket\", nameof(pathM));\n\t\t\tcase ']':\n\t\t\t\tthrow new ArgumentException(\"Invalid array close bracket\", nameof(pathM));\n\t\t\tcase '.':\n\t\t\t\tthrow new ArgumentException(\"Invalid dot\", nameof(pathM));\n\n\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tvar subItemName = path;\n\t\t\t\t\tvar rest = ReadOnlyMemory<char>.Empty;\n\t\t\t\t\tbool cont = false;\n\t\t\t\t\tfor (int i = 0; i < path.Length; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// todo allow in future\n\t\t\t\t\t\tif (path[i] == '*')\n\t\t\t\t\t\t\tthrow new ArgumentException(\"Invalid wildcard position\", nameof(pathM));\n\n\t\t\t\t\t\tvar currentSub = path[i..];\n\t\t\t\t\t\tif (!IsIdentifier(currentSub)) // if (!IsName)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcont = true;\n\t\t\t\t\t\t\tsubItemName = path[..i];\n\t\t\t\t\t\t\trest = pathM[i..];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvar item = obj.GetSubItemByName(subItemName);\n\t\t\t\t\tif (item is null)\n\t\t\t\t\t\treturn Enumerable.Empty<TomlObject>();\n\n\t\t\t\t\tif (cont)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (IsArray(rest.Span))\n\t\t\t\t\t\t\treturn ProcessArray(item, rest);\n\t\t\t\t\t\telse if (IsDot(rest.Span))\n\t\t\t\t\t\t\treturn ProcessDot(item, rest);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tthrow new ArgumentException(\"Invalid expression name identifier\", nameof(pathM));\n\t\t\t\t\t}\n\t\t\t\t\treturn new[] { item };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate static IEnumerable<TomlObject> ProcessArray(TomlObject obj, ReadOnlyMemory<char> pathM)\n\t\t{\n\t\t\tvar path = pathM.Span;\n\t\t\tif (path[0] != '[')\n\t\t\t\tthrow new ArgumentException(\"Expected array open breacket\", nameof(pathM));\n\t\t\tfor (int i = 1; i < path.Length; i++)\n\t\t\t{\n\t\t\t\tif (path[i] == ']')\n\t\t\t\t{\n\t\t\t\t\tif (i == 0)\n\t\t\t\t\t\tthrow new ArgumentException(\"Empty array indexer\", nameof(pathM));\n\t\t\t\t\tvar indexer = path[1..i];\n\t\t\t\t\tvar rest = pathM.Slice(i + 1);\n\t\t\t\t\tbool cont = rest.Length > 0;\n\n\t\t\t\t\t// select\n\t\t\t\t\tif (indexer.Length == 1 && indexer[0] == '*')\n\t\t\t\t\t{\n\t\t\t\t\t\tvar ret = obj.GetAllArrayItems();\n\t\t\t\t\t\tif (cont)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IsArray(rest.Span))\n\t\t\t\t\t\t\t\treturn ret.SelectMany(x => ProcessArray(x, rest));\n\t\t\t\t\t\t\telse if (IsDot(rest.Span))\n\t\t\t\t\t\t\t\treturn ret.SelectMany(x => ProcessDot(x, rest));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tthrow new ArgumentException(\"Invalid expression after array indexer\", nameof(pathM));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ret;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvar ret = obj.GetArrayItemByIndex(indexer);\n\t\t\t\t\t\tif (ret is null)\n\t\t\t\t\t\t\treturn Enumerable.Empty<TomlObject>();\n\n\t\t\t\t\t\tif (cont)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (IsArray(rest.Span))\n\t\t\t\t\t\t\t\treturn ProcessArray(ret, rest);\n\t\t\t\t\t\t\telse if (IsDot(rest.Span))\n\t\t\t\t\t\t\t\treturn ProcessDot(ret, rest);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tthrow new ArgumentException(\"Invalid expression after array indexer\", nameof(pathM));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new[] { ret };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new ArgumentException(\"Missing array close bracket\", nameof(pathM));\n\t\t}\n\n\t\tprivate static IEnumerable<TomlObject> ProcessDot(TomlObject obj, ReadOnlyMemory<char> pathM)\n\t\t{\n\t\t\tvar path = pathM.Span;\n\t\t\tif (!IsDot(path))\n\t\t\t\tthrow new ArgumentException(\"Expected dot\", nameof(pathM));\n\n\t\t\tvar rest = pathM[1..];\n\t\t\tif (!IsIdentifier(rest.Span))\n\t\t\t\tthrow new ArgumentException(\"Expected identifier after dot\", nameof(pathM));\n\n\t\t\treturn ProcessIdentifier(obj, rest);\n\t\t}\n\n\t\tinternal static bool IsArray(ReadOnlySpan<char> name)\n\t\t\t=> name.Length >= 1 && (name[0] == '[');\n\n\t\tinternal static bool IsIdentifier(ReadOnlySpan<char> name)\n\t\t\t=> name.Length >= 1 && (name[0] != '[' && name[0] != ']' && name[0] != '.');\n\n\t\tinternal static bool IsDot(ReadOnlySpan<char> name)\n\t\t\t=> name.Length >= 1 && (name[0] == '.');\n\n\t\tprivate static TomlObject? GetArrayItemByIndex(this TomlObject obj, ReadOnlySpan<char> index)\n\t\t{\n\t\t\tint indexNum = int.Parse(new string(index.ToArray()));\n\t\t\tif (indexNum < 0)\n\t\t\t\treturn null;\n\t\t\t//if (!System.Buffers.Text.Utf8Parser.TryParse(index, out int indexNum, out int bytesConsumed))\n\t\t\t//throw new ArgumentException(\"Invalid array indexer\");\n\t\t\tif (obj.TomlType == TomlObjectType.Array)\n\t\t\t{\n\t\t\t\tvar tomlTable = (TomlArray)obj;\n\t\t\t\tif (indexNum < tomlTable.Length)\n\t\t\t\t\treturn tomlTable[indexNum];\n\t\t\t}\n\t\t\telse if (obj.TomlType == TomlObjectType.ArrayOfTables)\n\t\t\t{\n\t\t\t\tvar tomlTableArray = (TomlTableArray)obj;\n\t\t\t\tif (indexNum >= tomlTableArray.Count)\n\t\t\t\t\treturn tomlTableArray[indexNum];\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate static IEnumerable<TomlObject> GetAllArrayItems(this TomlObject obj)\n\t\t{\n\t\t\tif (obj.TomlType == TomlObjectType.Array)\n\t\t\t\treturn ((TomlArray)obj).Items;\n\t\t\telse if (obj.TomlType == TomlObjectType.ArrayOfTables)\n\t\t\t\treturn ((TomlTableArray)obj).Items;\n\t\t\treturn Enumerable.Empty<TomlObject>();\n\t\t}\n\n\t\tprivate static TomlObject? GetSubItemByName(this TomlObject obj, ReadOnlySpan<char> name)\n\t\t{\n\t\t\tif (obj.TomlType == TomlObjectType.Table)\n\t\t\t\treturn ((TomlTable)obj).TryGetValue(new string(name.ToArray()));\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate static IEnumerable<TomlObject> GetAllSubItems(this TomlObject obj)\n\t\t{\n\t\t\tif (obj.TomlType == TomlObjectType.Table)\n\t\t\t\treturn ((TomlTable)obj).Values;\n\t\t\treturn Enumerable.Empty<TomlObject>();\n\t\t}\n\n\t\t// *** Toml Serializer ***\n\n\t\tpublic static string DumpToJson(this TomlObject obj)\n\t\t{\n\t\t\tvar sb = new StringBuilder();\n\t\t\tvar sw = new StringWriter(sb);\n\t\t\tusing (var writer = new JsonTextWriter(sw))\n\t\t\t{\n\t\t\t\twriter.Formatting = Formatting.Indented;\n\t\t\t\tDumpToJson(obj, writer);\n\t\t\t}\n\t\t\treturn sb.ToString();\n\t\t}\n\n\t\tpublic static void DumpToJson(this TomlObject obj, JsonWriter writer)\n\t\t{\n\t\t\tswitch (obj.TomlType)\n\t\t\t{\n\t\t\tcase TomlObjectType.Bool: writer.WriteValue(((TomlBool)obj).Value); break;\n\t\t\tcase TomlObjectType.Int: writer.WriteValue(((TomlInt)obj).Value); break;\n\t\t\tcase TomlObjectType.Float: writer.WriteValue(((TomlFloat)obj).Value); break;\n\t\t\tcase TomlObjectType.String: writer.WriteValue(((TomlString)obj).Value); break;\n\t\t\tcase TomlObjectType.DateTime: writer.WriteValue(((TomlLocalDateTime)obj).Value); break;\n\t\t\tcase TomlObjectType.TimeSpan: writer.WriteValue(((TomlDuration)obj).Value); break;\n\t\t\tcase TomlObjectType.Array:\n\t\t\tcase TomlObjectType.ArrayOfTables:\n\t\t\t\twriter.WriteStartArray();\n\t\t\t\tIEnumerable<TomlObject> list;\n\t\t\t\tif (obj.TomlType == TomlObjectType.Array) list = ((TomlArray)obj).Items; else list = ((TomlTableArray)obj).Items;\n\t\t\t\tforeach (var item in list)\n\t\t\t\t\tDumpToJson(item, writer);\n\t\t\t\twriter.WriteEndArray();\n\t\t\t\tbreak;\n\t\t\tcase TomlObjectType.Table:\n\t\t\t\twriter.WriteStartObject();\n\t\t\t\tforeach (var kvp in (TomlTable)obj)\n\t\t\t\t{\n\t\t\t\t\twriter.WritePropertyName(kvp.Key);\n\t\t\t\t\tDumpToJson(kvp.Value, writer);\n\t\t\t\t}\n\t\t\t\twriter.WriteEndObject();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/Util.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.Localization;\nusing TSLib.Messages;\n\nnamespace TS3AudioBot.Helper\n{\n\tpublic static class Util\n\t{\n\t\tpublic const RegexOptions DefaultRegexConfig = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ECMAScript;\n\n\t\tprivate static readonly Regex SafeFileNameMatcher = new Regex(@\"^[\\w-_]+$\", DefaultRegexConfig);\n\n\t\tprivate static readonly string[] byteSuffix = { \"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\" };\n\n\t\tpublic static string FormatBytesHumanReadable(long bytes)\n\t\t{\n\t\t\tif (bytes == 0)\n\t\t\t\treturn \"0B\";\n\t\t\tvar order = (int)Math.Log(Math.Abs(bytes), 1024);\n\t\t\treturn (bytes >> (10 * order)) + byteSuffix[order];\n\t\t}\n\n\t\tpublic static string FromSeed(int seed)\n\t\t{\n\t\t\tvar seedstr = new char[7];\n\t\t\tuint plainseed = unchecked((uint)seed);\n\t\t\tfor (int i = 0; i < 7; i++)\n\t\t\t{\n\t\t\t\tif (plainseed > 0)\n\t\t\t\t{\n\t\t\t\t\tplainseed--;\n\t\t\t\t\tvar remainder = plainseed % 26;\n\t\t\t\t\tseedstr[i] = (char)(remainder + 'a');\n\t\t\t\t\tplainseed = (plainseed - remainder) / 26;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tseedstr[i] = '\\0';\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn new string(seedstr).TrimEnd('\\0');\n\t\t}\n\n\t\tpublic static int ToSeed(string seed)\n\t\t{\n\t\t\tlong finalValue = 0;\n\n\t\t\tfor (int i = 0; i < seed.Length; i++)\n\t\t\t{\n\t\t\t\tlong powVal = (seed[i] - 'a' + 1) * Pow(26, i % 7);\n\t\t\t\tfinalValue += powVal;\n\t\t\t\tfinalValue %= ((long)uint.MaxValue + 1);\n\t\t\t}\n\t\t\tvar uval = (uint)finalValue;\n\t\t\treturn unchecked((int)uval);\n\t\t}\n\n\t\tprivate static long Pow(long b, int pow)\n\t\t{\n\t\t\tlong ret = 1;\n\t\t\twhile (pow != 0)\n\t\t\t{\n\t\t\t\tif ((pow & 1) == 1)\n\t\t\t\t\tret *= b;\n\t\t\t\tb *= b;\n\t\t\t\tpow >>= 1;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\n\t\tpublic static Stream? GetEmbeddedFile(string name)\n\t\t{\n\t\t\tvar assembly = Assembly.GetExecutingAssembly();\n\t\t\treturn assembly.GetManifestResourceStream(name);\n\t\t}\n\n\t\tpublic static bool TryCast<T>(this JToken token, string key, [MaybeNullWhen(false)] out T value) where T : notnull\n\t\t{\n\t\t\tvalue = default!;\n\t\t\tif (token is null)\n\t\t\t\treturn false;\n\t\t\tvar jValue = token.SelectToken(key);\n\t\t\tif (jValue is null)\n\t\t\t\treturn false;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar t = jValue.ToObject<T>();\n\t\t\t\tif (t is null)\n\t\t\t\t\treturn false;\n\t\t\t\tvalue = t;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcatch (JsonReaderException) { return false; }\n\t\t}\n\n\t\tpublic static E<LocalStr> IsSafeFileName(string name)\n\t\t{\n\t\t\tif (string.IsNullOrWhiteSpace(name))\n\t\t\t\treturn new LocalStr(strings.error_playlist_name_invalid_empty); // TODO change to more generic error\n\t\t\tif (name.Length > 64)\n\t\t\t\treturn new LocalStr(strings.error_playlist_name_invalid_too_long);\n\t\t\tif (!SafeFileNameMatcher.IsMatch(name))\n\t\t\t\treturn new LocalStr(strings.error_playlist_name_invalid_character);\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tpublic static IEnumerable<TResult> SelectOk<TSource, TResult, TErr>(this IEnumerable<TSource> source, Func<TSource, R<TResult, TErr>> selector) where TSource : notnull where TResult : notnull where TErr : notnull\n\t\t\t=> source.Select(selector).Where(x => x.Ok).Select(x => x.Value);\n\n\t\tpublic static bool HasExitedSafe(this Process process)\n\t\t{\n\t\t\ttry { return process.HasExited; }\n\t\t\tcatch { return true; }\n\t\t}\n\n\t\tpublic static V GetOrNew<K, V>(this IDictionary<K, V> dict, K key) where K : notnull where V : new()\n\t\t{\n\t\t\tif (!dict.TryGetValue(key, out var val))\n\t\t\t{\n\t\t\t\tval = new V();\n\t\t\t\tdict[key] = val;\n\t\t\t}\n\t\t\treturn val;\n\t\t}\n\n\t\tpublic static async Task CatchToLog(this Task t, NLog.Logger logger, NLog.LogLevel? level = null)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait t;\n\t\t\t}\n\t\t\tcatch (AudioBotException ex)\n\t\t\t{\n\t\t\t\tlogger.Log(level ?? NLog.LogLevel.Warn, ex, ex.Message);\n\t\t\t}\n\t\t}\n\n\t\tpublic static async Task<T?> Try<T>(this Task<T> t) where T : class\n\t\t{\n\t\t\ttry { return await t; }\n\t\t\tcatch { return null; }\n\t\t}\n\n\t\tpublic static T? Try<T>(Func<T> t) where T : class\n\t\t{\n\t\t\ttry { return t(); }\n\t\t\tcatch { return null; }\n\t\t}\n\n\t\tpublic static void UnwrapThrow(this E<LocalStr> r)\n\t\t{\n\t\t\tif (!r.Ok)\n\t\t\t\tthrow new CommandException(r.Error.Str, CommandExceptionReason.CommandError);\n\t\t}\n\n\t\tpublic static T UnwrapThrow<T>(this R<T, LocalStr> r) where T : notnull\n\t\t{\n\t\t\tif (r.Ok)\n\t\t\t\treturn r.Value;\n\t\t\telse\n\t\t\t\tthrow new CommandException(r.Error.Str, CommandExceptionReason.CommandError);\n\t\t}\n\n\t\tpublic static bool UnwrapToLog(this E<LocalStr> r, NLog.Logger logger, NLog.LogLevel? level = null)\n\t\t{\n\t\t\tif (!r.Ok)\n\t\t\t\tlogger.Log(level ?? NLog.LogLevel.Warn, r.Error.Str);\n\t\t\treturn r.Ok;\n\t\t}\n\n\t\tpublic static bool UnwrapToLog(this E<CommandError> r, NLog.Logger logger, NLog.LogLevel? level = null)\n\t\t{\n\t\t\tif (!r.Ok)\n\t\t\t\tlogger.Log(level ?? NLog.LogLevel.Warn, r.Error.ErrorFormat());\n\t\t\treturn r.Ok;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Helper/WebWrapper.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Text.Json;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.Helper\n{\n\tpublic static class WebWrapper\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tpublic static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(10);\n\t\tprivate const string TimeoutPropertyKey = \"RequestTimeout\";\n\n\t\tprivate static readonly HttpClient httpClient = new HttpClient(new RedirectHandler(new HttpClientHandler()));\n\n\t\tstatic WebWrapper()\n\t\t{\n\t\t\tServicePointManager.DefaultConnectionLimit = int.MaxValue;\n\t\t\thttpClient.Timeout = DefaultTimeout;\n\t\t\thttpClient.DefaultRequestHeaders.UserAgent.Clear();\n\t\t\tProductInfoHeaderValue version = ProductInfoHeaderValue.TryParse($\"TS3AudioBot/{Environment.SystemData.AssemblyData.Version}\", out var v)\n\t\t\t\t\t? v\n\t\t\t\t\t: new ProductInfoHeaderValue(\"TS3AudioBot\", \"1.3.3.7\");\n\t\t\thttpClient.DefaultRequestHeaders.UserAgent.Add(version);\n\t\t}\n\n\t\t// Start\n\n\t\tpublic static HttpRequestMessage Request(string? link) => Request(CreateUri(link));\n\t\tpublic static HttpRequestMessage Request(Uri uri) => new HttpRequestMessage(HttpMethod.Get, uri);\n\n\t\t// Prepare\n\n\t\tpublic static HttpRequestMessage WithMethod(this HttpRequestMessage request, HttpMethod method)\n\t\t{\n\t\t\trequest.Method = method;\n\t\t\treturn request;\n\t\t}\n\n\t\tpublic static HttpRequestMessage WithHeader(this HttpRequestMessage request, string name, string value)\n\t\t{\n\t\t\trequest.Headers.Add(name, value);\n\t\t\treturn request;\n\t\t}\n\n\t\tpublic static HttpRequestMessage WithTimeout(this HttpRequestMessage request, TimeSpan timeout)\n\t\t{\n\t\t\trequest.Properties[TimeoutPropertyKey] = timeout;\n\t\t\treturn request;\n\t\t}\n\n\t\t// Return\n\n\t\tpublic static async Task Send(this HttpRequestMessage request)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing (request)\n\t\t\t\t{\n\t\t\t\t\tusing var response = await httpClient.SendDefaultAsync(request);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException)\n\t\t\t{\n\t\t\t\tthrow ToLoggedError(ex);\n\t\t\t}\n\t\t}\n\n\t\tpublic static async Task<string> AsString(this HttpRequestMessage request)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing (request)\n\t\t\t\t{\n\t\t\t\t\tusing var response = await httpClient.SendDefaultAsync(request);\n\t\t\t\t\treturn await response.Content.ReadAsStringAsync();\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException)\n\t\t\t{\n\t\t\t\tthrow ToLoggedError(ex);\n\t\t\t}\n\t\t}\n\n\t\tpublic static async Task<T> AsJson<T>(this HttpRequestMessage request)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing (request)\n\t\t\t\t{\n\t\t\t\t\tusing var response = await httpClient.SendDefaultAsync(request);\n\t\t\t\t\tusing var stream = await response.Content.ReadAsStreamAsync();\n\t\t\t\t\tvar obj = await JsonSerializer.DeserializeAsync<T>(stream);\n\t\t\t\t\tif (obj is null) throw Error.LocalStr(strings.error_net_empty_response);\n\t\t\t\t\treturn obj;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (JsonException ex)\n\t\t\t{\n\t\t\t\tLog.Debug(ex, \"Failed to parse json.\");\n\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_invalid + \" (json-request)\");\n\t\t\t}\n\t\t\tcatch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException)\n\t\t\t{\n\t\t\t\tthrow ToLoggedError(ex);\n\t\t\t}\n\t\t}\n\n\t\tpublic static async Task ToAction(this HttpRequestMessage request, Func<HttpResponseMessage, Task> body)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing (request)\n\t\t\t\t{\n\t\t\t\t\tusing var response = await httpClient.SendDefaultAsync(request);\n\t\t\t\t\tawait body.Invoke(response);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException)\n\t\t\t{\n\t\t\t\tthrow ToLoggedError(ex);\n\t\t\t}\n\t\t}\n\n\t\tpublic static async Task<T> ToAction<T>(this HttpRequestMessage request, Func<HttpResponseMessage, Task<T>> body)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing (request)\n\t\t\t\t{\n\t\t\t\t\tusing var response = await httpClient.SendDefaultAsync(request);\n\t\t\t\t\treturn await body.Invoke(response);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException)\n\t\t\t{\n\t\t\t\tthrow ToLoggedError(ex);\n\t\t\t}\n\t\t}\n\n\t\tpublic static Task ToStream(this HttpRequestMessage request, Func<Stream, Task> body)\n\t\t\t=> request.ToAction(async response => await body(await response.Content.ReadAsStreamAsync()));\n\n\t\tpublic static async Task<HttpResponseMessage> UnsafeResponse(this HttpRequestMessage request)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing (request)\n\t\t\t\t{\n\t\t\t\t\tvar response = await httpClient.SendDefaultAsync(request);\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex) when (ex is HttpRequestException || ex is OperationCanceledException)\n\t\t\t{\n\t\t\t\tthrow ToLoggedError(ex);\n\t\t\t}\n\t\t}\n\n\t\tpublic static async Task<Stream> UnsafeStream(this HttpRequestMessage request)\n\t\t\t=> await (await request.UnsafeResponse()).Content.ReadAsStreamAsync();\n\n\t\t// Util\n\n\t\tpublic static string? GetSingle(this HttpHeaders headers, string name)\n\t\t\t=> headers.TryGetValues(name, out var hvals) ? hvals.FirstOrDefault() : null;\n\n\t\tprivate static async Task<HttpResponseMessage> SendDefaultAsync(this HttpClient client, HttpRequestMessage request)\n\t\t{\n\t\t\tvar response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);\n\t\t\tCheckOkReturnCodeOrThrow(response);\n\t\t\treturn response;\n\t\t}\n\n\t\tprivate static AudioBotException ToLoggedError(Exception ex)\n\t\t{\n\t\t\tif (ex is OperationCanceledException webEx)\n\t\t\t{\n\t\t\t\tLog.Debug(webEx, \"Request timed out\");\n\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_net_timeout);\n\t\t\t}\n\n\t\t\tLog.Debug(ex, \"Unknown request error\");\n\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_net_unknown);\n\t\t}\n\n\t\tprivate static Uri CreateUri(string? link)\n\t\t{\n\t\t\tif (!Uri.TryCreate(link, UriKind.RelativeOrAbsolute, out var uri))\n\t\t\t\tthrow Error.LocalStr(strings.error_media_invalid_uri);\n\t\t\treturn uri;\n\t\t}\n\n\t\tprivate static void CheckOkReturnCodeOrThrow(HttpResponseMessage response)\n\t\t{\n\t\t\tif (!response.IsSuccessStatusCode)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Web error: [{0}] {1}\", (int)response.StatusCode, response.StatusCode);\n\t\t\t\tthrow Error\n\t\t\t\t\t.LocalStr($\"{strings.error_net_error_status_code} [{(int)response.StatusCode}] {response.StatusCode}\");\n\t\t\t}\n\t\t}\n\t}\n\n\t// HttpClient does not allow unsafe HTTPS->HTTP redirects.\n\t// But we don't care because audio streaming is not security critical\n\t// This loop implements a simple redirect following on 301/302 with at most 5 redirects.\n\tpublic class RedirectHandler : DelegatingHandler\n\t{\n\t\tprivate const int MaxRedirects = 5;\n\n\t\tpublic RedirectHandler(HttpMessageHandler innerHandler)\n\t\t\t: base(innerHandler)\n\t\t{ }\n\n\t\tprotected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n\t\t{\n\t\t\tHttpResponseMessage response;\n\t\t\tfor (int i = 0; i < MaxRedirects; i++)\n\t\t\t{\n\t\t\t\tresponse = await base.SendAsync(request, cancellationToken);\n\t\t\t\tif (response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect)\n\t\t\t\t{\n\t\t\t\t\trequest.RequestUri = response.Headers.Location;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow Error.LocalStr(strings.error_media_internal_invalid + \" (Max redirects reached)\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/History/AudioLogEntry.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Globalization;\nusing TS3AudioBot.CommandSystem.CommandResults;\nusing TS3AudioBot.ResourceFactories;\n\nnamespace TS3AudioBot.History\n{\n\tpublic class AudioLogEntry : IAudioResourceResult\n\t{\n\t\t/// <summary>A unique id for each <see cref=\"ResourceFactories.AudioResource\"/>, given by the history system.</summary>\n\t\tpublic int Id { get; set; }\n\t\t/// <summary>Left for legacy reasons. The dbid of the teamspeak user, who played this song first.</summary>\n\t\t[Obsolete]\n\t\tpublic uint? UserInvokeId { get; set; }\n\t\t/// <summary>The Uid of the teamspeak user, who played this song first.</summary>\n\t\tpublic string? UserUid { get; set; }\n\t\t/// <summary>How often the song has been played.</summary>\n\t\tpublic uint PlayCount { get; set; }\n\t\t/// <summary>The last time this song has been played.</summary>\n\t\tpublic DateTime Timestamp { get; set; }\n\n\t\tpublic AudioResource AudioResource { get; set; }\n\n\t\tpublic AudioLogEntry()\n\t\t{\n\t\t\tPlayCount = 0;\n\t\t\tAudioResource = null!;\n\t\t}\n\n\t\tpublic AudioLogEntry(int id, AudioResource resource, string userUid) : this()\n\t\t{\n\t\t\tId = id;\n\t\t\tAudioResource = resource;\n\t\t\tUserUid = userUid;\n\t\t}\n\n\t\tpublic void SetName(string newName)\n\t\t{\n\t\t\tAudioResource.ResourceTitle = newName;\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn string.Format(CultureInfo.InvariantCulture, \"[{0}] @ {1} by {2}: {3}, ({4})\", Id, Timestamp, UserUid, AudioResource.ResourceTitle, AudioResource);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/History/HistoryManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing LiteDB;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.ResourceFactories;\nusing TSLib;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.History\n{\n\t/// <summary>Stores all played songs. Can be used to search and restore played songs.</summary>\n\tpublic sealed class HistoryManager\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate const int CurrentHistoryVersion = 1;\n\t\tprivate const string AudioLogEntriesTable = \"audioLogEntries\";\n\t\tprivate const string ResourceTitleQueryColumn = \"lowTitle\";\n\n\t\tprivate readonly LiteCollection<AudioLogEntry> audioLogEntries;\n\t\tprivate readonly LinkedList<int> unusedIds = new LinkedList<int>();\n\t\tprivate readonly object dbLock = new object();\n\t\tprivate readonly ConfHistory config;\n\n\t\tpublic IHistoryFormatter Formatter { get; private set; }\n\t\tpublic uint HighestId => (uint)audioLogEntries.Max().AsInt32;\n\n\t\tstatic HistoryManager()\n\t\t{\n\t\t\tBsonMapper.Global.Entity<AudioLogEntry>()\n\t\t\t\t.Id(x => x.Id);\n\t\t}\n\n\t\tpublic HistoryManager(ConfHistory config, DbStore database)\n\t\t{\n\t\t\tFormatter = new SmartHistoryFormatter();\n\n\t\t\tthis.config = config;\n\n\t\t\tvar meta = database.GetMetaData(AudioLogEntriesTable);\n\n\t\t\tif (meta.Version > CurrentHistoryVersion)\n\t\t\t{\n\t\t\t\tLog.Error(\"Database table \\\"{0}\\\" is higher than the current version. (table:{1}, app:{2}). \" +\n\t\t\t\t\t\"Please download the latest TS3AudioBot to read the history.\", AudioLogEntriesTable, meta.Version, CurrentHistoryVersion);\n\t\t\t\tthrow new NotSupportedException();\n\t\t\t}\n\n\t\t\taudioLogEntries = database.GetCollection<AudioLogEntry>(AudioLogEntriesTable);\n\t\t\taudioLogEntries.EnsureIndex(x => x.AudioResource.UniqueId, true);\n\t\t\taudioLogEntries.EnsureIndex(x => x.Timestamp);\n\t\t\taudioLogEntries.EnsureIndex(ResourceTitleQueryColumn,\n\t\t\t\t$\"LOWER($.{nameof(AudioLogEntry.AudioResource)}.{nameof(AudioResource.ResourceTitle)})\");\n\t\t\tRestoreFromFile();\n\n\t\t\tif (meta.Version == CurrentHistoryVersion)\n\t\t\t\treturn;\n\n\t\t\tif (audioLogEntries.Count() == 0)\n\t\t\t{\n\t\t\t\tmeta.Version = CurrentHistoryVersion;\n\t\t\t\tdatabase.UpdateMetaData(meta);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Content upgrade\n\t\t\tswitch (meta.Version)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tvar all = audioLogEntries.FindAll().ToArray();\n\t\t\t\tforeach (var audioLogEntry in all)\n\t\t\t\t{\n\t\t\t\t\tswitch (audioLogEntry.AudioResource.AudioType)\n\t\t\t\t\t{\n\t\t\t\t\tcase \"MediaLink\": audioLogEntry.AudioResource.AudioType = \"media\"; break;\n\t\t\t\t\tcase \"Youtube\": audioLogEntry.AudioResource.AudioType = \"youtube\"; break;\n\t\t\t\t\tcase \"Soundcloud\": audioLogEntry.AudioResource.AudioType = \"soundcloud\"; break;\n\t\t\t\t\tcase \"Twitch\": audioLogEntry.AudioResource.AudioType = \"twitch\"; break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taudioLogEntries.Update(all);\n\t\t\t\tmeta.Version = 1;\n\t\t\t\tdatabase.UpdateMetaData(meta);\n\t\t\t\tgoto default;\n\n\t\t\tdefault:\n\t\t\t\tLog.Info(\"Database table \\\"{0}\\\" upgraded to {1}\", AudioLogEntriesTable, meta.Version);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tprivate void RestoreFromFile()\n\t\t{\n\t\t\t// TODO load unused id list\n\t\t}\n\n\t\tpublic AudioLogEntry? LogAudioResource(HistorySaveData saveData)\n\t\t{\n\t\t\tif (saveData is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(saveData));\n\n\t\t\tlock (dbLock)\n\t\t\t{\n\t\t\t\tvar ale = FindByUniqueId(saveData.Resource.UniqueId);\n\t\t\t\tif (ale is null)\n\t\t\t\t{\n\t\t\t\t\tvar createResult = CreateLogEntry(saveData);\n\t\t\t\t\tif (!createResult.Ok)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Warn(createResult.Error, \"AudioLogEntry could not be created!\");\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tale = createResult.Value;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tLogEntryPlay(ale);\n\t\t\t\t}\n\n\t\t\t\treturn ale;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>Increases the playcount and updates the last playtime.</summary>\n\t\t/// <param name=\"ale\">The <see cref=\"AudioLogEntry\"/> to update.</param>\n\t\tprivate void LogEntryPlay(AudioLogEntry ale)\n\t\t{\n\t\t\tif (ale is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(ale));\n\n\t\t\t// update the playtime\n\t\t\tale.Timestamp = Tools.Now;\n\t\t\t// update the playcount\n\t\t\tale.PlayCount++;\n\n\t\t\taudioLogEntries.Update(ale);\n\t\t}\n\n\t\tprivate R<AudioLogEntry, Exception> CreateLogEntry(HistorySaveData saveData)\n\t\t{\n\t\t\tif (string.IsNullOrWhiteSpace(saveData.Resource.ResourceTitle))\n\t\t\t\treturn new Exception(\"Track name is empty\");\n\n\t\t\tint nextHid;\n\t\t\tvar first = unusedIds.First;\n\t\t\tif (config.FillDeletedIds && first != null)\n\t\t\t{\n\t\t\t\tnextHid = first.Value;\n\t\t\t\tunusedIds.Remove(first);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnextHid = 0;\n\t\t\t}\n\n\t\t\tvar userUid = (saveData.InvokerUid ?? Uid.Anonymous).Value ?? Uid.Anonymous.Value!;\n\t\t\tvar ale = new AudioLogEntry(nextHid, saveData.Resource, userUid)\n\t\t\t{\n\t\t\t\tTimestamp = Tools.Now,\n\t\t\t\tPlayCount = 1,\n\t\t\t};\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\taudioLogEntries.Insert(ale);\n\t\t\t\treturn ale;\n\t\t\t}\n\t\t\tcatch (Exception ex) { return ex; }\n\t\t}\n\n\t\tprivate AudioLogEntry? FindByUniqueId(string uniqueId) => audioLogEntries.FindOne(x => x.AudioResource.UniqueId == uniqueId);\n\n\t\t/// <summary>Gets all Entries matching the search criteria.\n\t\t/// The entries are sorted by last playtime descending.</summary>\n\t\t/// <param name=\"search\">All search criteria.</param>\n\t\t/// <returns>A list of all found entries.</returns>\n\t\tpublic IEnumerable<AudioLogEntry> Search(SeachQuery search)\n\t\t{\n\t\t\tif (search is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(search));\n\n\t\t\tif (search.MaxResults <= 0)\n\t\t\t\treturn Array.Empty<AudioLogEntry>();\n\n\t\t\tvar query = Query.All(nameof(AudioLogEntry.Timestamp), Query.Descending);\n\n\t\t\tif (!string.IsNullOrEmpty(search.TitlePart))\n\t\t\t{\n\t\t\t\tvar titleLower = search.TitlePart.ToLowerInvariant();\n\t\t\t\tquery = Query.And(query,\n\t\t\t\t\tQuery.Where(ResourceTitleQueryColumn, val => val.AsString.Contains(titleLower)));\n\t\t\t}\n\n\t\t\tif (search.UserUid != null)\n\t\t\t\tquery = Query.And(query, Query.EQ(nameof(AudioLogEntry.UserUid), search.UserUid));\n\n\t\t\tif (search.LastInvokedAfter != null)\n\t\t\t\tquery = Query.And(query, Query.GTE(nameof(AudioLogEntry.Timestamp), search.LastInvokedAfter.Value));\n\n\t\t\treturn audioLogEntries.Find(query, 0, search.MaxResults);\n\t\t}\n\n\t\tpublic string SearchParsed(SeachQuery query) => Format(Search(query));\n\n\t\tpublic string Format(AudioLogEntry ale)\n\t\t\t=> Formatter.ProcessQuery(ale, SmartHistoryFormatter.DefaultAleFormat);\n\t\tpublic string Format(IEnumerable<AudioLogEntry> aleList)\n\t\t\t=> Formatter.ProcessQuery(aleList, SmartHistoryFormatter.DefaultAleFormat);\n\n\t\tpublic AudioLogEntry? FindEntryByResource(AudioResource resource)\n\t\t{\n\t\t\tif (resource is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(resource));\n\t\t\treturn FindByUniqueId(resource.UniqueId);\n\t\t}\n\n\t\t/// <summary>Gets an <see cref=\"AudioLogEntry\"/> by its history id or null if not exising.</summary>\n\t\t/// <param name=\"id\">The id of the AudioLogEntry</param>\n\t\tpublic R<AudioLogEntry, LocalStr> GetEntryById(uint id)\n\t\t{\n\t\t\tvar entry = audioLogEntries.FindById((long)id);\n\t\t\tif (entry != null) return entry;\n\t\t\telse return new LocalStr(strings.error_history_could_not_find_entry);\n\t\t}\n\n\t\t/// <summary>Removes the <see cref=\"AudioLogEntry\"/> from the Database.</summary>\n\t\t/// <param name=\"ale\">The <see cref=\"AudioLogEntry\"/> to delete.</param>\n\t\tpublic bool RemoveEntry(AudioLogEntry ale)\n\t\t{\n\t\t\tif (ale is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(ale));\n\t\t\treturn audioLogEntries.Delete(ale.Id);\n\t\t}\n\n\t\t/// <summary>Sets the name of a <see cref=\"AudioLogEntry\"/>.</summary>\n\t\t/// <param name=\"ale\">The id of the <see cref=\"AudioLogEntry\"/> to rename.</param>\n\t\t/// <param name=\"newName\">The new name for the <see cref=\"AudioLogEntry\"/>.</param>\n\t\t/// <exception cref=\"ArgumentNullException\">When ale is null or the name is null, empty or only whitespaces</exception>\n\t\tpublic void RenameEntry(AudioLogEntry ale, string newName)\n\t\t{\n\t\t\tif (ale is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(ale));\n\t\t\tif (string.IsNullOrWhiteSpace(newName))\n\t\t\t\tthrow new ArgumentNullException(nameof(newName));\n\t\t\t// update the name\n\t\t\tale.SetName(newName);\n\t\t\taudioLogEntries.Update(ale);\n\t\t}\n\n\t\tpublic async Task RemoveBrokenLinks(ResolveContext resourceFactory)\n\t\t{\n\t\t\tconst int iterations = 3;\n\t\t\tvar currentIter = audioLogEntries.FindAll().ToList();\n\n\t\t\tfor (int i = 0; i < iterations; i++)\n\t\t\t{\n\t\t\t\tLog.Info(\"Filter iteration {0}\", i);\n\t\t\t\tcurrentIter = await FilterList(resourceFactory, currentIter);\n\t\t\t}\n\n\t\t\tforeach (var entry in currentIter)\n\t\t\t{\n\t\t\t\tif (RemoveEntry(entry))\n\t\t\t\t{\n\t\t\t\t\tLog.Info(\"Removed: {0} - {1}\", entry.Id, entry.AudioResource.ResourceTitle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Goes through a list of <see cref=\"AudioLogEntry\"/> and checks if the contained <see cref=\"AudioResource\"/>\n\t\t/// is playable/resolvable.\n\t\t/// </summary>\n\t\t/// <param name=\"list\">The list to iterate.</param>\n\t\t/// <returns>A new list with all working items.</returns>\n\t\tprivate async Task<List<AudioLogEntry>> FilterList(ResolveContext resourceFactory, IReadOnlyCollection<AudioLogEntry> list)\n\t\t{\n\t\t\tint userNotifyCnt = 0;\n\t\t\tvar nextIter = new List<AudioLogEntry>(list.Count);\n\t\t\tforeach (var entry in list)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tawait resourceFactory.Load(entry.AudioResource);\n\t\t\t\t}\n\t\t\t\tcatch (AudioBotException ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Debug(\"Cleaning: ({0}) Reason: {1}\", entry.AudioResource.UniqueId, ex.Message);\n\t\t\t\t\tnextIter.Add(entry);\n\t\t\t\t}\n\n\t\t\t\tif (++userNotifyCnt % 100 == 0)\n\t\t\t\t\tLog.Debug(\"Clean in progress {0}\", new string('.', userNotifyCnt / 100 % 10));\n\t\t\t}\n\t\t\treturn nextIter;\n\t\t}\n\n\t\tpublic async Task UpdadeDbIdToUid(Ts3Client ts3Client)\n\t\t{\n\t\t\tvar upgradedEntries = new List<AudioLogEntry>();\n\t\t\tvar dbIdCache = new Dictionary<uint, (bool valid, Uid uid)>();\n\n\t\t\tforeach (var audioLogEntry in audioLogEntries.FindAll())\n\t\t\t{\n#pragma warning disable CS0612\n\t\t\t\tif (audioLogEntry.UserInvokeId is null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (audioLogEntry.UserUid != null || audioLogEntry.UserInvokeId.Value == 0)\n\t\t\t\t{\n\t\t\t\t\taudioLogEntry.UserInvokeId = null;\n\t\t\t\t\tupgradedEntries.Add(audioLogEntry);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!dbIdCache.TryGetValue(audioLogEntry.UserInvokeId.Value, out var data))\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tvar dbData = await ts3Client.GetDbClientByDbId((ClientDbId)audioLogEntry.UserInvokeId.Value);\n\t\t\t\t\t\tdata = (true, dbData.Uid);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (AudioBotException)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Warn(\"Client DbId {0} could not be found.\", audioLogEntry.UserInvokeId.Value);\n\t\t\t\t\t\tdata = (false, Uid.Null);\n\t\t\t\t\t}\n\t\t\t\t\tdbIdCache.Add(audioLogEntry.UserInvokeId.Value, data);\n\t\t\t\t}\n\n\t\t\t\tif (!data.valid)\n\t\t\t\t\tcontinue;\n\n\t\t\t\taudioLogEntry.UserInvokeId = null;\n\t\t\t\taudioLogEntry.UserUid = data.uid.Value;\n\t\t\t\tupgradedEntries.Add(audioLogEntry);\n#pragma warning restore CS0612\n\t\t\t}\n\n\t\t\tif (upgradedEntries.Count > 0)\n\t\t\t\taudioLogEntries.Update(upgradedEntries);\n\t\t\tLog.Info(\"Upgraded {0} entries.\", upgradedEntries.Count);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/History/HistorySaveData.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TS3AudioBot.ResourceFactories;\nusing TSLib;\n\nnamespace TS3AudioBot.History\n{\n\tpublic class HistorySaveData\n\t{\n\t\tpublic AudioResource Resource { get; }\n\t\tpublic Uid? InvokerUid { get; }\n\n\t\tpublic HistorySaveData(AudioResource resource, Uid? invokerUid)\n\t\t{\n\t\t\tResource = resource ?? throw new ArgumentNullException(nameof(resource));\n\t\t\tInvokerUid = invokerUid;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/History/IHistoryFormatter.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace TS3AudioBot.History\n{\n\tpublic interface IHistoryFormatter\n\t{\n\t\tstring ProcessQuery(AudioLogEntry entry, Func<AudioLogEntry, string> format);\n\t\tstring ProcessQuery(IEnumerable<AudioLogEntry> entries, Func<AudioLogEntry, string> format);\n\t}\n\n\t// needed ?\n\tpublic enum HistoryDisplayColumn\n\t{\n\t\tAleId,\n\t\tUserDbId,\n\t\tUserName,\n\t\tAleTitle,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/History/SearchQuery.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.History\n{\n\tpublic class SeachQuery\n\t{\n\t\tpublic string? TitlePart { get; set; }\n\t\tpublic string? UserUid { get; set; }\n\t\tpublic DateTime? LastInvokedAfter { get; set; }\n\t\tpublic int MaxResults { get; set; }\n\n\t\tpublic SeachQuery()\n\t\t{\n\t\t\tTitlePart = null;\n\t\t\tUserUid = null;\n\t\t\tLastInvokedAfter = null;\n\t\t\tMaxResults = 10;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/History/SmartHistoryFormatter.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing TSLib.Commands;\n\nnamespace TS3AudioBot.History\n{\n\tpublic class SmartHistoryFormatter : IHistoryFormatter\n\t{\n\t\t// configurable constants\n\t\tprivate const string LineBreak = \"\\n\";\n\t\tprivate const int MinTokenLine = 40;\n\t\tprivate readonly bool fairDistribute = true;\n\t\t// resulting constants from configuration\n\t\tprivate static readonly int LineBreakLen = TsString.TokenLength(LineBreak);\n\t\tprivate static readonly int UseableTokenLine = MinTokenLine - LineBreakLen;\n\n\t\tpublic string ProcessQuery(AudioLogEntry entry, Func<AudioLogEntry, string> format)\n\t\t{\n\t\t\treturn SubstringToken(format(entry), TsConst.Default.MaxSizeTextMessage);\n\t\t}\n\n\t\tpublic string ProcessQuery(IEnumerable<AudioLogEntry> entries, Func<AudioLogEntry, string> format)\n\t\t{\n\t\t\t//! entryLinesRev[0] is the most recent entry\n\t\t\tvar entryLinesRev = entries.Select(e =>\n\t\t\t{\n\t\t\t\tstring finStr = format(e);\n\t\t\t\treturn new Line(finStr, TsString.TokenLength(finStr));\n\t\t\t});\n\n\t\t\t//! entryLines[n] is the most recent entry\n\t\t\tvar entryLines = entryLinesRev.Reverse();\n\n\t\t\tvar queryTokenLen = entryLines.Sum(eL => eL.TokenLength + LineBreakLen);\n\t\t\tStringBuilder strb;\n\n\t\t\t// If the entire content fits within the ts3 limitation, we can concat and return it.\n\t\t\tif (queryTokenLen <= TsConst.Default.MaxSizeTextMessage)\n\t\t\t{\n\t\t\t\tif (queryTokenLen == 0) return \"Nothing found!\";\n\t\t\t\tstrb = new StringBuilder(queryTokenLen, queryTokenLen);\n\t\t\t\t// we want the most recent entry at the bottom so we reverse the list\n\t\t\t\tforeach (var eL in entryLines)\n\t\t\t\t\tstrb.Append(eL.Value).Append(LineBreak);\n\t\t\t\treturn strb.ToString();\n\t\t\t}\n\n\t\t\tint spareToken = TsConst.Default.MaxSizeTextMessage;\n\t\t\tint listStart = 0;\n\n\t\t\t// Otherwise we go iteratively through the list to test how many entries we can add with our token\n\t\t\tforeach (var eL in entryLinesRev)\n\t\t\t{\n\t\t\t\t// if we don't have enough token to fit in the next entry (even in shorted form)\n\t\t\t\t// then we break and use the last few tokens in the next step to fill up.\n\t\t\t\tif (spareToken < 0 || (spareToken < MinTokenLine && spareToken < eL.TokenLength))\n\t\t\t\t\tbreak;\n\t\t\t\t// now the further execution is legal because of either of those cases\n\t\t\t\t// 1) !(spareToken < MinTokenLine):              entry will be trimmed to MinTokenLine and fits\n\t\t\t\t// 2) !(spareToken < entryLines[i].TokenLength): entry already fits into spareTokens\n\n\t\t\t\tif (eL.TokenLength < MinTokenLine)\n\t\t\t\t{\n\t\t\t\t\tspareToken -= eL.TokenLength;\n\t\t\t\t\tlistStart++;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tspareToken -= MinTokenLine;\n\t\t\t\t\tlistStart++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//! useList[0] is the most recent entry\n\t\t\tvar useList = entryLinesRev.Take(listStart).ToList();\n\n\t\t\tif (fairDistribute)\n\t\t\t{\n\t\t\t\t// If the fairDistribute option is active this loop will start out by trying to give each\n\t\t\t\t// entry an equal fraction of all spareToken.\n\t\t\t\tfor (int i = 0; i < useList.Count; i++)\n\t\t\t\t{\n\t\t\t\t\tif (spareToken <= 0) break;\n\t\t\t\t\tint fairBonus = spareToken / (useList.Count - i);\n\t\t\t\t\tint available = Math.Min(fairBonus, useList[i].TokenLength);\n\t\t\t\t\tuseList[i].BonusToken = available;\n\t\t\t\t\tspareToken -= available;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Now distribute the remaining tokens by first come first serve in reverse order\n\t\t\t\t// so the more recent an entry is the more token it gets\n\t\t\t\tforeach (var eL in useList)\n\t\t\t\t{\n\t\t\t\t\tif (spareToken <= 0) break;\n\t\t\t\t\tif (eL.TokenLength > UseableTokenLine)\n\t\t\t\t\t{\n\t\t\t\t\t\tint available = Math.Min(spareToken, eL.TokenLength - UseableTokenLine);\n\t\t\t\t\t\teL.BonusToken = available;\n\t\t\t\t\t\tspareToken -= available;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// now we can just build our result and return\n\t\t\tstrb = new StringBuilder(TsConst.Default.MaxSizeTextMessage - spareToken, TsConst.Default.MaxSizeTextMessage);\n\t\t\tfor (int i = useList.Count - 1; i >= 0; i--)\n\t\t\t{\n\t\t\t\tvar eL = useList[i];\n\t\t\t\tif (eL.TokenLength < UseableTokenLine + eL.BonusToken)\n\t\t\t\t\tstrb.Append(eL.Value).Append(LineBreak);\n\t\t\t\telse\n\t\t\t\t\tstrb.Append(SubstringToken(eL.Value, UseableTokenLine + eL.BonusToken)).Append(LineBreak);\n\t\t\t}\n\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tpublic static string DefaultAleFormat(AudioLogEntry e)\n\t\t\t=> string.Format(\"{0} ({2}): {1}\", e.Id, e.AudioResource.ResourceTitle, e.UserUid, e.PlayCount, e.Timestamp);\n\n\t\t/// <summary>Trims a string to have the given token count at max.</summary>\n\t\t/// <param name=\"value\">The string to substring from the left side.</param>\n\t\t/// <param name=\"token\">The max token count.</param>\n\t\t/// <returns>The new substring.</returns>\n\t\tprivate static string SubstringToken(string value, int token)\n\t\t{\n\t\t\tint tokens = 0;\n\t\t\tfor (int i = 0; i < value.Length; i++)\n\t\t\t{\n\t\t\t\tint addToken = TsString.IsDoubleChar(value[i]) ? 2 : 1;\n\t\t\t\tif (tokens + addToken > token) return value.Substring(0, i);\n\t\t\t\telse tokens += addToken;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tprivate class Line\n\t\t{\n\t\t\tpublic string Value { get; }\n\t\t\tpublic int TokenLength { get; }\n\t\t\tpublic int BonusToken { get; set; }\n\n\t\t\tpublic Line(string value, int tokenLength)\n\t\t\t{\n\t\t\t\tValue = value;\n\t\t\t\tTokenLength = tokenLength;\n\t\t\t\tBonusToken = 0;\n\t\t\t}\n\n\t\t\tpublic override string ToString() => $\"[{TokenLength:0000}+{BonusToken:0000}] {Value}\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/InvokerData.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TSLib;\n\nnamespace TS3AudioBot\n{\n\tpublic class InvokerData\n\t{\n\t\tpublic Uid ClientUid { get; }\n\t\tpublic bool IsAnonymous => ClientUid == Uid.Anonymous;\n\n\t\tpublic static readonly InvokerData Anonymous = new InvokerData(Uid.Anonymous);\n\n\t\tpublic InvokerData(Uid clientUid)\n\t\t{\n\t\t\tClientUid = clientUid;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Limits.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot\n{\n\tpublic static class Limits\n\t{\n\t\t/// <summary>Max stream size to download before aborting.</summary>\n\t\tpublic static long MaxImageStreamSize { get; } = 10_000_000;\n\t\t/// <summary>Max image size which is allowed to be resized from.</summary>\n\t\tpublic static long MaxImageDimension { get; } = 10_000;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Localization/DynamicResourceManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Reflection;\nusing System.Resources;\nusing System.Threading;\n\nnamespace TS3AudioBot.Localization\n{\n\tinternal class DynamicResourceManager : ResourceManager\n\t{\n\t\tprivate readonly Dictionary<string, ResourceSet> dynamicResourceSets = new Dictionary<string, ResourceSet>();\n\n\t\tpublic DynamicResourceManager(string baseName, Assembly assembly) : base(baseName, assembly)\n\t\t{\n\t\t}\n\n\t\tpublic void SetResourceSet(CultureInfo culture, ResourceSet set)\n\t\t{\n\t\t\tdynamicResourceSets[culture.Name] = set;\n\t\t}\n\n\t\tpublic override ResourceSet? GetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents)\n\t\t{\n\t\t\tif (culture is null)\n\t\t\t{\n\t\t\t\tculture = Thread.CurrentThread.CurrentUICulture;\n\t\t\t}\n\n\t\t\tif (dynamicResourceSets.TryGetValue(culture.Name, out var set))\n\t\t\t{\n\t\t\t\treturn set;\n\t\t\t}\n\n\t\t\treturn base.GetResourceSet(culture, createIfNotExists, tryParents);\n\t\t}\n\n\t\tpublic override string? GetString(string name, CultureInfo? culture)\n\t\t{\n\t\t\tif (culture is null)\n\t\t\t{\n\t\t\t\tculture = Thread.CurrentThread.CurrentUICulture;\n\t\t\t}\n\n\t\t\tstring? str;\n\t\t\tif (dynamicResourceSets.TryGetValue(culture.Name, out var set))\n\t\t\t{\n\t\t\t\tif ((str = set.GetString(name)) != null)\n\t\t\t\t\treturn str;\n\t\t\t}\n\n\t\t\tif ((str = base.GetString(name, culture)) != null)\n\t\t\t\treturn str;\n\n\t\t\tif ((str = base.GetString(name, CultureInfo.InvariantCulture)) != null)\n\t\t\t\treturn str;\n\n\t\t\t//$\"The localized entry {name} was not found\"\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Localization/LocalStr.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Localization\n{\n\t/// <summary>\n\t/// Represents a localizable string\n\t/// </summary>\n\tpublic readonly struct LocalStr\n\t{\n\t\tpublic static readonly LocalStr Empty = new LocalStr(string.Empty);\n\n\t\tpublic string Str { get; }\n\n\t\tpublic LocalStr(string str)\n\t\t{\n\t\t\tStr = str;\n\t\t}\n\n\t\tpublic override readonly string ToString() => Str;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Localization/LocalizationManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Reflection;\nusing System.Resources;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Helper;\n\nnamespace TS3AudioBot.Localization\n{\n\tpublic class LocalizationManager\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate static readonly Dictionary<string, LanguageData> loadedLanguage = new Dictionary<string, LanguageData>();\n\t\tprivate static readonly DynamicResourceManager dynResMan;\n\n\t\tprivate CultureInfo? culture;\n\t\tpublic bool LanguageLoaded => culture != null;\n\n\t\tstatic LocalizationManager()\n\t\t{\n\t\t\tloadedLanguage.Add(\"en\", new LanguageData\n\t\t\t{\n\t\t\t\tIsInternal = true,\n\t\t\t\tLoadedSuccessfully = true,\n\t\t\t});\n\n\t\t\tvar resManField = typeof(strings).GetField(\"resourceMan\", BindingFlags.NonPublic | BindingFlags.Static)!;\n\t\t\tvar currentResMan = resManField.GetValue(null);\n\t\t\t(currentResMan as ResourceManager)?.ReleaseAllResources();\n\t\t\tdynResMan = new DynamicResourceManager(\"TS3AudioBot.Localization.strings\", typeof(strings).Assembly);\n\t\t\tresManField.SetValue(null, dynResMan);\n\t\t}\n\n\t\tpublic async ValueTask<E<string>> LoadLanguage(string lang, bool forceDownload)\n\t\t{\n\t\t\ttry { culture = CultureInfo.GetCultureInfo(lang); }\n\t\t\tcatch (CultureNotFoundException) { return \"Language not found\"; }\n\n\t\t\tvar languageDataInfo = loadedLanguage.GetOrNew(culture.Name);\n\n\t\t\tif (!languageDataInfo.LoadedSuccessfully)\n\t\t\t{\n\t\t\t\tvar result = await LoadLanguageAssembly(languageDataInfo, culture, forceDownload);\n\t\t\t\tif (!result.Ok)\n\t\t\t\t{\n\t\t\t\t\tculture = CultureInfo.InvariantCulture;\n\t\t\t\t\treturn result.Error;\n\t\t\t\t}\n\t\t\t\tlanguageDataInfo.LoadedSuccessfully = true;\n\t\t\t}\n\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tpublic void ApplyLanguage()\n\t\t{\n\t\t\tvar applyCulture = culture ?? CultureInfo.InvariantCulture;\n\n\t\t\tThread.CurrentThread.CurrentCulture =\n\t\t\tThread.CurrentThread.CurrentUICulture =\n\t\t\tCultureInfo.CurrentCulture =\n\t\t\tCultureInfo.CurrentUICulture = applyCulture;\n\t\t}\n\n\t\tprivate static async Task<E<string>> LoadLanguageAssembly(LanguageData languageDataInfo, CultureInfo culture, bool forceDownload)\n\t\t{\n\t\t\tTask<HashSet<string>?>? avaliableToDownload = null;\n\t\t\tvar triedDownloading = languageDataInfo.TriedDownloading;\n\n\t\t\tforeach (var currentResolveCulture in GetWithFallbackCultures(culture))\n\t\t\t{\n\t\t\t\t// Try loading the resource set from memory\n\t\t\t\tif (strings.ResourceManager.GetResourceSet(currentResolveCulture, true, false) != null)\n\t\t\t\t\treturn R.Ok;\n\n\t\t\t\t// Do not attempt to download or load integrated languages\n\t\t\t\tif (languageDataInfo.IsInternal)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tvar tryFile = GetCultureFileInfo(currentResolveCulture);\n\n\t\t\t\t// Check if we need to download the resource\n\t\t\t\tif (forceDownload || (!tryFile.Exists && !triedDownloading))\n\t\t\t\t{\n\t\t\t\t\tif (avaliableToDownload is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tavaliableToDownload = DownloadAvaliableLanguages();\n\t\t\t\t\t}\n\t\t\t\t\tvar list = await avaliableToDownload;\n\t\t\t\t\tif (list is null || !list.Contains(currentResolveCulture.Name))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (list != null)\n\t\t\t\t\t\t\tLog.Info(\"Language \\\"{0}\\\" is not available on the server\", currentResolveCulture.Name);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tlanguageDataInfo.TriedDownloading = true;\n\t\t\t\t\t\tDirectory.CreateDirectory(tryFile.DirectoryName);\n\t\t\t\t\t\tLog.Info(\"Downloading the resource pack for the language '{0}'\", currentResolveCulture.Name);\n\t\t\t\t\t\tawait WebWrapper.Request($\"https://splamy.de/api/language/project/ts3ab/language/{currentResolveCulture.Name}/dll\").ToAction(async response =>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tusing var fs = File.Open(tryFile.FullName, FileMode.Create, FileAccess.Write, FileShare.None);\n\t\t\t\t\t\t\tawait response.Content.CopyToAsync(fs);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tcatch (Exception ex)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Warn(ex, \"Failed trying to download language '{0}'\", currentResolveCulture.Name);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Try loading the resource set from file\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar asm = Assembly.LoadFrom(tryFile.FullName);\n\t\t\t\t\tvar resStream = asm.GetManifestResourceStream($\"TS3AudioBot.Localization.strings.{currentResolveCulture.Name}.resources\") ?? throw new NullReferenceException(\"No stream found\");\n\t\t\t\t\tvar rr = new ResourceReader(resStream);\n\t\t\t\t\tvar set = new ResourceSet(rr);\n\t\t\t\t\tdynResMan.SetResourceSet(currentResolveCulture, set);\n\n\t\t\t\t\tif (strings.ResourceManager.GetResourceSet(currentResolveCulture, true, false) != null)\n\t\t\t\t\t\treturn R.Ok;\n\n\t\t\t\t\tLog.Error(\"The resource set was not found after initialization\");\n\t\t\t\t}\n\t\t\t\tcatch (Exception ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(ex, \"Failed to load language file '{0}'\", tryFile.FullName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"Could not find language file\";\n\t\t}\n\n\t\tprivate static IEnumerable<CultureInfo> GetWithFallbackCultures(CultureInfo culture)\n\t\t{\n\t\t\tCultureInfo currentResolveCulture = culture;\n\t\t\twhile (currentResolveCulture != CultureInfo.InvariantCulture)\n\t\t\t{\n\t\t\t\tyield return currentResolveCulture;\n\t\t\t\tcurrentResolveCulture = currentResolveCulture.Parent;\n\t\t\t}\n\t\t}\n\n\t\tprivate static FileInfo GetCultureFileInfo(CultureInfo culture)\n\t\t\t=> new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), culture.Name, \"TS3AudioBot.resources.dll\"));\n\n\t\tprivate static async Task<HashSet<string>?> DownloadAvaliableLanguages()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tLog.Info(\"Checking for requested language online\");\n\t\t\t\tvar arr = await WebWrapper.Request(\"https://splamy.de/api/language/project/ts3ab/languages\").AsJson<string[]>();\n\t\t\t\treturn new HashSet<string>(arr);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Failed to download language overview list\");\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic static string? GetString(string name)\n\t\t{\n\t\t\treturn strings.ResourceManager.GetString(name);\n\t\t}\n\n\t\tprivate class LanguageData\n\t\t{\n\t\t\tpublic bool IsInternal { get; set; } = false;\n\t\t\tpublic bool LoadedSuccessfully { get; set; } = false;\n\t\t\tpublic bool TriedDownloading { get; set; } = false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Localization/strings.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 TS3AudioBot.Localization {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class strings {\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 strings() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"TS3AudioBot.Localization.strings\", typeof(strings).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This feature is not documented..\n        /// </summary>\n        internal static string _undocumented {\n            get {\n                return ResourceManager.GetString(\"_undocumented\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Adds a new song to the queue..\n        /// </summary>\n        internal static string cmd_add_help {\n            get {\n                return ResourceManager.GetString(\"cmd_add_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Creates a new command alias..\n        /// </summary>\n        internal static string cmd_alias_add_help {\n            get {\n                return ResourceManager.GetString(\"cmd_alias_add_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lists all currently registered alias..\n        /// </summary>\n        internal static string cmd_alias_list_help {\n            get {\n                return ResourceManager.GetString(\"cmd_alias_list_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Removes an existing alias..\n        /// </summary>\n        internal static string cmd_alias_remove_help {\n            get {\n                return ResourceManager.GetString(\"cmd_alias_remove_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Shows the implementation of the alias..\n        /// </summary>\n        internal static string cmd_alias_show_help {\n            get {\n                return ResourceManager.GetString(\"cmd_alias_show_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Generates an api token..\n        /// </summary>\n        internal static string cmd_api_token_help {\n            get {\n                return ResourceManager.GetString(\"cmd_api_token_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Clears the avatar of the bot..\n        /// </summary>\n        internal static string cmd_bot_avatar_clear_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_avatar_clear_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sets an avatar for the bot.\n        /// </summary>\n        internal static string cmd_bot_avatar_set_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_avatar_set_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Set your bot a badge. The badges string starts with &apos;overwolf=0:badges=&apos;.\n        /// </summary>\n        internal static string cmd_bot_badges_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_badges_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Moves the bot to your channel..\n        /// </summary>\n        internal static string cmd_bot_come_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_come_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the status of the channel commander mode..\n        /// </summary>\n        internal static string cmd_bot_commander_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_commander_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disables channel commander..\n        /// </summary>\n        internal static string cmd_bot_commander_off_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_commander_off_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Enables channel commander..\n        /// </summary>\n        internal static string cmd_bot_commander_on_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_commander_on_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Connects a new bot with the settings from the template name..\n        /// </summary>\n        internal static string cmd_bot_connect_template_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_connect_template_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Connects a new bot to the given address..\n        /// </summary>\n        internal static string cmd_bot_connect_to_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_connect_to_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sets the description of the bot..\n        /// </summary>\n        internal static string cmd_bot_description_set_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_description_set_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Stop this bot instance..\n        /// </summary>\n        internal static string cmd_bot_disconnect_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_disconnect_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets various information about the bot..\n        /// </summary>\n        internal static string cmd_bot_info_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_info_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the id of the current bot..\n        /// </summary>\n        internal static string cmd_bot_info_id_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_info_id_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets a list of all active bots..\n        /// </summary>\n        internal static string cmd_bot_list_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_list_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Moves the bot to you or a specified channel..\n        /// </summary>\n        internal static string cmd_bot_move_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_move_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gives the bot a new name..\n        /// </summary>\n        internal static string cmd_bot_name_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_name_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Saves the configuration for the newly connected bot..\n        /// </summary>\n        internal static string cmd_bot_save_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_save_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Bot setup failed. See logs for more details..\n        /// </summary>\n        internal static string cmd_bot_setup_error {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_setup_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sets all teamspeak rights for the bot to be fully functional..\n        /// </summary>\n        internal static string cmd_bot_setup_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_setup_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Switches the context to the requested bot..\n        /// </summary>\n        internal static string cmd_bot_use_help {\n            get {\n                return ResourceManager.GetString(\"cmd_bot_use_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Removes all songs from the current playlist..\n        /// </summary>\n        internal static string cmd_clear_help {\n            get {\n                return ResourceManager.GetString(\"cmd_clear_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Executes a given command or string.\n        /// </summary>\n        internal static string cmd_eval_help {\n            get {\n                return ResourceManager.GetString(\"cmd_eval_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets all information about you..\n        /// </summary>\n        internal static string cmd_getmy_all_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getmy_all_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets your channel id you are currently in..\n        /// </summary>\n        internal static string cmd_getmy_channel_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getmy_channel_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets your database id..\n        /// </summary>\n        internal static string cmd_getmy_dbid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getmy_dbid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets your id..\n        /// </summary>\n        internal static string cmd_getmy_id_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getmy_id_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets your nickname..\n        /// </summary>\n        internal static string cmd_getmy_name_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getmy_name_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets your unique id..\n        /// </summary>\n        internal static string cmd_getmy_uid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getmy_uid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets all information about a user, searching with his id..\n        /// </summary>\n        internal static string cmd_getuser_all_byid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_all_byid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets all information of a user, searching with his name..\n        /// </summary>\n        internal static string cmd_getuser_all_byname_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_all_byname_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the channel id a user is currently in, searching with his id..\n        /// </summary>\n        internal static string cmd_getuser_channel_byid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_channel_byid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the database id of a user, searching with his id..\n        /// </summary>\n        internal static string cmd_getuser_dbid_byid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_dbid_byid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the id of a user, searching with his name..\n        /// </summary>\n        internal static string cmd_getuser_id_byname_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_id_byname_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the user name by dbid, searching with his database id..\n        /// </summary>\n        internal static string cmd_getuser_name_bydbid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_name_bydbid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the nickname of a user, searching with his id..\n        /// </summary>\n        internal static string cmd_getuser_name_byid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_name_byid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the unique id of a user, searching with his database id..\n        /// </summary>\n        internal static string cmd_getuser_uid_bydbid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_uid_bydbid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the unique id of a user, searching with his id..\n        /// </summary>\n        internal static string cmd_getuser_uid_byid_help {\n            get {\n                return ResourceManager.GetString(\"cmd_getuser_uid_byid_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Requested command is ambiguous between: {0}.\n        /// </summary>\n        internal static string cmd_help_error_ambiguous_command {\n            get {\n                return ResourceManager.GetString(\"cmd_help_error_ambiguous_command\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The command has no further subfunctions after {0}.\n        /// </summary>\n        internal static string cmd_help_error_no_further_subfunctions {\n            get {\n                return ResourceManager.GetString(\"cmd_help_error_no_further_subfunctions\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No matching command found! Try !help to get a list of all commands..\n        /// </summary>\n        internal static string cmd_help_error_no_matching_command {\n            get {\n                return ResourceManager.GetString(\"cmd_help_error_no_matching_command\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Seems like something went wrong. No help can be shown for this command path..\n        /// </summary>\n        internal static string cmd_help_error_unknown_error {\n            get {\n                return ResourceManager.GetString(\"cmd_help_error_unknown_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to ========= Welcome to the TS3AudioBot =========\n        ///If you need any help with a special command use !help &lt;commandName&gt;.\n        ///Here are all possible commands:.\n        /// </summary>\n        internal static string cmd_help_header {\n            get {\n                return ResourceManager.GetString(\"cmd_help_header\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Shows all commands or detailed help about a specific command..\n        /// </summary>\n        internal static string cmd_help_help {\n            get {\n                return ResourceManager.GetString(\"cmd_help_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The command contains the following subfunctions: {0}.\n        /// </summary>\n        internal static string cmd_help_info_contains_subfunctions {\n            get {\n                return ResourceManager.GetString(\"cmd_help_info_contains_subfunctions\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;id&gt; Adds the song with &lt;id&gt; to the queue.\n        /// </summary>\n        internal static string cmd_history_add_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_add_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Do want to clean the history file now? .\n        /// </summary>\n        internal static string cmd_history_clean_confirm_clean {\n            get {\n                return ResourceManager.GetString(\"cmd_history_clean_confirm_clean\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cleans up the history file for better startup performance..\n        /// </summary>\n        internal static string cmd_history_clean_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_clean_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Do want to remove all defective links file now?.\n        /// </summary>\n        internal static string cmd_history_clean_removedefective_confirm_clean {\n            get {\n                return ResourceManager.GetString(\"cmd_history_clean_removedefective_confirm_clean\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Checks for all links in the history which cannot be opened anymore and removes them..\n        /// </summary>\n        internal static string cmd_history_clean_removedefective_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_clean_removedefective_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Do you really want to delete the entry &quot;{0}&quot;\n        ///with the id {1}?.\n        /// </summary>\n        internal static string cmd_history_delete_confirm {\n            get {\n                return ResourceManager.GetString(\"cmd_history_delete_confirm\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;id&gt; Removes the entry with &lt;id&gt; from the history.\n        /// </summary>\n        internal static string cmd_history_delete_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_delete_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the last &lt;count&gt; songs from the user with the given &lt;user-dbid&gt;.\n        /// </summary>\n        internal static string cmd_history_from_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_from_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0} is the currently highest song id..\n        /// </summary>\n        internal static string cmd_history_id_last {\n            get {\n                return ResourceManager.GetString(\"cmd_history_id_last\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0} will be the next song id..\n        /// </summary>\n        internal static string cmd_history_id_next {\n            get {\n                return ResourceManager.GetString(\"cmd_history_id_next\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to (last|next) Gets the highest|next song id.\n        /// </summary>\n        internal static string cmd_history_id_string_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_id_string_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;id&gt; Displays all saved informations about the song with &lt;id&gt;.\n        /// </summary>\n        internal static string cmd_history_id_uint_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_id_uint_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Plays the last song again.\n        /// </summary>\n        internal static string cmd_history_last_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_last_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;count&gt; Gets the last &lt;count&gt; played songs..\n        /// </summary>\n        internal static string cmd_history_last_int_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_last_int_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to There is no song in the history..\n        /// </summary>\n        internal static string cmd_history_last_is_empty {\n            get {\n                return ResourceManager.GetString(\"cmd_history_last_is_empty\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;id&gt; Playes the song with &lt;id&gt;.\n        /// </summary>\n        internal static string cmd_history_play_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_play_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;id&gt; &lt;name&gt; Sets the name of the song with &lt;id&gt; to &lt;name&gt;.\n        /// </summary>\n        internal static string cmd_history_rename_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_rename_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The new name must not be empty or only whitespaces..\n        /// </summary>\n        internal static string cmd_history_rename_invalid_name {\n            get {\n                return ResourceManager.GetString(\"cmd_history_rename_invalid_name\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;date&gt; Gets all songs played until &lt;date&gt;..\n        /// </summary>\n        internal static string cmd_history_till_DateTime_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_till_DateTime_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;name&gt; Any of those desciptors: (hour|today|yesterday|week).\n        /// </summary>\n        internal static string cmd_history_till_string_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_till_string_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets all songs which title contains &lt;string&gt;.\n        /// </summary>\n        internal static string cmd_history_title_help {\n            get {\n                return ResourceManager.GetString(\"cmd_history_title_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Conditionally executes subcommands..\n        /// </summary>\n        internal static string cmd_if_help {\n            get {\n                return ResourceManager.GetString(\"cmd_if_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unknown comparison operator..\n        /// </summary>\n        internal static string cmd_if_unknown_operator {\n            get {\n                return ResourceManager.GetString(\"cmd_if_unknown_operator\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Show&apos;s a small summary of the current playlist and queue status..\n        /// </summary>\n        internal static string cmd_info_help {\n            get {\n                return ResourceManager.GetString(\"cmd_info_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Allows you to combine multiple JsonResults into one.\n        /// </summary>\n        internal static string cmd_json_merge_help {\n            get {\n                return ResourceManager.GetString(\"cmd_json_merge_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Jumps to the requested index in the current queue and starts playing..\n        /// </summary>\n        internal static string cmd_jump_help {\n            get {\n                return ResourceManager.GetString(\"cmd_jump_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Guess what?.\n        /// </summary>\n        internal static string cmd_kickme_help {\n            get {\n                return ResourceManager.GetString(\"cmd_kickme_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to I&apos;m not strong enough, master!.\n        /// </summary>\n        internal static string cmd_kickme_missing_permission {\n            get {\n                return ResourceManager.GetString(\"cmd_kickme_missing_permission\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets a link to the origin of the current song..\n        /// </summary>\n        internal static string cmd_link_help {\n            get {\n                return ResourceManager.GetString(\"cmd_link_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;id&gt; Adds a link to your private playlist from the history by &lt;id&gt;..\n        /// </summary>\n        internal static string cmd_list_add_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_add_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Clears a playlist..\n        /// </summary>\n        internal static string cmd_list_clear_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_clear_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You are not allowed to delete others playlists..\n        /// </summary>\n        internal static string cmd_list_delete_cannot_delete_others_playlist {\n            get {\n                return ResourceManager.GetString(\"cmd_list_delete_cannot_delete_others_playlist\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Do you really want to delete the playlist &quot;{0}&quot;.\n        /// </summary>\n        internal static string cmd_list_delete_confirm {\n            get {\n                return ResourceManager.GetString(\"cmd_list_delete_confirm\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;name&gt; Deletes the playlist with the name &lt;name&gt;. You can only delete playlists which you also have created. Admins can delete every playlist..\n        /// </summary>\n        internal static string cmd_list_delete_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_delete_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;link&gt; Imports a playlist form an other platform like youtube etc..\n        /// </summary>\n        internal static string cmd_list_get_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_get_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;index&gt; Removes the item at &lt;index&gt;..\n        /// </summary>\n        internal static string cmd_list_item_delete_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_item_delete_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;from&gt; &lt;to&gt; Moves a item in a playlist &lt;from&gt; &lt;to&gt; position..\n        /// </summary>\n        internal static string cmd_list_item_move_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_item_move_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Renames an item..\n        /// </summary>\n        internal static string cmd_list_item_name_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_item_name_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Displays all available playlists from all users..\n        /// </summary>\n        internal static string cmd_list_list_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_list_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Opens a playlist to be editable for you. This replaces your current worklist with the opened playlist..\n        /// </summary>\n        internal static string cmd_list_load_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_load_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Loaded &quot;{0}&quot; with {1} songs..\n        /// </summary>\n        internal static string cmd_list_load_response {\n            get {\n                return ResourceManager.GetString(\"cmd_list_load_response\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Appends another playlist to yours..\n        /// </summary>\n        internal static string cmd_list_merge_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_merge_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Displays the name of the playlist you are currently working on..\n        /// </summary>\n        internal static string cmd_list_name_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_name_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Replaces the current freelist with your workinglist and plays from the beginning..\n        /// </summary>\n        internal static string cmd_list_play_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_play_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Appends your playlist to the freelist..\n        /// </summary>\n        internal static string cmd_list_queue_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_queue_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Stores your current workinglist to disk..\n        /// </summary>\n        internal static string cmd_list_save_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_save_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Playlist: &quot;{0}&quot; with {1} songs..\n        /// </summary>\n        internal static string cmd_list_show_header {\n            get {\n                return ResourceManager.GetString(\"cmd_list_show_header\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;name&gt; Displays all songs currently in the playlists with the name &lt;name&gt;.\n        /// </summary>\n        internal static string cmd_list_show_help {\n            get {\n                return ResourceManager.GetString(\"cmd_list_show_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Plays the next song in the playlist..\n        /// </summary>\n        internal static string cmd_next_help {\n            get {\n                return ResourceManager.GetString(\"cmd_next_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Displays the AST of the requested command..\n        /// </summary>\n        internal static string cmd_parse_command_help {\n            get {\n                return ResourceManager.GetString(\"cmd_parse_command_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Well, pauses the song. Undo with !play..\n        /// </summary>\n        internal static string cmd_pause_help {\n            get {\n                return ResourceManager.GetString(\"cmd_pause_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Automatically tries to decide whether the link is a special resource (like youtube) or a direct resource (like ./hello.mp3) and starts it..\n        /// </summary>\n        internal static string cmd_play_help {\n            get {\n                return ResourceManager.GetString(\"cmd_play_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lists all found plugins..\n        /// </summary>\n        internal static string cmd_plugin_list_help {\n            get {\n                return ResourceManager.GetString(\"cmd_plugin_list_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unloads a plugin..\n        /// </summary>\n        internal static string cmd_plugin_load_help {\n            get {\n                return ResourceManager.GetString(\"cmd_plugin_load_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unloads a plugin..\n        /// </summary>\n        internal static string cmd_plugin_unload_help {\n            get {\n                return ResourceManager.GetString(\"cmd_plugin_unload_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Requests a private session with the ServerBot so you can be intimate..\n        /// </summary>\n        internal static string cmd_pm_help {\n            get {\n                return ResourceManager.GetString(\"cmd_pm_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Hi {0}.\n        /// </summary>\n        internal static string cmd_pm_hi {\n            get {\n                return ResourceManager.GetString(\"cmd_pm_hi\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Writes a message to a particular user..\n        /// </summary>\n        internal static string cmd_pm_user_help {\n            get {\n                return ResourceManager.GetString(\"cmd_pm_user_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Plays the previous song in the playlist..\n        /// </summary>\n        internal static string cmd_previous_help {\n            get {\n                return ResourceManager.GetString(\"cmd_previous_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lets you format multiple parameter to one..\n        /// </summary>\n        internal static string cmd_print_help {\n            get {\n                return ResourceManager.GetString(\"cmd_print_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Displays the current play queue..\n        /// </summary>\n        internal static string cmd_queue_help {\n            get {\n                return ResourceManager.GetString(\"cmd_queue_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Do you really want to quit?.\n        /// </summary>\n        internal static string cmd_quit_confirm {\n            get {\n                return ResourceManager.GetString(\"cmd_quit_confirm\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Closes the TS3AudioBot application..\n        /// </summary>\n        internal static string cmd_quit_help {\n            get {\n                return ResourceManager.GetString(\"cmd_quit_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Shows the quizmode status..\n        /// </summary>\n        internal static string cmd_quiz_help {\n            get {\n                return ResourceManager.GetString(\"cmd_quiz_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disable to show the songnames again..\n        /// </summary>\n        internal static string cmd_quiz_off_help {\n            get {\n                return ResourceManager.GetString(\"cmd_quiz_off_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No cheating! Everybody has to see it!.\n        /// </summary>\n        internal static string cmd_quiz_off_no_cheating {\n            get {\n                return ResourceManager.GetString(\"cmd_quiz_off_no_cheating\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Enable to hide the songnames and let your friends guess the title..\n        /// </summary>\n        internal static string cmd_quiz_on_help {\n            get {\n                return ResourceManager.GetString(\"cmd_quiz_on_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets whether or not to play playlists in random order..\n        /// </summary>\n        internal static string cmd_random_help {\n            get {\n                return ResourceManager.GetString(\"cmd_random_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disables random playlist playback.\n        /// </summary>\n        internal static string cmd_random_off_help {\n            get {\n                return ResourceManager.GetString(\"cmd_random_off_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Enables random playlist playback.\n        /// </summary>\n        internal static string cmd_random_on_help {\n            get {\n                return ResourceManager.GetString(\"cmd_random_on_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the unique seed for a certain playback order.\n        /// </summary>\n        internal static string cmd_random_seed_help {\n            get {\n                return ResourceManager.GetString(\"cmd_random_seed_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sets the unique seed for a certain playback order.\n        /// </summary>\n        internal static string cmd_random_seed_int_help {\n            get {\n                return ResourceManager.GetString(\"cmd_random_seed_int_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Only letters allowed..\n        /// </summary>\n        internal static string cmd_random_seed_only_letters_allowed {\n            get {\n                return ResourceManager.GetString(\"cmd_random_seed_only_letters_allowed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sets the unique seed for a certain playback order.\n        /// </summary>\n        internal static string cmd_random_seed_string_help {\n            get {\n                return ResourceManager.GetString(\"cmd_random_seed_string_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Repeats the entire playlist..\n        /// </summary>\n        internal static string cmd_repeat_all_help {\n            get {\n                return ResourceManager.GetString(\"cmd_repeat_all_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the current repeat mode..\n        /// </summary>\n        internal static string cmd_repeat_help {\n            get {\n                return ResourceManager.GetString(\"cmd_repeat_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Repeating the playlist..\n        /// </summary>\n        internal static string cmd_repeat_info_all {\n            get {\n                return ResourceManager.GetString(\"cmd_repeat_info_all\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Not repeating..\n        /// </summary>\n        internal static string cmd_repeat_info_off {\n            get {\n                return ResourceManager.GetString(\"cmd_repeat_info_off\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Repeating a single song..\n        /// </summary>\n        internal static string cmd_repeat_info_one {\n            get {\n                return ResourceManager.GetString(\"cmd_repeat_info_one\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disables repeating..\n        /// </summary>\n        internal static string cmd_repeat_off_help {\n            get {\n                return ResourceManager.GetString(\"cmd_repeat_off_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Repeats a single song..\n        /// </summary>\n        internal static string cmd_repeat_one_help {\n            get {\n                return ResourceManager.GetString(\"cmd_repeat_one_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Returns the subset of allowed commands the caller (you) can execute..\n        /// </summary>\n        internal static string cmd_rights_can_help {\n            get {\n                return ResourceManager.GetString(\"cmd_rights_can_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error while parsing file, see log for more details..\n        /// </summary>\n        internal static string cmd_rights_reload_error_parsing_file {\n            get {\n                return ResourceManager.GetString(\"cmd_rights_reload_error_parsing_file\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Reloads the rights configuration from file..\n        /// </summary>\n        internal static string cmd_rights_reload_help {\n            get {\n                return ResourceManager.GetString(\"cmd_rights_reload_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets a random number..\n        /// </summary>\n        internal static string cmd_rng_help {\n            get {\n                return ResourceManager.GetString(\"cmd_rng_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Value must be 0 or positive..\n        /// </summary>\n        internal static string cmd_rng_value_must_be_positive {\n            get {\n                return ResourceManager.GetString(\"cmd_rng_value_must_be_positive\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Found the following songs. Use &quot;{0}&quot; to play. Use &quot;{1}&quot; to queue..\n        /// </summary>\n        internal static string cmd_search_header {\n            get {\n                return ResourceManager.GetString(\"cmd_search_header\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Found no results for this query..\n        /// </summary>\n        internal static string cmd_search_no_result {\n            get {\n                return ResourceManager.GetString(\"cmd_search_no_result\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Jumps to a timemark within the current song..\n        /// </summary>\n        internal static string cmd_seek_help {\n            get {\n                return ResourceManager.GetString(\"cmd_seek_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The time was not in a correct format, see !help seek for more information..\n        /// </summary>\n        internal static string cmd_seek_invalid_format {\n            get {\n                return ResourceManager.GetString(\"cmd_seek_invalid_format\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The point of time is not within the song length..\n        /// </summary>\n        internal static string cmd_seek_out_of_range {\n            get {\n                return ResourceManager.GetString(\"cmd_seek_out_of_range\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Selects a song from a previous search and plays it..\n        /// </summary>\n        internal static string cmd_select_help {\n            get {\n                return ResourceManager.GetString(\"cmd_select_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Reloads the bot template configuration from the file..\n        /// </summary>\n        internal static string cmd_settings_bot_reload_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_bot_reload_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Duplicates a bot template with a new name..\n        /// </summary>\n        internal static string cmd_settings_copy_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_copy_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Creates a new bot template..\n        /// </summary>\n        internal static string cmd_settings_create_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_create_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Deletes a bot template..\n        /// </summary>\n        internal static string cmd_settings_delete_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_delete_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Please specify a key. E.g {0}.\n        /// </summary>\n        internal static string cmd_settings_empty_usage {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_empty_usage\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets a value from the bot settings..\n        /// </summary>\n        internal static string cmd_settings_get_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_get_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets a value from the core settings..\n        /// </summary>\n        internal static string cmd_settings_global_get_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_global_get_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Set a value from the core settings..\n        /// </summary>\n        internal static string cmd_settings_global_set_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_global_set_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Provides get/set methods to change the settings..\n        /// </summary>\n        internal static string cmd_settings_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Get the desciption for a setting..\n        /// </summary>\n        internal static string cmd_settings_help_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_help_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Reloads the core configuration from the file..\n        /// </summary>\n        internal static string cmd_settings_reload_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_reload_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sets a value from the bot settings..\n        /// </summary>\n        internal static string cmd_settings_set_help {\n            get {\n                return ResourceManager.GetString(\"cmd_settings_set_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Tells you the name of the current song..\n        /// </summary>\n        internal static string cmd_song_help {\n            get {\n                return ResourceManager.GetString(\"cmd_song_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the length and position of the current track..\n        /// </summary>\n        internal static string cmd_song_position_help {\n            get {\n                return ResourceManager.GetString(\"cmd_song_position_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Stops the current song..\n        /// </summary>\n        internal static string cmd_stop_help {\n            get {\n                return ResourceManager.GetString(\"cmd_stop_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Adds your current channel to the music playback..\n        /// </summary>\n        internal static string cmd_subscribe_channel_help {\n            get {\n                return ResourceManager.GetString(\"cmd_subscribe_channel_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Subscribes the specified client to listen from anywhere.\n        /// </summary>\n        internal static string cmd_subscribe_client_help {\n            get {\n                return ResourceManager.GetString(\"cmd_subscribe_client_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lets you hear the music independent from the channel you are in..\n        /// </summary>\n        internal static string cmd_subscribe_help {\n            get {\n                return ResourceManager.GetString(\"cmd_subscribe_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Adds your current channel to the music playback..\n        /// </summary>\n        internal static string cmd_subscribe_tempchannel_help {\n            get {\n                return ResourceManager.GetString(\"cmd_subscribe_tempchannel_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Take a substring from a string..\n        /// </summary>\n        internal static string cmd_take_help {\n            get {\n                return ResourceManager.GetString(\"cmd_take_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Not enough arguments to take..\n        /// </summary>\n        internal static string cmd_take_not_enough_arguements {\n            get {\n                return ResourceManager.GetString(\"cmd_take_not_enough_arguements\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Removes your current channel from the music playback..\n        /// </summary>\n        internal static string cmd_unsubscribe_channel_help {\n            get {\n                return ResourceManager.GetString(\"cmd_unsubscribe_channel_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unsubscribes the specified client to listen from anywhere..\n        /// </summary>\n        internal static string cmd_unsubscribe_client_help {\n            get {\n                return ResourceManager.GetString(\"cmd_unsubscribe_client_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Only lets you hear the music in active channels again..\n        /// </summary>\n        internal static string cmd_unsubscribe_help {\n            get {\n                return ResourceManager.GetString(\"cmd_unsubscribe_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Clears all temporary targets..\n        /// </summary>\n        internal static string cmd_unsubscribe_temporary_help {\n            get {\n                return ResourceManager.GetString(\"cmd_unsubscribe_temporary_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Gets the current build version..\n        /// </summary>\n        internal static string cmd_version_help {\n            get {\n                return ResourceManager.GetString(\"cmd_version_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Current volume: {0}.\n        /// </summary>\n        internal static string cmd_volume_current {\n            get {\n                return ResourceManager.GetString(\"cmd_volume_current\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sets the volume level of the music..\n        /// </summary>\n        internal static string cmd_volume_help {\n            get {\n                return ResourceManager.GetString(\"cmd_volume_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Careful you are requesting a very high volume! Do you want to apply this?.\n        /// </summary>\n        internal static string cmd_volume_high_volume_confirm {\n            get {\n                return ResourceManager.GetString(\"cmd_volume_high_volume_confirm\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The volume level must be between {0} and {1}.\n        /// </summary>\n        internal static string cmd_volume_is_limited {\n            get {\n                return ResourceManager.GetString(\"cmd_volume_is_limited\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You are not allowed to set higher volumes..\n        /// </summary>\n        internal static string cmd_volume_missing_high_volume_permission {\n            get {\n                return ResourceManager.GetString(\"cmd_volume_missing_high_volume_permission\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The new volume could not be parsed.\n        /// </summary>\n        internal static string cmd_volume_parse_error {\n            get {\n                return ResourceManager.GetString(\"cmd_volume_parse_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Set how to send music..\n        /// </summary>\n        internal static string cmd_whisper_all_help {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_all_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Set a specific teamspeak whisper group..\n        /// </summary>\n        internal static string cmd_whisper_group_help {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_group_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This type requires an additional target..\n        /// </summary>\n        internal static string cmd_whisper_group_missing_target {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_group_missing_target\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This type does not take an additional target..\n        /// </summary>\n        internal static string cmd_whisper_group_superfluous_target {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_group_superfluous_target\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Currently targeting:.\n        /// </summary>\n        internal static string cmd_whisper_list_header {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_list_header\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Set how to send music..\n        /// </summary>\n        internal static string cmd_whisper_list_help {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_list_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Nowhere!.\n        /// </summary>\n        internal static string cmd_whisper_list_target_none {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_list_target_none\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This channel via voice!.\n        /// </summary>\n        internal static string cmd_whisper_list_target_voice {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_list_target_voice\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Channel.\n        /// </summary>\n        internal static string cmd_whisper_list_target_whisper_channel {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_list_target_whisper_channel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Clients.\n        /// </summary>\n        internal static string cmd_whisper_list_target_whisper_clients {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_list_target_whisper_clients\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A whisper group {0} {1} ({2})!.\n        /// </summary>\n        internal static string cmd_whisper_list_target_whispergroup {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_list_target_whispergroup\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Enables normal voice mode..\n        /// </summary>\n        internal static string cmd_whisper_off_help {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_off_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Enables default whisper subscription mode..\n        /// </summary>\n        internal static string cmd_whisper_subscription_help {\n            get {\n                return ResourceManager.GetString(\"cmd_whisper_subscription_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Evaluates all parameter..\n        /// </summary>\n        internal static string cmd_xecute_help {\n            get {\n                return ResourceManager.GetString(\"cmd_xecute_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This bot does not exist..\n        /// </summary>\n        internal static string error_bot_does_not_exist {\n            get {\n                return ResourceManager.GetString(\"error_bot_does_not_exist\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error: {0}.\n        /// </summary>\n        internal static string error_call_error {\n            get {\n                return ResourceManager.GetString(\"error_call_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to An unexpected error occurred: {0}.\n        /// </summary>\n        internal static string error_call_unexpected_error {\n            get {\n                return ResourceManager.GetString(\"error_call_unexpected_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Need at least four arguments to evaluate..\n        /// </summary>\n        internal static string error_cmd_at_least_four_argument {\n            get {\n                return ResourceManager.GetString(\"error_cmd_at_least_four_argument\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Need at least {0} arguments to evaluate..\n        /// </summary>\n        internal static string error_cmd_at_least_n_arguments {\n            get {\n                return ResourceManager.GetString(\"error_cmd_at_least_n_arguments\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Need at least one argument to evaluate..\n        /// </summary>\n        internal static string error_cmd_at_least_one_argument {\n            get {\n                return ResourceManager.GetString(\"error_cmd_at_least_one_argument\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Need at least three arguments to evaluate..\n        /// </summary>\n        internal static string error_cmd_at_least_three_argument {\n            get {\n                return ResourceManager.GetString(\"error_cmd_at_least_three_argument\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Need at least two arguments to evaluate..\n        /// </summary>\n        internal static string error_cmd_at_least_two_argument {\n            get {\n                return ResourceManager.GetString(\"error_cmd_at_least_two_argument\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The command exceeded the maximum calling complexity..\n        /// </summary>\n        internal static string error_cmd_complexity_reached {\n            get {\n                return ResourceManager.GetString(\"error_cmd_complexity_reached\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Could not convert &quot;{0}&quot; to {1}..\n        /// </summary>\n        internal static string error_cmd_could_not_convert_to {\n            get {\n                return ResourceManager.GetString(\"error_cmd_could_not_convert_to\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No matching function overload could be found..\n        /// </summary>\n        internal static string error_cmd_no_matching_overload {\n            get {\n                return ResourceManager.GetString(\"error_cmd_no_matching_overload\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The number is too big..\n        /// </summary>\n        internal static string error_cmd_number_too_big {\n            get {\n                return ResourceManager.GetString(\"error_cmd_number_too_big\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Found more than one matching key: {0}.\n        /// </summary>\n        internal static string error_config_multiple_keys_found {\n            get {\n                return ResourceManager.GetString(\"error_config_multiple_keys_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No config key matching the pattern found..\n        /// </summary>\n        internal static string error_config_no_key_found {\n            get {\n                return ResourceManager.GetString(\"error_config_no_key_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The value could not be parsed..\n        /// </summary>\n        internal static string error_config_value_parse_error {\n            get {\n                return ResourceManager.GetString(\"error_config_value_parse_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Could not create new instance..\n        /// </summary>\n        internal static string error_could_not_create_bot {\n            get {\n                return ResourceManager.GetString(\"error_could_not_create_bot\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This feature is currently unavailable..\n        /// </summary>\n        internal static string error_feature_unavailable {\n            get {\n                return ResourceManager.GetString(\"error_feature_unavailable\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Entry could not be stored..\n        /// </summary>\n        internal static string error_history_could_not_create_entry {\n            get {\n                return ResourceManager.GetString(\"error_history_could_not_create_entry\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Could not find entry with this id..\n        /// </summary>\n        internal static string error_history_could_not_find_entry {\n            get {\n                return ResourceManager.GetString(\"error_history_could_not_find_entry\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Invalid token-valid duration..\n        /// </summary>\n        internal static string error_invalid_token_duration {\n            get {\n                return ResourceManager.GetString(\"error_invalid_token_duration\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Invoker casted Ghost Walk..\n        /// </summary>\n        internal static string error_invoker_not_visible {\n            get {\n                return ResourceManager.GetString(\"error_invoker_not_visible\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The file still in use..\n        /// </summary>\n        internal static string error_io_in_use {\n            get {\n                return ResourceManager.GetString(\"error_io_in_use\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The bot does not have the required system permission..\n        /// </summary>\n        internal static string error_io_missing_permission {\n            get {\n                return ResourceManager.GetString(\"error_io_missing_permission\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to An unknown error occoured..\n        /// </summary>\n        internal static string error_io_unknown_error {\n            get {\n                return ResourceManager.GetString(\"error_io_unknown_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The id could not get parsed..\n        /// </summary>\n        internal static string error_media_failed_to_parse_id {\n            get {\n                return ResourceManager.GetString(\"error_media_failed_to_parse_id\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The resource could not be found..\n        /// </summary>\n        internal static string error_media_file_not_found {\n            get {\n                return ResourceManager.GetString(\"error_media_file_not_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No image could not be found..\n        /// </summary>\n        internal static string error_media_image_not_found {\n            get {\n                return ResourceManager.GetString(\"error_media_image_not_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Invalid or malformed response parts..\n        /// </summary>\n        internal static string error_media_internal_invalid {\n            get {\n                return ResourceManager.GetString(\"error_media_internal_invalid\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Empty or missing response parts..\n        /// </summary>\n        internal static string error_media_internal_missing {\n            get {\n                return ResourceManager.GetString(\"error_media_internal_missing\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The image is invalid..\n        /// </summary>\n        internal static string error_media_invalid_image {\n            get {\n                return ResourceManager.GetString(\"error_media_invalid_image\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Invalid uri..\n        /// </summary>\n        internal static string error_media_invalid_uri {\n            get {\n                return ResourceManager.GetString(\"error_media_invalid_uri\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No stream extracted..\n        /// </summary>\n        internal static string error_media_no_stream_extracted {\n            get {\n                return ResourceManager.GetString(\"error_media_no_stream_extracted\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You cannot execute &apos;{0}&apos;. You are missing the &apos;{1}&apos; right!.\n        /// </summary>\n        internal static string error_missing_right {\n            get {\n                return ResourceManager.GetString(\"error_missing_right\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Missing session context..\n        /// </summary>\n        internal static string error_missing_session_context {\n            get {\n                return ResourceManager.GetString(\"error_missing_session_context\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Request got empty response..\n        /// </summary>\n        internal static string error_net_empty_response {\n            get {\n                return ResourceManager.GetString(\"error_net_empty_response\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Got error status code..\n        /// </summary>\n        internal static string error_net_error_status_code {\n            get {\n                return ResourceManager.GetString(\"error_net_error_status_code\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No connection could be established..\n        /// </summary>\n        internal static string error_net_no_connection {\n            get {\n                return ResourceManager.GetString(\"error_net_no_connection\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Request timed out..\n        /// </summary>\n        internal static string error_net_timeout {\n            get {\n                return ResourceManager.GetString(\"error_net_timeout\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unknown request error..\n        /// </summary>\n        internal static string error_net_unknown {\n            get {\n                return ResourceManager.GetString(\"error_net_unknown\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No active token found..\n        /// </summary>\n        internal static string error_no_active_token {\n            get {\n                return ResourceManager.GetString(\"error_no_active_token\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No help found..\n        /// </summary>\n        internal static string error_no_help {\n            get {\n                return ResourceManager.GetString(\"error_no_help\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No invoker in context..\n        /// </summary>\n        internal static string error_no_invoker_in_context {\n            get {\n                return ResourceManager.GetString(\"error_no_invoker_in_context\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Missing session context..\n        /// </summary>\n        internal static string error_no_session_in_context {\n            get {\n                return ResourceManager.GetString(\"error_no_session_in_context\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No target channel found..\n        /// </summary>\n        internal static string error_no_target_channel {\n            get {\n                return ResourceManager.GetString(\"error_no_target_channel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No teamspeak connection in context..\n        /// </summary>\n        internal static string error_no_teamspeak_in_context {\n            get {\n                return ResourceManager.GetString(\"error_no_teamspeak_in_context\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No Uid found to register token for..\n        /// </summary>\n        internal static string error_no_uid_found {\n            get {\n                return ResourceManager.GetString(\"error_no_uid_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This command is not available as API..\n        /// </summary>\n        internal static string error_not_available_from_api {\n            get {\n                return ResourceManager.GetString(\"error_not_available_from_api\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Not found..\n        /// </summary>\n        internal static string error_not_found {\n            get {\n                return ResourceManager.GetString(\"error_not_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Can&apos;t find a fitting return type to return..\n        /// </summary>\n        internal static string error_nothing_to_return {\n            get {\n                return ResourceManager.GetString(\"error_nothing_to_return\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The playlist file is corrupted. Only admins can modify it until fixed..\n        /// </summary>\n        internal static string error_playlist_broken_file {\n            get {\n                return ResourceManager.GetString(\"error_playlist_broken_file\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You cannot access a playlist which you dont own..\n        /// </summary>\n        internal static string error_playlist_cannot_access_not_owned {\n            get {\n                return ResourceManager.GetString(\"error_playlist_cannot_access_not_owned\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Nothing to play....\n        /// </summary>\n        internal static string error_playlist_is_empty {\n            get {\n                return ResourceManager.GetString(\"error_playlist_is_empty\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Index must be within playlist length..\n        /// </summary>\n        internal static string error_playlist_item_index_out_of_range {\n            get {\n                return ResourceManager.GetString(\"error_playlist_item_index_out_of_range\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The name contains invalid characters; please only use [a-zA-Z0-9_-]..\n        /// </summary>\n        internal static string error_playlist_name_invalid_character {\n            get {\n                return ResourceManager.GetString(\"error_playlist_name_invalid_character\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to An empty name is not valid..\n        /// </summary>\n        internal static string error_playlist_name_invalid_empty {\n            get {\n                return ResourceManager.GetString(\"error_playlist_name_invalid_empty\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The name length must be &lt;64..\n        /// </summary>\n        internal static string error_playlist_name_invalid_too_long {\n            get {\n                return ResourceManager.GetString(\"error_playlist_name_invalid_too_long\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No playlist directory has been set up..\n        /// </summary>\n        internal static string error_playlist_no_store_directory {\n            get {\n                return ResourceManager.GetString(\"error_playlist_no_store_directory\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The playlist could not be found..\n        /// </summary>\n        internal static string error_playlist_not_found {\n            get {\n                return ResourceManager.GetString(\"error_playlist_not_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Special list not found..\n        /// </summary>\n        internal static string error_playlist_special_not_found {\n            get {\n                return ResourceManager.GetString(\"error_playlist_special_not_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Internal error..\n        /// </summary>\n        internal static string error_playmgr_internal_error {\n            get {\n                return ResourceManager.GetString(\"error_playmgr_internal_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A few songs failed to start, use {0} to continue..\n        /// </summary>\n        internal static string error_playmgr_many_songs_failed {\n            get {\n                return ResourceManager.GetString(\"error_playmgr_many_songs_failed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Plugin error: {0}.\n        /// </summary>\n        internal static string error_plugin_error {\n            get {\n                return ResourceManager.GetString(\"error_plugin_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Could not load..\n        /// </summary>\n        internal static string error_resfac_could_not_load {\n            get {\n                return ResourceManager.GetString(\"error_resfac_could_not_load\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Considered multiple factories but all failed..\n        /// </summary>\n        internal static string error_resfac_multiple_factories_failed {\n            get {\n                return ResourceManager.GetString(\"error_resfac_multiple_factories_failed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No registered factory for &quot;{0}&quot; found..\n        /// </summary>\n        internal static string error_resfac_no_registered_factory {\n            get {\n                return ResourceManager.GetString(\"error_resfac_no_registered_factory\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Nothing to select....\n        /// </summary>\n        internal static string error_select_empty {\n            get {\n                return ResourceManager.GetString(\"error_select_empty\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot move there..\n        /// </summary>\n        internal static string error_ts_cannot_move {\n            get {\n                return ResourceManager.GetString(\"error_ts_cannot_move\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot set commander mode..\n        /// </summary>\n        internal static string error_ts_cannot_set_commander {\n            get {\n                return ResourceManager.GetString(\"error_ts_cannot_set_commander\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Missing teamspeak permissions..\n        /// </summary>\n        internal static string error_ts_code_2568 {\n            get {\n                return ResourceManager.GetString(\"error_ts_code_2568\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Invalid channel password..\n        /// </summary>\n        internal static string error_ts_code_781 {\n            get {\n                return ResourceManager.GetString(\"error_ts_code_781\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Teamspeak Error: {0}.\n        /// </summary>\n        internal static string error_ts_error {\n            get {\n                return ResourceManager.GetString(\"error_ts_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The file to upload is too big..\n        /// </summary>\n        internal static string error_ts_file_too_big {\n            get {\n                return ResourceManager.GetString(\"error_ts_file_too_big\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The new name is too long or invalid..\n        /// </summary>\n        internal static string error_ts_invalid_name {\n            get {\n                return ResourceManager.GetString(\"error_ts_invalid_name\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The message to send is longer than the allowed maximum..\n        /// </summary>\n        internal static string error_ts_msg_too_long {\n            get {\n                return ResourceManager.GetString(\"error_ts_msg_too_long\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No client found..\n        /// </summary>\n        internal static string error_ts_no_client_found {\n            get {\n                return ResourceManager.GetString(\"error_ts_no_client_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unknown Teamspeak Error..\n        /// </summary>\n        internal static string error_ts_unknown_error {\n            get {\n                return ResourceManager.GetString(\"error_ts_unknown_error\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unrecognized descriptor..\n        /// </summary>\n        internal static string error_unrecognized_descriptor {\n            get {\n                return ResourceManager.GetString(\"error_unrecognized_descriptor\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Please use this command in a private session..\n        /// </summary>\n        internal static string error_use_private {\n            get {\n                return ResourceManager.GetString(\"error_use_private\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Your value is out of range. Select one between {0} and {1}..\n        /// </summary>\n        internal static string error_value_not_in_range {\n            get {\n                return ResourceManager.GetString(\"error_value_not_in_range\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No youtube-dl response.\n        /// </summary>\n        internal static string error_ytdl_empty_response {\n            get {\n                return ResourceManager.GetString(\"error_ytdl_empty_response\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Failed to run youtube-dl..\n        /// </summary>\n        internal static string error_ytdl_failed_to_run {\n            get {\n                return ResourceManager.GetString(\"error_ytdl_failed_to_run\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Youtube-Dl could not be found. The song/video cannot be played due to restrictions..\n        /// </summary>\n        internal static string error_ytdl_not_found {\n            get {\n                return ResourceManager.GetString(\"error_ytdl_not_found\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to youtube-dl failed to load the resource..\n        /// </summary>\n        internal static string error_ytdl_song_failed_to_load {\n            get {\n                return ResourceManager.GetString(\"error_ytdl_song_failed_to_load\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This might take a while and make the bot unresponsive in meanwhile..\n        /// </summary>\n        internal static string info_bot_might_be_unresponsive {\n            get {\n                return ResourceManager.GetString(\"info_bot_might_be_unresponsive\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;Quiztime!&gt;.\n        /// </summary>\n        internal static string info_botstatus_quiztime {\n            get {\n                return ResourceManager.GetString(\"info_botstatus_quiztime\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;Sleeping&gt;.\n        /// </summary>\n        internal static string info_botstatus_sleeping {\n            get {\n                return ResourceManager.GetString(\"info_botstatus_sleeping\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cleanup done!.\n        /// </summary>\n        internal static string info_cleanup_done {\n            get {\n                return ResourceManager.GetString(\"info_cleanup_done\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to There is nothing on right now....\n        /// </summary>\n        internal static string info_currently_not_playing {\n            get {\n                return ResourceManager.GetString(\"info_currently_not_playing\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Now playing: {0}.\n        /// </summary>\n        internal static string info_currently_playing {\n            get {\n                return ResourceManager.GetString(\"info_currently_playing\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;empty&gt;.\n        /// </summary>\n        internal static string info_empty {\n            get {\n                return ResourceManager.GetString(\"info_empty\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to number.\n        /// </summary>\n        internal static string info_number {\n            get {\n                return ResourceManager.GetString(\"info_number\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to off.\n        /// </summary>\n        internal static string info_off {\n            get {\n                return ResourceManager.GetString(\"info_off\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Ok.\n        /// </summary>\n        internal static string info_ok {\n            get {\n                return ResourceManager.GetString(\"info_ok\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to on.\n        /// </summary>\n        internal static string info_on {\n            get {\n                return ResourceManager.GetString(\"info_on\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No next song could be played..\n        /// </summary>\n        internal static string info_playmgr_no_next_song {\n            get {\n                return ResourceManager.GetString(\"info_playmgr_no_next_song\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No previous song could be played..\n        /// </summary>\n        internal static string info_playmgr_no_previous_song {\n            get {\n                return ResourceManager.GetString(\"info_playmgr_no_previous_song\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sorry, you have to guess!.\n        /// </summary>\n        internal static string info_quizmode_is_active {\n            get {\n                return ResourceManager.GetString(\"info_quizmode_is_active\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Removed &quot;{0}&quot;.\n        /// </summary>\n        internal static string info_removed {\n            get {\n                return ResourceManager.GetString(\"info_removed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Channel commander is {0}.\n        /// </summary>\n        internal static string info_status_channelcommander {\n            get {\n                return ResourceManager.GetString(\"info_status_channelcommander\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Quizmode is {0}.\n        /// </summary>\n        internal static string info_status_quizmode {\n            get {\n                return ResourceManager.GetString(\"info_status_quizmode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Random is {0}.\n        /// </summary>\n        internal static string info_status_random {\n            get {\n                return ResourceManager.GetString(\"info_status_random\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "TS3AudioBot/Localization/strings.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=\"cmd_add_help\" xml:space=\"preserve\">\n    <value>Adds a new song to the queue.</value>\n  </data>\n  <data name=\"cmd_api_token_help\" xml:space=\"preserve\">\n    <value>Generates an api token.</value>\n  </data>\n  <data name=\"cmd_bot_commander_help\" xml:space=\"preserve\">\n    <value>Gets the status of the channel commander mode.</value>\n  </data>\n  <data name=\"cmd_bot_commander_on_help\" xml:space=\"preserve\">\n    <value>Enables channel commander.</value>\n  </data>\n  <data name=\"cmd_bot_commander_off_help\" xml:space=\"preserve\">\n    <value>Disables channel commander.</value>\n  </data>\n  <data name=\"cmd_bot_come_help\" xml:space=\"preserve\">\n    <value>Moves the bot to your channel.</value>\n  </data>\n  <data name=\"cmd_bot_info_help\" xml:space=\"preserve\">\n    <value>Gets various information about the bot.</value>\n  </data>\n  <data name=\"cmd_bot_info_id_help\" xml:space=\"preserve\">\n    <value>Gets the id of the current bot.</value>\n  </data>\n  <data name=\"cmd_bot_list_help\" xml:space=\"preserve\">\n    <value>Gets a list of all active bots.</value>\n  </data>\n  <data name=\"cmd_bot_move_help\" xml:space=\"preserve\">\n    <value>Moves the bot to you or a specified channel.</value>\n  </data>\n  <data name=\"cmd_bot_name_help\" xml:space=\"preserve\">\n    <value>Gives the bot a new name.</value>\n  </data>\n  <data name=\"cmd_bot_badges_help\" xml:space=\"preserve\">\n    <value>Set your bot a badge. The badges string starts with 'overwolf=0:badges='</value>\n  </data>\n  <data name=\"cmd_bot_setup_help\" xml:space=\"preserve\">\n    <value>Sets all teamspeak rights for the bot to be fully functional.</value>\n  </data>\n  <data name=\"cmd_bot_use_help\" xml:space=\"preserve\">\n    <value>Switches the context to the requested bot.</value>\n  </data>\n  <data name=\"cmd_clear_help\" xml:space=\"preserve\">\n    <value>Removes all songs from the current playlist.</value>\n  </data>\n  <data name=\"cmd_bot_disconnect_help\" xml:space=\"preserve\">\n    <value>Stop this bot instance.</value>\n  </data>\n  <data name=\"cmd_eval_help\" xml:space=\"preserve\">\n    <value>Executes a given command or string</value>\n  </data>\n  <data name=\"cmd_getmy_id_help\" xml:space=\"preserve\">\n    <value>Gets your id.</value>\n  </data>\n  <data name=\"cmd_getmy_uid_help\" xml:space=\"preserve\">\n    <value>Gets your unique id.</value>\n  </data>\n  <data name=\"cmd_getmy_name_help\" xml:space=\"preserve\">\n    <value>Gets your nickname.</value>\n  </data>\n  <data name=\"cmd_getmy_dbid_help\" xml:space=\"preserve\">\n    <value>Gets your database id.</value>\n  </data>\n  <data name=\"cmd_getmy_channel_help\" xml:space=\"preserve\">\n    <value>Gets your channel id you are currently in.</value>\n  </data>\n  <data name=\"cmd_getmy_all_help\" xml:space=\"preserve\">\n    <value>Gets all information about you.</value>\n  </data>\n  <data name=\"cmd_getuser_uid_byid_help\" xml:space=\"preserve\">\n    <value>Gets the unique id of a user, searching with his id.</value>\n  </data>\n  <data name=\"cmd_getuser_name_byid_help\" xml:space=\"preserve\">\n    <value>Gets the nickname of a user, searching with his id.</value>\n  </data>\n  <data name=\"cmd_getuser_dbid_byid_help\" xml:space=\"preserve\">\n    <value>Gets the database id of a user, searching with his id.</value>\n  </data>\n  <data name=\"cmd_getuser_channel_byid_help\" xml:space=\"preserve\">\n    <value>Gets the channel id a user is currently in, searching with his id.</value>\n  </data>\n  <data name=\"cmd_getuser_all_byid_help\" xml:space=\"preserve\">\n    <value>Gets all information about a user, searching with his id.</value>\n  </data>\n  <data name=\"cmd_getuser_id_byname_help\" xml:space=\"preserve\">\n    <value>Gets the id of a user, searching with his name.</value>\n  </data>\n  <data name=\"cmd_getuser_all_byname_help\" xml:space=\"preserve\">\n    <value>Gets all information of a user, searching with his name.</value>\n  </data>\n  <data name=\"cmd_getuser_name_bydbid_help\" xml:space=\"preserve\">\n    <value>Gets the user name by dbid, searching with his database id.</value>\n  </data>\n  <data name=\"cmd_getuser_uid_bydbid_help\" xml:space=\"preserve\">\n    <value>Gets the unique id of a user, searching with his database id.</value>\n  </data>\n  <data name=\"cmd_help_help\" xml:space=\"preserve\">\n    <value>Shows all commands or detailed help about a specific command.</value>\n  </data>\n  <data name=\"cmd_history_add_help\" xml:space=\"preserve\">\n    <value>&lt;id&gt; Adds the song with &lt;id&gt; to the queue</value>\n  </data>\n  <data name=\"cmd_history_clean_help\" xml:space=\"preserve\">\n    <value>Cleans up the history file for better startup performance.</value>\n  </data>\n  <data name=\"cmd_history_delete_help\" xml:space=\"preserve\">\n    <value>&lt;id&gt; Removes the entry with &lt;id&gt; from the history</value>\n  </data>\n  <data name=\"cmd_history_from_help\" xml:space=\"preserve\">\n    <value>Gets the last &lt;count&gt; songs from the user with the given &lt;user-dbid&gt;</value>\n  </data>\n  <data name=\"cmd_history_id_uint_help\" xml:space=\"preserve\">\n    <value>&lt;id&gt; Displays all saved informations about the song with &lt;id&gt;</value>\n  </data>\n  <data name=\"cmd_history_id_string_help\" xml:space=\"preserve\">\n    <value>(last|next) Gets the highest|next song id</value>\n  </data>\n  <data name=\"cmd_history_last_int_help\" xml:space=\"preserve\">\n    <value>&lt;count&gt; Gets the last &lt;count&gt; played songs.</value>\n  </data>\n  <data name=\"cmd_history_last_help\" xml:space=\"preserve\">\n    <value>Plays the last song again</value>\n  </data>\n  <data name=\"cmd_history_play_help\" xml:space=\"preserve\">\n    <value>&lt;id&gt; Playes the song with &lt;id&gt;</value>\n  </data>\n  <data name=\"cmd_history_rename_help\" xml:space=\"preserve\">\n    <value>&lt;id&gt; &lt;name&gt; Sets the name of the song with &lt;id&gt; to &lt;name&gt;</value>\n  </data>\n  <data name=\"cmd_history_till_DateTime_help\" xml:space=\"preserve\">\n    <value>&lt;date&gt; Gets all songs played until &lt;date&gt;.</value>\n  </data>\n  <data name=\"cmd_history_till_string_help\" xml:space=\"preserve\">\n    <value>&lt;name&gt; Any of those desciptors: (hour|today|yesterday|week)</value>\n  </data>\n  <data name=\"cmd_history_title_help\" xml:space=\"preserve\">\n    <value>Gets all songs which title contains &lt;string&gt;</value>\n  </data>\n  <data name=\"cmd_json_merge_help\" xml:space=\"preserve\">\n    <value>Allows you to combine multiple JsonResults into one</value>\n  </data>\n  <data name=\"cmd_kickme_help\" xml:space=\"preserve\">\n    <value>Guess what?</value>\n  </data>\n  <data name=\"cmd_link_help\" xml:space=\"preserve\">\n    <value>Gets a link to the origin of the current song.</value>\n  </data>\n  <data name=\"cmd_list_add_help\" xml:space=\"preserve\">\n    <value>&lt;id&gt; Adds a link to your private playlist from the history by &lt;id&gt;.</value>\n  </data>\n  <data name=\"cmd_list_clear_help\" xml:space=\"preserve\">\n    <value>Clears a playlist.</value>\n  </data>\n  <data name=\"cmd_list_delete_help\" xml:space=\"preserve\">\n    <value>&lt;name&gt; Deletes the playlist with the name &lt;name&gt;. You can only delete playlists which you also have created. Admins can delete every playlist.</value>\n  </data>\n  <data name=\"cmd_list_get_help\" xml:space=\"preserve\">\n    <value>&lt;link&gt; Imports a playlist form an other platform like youtube etc.</value>\n  </data>\n  <data name=\"cmd_list_item_move_help\" xml:space=\"preserve\">\n    <value>&lt;from&gt; &lt;to&gt; Moves a item in a playlist &lt;from&gt; &lt;to&gt; position.</value>\n  </data>\n  <data name=\"cmd_list_item_delete_help\" xml:space=\"preserve\">\n    <value>&lt;index&gt; Removes the item at &lt;index&gt;.</value>\n  </data>\n  <data name=\"cmd_list_list_help\" xml:space=\"preserve\">\n    <value>Displays all available playlists from all users.</value>\n  </data>\n  <data name=\"cmd_list_load_help\" xml:space=\"preserve\">\n    <value>Opens a playlist to be editable for you. This replaces your current worklist with the opened playlist.</value>\n  </data>\n  <data name=\"cmd_list_merge_help\" xml:space=\"preserve\">\n    <value>Appends another playlist to yours.</value>\n  </data>\n  <data name=\"cmd_list_name_help\" xml:space=\"preserve\">\n    <value>Displays the name of the playlist you are currently working on.</value>\n  </data>\n  <data name=\"cmd_list_play_help\" xml:space=\"preserve\">\n    <value>Replaces the current freelist with your workinglist and plays from the beginning.</value>\n  </data>\n  <data name=\"cmd_list_queue_help\" xml:space=\"preserve\">\n    <value>Appends your playlist to the freelist.</value>\n  </data>\n  <data name=\"cmd_list_save_help\" xml:space=\"preserve\">\n    <value>Stores your current workinglist to disk.</value>\n  </data>\n  <data name=\"cmd_list_show_help\" xml:space=\"preserve\">\n    <value>&lt;name&gt; Displays all songs currently in the playlists with the name &lt;name&gt;</value>\n  </data>\n  <data name=\"cmd_next_help\" xml:space=\"preserve\">\n    <value>Plays the next song in the playlist.</value>\n  </data>\n  <data name=\"cmd_pm_help\" xml:space=\"preserve\">\n    <value>Requests a private session with the ServerBot so you can be intimate.</value>\n  </data>\n  <data name=\"cmd_parse_command_help\" xml:space=\"preserve\">\n    <value>Displays the AST of the requested command.</value>\n  </data>\n  <data name=\"cmd_pause_help\" xml:space=\"preserve\">\n    <value>Well, pauses the song. Undo with !play.</value>\n  </data>\n  <data name=\"cmd_play_help\" xml:space=\"preserve\">\n    <value>Automatically tries to decide whether the link is a special resource (like youtube) or a direct resource (like ./hello.mp3) and starts it.</value>\n  </data>\n  <data name=\"cmd_plugin_list_help\" xml:space=\"preserve\">\n    <value>Lists all found plugins.</value>\n  </data>\n  <data name=\"cmd_plugin_unload_help\" xml:space=\"preserve\">\n    <value>Unloads a plugin.</value>\n  </data>\n  <data name=\"cmd_plugin_load_help\" xml:space=\"preserve\">\n    <value>Unloads a plugin.</value>\n  </data>\n  <data name=\"cmd_previous_help\" xml:space=\"preserve\">\n    <value>Plays the previous song in the playlist.</value>\n  </data>\n  <data name=\"cmd_print_help\" xml:space=\"preserve\">\n    <value>Lets you format multiple parameter to one.</value>\n  </data>\n  <data name=\"cmd_quit_help\" xml:space=\"preserve\">\n    <value>Closes the TS3AudioBot application.</value>\n  </data>\n  <data name=\"cmd_quiz_help\" xml:space=\"preserve\">\n    <value>Shows the quizmode status.</value>\n  </data>\n  <data name=\"cmd_quiz_on_help\" xml:space=\"preserve\">\n    <value>Enable to hide the songnames and let your friends guess the title.</value>\n  </data>\n  <data name=\"cmd_quiz_off_help\" xml:space=\"preserve\">\n    <value>Disable to show the songnames again.</value>\n  </data>\n  <data name=\"cmd_random_help\" xml:space=\"preserve\">\n    <value>Gets whether or not to play playlists in random order.</value>\n  </data>\n  <data name=\"cmd_random_on_help\" xml:space=\"preserve\">\n    <value>Enables random playlist playback</value>\n  </data>\n  <data name=\"cmd_random_off_help\" xml:space=\"preserve\">\n    <value>Disables random playlist playback</value>\n  </data>\n  <data name=\"cmd_random_seed_help\" xml:space=\"preserve\">\n    <value>Gets the unique seed for a certain playback order</value>\n  </data>\n  <data name=\"cmd_random_seed_string_help\" xml:space=\"preserve\">\n    <value>Sets the unique seed for a certain playback order</value>\n  </data>\n  <data name=\"cmd_random_seed_int_help\" xml:space=\"preserve\">\n    <value>Sets the unique seed for a certain playback order</value>\n  </data>\n  <data name=\"cmd_repeat_help\" xml:space=\"preserve\">\n    <value>Gets the current repeat mode.</value>\n  </data>\n  <data name=\"cmd_repeat_one_help\" xml:space=\"preserve\">\n    <value>Repeats a single song.</value>\n  </data>\n  <data name=\"cmd_repeat_off_help\" xml:space=\"preserve\">\n    <value>Disables repeating.</value>\n  </data>\n  <data name=\"cmd_rights_can_help\" xml:space=\"preserve\">\n    <value>Returns the subset of allowed commands the caller (you) can execute.</value>\n  </data>\n  <data name=\"cmd_rights_reload_help\" xml:space=\"preserve\">\n    <value>Reloads the rights configuration from file.</value>\n  </data>\n  <data name=\"cmd_rng_help\" xml:space=\"preserve\">\n    <value>Gets a random number.</value>\n  </data>\n  <data name=\"cmd_seek_help\" xml:space=\"preserve\">\n    <value>Jumps to a timemark within the current song.</value>\n  </data>\n  <data name=\"cmd_song_help\" xml:space=\"preserve\">\n    <value>Tells you the name of the current song.</value>\n  </data>\n  <data name=\"cmd_stop_help\" xml:space=\"preserve\">\n    <value>Stops the current song.</value>\n  </data>\n  <data name=\"cmd_subscribe_help\" xml:space=\"preserve\">\n    <value>Lets you hear the music independent from the channel you are in.</value>\n  </data>\n  <data name=\"cmd_subscribe_tempchannel_help\" xml:space=\"preserve\">\n    <value>Adds your current channel to the music playback.</value>\n  </data>\n  <data name=\"cmd_subscribe_channel_help\" xml:space=\"preserve\">\n    <value>Adds your current channel to the music playback.</value>\n  </data>\n  <data name=\"cmd_take_help\" xml:space=\"preserve\">\n    <value>Take a substring from a string.</value>\n  </data>\n  <data name=\"cmd_unsubscribe_help\" xml:space=\"preserve\">\n    <value>Only lets you hear the music in active channels again.</value>\n  </data>\n  <data name=\"cmd_unsubscribe_channel_help\" xml:space=\"preserve\">\n    <value>Removes your current channel from the music playback.</value>\n  </data>\n  <data name=\"cmd_unsubscribe_temporary_help\" xml:space=\"preserve\">\n    <value>Clears all temporary targets.</value>\n  </data>\n  <data name=\"cmd_version_help\" xml:space=\"preserve\">\n    <value>Gets the current build version.</value>\n  </data>\n  <data name=\"cmd_volume_help\" xml:space=\"preserve\">\n    <value>Sets the volume level of the music.</value>\n  </data>\n  <data name=\"cmd_whisper_all_help\" xml:space=\"preserve\">\n    <value>Set how to send music.</value>\n  </data>\n  <data name=\"cmd_whisper_group_help\" xml:space=\"preserve\">\n    <value>Set a specific teamspeak whisper group.</value>\n  </data>\n  <data name=\"cmd_whisper_list_help\" xml:space=\"preserve\">\n    <value>Set how to send music.</value>\n  </data>\n  <data name=\"cmd_whisper_off_help\" xml:space=\"preserve\">\n    <value>Enables normal voice mode.</value>\n  </data>\n  <data name=\"cmd_whisper_subscription_help\" xml:space=\"preserve\">\n    <value>Enables default whisper subscription mode.</value>\n  </data>\n  <data name=\"cmd_xecute_help\" xml:space=\"preserve\">\n    <value>Evaluates all parameter.</value>\n  </data>\n  <data name=\"cmd_help_error_ambiguous_command\" xml:space=\"preserve\">\n    <value>Requested command is ambiguous between: {0}</value>\n  </data>\n  <data name=\"cmd_help_error_no_further_subfunctions\" xml:space=\"preserve\">\n    <value>The command has no further subfunctions after {0}</value>\n  </data>\n  <data name=\"cmd_help_error_no_matching_command\" xml:space=\"preserve\">\n    <value>No matching command found! Try !help to get a list of all commands.</value>\n  </data>\n  <data name=\"cmd_help_error_unknown_error\" xml:space=\"preserve\">\n    <value>Seems like something went wrong. No help can be shown for this command path.</value>\n  </data>\n  <data name=\"cmd_help_header\" xml:space=\"preserve\">\n    <value>========= Welcome to the TS3AudioBot =========\nIf you need any help with a special command use !help &lt;commandName&gt;.\nHere are all possible commands:</value>\n  </data>\n  <data name=\"cmd_help_info_contains_subfunctions\" xml:space=\"preserve\">\n    <value>The command contains the following subfunctions: {0}</value>\n  </data>\n  <data name=\"cmd_history_clean_confirm_clean\" xml:space=\"preserve\">\n    <value>Do want to clean the history file now? </value>\n  </data>\n  <data name=\"cmd_history_clean_removedefective_confirm_clean\" xml:space=\"preserve\">\n    <value>Do want to remove all defective links file now?</value>\n  </data>\n  <data name=\"cmd_history_delete_confirm\" xml:space=\"preserve\">\n    <value>Do you really want to delete the entry \"{0}\"\nwith the id {1}?</value>\n  </data>\n  <data name=\"cmd_history_id_last\" xml:space=\"preserve\">\n    <value>{0} is the currently highest song id.</value>\n  </data>\n  <data name=\"cmd_history_id_next\" xml:space=\"preserve\">\n    <value>{0} will be the next song id.</value>\n  </data>\n  <data name=\"cmd_history_last_is_empty\" xml:space=\"preserve\">\n    <value>There is no song in the history.</value>\n  </data>\n  <data name=\"cmd_history_rename_invalid_name\" xml:space=\"preserve\">\n    <value>The new name must not be empty or only whitespaces.</value>\n  </data>\n  <data name=\"cmd_if_unknown_operator\" xml:space=\"preserve\">\n    <value>Unknown comparison operator.</value>\n  </data>\n  <data name=\"cmd_kickme_missing_permission\" xml:space=\"preserve\">\n    <value>I'm not strong enough, master!</value>\n  </data>\n  <data name=\"cmd_list_delete_cannot_delete_others_playlist\" xml:space=\"preserve\">\n    <value>You are not allowed to delete others playlists.</value>\n  </data>\n  <data name=\"cmd_list_delete_confirm\" xml:space=\"preserve\">\n    <value>Do you really want to delete the playlist \"{0}\"?</value>\n  </data>\n  <data name=\"cmd_list_load_response\" xml:space=\"preserve\">\n    <value>Loaded \"{0}\" with {1} songs.</value>\n  </data>\n  <data name=\"cmd_list_show_header\" xml:space=\"preserve\">\n    <value>Playlist: \"{0}\" with {1} songs.</value>\n  </data>\n  <data name=\"cmd_pm_hi\" xml:space=\"preserve\">\n    <value>Hi {0}</value>\n  </data>\n  <data name=\"cmd_quit_confirm\" xml:space=\"preserve\">\n    <value>Do you really want to quit?</value>\n  </data>\n  <data name=\"cmd_quiz_off_no_cheating\" xml:space=\"preserve\">\n    <value>No cheating! Everybody has to see it!</value>\n  </data>\n  <data name=\"cmd_random_seed_only_letters_allowed\" xml:space=\"preserve\">\n    <value>Only letters allowed.</value>\n  </data>\n  <data name=\"cmd_rights_reload_error_parsing_file\" xml:space=\"preserve\">\n    <value>Error while parsing file, see log for more details.</value>\n  </data>\n  <data name=\"cmd_rng_value_must_be_positive\" xml:space=\"preserve\">\n    <value>Value must be 0 or positive.</value>\n  </data>\n  <data name=\"cmd_seek_invalid_format\" xml:space=\"preserve\">\n    <value>The time was not in a correct format, see !help seek for more information.</value>\n  </data>\n  <data name=\"cmd_seek_out_of_range\" xml:space=\"preserve\">\n    <value>The point of time is not within the song length.</value>\n  </data>\n  <data name=\"cmd_settings_empty_usage\" xml:space=\"preserve\">\n    <value>Please specify a key. E.g {0}</value>\n  </data>\n  <data name=\"error_config_multiple_keys_found\" xml:space=\"preserve\">\n    <value>Found more than one matching key: {0}</value>\n  </data>\n  <data name=\"error_config_no_key_found\" xml:space=\"preserve\">\n    <value>No config key matching the pattern found.</value>\n  </data>\n  <data name=\"cmd_take_not_enough_arguements\" xml:space=\"preserve\">\n    <value>Not enough arguments to take.</value>\n  </data>\n  <data name=\"cmd_volume_current\" xml:space=\"preserve\">\n    <value>Current volume: {0}</value>\n  </data>\n  <data name=\"cmd_volume_high_volume_confirm\" xml:space=\"preserve\">\n    <value>Careful you are requesting a very high volume! Do you want to apply this?</value>\n  </data>\n  <data name=\"cmd_volume_is_limited\" xml:space=\"preserve\">\n    <value>The volume level must be between {0} and {1}</value>\n  </data>\n  <data name=\"cmd_volume_missing_high_volume_permission\" xml:space=\"preserve\">\n    <value>You are not allowed to set higher volumes.</value>\n  </data>\n  <data name=\"cmd_volume_parse_error\" xml:space=\"preserve\">\n    <value>The new volume could not be parsed</value>\n  </data>\n  <data name=\"cmd_whisper_group_missing_target\" xml:space=\"preserve\">\n    <value>This type requires an additional target.</value>\n  </data>\n  <data name=\"cmd_whisper_group_superfluous_target\" xml:space=\"preserve\">\n    <value>This type does not take an additional target.</value>\n  </data>\n  <data name=\"cmd_whisper_list_header\" xml:space=\"preserve\">\n    <value>Currently targeting:</value>\n  </data>\n  <data name=\"cmd_whisper_list_target_none\" xml:space=\"preserve\">\n    <value>Nowhere!</value>\n  </data>\n  <data name=\"cmd_whisper_list_target_voice\" xml:space=\"preserve\">\n    <value>This channel via voice!</value>\n  </data>\n  <data name=\"cmd_whisper_list_target_whispergroup\" xml:space=\"preserve\">\n    <value>A whisper group {0} {1} ({2})!</value>\n  </data>\n  <data name=\"cmd_whisper_list_target_whisper_channel\" xml:space=\"preserve\">\n    <value>Channel</value>\n  </data>\n  <data name=\"cmd_whisper_list_target_whisper_clients\" xml:space=\"preserve\">\n    <value>Clients</value>\n  </data>\n  <data name=\"error_bot_does_not_exist\" xml:space=\"preserve\">\n    <value>This bot does not exist.</value>\n  </data>\n  <data name=\"error_call_error\" xml:space=\"preserve\">\n    <value>Error: {0}</value>\n  </data>\n  <data name=\"error_call_unexpected_error\" xml:space=\"preserve\">\n    <value>An unexpected error occurred: {0}</value>\n  </data>\n  <data name=\"error_cmd_at_least_four_argument\" xml:space=\"preserve\">\n    <value>Need at least four arguments to evaluate.</value>\n  </data>\n  <data name=\"error_cmd_at_least_one_argument\" xml:space=\"preserve\">\n    <value>Need at least one argument to evaluate.</value>\n  </data>\n  <data name=\"error_cmd_at_least_two_argument\" xml:space=\"preserve\">\n    <value>Need at least two arguments to evaluate.</value>\n  </data>\n  <data name=\"error_could_not_create_bot\" xml:space=\"preserve\">\n    <value>Could not create new instance.</value>\n  </data>\n  <data name=\"error_invalid_token_duration\" xml:space=\"preserve\">\n    <value>Invalid token-valid duration.</value>\n  </data>\n  <data name=\"error_invoker_not_visible\" xml:space=\"preserve\">\n    <value>Invoker casted Ghost Walk.</value>\n  </data>\n  <data name=\"error_missing_session_context\" xml:space=\"preserve\">\n    <value>Missing session context.</value>\n  </data>\n  <data name=\"error_nothing_to_return\" xml:space=\"preserve\">\n    <value>Can't find a fitting return type to return.</value>\n  </data>\n  <data name=\"error_not_available_from_api\" xml:space=\"preserve\">\n    <value>This command is not available as API.</value>\n  </data>\n  <data name=\"error_not_found\" xml:space=\"preserve\">\n    <value>Not found.</value>\n  </data>\n  <data name=\"error_no_active_token\" xml:space=\"preserve\">\n    <value>No active token found.</value>\n  </data>\n  <data name=\"error_no_invoker_in_context\" xml:space=\"preserve\">\n    <value>No invoker in context.</value>\n  </data>\n  <data name=\"error_no_target_channel\" xml:space=\"preserve\">\n    <value>No target channel found.</value>\n  </data>\n  <data name=\"error_no_teamspeak_in_context\" xml:space=\"preserve\">\n    <value>No teamspeak connection in context.</value>\n  </data>\n  <data name=\"error_no_uid_found\" xml:space=\"preserve\">\n    <value>No Uid found to register token for.</value>\n  </data>\n  <data name=\"error_playlist_is_empty\" xml:space=\"preserve\">\n    <value>Nothing to play...</value>\n  </data>\n  <data name=\"error_playlist_item_index_out_of_range\" xml:space=\"preserve\">\n    <value>Index must be within playlist length.</value>\n  </data>\n  <data name=\"error_playlist_not_found\" xml:space=\"preserve\">\n    <value>The playlist could not be found.</value>\n  </data>\n  <data name=\"error_plugin_error\" xml:space=\"preserve\">\n    <value>Plugin error: {0}</value>\n  </data>\n  <data name=\"error_unrecognized_descriptor\" xml:space=\"preserve\">\n    <value>Unrecognized descriptor.</value>\n  </data>\n  <data name=\"error_use_private\" xml:space=\"preserve\">\n    <value>Please use this command in a private session.</value>\n  </data>\n  <data name=\"info_bot_might_be_unresponsive\" xml:space=\"preserve\">\n    <value>This might take a while and make the bot unresponsive in meanwhile.</value>\n  </data>\n  <data name=\"info_status_channelcommander\" xml:space=\"preserve\">\n    <value>Channel commander is {0}</value>\n  </data>\n  <data name=\"info_cleanup_done\" xml:space=\"preserve\">\n    <value>Cleanup done!</value>\n  </data>\n  <data name=\"info_currently_not_playing\" xml:space=\"preserve\">\n    <value>There is nothing on right now...</value>\n  </data>\n  <data name=\"info_currently_playing\" xml:space=\"preserve\">\n    <value>Now playing: {0}</value>\n  </data>\n  <data name=\"info_empty\" xml:space=\"preserve\">\n    <value>&lt;empty&gt;</value>\n  </data>\n  <data name=\"info_ok\" xml:space=\"preserve\">\n    <value>Ok</value>\n  </data>\n  <data name=\"info_quizmode_is_active\" xml:space=\"preserve\">\n    <value>Sorry, you have to guess!</value>\n  </data>\n  <data name=\"info_removed\" xml:space=\"preserve\">\n    <value>Removed \"{0}\"</value>\n  </data>\n  <data name=\"info_botstatus_quiztime\" xml:space=\"preserve\">\n    <value>&lt;Quiztime!&gt;</value>\n  </data>\n  <data name=\"info_botstatus_sleeping\" xml:space=\"preserve\">\n    <value>&lt;Sleeping&gt;</value>\n  </data>\n  <data name=\"cmd_bot_setup_error\" xml:space=\"preserve\">\n    <value>Bot setup failed. See logs for more details.</value>\n  </data>\n  <data name=\"error_feature_unavailable\" xml:space=\"preserve\">\n    <value>This feature is currently unavailable.</value>\n  </data>\n  <data name=\"error_history_could_not_create_entry\" xml:space=\"preserve\">\n    <value>Entry could not be stored.</value>\n  </data>\n  <data name=\"error_history_could_not_find_entry\" xml:space=\"preserve\">\n    <value>Could not find entry with this id.</value>\n  </data>\n  <data name=\"error_playlist_broken_file\" xml:space=\"preserve\">\n    <value>The playlist file is corrupted. Only admins can modify it until fixed.</value>\n  </data>\n  <data name=\"error_ts_cannot_move\" xml:space=\"preserve\">\n    <value>Cannot move there.</value>\n  </data>\n  <data name=\"error_ts_cannot_set_commander\" xml:space=\"preserve\">\n    <value>Cannot set commander mode.</value>\n  </data>\n  <data name=\"error_ts_error\" xml:space=\"preserve\">\n    <value>Teamspeak Error: {0}</value>\n  </data>\n  <data name=\"error_ts_invalid_name\" xml:space=\"preserve\">\n    <value>The new name is too long or invalid.</value>\n  </data>\n  <data name=\"error_ts_msg_too_long\" xml:space=\"preserve\">\n    <value>The message to send is longer than the allowed maximum.</value>\n  </data>\n  <data name=\"error_ts_no_client_found\" xml:space=\"preserve\">\n    <value>No client found.</value>\n  </data>\n  <data name=\"error_ts_unknown_error\" xml:space=\"preserve\">\n    <value>Unknown Teamspeak Error.</value>\n  </data>\n  <data name=\"info_off\" xml:space=\"preserve\">\n    <value>off</value>\n  </data>\n  <data name=\"info_on\" xml:space=\"preserve\">\n    <value>on</value>\n  </data>\n  <data name=\"info_status_quizmode\" xml:space=\"preserve\">\n    <value>Quizmode is {0}</value>\n  </data>\n  <data name=\"info_status_random\" xml:space=\"preserve\">\n    <value>Random is {0}</value>\n  </data>\n  <data name=\"error_config_value_parse_error\" xml:space=\"preserve\">\n    <value>The value could not be parsed.</value>\n  </data>\n  <data name=\"error_io_in_use\" xml:space=\"preserve\">\n    <value>The file still in use.</value>\n  </data>\n  <data name=\"error_io_missing_permission\" xml:space=\"preserve\">\n    <value>The bot does not have the required system permission.</value>\n  </data>\n  <data name=\"error_io_unknown_error\" xml:space=\"preserve\">\n    <value>An unknown error occoured.</value>\n  </data>\n  <data name=\"error_media_failed_to_parse_id\" xml:space=\"preserve\">\n    <value>The id could not get parsed.</value>\n  </data>\n  <data name=\"error_media_file_not_found\" xml:space=\"preserve\">\n    <value>The resource could not be found.</value>\n  </data>\n  <data name=\"error_media_image_not_found\" xml:space=\"preserve\">\n    <value>No image could not be found.</value>\n  </data>\n  <data name=\"error_media_internal_invalid\" xml:space=\"preserve\">\n    <value>Invalid or malformed response parts.</value>\n  </data>\n  <data name=\"error_media_internal_missing\" xml:space=\"preserve\">\n    <value>Empty or missing response parts.</value>\n  </data>\n  <data name=\"error_media_invalid_image\" xml:space=\"preserve\">\n    <value>The image is invalid.</value>\n  </data>\n  <data name=\"error_media_invalid_uri\" xml:space=\"preserve\">\n    <value>Invalid uri.</value>\n  </data>\n  <data name=\"error_media_no_stream_extracted\" xml:space=\"preserve\">\n    <value>No stream extracted.</value>\n  </data>\n  <data name=\"error_net_empty_response\" xml:space=\"preserve\">\n    <value>Request got empty response.</value>\n  </data>\n  <data name=\"error_net_error_status_code\" xml:space=\"preserve\">\n    <value>Got error status code.</value>\n  </data>\n  <data name=\"error_net_no_connection\" xml:space=\"preserve\">\n    <value>No connection could be established.</value>\n  </data>\n  <data name=\"error_net_timeout\" xml:space=\"preserve\">\n    <value>Request timed out.</value>\n  </data>\n  <data name=\"error_net_unknown\" xml:space=\"preserve\">\n    <value>Unknown request error.</value>\n  </data>\n  <data name=\"error_playlist_cannot_access_not_owned\" xml:space=\"preserve\">\n    <value>You cannot access a playlist which you dont own.</value>\n  </data>\n  <data name=\"error_playlist_name_invalid_character\" xml:space=\"preserve\">\n    <value>The name contains invalid characters; please only use [a-zA-Z0-9_-].</value>\n  </data>\n  <data name=\"error_playlist_name_invalid_empty\" xml:space=\"preserve\">\n    <value>An empty name is not valid.</value>\n  </data>\n  <data name=\"error_playlist_name_invalid_too_long\" xml:space=\"preserve\">\n    <value>The name length must be &lt;64.</value>\n  </data>\n  <data name=\"error_playlist_no_store_directory\" xml:space=\"preserve\">\n    <value>No playlist directory has been set up.</value>\n  </data>\n  <data name=\"error_playlist_special_not_found\" xml:space=\"preserve\">\n    <value>Special list not found.</value>\n  </data>\n  <data name=\"error_playmgr_internal_error\" xml:space=\"preserve\">\n    <value>Internal error.</value>\n  </data>\n  <data name=\"error_playmgr_many_songs_failed\" xml:space=\"preserve\">\n    <value>A few songs failed to start, use {0} to continue.</value>\n  </data>\n  <data name=\"error_resfac_could_not_load\" xml:space=\"preserve\">\n    <value>Could not load.</value>\n  </data>\n  <data name=\"error_resfac_multiple_factories_failed\" xml:space=\"preserve\">\n    <value>Considered multiple factories but all failed.</value>\n  </data>\n  <data name=\"error_resfac_no_registered_factory\" xml:space=\"preserve\">\n    <value>No registered factory for \"{0}\" found.</value>\n  </data>\n  <data name=\"error_ytdl_empty_response\" xml:space=\"preserve\">\n    <value>No youtube-dl response</value>\n  </data>\n  <data name=\"error_ytdl_failed_to_run\" xml:space=\"preserve\">\n    <value>Failed to run youtube-dl.</value>\n  </data>\n  <data name=\"error_ytdl_not_found\" xml:space=\"preserve\">\n    <value>Youtube-Dl could not be found. The song/video cannot be played due to restrictions.</value>\n  </data>\n  <data name=\"error_ytdl_song_failed_to_load\" xml:space=\"preserve\">\n    <value>youtube-dl failed to load the resource.</value>\n  </data>\n  <data name=\"info_playmgr_no_next_song\" xml:space=\"preserve\">\n    <value>No next song could be played.</value>\n  </data>\n  <data name=\"info_playmgr_no_previous_song\" xml:space=\"preserve\">\n    <value>No previous song could be played.</value>\n  </data>\n  <data name=\"error_no_help\" xml:space=\"preserve\">\n    <value>No help found.</value>\n  </data>\n  <data name=\"error_no_session_in_context\" xml:space=\"preserve\">\n    <value>Missing session context.</value>\n  </data>\n  <data name=\"error_ts_code_2568\" xml:space=\"preserve\">\n    <value>Missing teamspeak permissions.</value>\n  </data>\n  <data name=\"cmd_bot_connect_to_help\" xml:space=\"preserve\">\n    <value>Connects a new bot to the given address.</value>\n  </data>\n  <data name=\"cmd_bot_connect_template_help\" xml:space=\"preserve\">\n    <value>Connects a new bot with the settings from the template name.</value>\n  </data>\n  <data name=\"cmd_bot_save_help\" xml:space=\"preserve\">\n    <value>Saves the configuration for the newly connected bot.</value>\n  </data>\n  <data name=\"cmd_history_clean_removedefective_help\" xml:space=\"preserve\">\n    <value>Checks for all links in the history which cannot be opened anymore and removes them.</value>\n  </data>\n  <data name=\"cmd_if_help\" xml:space=\"preserve\">\n    <value>Conditionally executes subcommands.</value>\n  </data>\n  <data name=\"cmd_settings_get_help\" xml:space=\"preserve\">\n    <value>Gets a value from the bot settings.</value>\n  </data>\n  <data name=\"cmd_settings_global_get_help\" xml:space=\"preserve\">\n    <value>Gets a value from the core settings.</value>\n  </data>\n  <data name=\"cmd_settings_global_set_help\" xml:space=\"preserve\">\n    <value>Set a value from the core settings.</value>\n  </data>\n  <data name=\"cmd_settings_help\" xml:space=\"preserve\">\n    <value>Provides get/set methods to change the settings.</value>\n  </data>\n  <data name=\"cmd_settings_help_help\" xml:space=\"preserve\">\n    <value>Get the desciption for a setting.</value>\n  </data>\n  <data name=\"cmd_settings_set_help\" xml:space=\"preserve\">\n    <value>Sets a value from the bot settings.</value>\n  </data>\n  <data name=\"_undocumented\" xml:space=\"preserve\">\n    <value>This feature is not documented.</value>\n  </data>\n  <data name=\"cmd_bot_avatar_set_help\" xml:space=\"preserve\">\n    <value>Sets an avatar for the bot</value>\n  </data>\n  <data name=\"cmd_song_position_help\" xml:space=\"preserve\">\n    <value>Gets the length and position of the current track.</value>\n  </data>\n  <data name=\"error_missing_right\" xml:space=\"preserve\">\n    <value>You cannot execute '{0}'. You are missing the '{1}' right!</value>\n  </data>\n  <data name=\"cmd_repeat_all_help\" xml:space=\"preserve\">\n    <value>Repeats the entire playlist.</value>\n  </data>\n  <data name=\"cmd_repeat_info_all\" xml:space=\"preserve\">\n    <value>Repeating the playlist.</value>\n  </data>\n  <data name=\"cmd_repeat_info_off\" xml:space=\"preserve\">\n    <value>Not repeating.</value>\n  </data>\n  <data name=\"cmd_repeat_info_one\" xml:space=\"preserve\">\n    <value>Repeating a single song.</value>\n  </data>\n  <data name=\"cmd_bot_avatar_clear_help\" xml:space=\"preserve\">\n    <value>Clears the avatar of the bot.</value>\n  </data>\n  <data name=\"error_cmd_could_not_convert_to\" xml:space=\"preserve\">\n    <value>Could not convert \"{0}\" to {1}.</value>\n  </data>\n  <data name=\"error_cmd_no_matching_overload\" xml:space=\"preserve\">\n    <value>No matching function overload could be found.</value>\n  </data>\n  <data name=\"error_cmd_number_too_big\" xml:space=\"preserve\">\n    <value>The number is too big.</value>\n  </data>\n  <data name=\"error_cmd_at_least_n_arguments\" xml:space=\"preserve\">\n    <value>Need at least {0} arguments to evaluate.</value>\n  </data>\n  <data name=\"error_cmd_at_least_three_argument\" xml:space=\"preserve\">\n    <value>Need at least three arguments to evaluate.</value>\n  </data>\n  <data name=\"cmd_bot_description_set_help\" xml:space=\"preserve\">\n    <value>Sets the description of the bot.</value>\n  </data>\n  <data name=\"cmd_settings_bot_reload_help\" xml:space=\"preserve\">\n    <value>Reloads the bot template configuration from the file.</value>\n  </data>\n  <data name=\"cmd_settings_create_help\" xml:space=\"preserve\">\n    <value>Creates a new bot template.</value>\n  </data>\n  <data name=\"cmd_settings_delete_help\" xml:space=\"preserve\">\n    <value>Deletes a bot template.</value>\n  </data>\n  <data name=\"cmd_settings_reload_help\" xml:space=\"preserve\">\n    <value>Reloads the core configuration from the file.</value>\n  </data>\n  <data name=\"cmd_settings_copy_help\" xml:space=\"preserve\">\n    <value>Duplicates a bot template with a new name.</value>\n  </data>\n  <data name=\"cmd_queue_help\" xml:space=\"preserve\">\n    <value>Displays the current play queue.</value>\n  </data>\n  <data name=\"cmd_info_help\" xml:space=\"preserve\">\n    <value>Show's a small summary of the current playlist and queue status.</value>\n  </data>\n  <data name=\"cmd_list_item_name_help\" xml:space=\"preserve\">\n    <value>Renames an item.</value>\n  </data>\n  <data name=\"error_cmd_complexity_reached\" xml:space=\"preserve\">\n    <value>The command exceeded the maximum calling complexity.</value>\n  </data>\n  <data name=\"cmd_alias_add_help\" xml:space=\"preserve\">\n    <value>Creates a new command alias.</value>\n  </data>\n  <data name=\"cmd_alias_list_help\" xml:space=\"preserve\">\n    <value>Lists all currently registered alias.</value>\n  </data>\n  <data name=\"cmd_alias_remove_help\" xml:space=\"preserve\">\n    <value>Removes an existing alias.</value>\n  </data>\n  <data name=\"cmd_alias_show_help\" xml:space=\"preserve\">\n    <value>Shows the implementation of the alias.</value>\n  </data>\n  <data name=\"cmd_pm_user_help\" xml:space=\"preserve\">\n    <value>Writes a message to a particular user.</value>\n  </data>\n  <data name=\"cmd_search_header\" xml:space=\"preserve\">\n    <value>Found the following songs. Use \"{0}\" to play. Use \"{1}\" to queue.</value>\n  </data>\n  <data name=\"cmd_search_no_result\" xml:space=\"preserve\">\n    <value>Found no results for this query.</value>\n  </data>\n  <data name=\"error_select_empty\" xml:space=\"preserve\">\n    <value>Nothing to select...</value>\n  </data>\n  <data name=\"error_value_not_in_range\" xml:space=\"preserve\">\n    <value>Your value is out of range. Select one between {0} and {1}.</value>\n  </data>\n  <data name=\"info_number\" xml:space=\"preserve\">\n    <value>number</value>\n  </data>\n  <data name=\"cmd_select_help\" xml:space=\"preserve\">\n    <value>Selects a song from a previous search and plays it.</value>\n  </data>\n  <data name=\"error_ts_file_too_big\" xml:space=\"preserve\">\n    <value>The file to upload is too big.</value>\n  </data>\n  <data name=\"error_ts_code_781\" xml:space=\"preserve\">\n    <value>Invalid channel password.</value>\n  </data>\n  <data name=\"cmd_subscribe_client_help\" xml:space=\"preserve\">\n    <value>Subscribes the specified client to listen from anywhere</value>\n  </data>\n  <data name=\"cmd_unsubscribe_client_help\" xml:space=\"preserve\">\n    <value>Unsubscribes the specified client to listen from anywhere.</value>\n  </data>\n  <data name=\"cmd_jump_help\" xml:space=\"preserve\">\n    <value>Jumps to the requested index in the current queue and starts playing.</value>\n  </data>\n</root>\n"
  },
  {
    "path": "TS3AudioBot/MainCommands.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing CliWrap;\nusing CliWrap.Buffered;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Algorithm;\nusing TS3AudioBot.Audio;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.CommandSystem.Ast;\nusing TS3AudioBot.CommandSystem.CommandResults;\nusing TS3AudioBot.CommandSystem.Commands;\nusing TS3AudioBot.CommandSystem.Text;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.Environment;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Helper.Diagnose;\nusing TS3AudioBot.History;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Playlists;\nusing TS3AudioBot.Plugins;\nusing TS3AudioBot.ResourceFactories;\nusing TS3AudioBot.Rights;\nusing TS3AudioBot.Sessions;\nusing TS3AudioBot.Web;\nusing TS3AudioBot.Web.Api;\nusing TS3AudioBot.Web.Model;\nusing TSLib;\nusing TSLib.Audio;\nusing TSLib.Full.Book;\nusing TSLib.Helper;\nusing TSLib.Messages;\n\nnamespace TS3AudioBot\n{\n\tpublic static class MainCommands\n\t{\n\t\tinternal static ICommandBag Bag { get; } = new MainCommandsBag();\n\n\t\tinternal class MainCommandsBag : ICommandBag\n\t\t{\n\t\t\tpublic IReadOnlyCollection<BotCommand> BagCommands { get; } = CommandManager.GetBotCommands(null, typeof(MainCommands)).ToArray();\n\t\t\tpublic IReadOnlyCollection<string> AdditionalRights { get; } = new string[] { RightHighVolume, RightDeleteAllPlaylists };\n\t\t}\n\n\t\tpublic const string RightHighVolume = \"ts3ab.admin.volume\";\n\t\tpublic const string RightDeleteAllPlaylists = \"ts3ab.admin.list\";\n\n\t\tprivate const string YesNoOption = \" !(yes|no)\";\n\n\t\t// [...] = Optional\n\t\t// <name> = Placeholder for a text\n\t\t// [text] = Option for fixed text\n\t\t// (a|b) = either or switch\n\n\t\t// ReSharper disable UnusedMember.Global\n\t\t[Command(\"add\")]\n\t\tpublic static async Task CommandAdd(PlayManager playManager, InvokerData invoker, string url, params string[] attributes)\n\t\t\t=> await playManager.Enqueue(invoker, url, meta: PlayManager.ParseAttributes(attributes));\n\n\t\t[Command(\"add\")]\n\t\tpublic static async Task CommandAdd(PlayManager playManager, InvokerData invoker, IAudioResourceResult rsc, params string[] attributes)\n\t\t\t=> await playManager.Enqueue(invoker, rsc.AudioResource, meta: PlayManager.ParseAttributes(attributes));\n\n\t\t[Command(\"alias add\")]\n\t\tpublic static void CommandAliasAdd(CommandManager commandManager, ConfBot confBot, string commandName, string command)\n\t\t{\n\t\t\tcommandManager.RegisterAlias(commandName, command).UnwrapThrow();\n\n\t\t\tvar confEntry = confBot.Commands.Alias.GetOrCreateItem(commandName);\n\t\t\tconfEntry.Value = command;\n\t\t\tconfBot.SaveWhenExists().UnwrapThrow();\n\t\t}\n\n\t\t[Command(\"alias remove\")]\n\t\tpublic static void CommandAliasRemove(CommandManager commandManager, ConfBot confBot, string commandName)\n\t\t{\n\t\t\tcommandManager.UnregisterAlias(commandName).UnwrapThrow();\n\n\t\t\tconfBot.Commands.Alias.RemoveItem(commandName);\n\t\t\tconfBot.SaveWhenExists().UnwrapThrow();\n\t\t}\n\n\t\t[Command(\"alias list\")]\n\t\tpublic static JsonArray<string> CommandAliasList(CommandManager commandManager)\n\t\t\t=> new JsonArray<string>(commandManager.AllAlias.ToArray(), x => string.Join(\",\", x));\n\n\t\t[Command(\"alias show\")]\n\t\tpublic static string? CommandAliasShow(CommandManager commandManager, string commandName)\n\t\t\t=> commandManager.GetAlias(commandName)?.AliasString;\n\n\t\t[Command(\"api token\")]\n\t\t[Usage(\"[<duration>]\", \"Optionally specifies a duration this key is valid in hours.\")]\n\t\tpublic static string CommandApiToken(TokenManager tokenManager, ClientCall invoker, double? validHours = null)\n\t\t{\n\t\t\tif (invoker.Visibiliy != null && invoker.Visibiliy != TextMessageTargetMode.Private)\n\t\t\t\tthrow new CommandException(strings.error_use_private, CommandExceptionReason.CommandError);\n\t\t\tif (invoker.IsAnonymous || invoker.ClientUid == Uid.Null)\n\t\t\t\tthrow new MissingContextCommandException(strings.error_no_uid_found, typeof(ClientCall));\n\n\t\t\tTimeSpan? validSpan = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (validHours != null)\n\t\t\t\t\tvalidSpan = TimeSpan.FromHours(validHours.Value);\n\t\t\t}\n\t\t\tcatch (OverflowException oex)\n\t\t\t{\n\t\t\t\tthrow new CommandException(strings.error_invalid_token_duration, oex, CommandExceptionReason.CommandError);\n\t\t\t}\n\t\t\treturn tokenManager.GenerateToken(invoker.ClientUid.Value!, validSpan);\n\t\t}\n\n\t\t[Command(\"bot avatar set\")]\n\t\tpublic static async Task CommandBotAvatarSet(Ts3Client ts3Client, string url)\n\t\t{\n\t\t\turl = TextUtil.ExtractUrlFromBb(url);\n\t\t\tawait WebWrapper.Request(url).ToAction(async x =>\n\t\t\t{\n\t\t\t\tusing var stream = await x.Content.ReadAsStreamAsync();\n\t\t\t\tusing var image = await ImageUtil.ResizeImageSave(stream);\n\t\t\t\tawait ts3Client.UploadAvatar(image.Stream);\n\t\t\t});\n\t\t}\n\n\t\t[Command(\"bot avatar clear\")]\n\t\tpublic static Task CommandBotAvatarClear(Ts3Client ts3Client) => ts3Client.DeleteAvatar();\n\n\t\t[Command(\"bot badges\")]\n\t\tpublic static Task CommandBotBadges(Ts3Client ts3Client, string badges) => ts3Client.ChangeBadges(badges);\n\n\t\t[Command(\"bot description set\")]\n\t\tpublic static Task CommandBotDescriptionSet(Ts3Client ts3Client, string description) => ts3Client.ChangeDescription(description);\n\n\t\t[Command(\"bot diagnose\", \"_undocumented\")]\n\t\tpublic static async Task<JsonArray<SelfDiagnoseMessage>> CommandBotDiagnose(Player player, IVoiceTarget target, Connection book, ConfRoot rootConf, WebServer webServer)\n\t\t{\n\t\t\tvar problems = new List<SelfDiagnoseMessage>();\n\t\t\t// ** Diagnose common playback problems and more **\n\n\t\t\tvar self = book.Self();\n\t\t\tvar curChan = book.CurrentChannel();\n\n\t\t\t// Check talk power\n\t\t\tif (self != null && curChan != null && !self.TalkPowerGranted && self.TalkPower < curChan.NeededTalkPower)\n\t\t\t\tproblems.Add(new SelfDiagnoseMessage(\"The bot does not have enough talk power.\", \"play\", SelfDiagnoseLevel.Warning));\n\n\t\t\t// Check volume 0\n\t\t\tif (player.Volume == 0)\n\t\t\t\tproblems.Add(new SelfDiagnoseMessage(\"The volume level is at 0.\", \"play\", SelfDiagnoseLevel.Warning));\n\n\t\t\t// Check if send mode hasn't been selected yet\n\t\t\tif (target.SendMode == TargetSendMode.None)\n\t\t\t\tproblems.Add(new SelfDiagnoseMessage(\"Send mode is currently 'None', use '!whisper off' for example to send via voice.\", \"play\", SelfDiagnoseLevel.Warning));\n\n\t\t\t// - Check if ffmpeg exists\n\t\t\t// - Check ffmpeg https support (https://gitter.im/TS3AudioBot/Lobby?at=5eaf1e14f0377f1631656b7a)\n\t\t\t//   Seems like CentOS 7 for e.g. by default has no https\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar ffPath = rootConf.Tools.Ffmpeg.Path.Value;\n\t\t\t\tvar result = await Cli.Wrap(ffPath)\n\t\t\t\t\t.WithArguments(new[] { \"-hide_banner\", \"-protocols\" })\n\t\t\t\t\t.ExecuteBufferedAsync();\n\t\t\t\tvar protos = new HashSet<string>(result.StandardOutput\n\t\t\t\t\t.Split('\\n')\n\t\t\t\t\t.Select(x => x.Trim())\n\t\t\t\t\t.SkipWhile(x => x != \"Input:\").Skip(1)\n\t\t\t\t\t.TakeWhile(x => x != \"Output:\"));\n\t\t\t\tforeach (var wantProto in new[] { \"http\", \"https\", \"hls\" })\n\t\t\t\t{\n\t\t\t\t\tif (!protos.Contains(wantProto))\n\t\t\t\t\t\tproblems.Add(new SelfDiagnoseMessage($\"Your ffmpeg binary is missing '{wantProto}'. Some streams might not play.\", \"play\", SelfDiagnoseLevel.Warning));\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tproblems.Add(new SelfDiagnoseMessage($\"Could not find or run ffmpeg binary. Playback will NOT work. ({ex.Message})\", \"play\", SelfDiagnoseLevel.Error));\n\t\t\t}\n\n\t\t\t// Check if web path is found\n\t\t\t{\n\t\t\t\tif (!rootConf.Web.Interface.Enabled)\n\t\t\t\t\tproblems.Add(new SelfDiagnoseMessage($\"WebInterface is disabled.\", \"web\", SelfDiagnoseLevel.Info));\n\n\t\t\t\tvar webPath = webServer.FindWebFolder();\n\t\t\t\tif (rootConf.Web.Interface.Enabled &&\n\t\t\t\t\t(webPath is null || !Directory.Exists(webPath) || !System.IO.File.Exists(Path.Combine(webPath, \"index.html\"))))\n\t\t\t\t\tproblems.Add(new SelfDiagnoseMessage($\"WebInterface is enabled, but the required files are missing.\", \"web\", SelfDiagnoseLevel.Error));\n\t\t\t}\n\n\t\t\treturn new JsonArray<SelfDiagnoseMessage>(problems, x =>\n\t\t\t{\n\t\t\t\tif (x.Count == 0)\n\t\t\t\t\treturn \"No problems detected\";\n\t\t\t\tvar strb = new StringBuilder(\"The following issues have been found:\");\n\t\t\t\tforeach (var prob in x)\n\t\t\t\t\tstrb.Append(\"\\n- \").Append(prob.Level).Append(\": \").Append(prob.Description);\n\t\t\t\treturn strb.ToString();\n\t\t\t});\n\t\t}\n\n\t\t[Command(\"bot disconnect\")]\n\t\tpublic static async Task CommandBotDisconnect(Bot bot) => await bot.Stop();\n\n\t\t[Command(\"bot commander\")]\n\t\tpublic static async Task<JsonValue<bool>> CommandBotCommander(Ts3Client ts3Client)\n\t\t{\n\t\t\tvar value = await ts3Client.IsChannelCommander();\n\t\t\treturn new JsonValue<bool>(value, string.Format(strings.info_status_channelcommander, value ? strings.info_on : strings.info_off));\n\t\t}\n\t\t[Command(\"bot commander on\")]\n\t\tpublic static Task CommandBotCommanderOn(Ts3Client ts3Client) => ts3Client.SetChannelCommander(true);\n\t\t[Command(\"bot commander off\")]\n\t\tpublic static Task CommandBotCommanderOff(Ts3Client ts3Client) => ts3Client.SetChannelCommander(false);\n\n\t\t[Command(\"bot come\")]\n\t\tpublic static Task CommandBotCome(Ts3Client ts3Client, ClientCall invoker, string? password = null)\n\t\t{\n\t\t\tvar channel = invoker?.ChannelId;\n\t\t\tif (channel == null)\n\t\t\t\tthrow new CommandException(strings.error_no_target_channel, CommandExceptionReason.CommandError);\n\t\t\treturn ts3Client.MoveTo(channel.Value, password);\n\t\t}\n\n\t\t[Command(\"bot connect template\")]\n\t\tpublic static async Task<BotInfo> CommandBotConnectTo(BotManager bots, string name)\n\t\t{\n\t\t\tvar botInfo = await bots.RunBotTemplate(name);\n\t\t\tif (!botInfo.Ok)\n\t\t\t\tthrow new CommandException(strings.error_could_not_create_bot + $\" ({botInfo.Error})\", CommandExceptionReason.CommandError);\n\t\t\treturn botInfo.Value;\n\t\t}\n\n\t\t[Command(\"bot connect to\")]\n\t\tpublic static async Task<BotInfo> CommandBotConnectNew(BotManager bots, string address, string? password = null)\n\t\t{\n\t\t\tvar botConf = bots.CreateNewBot();\n\t\t\tbotConf.Connect.Address.Value = address;\n\t\t\tif (!string.IsNullOrEmpty(password))\n\t\t\t\tbotConf.Connect.ServerPassword.Password.Value = password;\n\t\t\tvar botInfo = await bots.RunBot(botConf);\n\t\t\tif (!botInfo.Ok)\n\t\t\t\tthrow new CommandException(strings.error_could_not_create_bot + $\" ({botInfo.Error})\", CommandExceptionReason.CommandError);\n\t\t\treturn botInfo.Value;\n\t\t}\n\n\t\t[Command(\"bot info\")]\n\t\tpublic static BotInfo CommandBotInfo(Bot bot) => bot.GetInfo();\n\n\t\t[Command(\"bot info client\", \"_undocumented\")]\n\t\tpublic static Client? CommandBotInfoClient(Connection book, ApiCall _) => book.Self();\n\n\t\t[Command(\"bot info template\", \"cmd_bot_info_help\")]\n\t\tpublic static BotInfo CommandBotInfo(BotManager botManager, ConfRoot config, string name)\n\t\t{\n\t\t\tvar bot = botManager.GetBotLock(name);\n\t\t\tif (bot != null)\n\t\t\t\treturn CommandBotInfo(bot);\n\t\t\tvar botInfo = GetOfflineBotInfo(config, name).UnwrapThrow();\n\t\t\treturn botInfo;\n\t\t}\n\n\t\t[Command(\"bot list\")]\n\t\tpublic static JsonArray<BotInfo> CommandBotList(BotManager bots, ConfRoot config)\n\t\t{\n\t\t\tvar botInfoList = bots.GetBotInfolist();\n\t\t\tvar botConfigList = config.GetAllBots() ?? Array.Empty<ConfBot>();\n\t\t\tvar infoList = new Dictionary<string, BotInfo>();\n\t\t\tforeach (var botInfo in botInfoList)\n\t\t\t{\n\t\t\t\tif (string.IsNullOrEmpty(botInfo.Name))\n\t\t\t\t\tcontinue;\n\t\t\t\tinfoList[botInfo.Name] = botInfo;\n\t\t\t}\n\t\t\tforeach (var botConfig in botConfigList)\n\t\t\t{\n\t\t\t\tvar name = botConfig.Name;\n\t\t\t\tif (name is null || infoList.ContainsKey(name))\n\t\t\t\t\tcontinue;\n\t\t\t\tinfoList[name] = GetOfflineBotInfo(botConfig);\n\t\t\t}\n\t\t\treturn new JsonArray<BotInfo>(infoList.Values.Concat(botInfoList.Where(x => string.IsNullOrEmpty(x.Name))).ToArray(),\n\t\t\t\tbl => string.Join(\"\\n\", bl.Select(x => x.ToString())));\n\t\t}\n\n\t\tprivate static R<BotInfo, LocalStr> GetOfflineBotInfo(ConfRoot config, string name)\n\t\t{\n\t\t\tvar result = config.GetBotConfig(name);\n\t\t\tif (!result.Ok)\n\t\t\t\treturn new LocalStr(result.Error.Message);\n\t\t\tvar botConfig = result.Value;\n\t\t\treturn GetOfflineBotInfo(botConfig);\n\t\t}\n\n\t\tprivate static BotInfo GetOfflineBotInfo(ConfBot botConfig)\n\t\t{\n\t\t\treturn new BotInfo\n\t\t\t{\n\t\t\t\tId = null,\n\t\t\t\tName = botConfig.Name,\n\t\t\t\tServer = botConfig.Connect.Address,\n\t\t\t\tStatus = BotStatus.Offline,\n\t\t\t};\n\t\t}\n\n\t\t[Command(\"bot move\")]\n\t\tpublic static Task CommandBotMove(Ts3Client ts3Client, ulong channel, string? password = null) => ts3Client.MoveTo((ChannelId)channel, password);\n\n\t\t[Command(\"bot name\")]\n\t\tpublic static Task CommandBotName(Ts3Client ts3Client, string name) => ts3Client.ChangeName(name);\n\n\t\t[Command(\"bot save\")]\n\t\tpublic static void CommandBotSetup(ConfBot botConfig, string name) => botConfig.SaveNew(name).UnwrapThrow();\n\n\t\t[Command(\"bot setup\")]\n\t\tpublic static async Task CommandBotSetup(Ts3Client ts3Client, string? adminToken = null)\n\t\t{\n\t\t\tawait ts3Client.SetupRights(adminToken);\n\t\t}\n\n\t\t[Command(\"bot template\", \"cmd_bot_use_help\")]\n\t\tpublic static async Task<object?> CommandBotTemplate(ExecutionInformation info, BotManager bots, string botName, ICommand cmd)\n\t\t{\n\t\t\tvar bot = bots.GetBotLock(botName);\n\t\t\treturn await CommandBotUseInternal(info, bot, cmd);\n\t\t}\n\n\t\t[Command(\"bot use\")]\n\t\tpublic static async Task<object?> CommandBotUse(ExecutionInformation info, BotManager bots, int botId, ICommand cmd)\n\t\t{\n\t\t\tvar bot = bots.GetBotLock(botId);\n\t\t\treturn await CommandBotUseInternal(info, bot, cmd);\n\t\t}\n\n\t\tprivate static async Task<object?> CommandBotUseInternal(ExecutionInformation info, Bot? bot, ICommand cmd)\n\t\t{\n\t\t\tif (bot is null)\n\t\t\t\tthrow new CommandException(strings.error_bot_does_not_exist, CommandExceptionReason.CommandError);\n\n\t\t\tvar backParent = info.ParentInjector;\n\t\t\tinfo.ParentInjector = bot.Injector;\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn await bot.Scheduler.InvokeAsync(() => cmd.Execute(info, Array.Empty<ICommand>()).AsTask());\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tinfo.ParentInjector = backParent;\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"clear\")]\n\t\tpublic static void CommandClear(PlaylistManager playlistManager) => playlistManager.Clear();\n\n\t\t[Command(\"command parse\", \"cmd_parse_command_help\")]\n\t\tpublic static JsonValue<AstNode> CommandParse(string parameter)\n\t\t{\n\t\t\tvar node = CommandParser.ParseCommandRequest(parameter);\n\t\t\tvar strb = new StringBuilder();\n\t\t\tstrb.AppendLine();\n\t\t\tnode.Write(strb, 0);\n\t\t\treturn new JsonValue<AstNode>(node, strb.ToString());\n\t\t}\n\n\t\t[Command(\"command tree\", \"_undocumented\")]\n\t\tpublic static string CommandTree(CommandManager commandManager)\n\t\t{\n\t\t\treturn CommandManager.GetTree(commandManager.RootGroup);\n\t\t}\n\n\t\t[Command(\"data song cover get\", \"_undocumented\")]\n\t\tpublic static DataStream CommandData(ResolveContext resourceFactory, PlayManager playManager) =>\n\t\t\tnew DataStream(async response =>\n\t\t\t{\n\t\t\t\tvar cur = playManager.CurrentPlayData;\n\t\t\t\tif (cur is null)\n\t\t\t\t\tthrow Error.LocalStr(strings.info_currently_not_playing);\n\t\t\t\tawait resourceFactory.GetThumbnail(cur.PlayResource, async stream =>\n\t\t\t\t{\n\t\t\t\t\tusing var image = await ImageUtil.ResizeImageSave(stream);\n\t\t\t\t\tresponse.ContentType = image.Mime;\n\t\t\t\t\tawait image.Stream.CopyToAsync(response.Body);\n\t\t\t\t});\n\t\t\t});\n\n\t\t[Command(\"eval\")]\n\t\t[Usage(\"<command> <arguments...>\", \"Executes the given command on arguments\")]\n\t\t[Usage(\"<strings...>\", \"Concat the strings and execute them with the command system\")]\n\t\tpublic static async Task<object?> CommandEval(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\t// Evaluate the first argument on the rest of the arguments\n\t\t\tif (arguments.Count == 0)\n\t\t\t\tthrow new CommandException(strings.error_cmd_at_least_one_argument, CommandExceptionReason.MissingParameter);\n\t\t\tvar leftArguments = arguments.TrySegment(1);\n\t\t\tvar arg0 = await arguments[0].Execute(info, Array.Empty<ICommand>());\n\t\t\tswitch (arg0)\n\t\t\t{\n\t\t\tcase ICommand command:\n\t\t\t\treturn await command.Execute(info, leftArguments);\n\t\t\tcase null:\n\t\t\t\treturn null;\n\t\t\tdefault:\n\t\t\t\tvar cmdStr = arg0.ToString()!;\n\t\t\t\t// We got a string back so parse and evaluate it\n\t\t\t\tvar cmd = CommandManager.AstToCommandResult(CommandParser.ParseCommandRequest(cmdStr));\n\t\t\t\treturn await cmd.Execute(info, leftArguments);\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"from\", \"_undocumented\")]\n\t\tpublic static async Task CommandFrom(PlayManager playManager, InvokerData invoker, string factoryName, string url)\n\t\t\t=> await playManager.Play(invoker, url, factoryName);\n\n\t\t[Command(\"get\", \"_undocumented\")]\n\t\t[Usage(\"<index> <list...>\", \"Get an element out of a list\")]\n\t\tpublic static object? CommandGet(uint index, System.Collections.IEnumerable list)\n\t\t{\n\t\t\tforeach (var i in list)\n\t\t\t{\n\t\t\t\tif (index == 0)\n\t\t\t\t\treturn i;\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\t[Command(\"getmy id\")]\n\t\tpublic static ushort CommandGetId(ClientCall invoker)\n\t\t\t=> invoker.ClientId?.Value ?? throw new CommandException(strings.error_not_found, CommandExceptionReason.CommandError);\n\t\t[Command(\"getmy uid\")]\n\t\tpublic static string? CommandGetUid(ClientCall invoker)\n\t\t\t=> invoker.ClientUid.Value;\n\t\t[Command(\"getmy name\")]\n\t\tpublic static string CommandGetName(ClientCall invoker)\n\t\t\t=> invoker.NickName ?? throw new CommandException(strings.error_not_found, CommandExceptionReason.CommandError);\n\t\t[Command(\"getmy dbid\")]\n\t\tpublic static ulong CommandGetDbId(ClientCall invoker)\n\t\t\t=> invoker.DatabaseId?.Value ?? throw new CommandException(strings.error_not_found, CommandExceptionReason.CommandError);\n\t\t[Command(\"getmy channel\")]\n\t\tpublic static ulong CommandGetChannel(ClientCall invoker)\n\t\t\t=> invoker.ChannelId?.Value ?? throw new CommandException(strings.error_not_found, CommandExceptionReason.CommandError);\n\t\t[Command(\"getmy all\")]\n\t\tpublic static JsonValue<ClientCall> CommandGetUser(ClientCall invoker)\n\t\t\t=> new JsonValue<ClientCall>(invoker, $\"Client: Id:{invoker.ClientId} DbId:{invoker.DatabaseId} ChanId:{invoker.ChannelId} Uid:{invoker.ClientUid}\"); // LOC: TODO\n\n\t\t[Command(\"getuser uid byid\")]\n\t\tpublic static async Task<string> CommandGetUidById(Ts3Client ts3Client, ushort id) => (await ts3Client.GetFallbackedClientById((ClientId)id)).Uid?.Value ?? \"\";\n\t\t[Command(\"getuser name byid\")]\n\t\tpublic static async Task<string> CommandGetNameById(Ts3Client ts3Client, ushort id) => (await ts3Client.GetFallbackedClientById((ClientId)id)).Name;\n\t\t[Command(\"getuser dbid byid\")]\n\t\tpublic static async Task<ulong> CommandGetDbIdById(Ts3Client ts3Client, ushort id) => (await ts3Client.GetFallbackedClientById((ClientId)id)).DatabaseId.Value;\n\t\t[Command(\"getuser channel byid\")]\n\t\tpublic static async Task<ulong> CommandGetChannelById(Ts3Client ts3Client, ushort id) => (await ts3Client.GetFallbackedClientById((ClientId)id)).ChannelId.Value;\n\t\t[Command(\"getuser all byid\")]\n\t\tpublic static async Task<JsonValue<ClientList>> CommandGetUserById(Ts3Client ts3Client, ushort id)\n\t\t{\n\t\t\tvar client = await ts3Client.GetFallbackedClientById((ClientId)id);\n\t\t\treturn new JsonValue<ClientList>(client, $\"Client: Id:{client.ClientId} DbId:{client.DatabaseId} ChanId:{client.ChannelId} Uid:{client.Uid}\");\n\t\t}\n\t\t[Command(\"getuser id byname\")]\n\t\tpublic static async Task<ushort> CommandGetIdByName(Ts3Client ts3Client, string username) => (await ts3Client.GetClientByName(username)).ClientId.Value;\n\t\t[Command(\"getuser all byname\")]\n\t\tpublic static async Task<JsonValue<ClientList>> CommandGetUserByName(Ts3Client ts3Client, string username)\n\t\t{\n\t\t\tvar client = await ts3Client.GetClientByName(username);\n\t\t\treturn new JsonValue<ClientList>(client, $\"Client: Id:{client.ClientId} DbId:{client.DatabaseId} ChanId:{client.ChannelId} Uid:{client.Uid}\");\n\t\t}\n\t\t[Command(\"getuser name bydbid\")]\n\t\tpublic static async Task<string> CommandGetNameByDbId(Ts3Client ts3Client, ulong dbId) => (await ts3Client.GetDbClientByDbId((ClientDbId)dbId)).Name;\n\t\t[Command(\"getuser uid bydbid\")]\n\t\tpublic static async Task<string?> CommandGetUidByDbId(Ts3Client ts3Client, ulong dbId) => (await ts3Client.GetDbClientByDbId((ClientDbId)dbId)).Uid.Value;\n\n\t\tprivate static readonly TextMod HelpCommand = new TextMod(TextModFlag.Bold);\n\t\tprivate static readonly TextMod HelpCommandParam = new TextMod(TextModFlag.Italic);\n\n\t\t[Command(\"help\")]\n\t\tpublic static string CommandHelp(CallerInfo callerInfo)\n\t\t{\n\t\t\tvar tmb = new TextModBuilder(callerInfo.IsColor);\n\t\t\ttmb.AppendLine(\"TS3AudioBot at your service!\");\n\t\t\ttmb.AppendLine(\"To get some basic help on how to get started use one of the following commands:\");\n\t\t\ttmb.Append(\"!help play\", HelpCommand).AppendLine(\" : basics for playing songs\");\n\t\t\ttmb.Append(\"!help playlists\", HelpCommand).AppendLine(\" : how to manage playlists\");\n\t\t\ttmb.Append(\"!help history\", HelpCommand).AppendLine(\" : viewing and accesing the play history\");\n\t\t\ttmb.Append(\"!help bot\", HelpCommand).AppendLine(\" : useful features to configure your bot\");\n\t\t\ttmb.Append(\"!help all\", HelpCommand).AppendLine(\" : show all commands\");\n\t\t\ttmb.Append(\"!help command\", HelpCommand).Append(\" <command path>\", HelpCommandParam).AppendLine(\" : help text of a specific command\");\n\t\t\tvar str = tmb.ToString();\n\t\t\treturn str;\n\t\t}\n\n\t\t[Command(\"help all\", \"_undocumented\")]\n\t\tpublic static JsonArray<string> CommandHelpAll(CommandManager commandManager)\n\t\t{\n\t\t\tvar botComList = commandManager.RootGroup.Commands.Select(c => c.Key).ToArray();\n\t\t\treturn new JsonArray<string>(botComList, bcl =>\n\t\t\t{\n\t\t\t\tvar strb = new StringBuilder();\n\t\t\t\tforeach (var botCom in bcl)\n\t\t\t\t\tstrb.Append(botCom).Append(\", \");\n\t\t\t\tstrb.Length -= 2;\n\t\t\t\treturn strb.ToString();\n\t\t\t});\n\t\t}\n\n\t\t[Command(\"help command\", \"_undocumented\")]\n\t\tpublic static JsonObject CommandHelpCommand(CommandManager commandManager, IFilter? filter = null, params string[] command)\n\t\t{\n\t\t\tif (command.Length == 0)\n\t\t\t{\n\t\t\t\treturn new JsonEmpty(strings.error_cmd_at_least_one_argument);\n\t\t\t}\n\n\t\t\tCommandGroup? group = commandManager.RootGroup;\n\t\t\tICommand? target = group;\n\t\t\tfilter ??= Filter.DefaultFilter;\n\t\t\tvar realPath = new List<string>();\n\t\t\tfor (int i = 0; i < command.Length; i++)\n\t\t\t{\n\t\t\t\tvar possibilities = filter.Filter(group.Commands, command[i]).ToList();\n\t\t\t\tif (possibilities.Count <= 0)\n\t\t\t\t\tthrow new CommandException(strings.cmd_help_error_no_matching_command, CommandExceptionReason.CommandError);\n\t\t\t\tif (possibilities.Count > 1)\n\t\t\t\t\tthrow new CommandException(string.Format(strings.cmd_help_error_ambiguous_command, string.Join(\", \", possibilities.Select(kvp => kvp.Key))), CommandExceptionReason.CommandError);\n\n\t\t\t\trealPath.Add(possibilities[0].Key);\n\t\t\t\ttarget = possibilities[0].Value;\n\n\t\t\t\tif (i < command.Length - 1)\n\t\t\t\t{\n\t\t\t\t\tgroup = target as CommandGroup;\n\t\t\t\t\tif (group is null)\n\t\t\t\t\t\tthrow new CommandException(string.Format(strings.cmd_help_error_no_further_subfunctions, string.Join(\" \", realPath, 0, i)), CommandExceptionReason.CommandError);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch (target)\n\t\t\t{\n\t\t\tcase BotCommand targetB:\n\t\t\t\treturn JsonValue.Create(targetB);\n\t\t\tcase CommandGroup targetCg:\n\t\t\t\tvar subList = targetCg.Commands.Select(g => g.Key).ToArray();\n\t\t\t\treturn new JsonArray<string>(subList, string.Format(strings.cmd_help_info_contains_subfunctions, string.Join(\", \", subList)));\n\t\t\tcase OverloadedFunctionCommand targetOfc:\n\t\t\t\tvar strb = new StringBuilder();\n\t\t\t\tforeach (var botCom in targetOfc.Functions.OfType<BotCommand>())\n\t\t\t\t\tstrb.Append(botCom);\n\t\t\t\treturn JsonValue.Create(strb.ToString());\n\t\t\tcase AliasCommand targetAlias:\n\t\t\t\treturn JsonValue.Create(string.Format(\"'{0}' is an alias for:\\n{1}\", string.Join(\" \", realPath), targetAlias.AliasString));\n\t\t\tdefault:\n\t\t\t\tthrow new CommandException(strings.cmd_help_error_unknown_error, CommandExceptionReason.CommandError);\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"help play\", \"_undocumented\")]\n\t\tpublic static string CommandHelpPlay()\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\n\t\t[Command(\"history add\")]\n\t\tpublic static async Task CommandHistoryQueue(HistoryManager historyManager, PlayManager playManager, InvokerData invoker, uint hid)\n\t\t{\n\t\t\tvar ale = historyManager.GetEntryById(hid).UnwrapThrow();\n\t\t\tawait playManager.Enqueue(invoker, ale.AudioResource);\n\t\t}\n\n\t\t[Command(\"history clean\")]\n\t\tpublic static JsonEmpty CommandHistoryClean(DbStore database, CallerInfo caller, UserSession? session = null)\n\t\t{\n\t\t\tif (caller.ApiCall)\n\t\t\t{\n\t\t\t\tdatabase.CleanFile();\n\t\t\t\treturn new JsonEmpty(string.Empty);\n\t\t\t}\n\n\t\t\tTask<string?> ResponseHistoryClean(string message)\n\t\t\t{\n\t\t\t\tif (TextUtil.GetAnswer(message) == Answer.Yes)\n\t\t\t\t{\n\t\t\t\t\tdatabase.CleanFile();\n\t\t\t\t\treturn Task.FromResult<string?>(strings.info_cleanup_done);\n\t\t\t\t}\n\t\t\t\treturn Task.FromResult<string?>(null);\n\t\t\t}\n\t\t\tsession.SetResponse(ResponseHistoryClean);\n\t\t\treturn new JsonEmpty($\"{strings.cmd_history_clean_confirm_clean} {strings.info_bot_might_be_unresponsive} {YesNoOption}\");\n\t\t}\n\n\t\t[Command(\"history clean removedefective\")]\n\t\tpublic static async Task<JsonEmpty> CommandHistoryCleanRemove(HistoryManager historyManager, ResolveContext resourceFactory, CallerInfo caller, UserSession? session = null)\n\t\t{\n\t\t\tif (caller.ApiCall)\n\t\t\t{\n\t\t\t\tawait historyManager.RemoveBrokenLinks(resourceFactory);\n\t\t\t\treturn new JsonEmpty(string.Empty);\n\t\t\t}\n\n\t\t\tasync Task<string?> ResponseHistoryCleanRemove(string message)\n\t\t\t{\n\t\t\t\tif (TextUtil.GetAnswer(message) == Answer.Yes)\n\t\t\t\t{\n\t\t\t\t\tawait historyManager.RemoveBrokenLinks(resourceFactory);\n\t\t\t\t\treturn strings.info_cleanup_done;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tsession.SetResponse(ResponseHistoryCleanRemove);\n\t\t\treturn new JsonEmpty($\"{strings.cmd_history_clean_removedefective_confirm_clean} {strings.info_bot_might_be_unresponsive} {YesNoOption}\");\n\t\t}\n\n\t\t[Command(\"history clean upgrade\", \"_undocumented\")]\n\t\tpublic static async Task CommandHistoryCleanUpgrade(HistoryManager historyManager, Ts3Client ts3Client)\n\t\t{\n\t\t\tawait historyManager.UpdadeDbIdToUid(ts3Client);\n\t\t}\n\n\t\t[Command(\"history delete\")]\n\t\tpublic static JsonEmpty CommandHistoryDelete(HistoryManager historyManager, CallerInfo caller, uint id, UserSession? session = null)\n\t\t{\n\t\t\tvar ale = historyManager.GetEntryById(id).UnwrapThrow();\n\n\t\t\tif (caller.ApiCall)\n\t\t\t{\n\t\t\t\thistoryManager.RemoveEntry(ale);\n\t\t\t\treturn new JsonEmpty(string.Empty);\n\t\t\t}\n\n\t\t\tTask<string?> ResponseHistoryDelete(string message)\n\t\t\t{\n\t\t\t\tAnswer answer = TextUtil.GetAnswer(message);\n\t\t\t\tif (answer == Answer.Yes)\n\t\t\t\t{\n\t\t\t\t\thistoryManager.RemoveEntry(ale);\n\t\t\t\t}\n\t\t\t\treturn Task.FromResult<string?>(null);\n\t\t\t}\n\n\t\t\tsession.SetResponse(ResponseHistoryDelete);\n\t\t\tvar name = ale.AudioResource.ResourceTitle;\n\t\t\tif (name?.Length > 100)\n\t\t\t\tname = name.Substring(100) + \"...\";\n\t\t\treturn new JsonEmpty(string.Format(strings.cmd_history_delete_confirm + YesNoOption, name, id));\n\t\t}\n\n\t\t[Command(\"history from\")]\n\t\tpublic static JsonArray<AudioLogEntry> CommandHistoryFrom(HistoryManager historyManager, string userUid, int? amount = null)\n\t\t{\n\t\t\tvar query = new SeachQuery { UserUid = userUid };\n\t\t\tif (amount != null)\n\t\t\t\tquery.MaxResults = amount.Value;\n\n\t\t\tvar results = historyManager.Search(query).ToArray();\n\t\t\treturn new JsonArray<AudioLogEntry>(results, historyManager.Format);\n\t\t}\n\n\t\t[Command(\"history id\", \"cmd_history_id_uint_help\")]\n\t\tpublic static JsonValue<AudioLogEntry> CommandHistoryId(HistoryManager historyManager, uint id)\n\t\t{\n\t\t\tvar result = historyManager.GetEntryById(id).UnwrapThrow();\n\t\t\treturn new JsonValue<AudioLogEntry>(result, r => historyManager.Format(r));\n\t\t}\n\n\t\t[Command(\"history id\", \"cmd_history_id_string_help\")]\n\t\tpublic static JsonValue<uint> CommandHistoryId(HistoryManager historyManager, string special)\n\t\t{\n\t\t\tif (special == \"last\")\n\t\t\t\treturn new JsonValue<uint>(historyManager.HighestId, string.Format(strings.cmd_history_id_last, historyManager.HighestId));\n\t\t\telse if (special == \"next\")\n\t\t\t\treturn new JsonValue<uint>(historyManager.HighestId + 1, string.Format(strings.cmd_history_id_next, historyManager.HighestId + 1));\n\t\t\telse\n\t\t\t\tthrow new CommandException(\"Unrecognized name descriptor\", CommandExceptionReason.CommandError);\n\t\t}\n\n\t\t[Command(\"history last\", \"cmd_history_last_int_help\")]\n\t\tpublic static JsonArray<AudioLogEntry> CommandHistoryLast(HistoryManager historyManager, int amount)\n\t\t{\n\t\t\tvar query = new SeachQuery { MaxResults = amount };\n\t\t\tvar results = historyManager.Search(query).ToArray();\n\t\t\treturn new JsonArray<AudioLogEntry>(results, historyManager.Format);\n\t\t}\n\n\t\t[Command(\"history last\", \"cmd_history_last_help\")]\n\t\tpublic static async Task CommandHistoryLast(HistoryManager historyManager, PlayManager playManager, InvokerData invoker)\n\t\t{\n\t\t\tvar ale = historyManager.Search(new SeachQuery { MaxResults = 1 }).FirstOrDefault();\n\t\t\tif (ale is null)\n\t\t\t\tthrow new CommandException(strings.cmd_history_last_is_empty, CommandExceptionReason.CommandError);\n\t\t\tawait playManager.Play(invoker, ale.AudioResource);\n\t\t}\n\n\t\t[Command(\"history play\")]\n\t\tpublic static async Task CommandHistoryPlay(HistoryManager historyManager, PlayManager playManager, InvokerData invoker, uint hid)\n\t\t{\n\t\t\tvar ale = historyManager.GetEntryById(hid).UnwrapThrow();\n\t\t\tawait playManager.Play(invoker, ale.AudioResource);\n\t\t}\n\n\t\t[Command(\"history rename\")]\n\t\tpublic static void CommandHistoryRename(HistoryManager historyManager, uint id, string newName)\n\t\t{\n\t\t\tvar ale = historyManager.GetEntryById(id).UnwrapThrow();\n\n\t\t\tif (string.IsNullOrWhiteSpace(newName))\n\t\t\t\tthrow new CommandException(strings.cmd_history_rename_invalid_name, CommandExceptionReason.CommandError);\n\n\t\t\thistoryManager.RenameEntry(ale, newName);\n\t\t}\n\n\t\t[Command(\"history till\", \"cmd_history_till_DateTime_help\")]\n\t\tpublic static JsonArray<AudioLogEntry> CommandHistoryTill(HistoryManager historyManager, DateTime time)\n\t\t{\n\t\t\tvar query = new SeachQuery { LastInvokedAfter = time };\n\t\t\tvar results = historyManager.Search(query).ToArray();\n\t\t\treturn new JsonArray<AudioLogEntry>(results, historyManager.Format);\n\t\t}\n\n\t\t[Command(\"history till\", \"cmd_history_till_string_help\")]\n\t\tpublic static JsonArray<AudioLogEntry> CommandHistoryTill(HistoryManager historyManager, string time)\n\t\t{\n\t\t\tvar tillTime = (time.ToLowerInvariant()) switch\n\t\t\t{\n\t\t\t\t\"hour\" => DateTime.Now.AddHours(-1),\n\t\t\t\t\"today\" => DateTime.Today,\n\t\t\t\t\"yesterday\" => DateTime.Today.AddDays(-1),\n\t\t\t\t\"week\" => DateTime.Today.AddDays(-7),\n\t\t\t\t_ => throw new CommandException(strings.error_unrecognized_descriptor, CommandExceptionReason.CommandError),\n\t\t\t};\n\t\t\tvar query = new SeachQuery { LastInvokedAfter = tillTime };\n\t\t\tvar results = historyManager.Search(query).ToArray();\n\t\t\treturn new JsonArray<AudioLogEntry>(results, historyManager.Format);\n\t\t}\n\n\t\t[Command(\"history title\")]\n\t\tpublic static JsonArray<AudioLogEntry> CommandHistoryTitle(HistoryManager historyManager, string part)\n\t\t{\n\t\t\tvar query = new SeachQuery { TitlePart = part };\n\t\t\tvar results = historyManager.Search(query).ToArray();\n\t\t\treturn new JsonArray<AudioLogEntry>(results, historyManager.Format);\n\t\t}\n\n\t\t[Command(\"if\")]\n\t\t[Usage(\"<argument0> <comparator> <argument1> <then>\", \"Compares the two arguments and returns or executes the then-argument\")]\n\t\t[Usage(\"<argument0> <comparator> <argument1> <then> <else>\", \"Same as before and return the else-arguments if the condition is false\")]\n\t\tpublic static async Task<object?> CommandIf(ExecutionInformation info, string arg0, string cmp, string arg1, ICommand then, ICommand? other = null)\n\t\t{\n\t\t\tFunc<double, double, bool> comparer = cmp switch\n\t\t\t{\n\t\t\t\t\"<\" => (a, b) => a < b,\n\t\t\t\t\">\" => (a, b) => a > b,\n\t\t\t\t\"<=\" => (a, b) => a <= b,\n\t\t\t\t\">=\" => (a, b) => a >= b,\n\t\t\t\t\"==\" => (a, b) => Math.Abs(a - b) < 1e-6,\n\t\t\t\t\"!=\" => (a, b) => Math.Abs(a - b) > 1e-6,\n\t\t\t\t_ => throw new CommandException(strings.cmd_if_unknown_operator, CommandExceptionReason.CommandError),\n\t\t\t};\n\t\t\tbool cmpResult;\n\t\t\t// Try to parse arguments into doubles\n\t\t\tif (double.TryParse(arg0, NumberStyles.Number, CultureInfo.InvariantCulture, out var d0)\n\t\t\t\t&& double.TryParse(arg1, NumberStyles.Number, CultureInfo.InvariantCulture, out var d1))\n\t\t\t{\n\t\t\t\tcmpResult = comparer(d0, d1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcmpResult = comparer(string.CompareOrdinal(arg0, arg1), 0);\n\t\t\t}\n\n\t\t\t// If branch\n\t\t\tif (cmpResult)\n\t\t\t\treturn await then.Execute(info, Array.Empty<ICommand>());\n\t\t\t// Else branch\n\t\t\tif (other != null)\n\t\t\t\treturn await other.Execute(info, Array.Empty<ICommand>());\n\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate static readonly TextMod SongDone = new TextMod(TextModFlag.Color, Color.Gray);\n\t\tprivate static readonly TextMod SongCurrent = new TextMod(TextModFlag.Bold);\n\n\t\tprivate static int GetIndexExpression(PlaylistManager playlistManager, string expression)\n\t\t{\n\t\t\tint index;\n\t\t\tif (string.IsNullOrEmpty(expression))\n\t\t\t{\n\t\t\t\tindex = playlistManager.Index;\n\t\t\t}\n\t\t\telse if (expression.StartsWith(\"@\"))\n\t\t\t{\n\t\t\t\tvar subOffset = expression.AsSpan(1).Trim();\n\t\t\t\tif (subOffset.IsEmpty)\n\t\t\t\t\tindex = 0;\n\t\t\t\telse if (!int.TryParse(subOffset, out index))\n\t\t\t\t\tthrow new CommandException(strings.error_unrecognized_descriptor, CommandExceptionReason.CommandError);\n\t\t\t\tindex += playlistManager.Index;\n\t\t\t}\n\t\t\telse if (!int.TryParse(expression, NumberStyles.Integer, CultureInfo.InvariantCulture, out index))\n\t\t\t{\n\t\t\t\tthrow new CommandException(strings.error_unrecognized_descriptor, CommandExceptionReason.CommandError);\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\t[Command(\"info\")]\n\t\tpublic static JsonValue<QueueInfo> CommandInfo(ResolveContext resourceFactory, PlaylistManager playlistManager, string? offset = null, int? count = null)\n\t\t\t=> CommandInfo(resourceFactory, playlistManager, GetIndexExpression(playlistManager, offset ?? \"@-1\"), count);\n\n\t\t[Command(\"info\")]\n\t\tpublic static JsonValue<QueueInfo> CommandInfo(ResolveContext resourceFactory, PlaylistManager playlistManager, int offset, int? count = null)\n\t\t{\n\t\t\tconst int maxSongs = 20;\n\t\t\tvar playIndex = playlistManager.Index;\n\t\t\tvar plist = playlistManager.CurrentList;\n\t\t\tint offsetV = Tools.Clamp(offset, 0, plist.Items.Count);\n\t\t\tint countV = Tools.Clamp(count ?? 3, 0, Math.Min(maxSongs, plist.Items.Count - offsetV));\n\t\t\tvar items = plist.Items.Skip(offsetV).Take(countV).Select(x => resourceFactory.ToApiFormat(x)).ToArray();\n\n\t\t\tvar plInfo = new QueueInfo(\".mix\", plist.Title)\n\t\t\t{\n\t\t\t\tSongCount = plist.Items.Count,\n\t\t\t\tDisplayOffset = offsetV,\n\t\t\t\tItems = items,\n\t\t\t\tPlaybackIndex = playIndex,\n\t\t\t};\n\n\t\t\treturn JsonValue.Create(plInfo, x =>\n\t\t\t{\n\t\t\t\tif (x.SongCount == 0 || x.Items is null)\n\t\t\t\t\treturn strings.info_currently_not_playing;\n\n\t\t\t\tvar tmb = new TextModBuilder();\n\t\t\t\ttmb.AppendFormat(strings.cmd_list_show_header, x.Title.Mod().Bold(), x.SongCount.ToString()).Append(\"\\n\");\n\n\t\t\t\tfor (int i = 0; i < x.Items.Length; i++)\n\t\t\t\t{\n\t\t\t\t\tvar line = $\"{x.DisplayOffset + i}: {x.Items[i].Title}\";\n\t\t\t\t\tvar plIndex = x.DisplayOffset + i;\n\t\t\t\t\tif (plIndex == x.PlaybackIndex)\n\t\t\t\t\t\ttmb.AppendLine(\"> \" + line, SongCurrent);\n\t\t\t\t\telse if (plIndex < x.PlaybackIndex)\n\t\t\t\t\t\ttmb.AppendLine(line, SongDone);\n\t\t\t\t\telse if (plIndex > x.PlaybackIndex)\n\t\t\t\t\t\ttmb.AppendLine(line);\n\t\t\t\t\telse\n\t\t\t\t\t\tbreak; // ?\n\t\t\t\t}\n\n\t\t\t\treturn tmb.ToString();\n\t\t\t});\n\t\t}\n\n\t\t[Command(\"json merge\")]\n\t\tpublic static async Task<JsonArray<object?>> CommandJsonMerge(ExecutionInformation info, ApiCall _, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tif (arguments.Count == 0)\n\t\t\t\treturn new JsonArray<object?>(Array.Empty<object>(), string.Empty);\n\n\t\t\tvar jsonArr = new object?[arguments.Count];\n\t\t\tfor (int i = 0; i < arguments.Count; i++)\n\t\t\t{\n\t\t\t\tobject? res;\n\t\t\t\ttry { res = await arguments[i].Execute(info, Array.Empty<ICommand>()); }\n\t\t\t\tcatch (AudioBotException) { continue; }\n\t\t\t\tif (res is JsonObject o)\n\t\t\t\t\tjsonArr[i] = o.GetSerializeObject();\n\t\t\t\telse\n\t\t\t\t\tjsonArr[i] = res;\n\t\t\t}\n\n\t\t\treturn new JsonArray<object?>(jsonArr, string.Empty);\n\t\t}\n\n\t\t[Command(\"json api\", \"_undocumented\")]\n\t\tpublic static JsonObject CommandJsonApi(CommandManager commandManager, ApiCall _, BotManager? botManager = null)\n\t\t{\n\t\t\tvar bots = botManager?.GetBotInfolist() ?? Array.Empty<BotInfo>();\n\t\t\tvar api = OpenApiGenerator.Generate(commandManager, bots);\n\t\t\treturn new JsonValue<JObject>(api, string.Empty);\n\t\t}\n\n\t\t[Command(\"jump\")]\n\t\tpublic static async Task CommandJump(PlayManager playManager, PlaylistManager playlistManager, InvokerData invoker, string offset)\n\t\t{\n\t\t\tplaylistManager.Index = GetIndexExpression(playlistManager, offset);\n\t\t\tawait playManager.Play(invoker);\n\t\t}\n\n\t\t[Command(\"kickme\")]\n\t\tpublic static Task CommandKickme(Ts3Client ts3Client, ClientCall invoker)\n\t\t\t=> CommandKickme(ts3Client, invoker, false);\n\n\t\t[Command(\"kickme far\", \"cmd_kickme_help\")]\n\t\tpublic static Task CommandKickmeFar(Ts3Client ts3Client, ClientCall invoker)\n\t\t\t=> CommandKickme(ts3Client, invoker, true);\n\n\t\tprivate static async Task CommandKickme(Ts3Client ts3Client, ClientCall invoker, bool far)\n\t\t{\n\t\t\tif (invoker.ClientId is null)\n\t\t\t\treturn;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (far) await ts3Client.KickClientFromServer(invoker.ClientId.Value);\n\t\t\t\telse await ts3Client.KickClientFromChannel(invoker.ClientId.Value);\n\t\t\t}\n\t\t\tcatch (Exception ex) { throw new CommandException(strings.cmd_kickme_missing_permission, ex, CommandExceptionReason.CommandError); }\n\t\t}\n\n\t\t[Command(\"list add\")]\n\t\tpublic static async Task<JsonValue<PlaylistItemGetData>> CommandListAdd(ResolveContext resourceFactory, PlaylistManager playlistManager, string listId, string link /* TODO param */)\n\t\t{\n\t\t\tPlaylistItemGetData? getData = null;\n\t\t\tvar playResource = await resourceFactory.Load(link);\n\t\t\tplaylistManager.ModifyPlaylist(listId, plist =>\n\t\t\t{\n\t\t\t\tvar item = PlaylistItem.From(playResource);\n\t\t\t\tplist.Add(item).UnwrapThrow();\n\t\t\t\tgetData = resourceFactory.ToApiFormat(item);\n\t\t\t\t//getData.Index = plist.Items.Count - 1;\n\t\t\t}).UnwrapThrow();\n\t\t\treturn JsonValue.Create(getData!, strings.info_ok);\n\t\t}\n\n\t\t[Command(\"list clear\")]\n\t\tpublic static void CommandListClear(PlaylistManager playlistManager, string listId)\n\t\t\t=> playlistManager.ModifyPlaylist(listId, plist => plist.Clear()).UnwrapThrow();\n\n\t\t[Command(\"list create\", \"_undocumented\")]\n\t\tpublic static void CommandListCreate(PlaylistManager playlistManager, string listId, string? title = null)\n\t\t\t=> playlistManager.CreatePlaylist(listId, title ?? listId).UnwrapThrow();\n\n\t\t[Command(\"list delete\")]\n\t\tpublic static JsonEmpty CommandListDelete(PlaylistManager playlistManager, UserSession session, string listId)\n\t\t{\n\t\t\tTask<string?> ResponseListDelete(string message)\n\t\t\t{\n\t\t\t\tif (TextUtil.GetAnswer(message) == Answer.Yes)\n\t\t\t\t{\n\t\t\t\t\tplaylistManager.DeletePlaylist(listId).UnwrapThrow();\n\t\t\t\t}\n\t\t\t\treturn Task.FromResult<string?>(null);\n\t\t\t}\n\n\t\t\tsession.SetResponse(ResponseListDelete);\n\t\t\treturn new JsonEmpty(string.Format(strings.cmd_list_delete_confirm + YesNoOption, listId));\n\t\t}\n\n\t\t[Command(\"list delete\")]\n\t\tpublic static void CommandListDelete(PlaylistManager playlistManager, ApiCall _, string listId)\n\t\t\t=> playlistManager.DeletePlaylist(listId).UnwrapThrow();\n\n\t\t[Command(\"list from\", \"_undocumented\")]\n\t\tpublic static async Task<JsonValue<PlaylistInfo>> PropagiateLoad(PlaylistManager playlistManager, ResolveContext resolver, string resolverName, string listId, string url)\n\t\t{\n\t\t\tvar getList = await resolver.LoadPlaylistFrom(url, resolverName);\n\t\t\treturn ImportMerge(playlistManager, resolver, getList, listId);\n\t\t}\n\n\t\t[Command(\"list import\", \"cmd_list_get_help\")] // TODO readjust help texts\n\t\tpublic static async Task<JsonValue<PlaylistInfo>> CommandListImport(PlaylistManager playlistManager, ResolveContext resolver, string listId, string link)\n\t\t{\n\t\t\tvar getList = await resolver.LoadPlaylistFrom(link);\n\t\t\treturn ImportMerge(playlistManager, resolver, getList, listId);\n\t\t}\n\n\t\tprivate static JsonValue<PlaylistInfo> ImportMerge(PlaylistManager playlistManager, ResolveContext resolver, Playlist addList, string listId)\n\t\t{\n\t\t\tif (!playlistManager.ExistsPlaylist(listId))\n\t\t\t\tplaylistManager.CreatePlaylist(listId).UnwrapThrow();\n\n\t\t\tplaylistManager.ModifyPlaylist(listId, playlist =>\n\t\t\t{\n\t\t\t\tplaylist.AddRange(addList.Items).UnwrapThrow();\n\t\t\t}).UnwrapThrow();\n\n\t\t\treturn CommandListShow(playlistManager, resolver, listId, null, null);\n\t\t}\n\n\t\t[Command(\"list insert\", \"_undocumented\")]  // TODO Doc\n\t\tpublic static async Task<JsonValue<PlaylistItemGetData>> CommandListAdd(PlaylistManager playlistManager, ResolveContext resourceFactory, string listId, int index, string link /* TODO param */)\n\t\t{\n\t\t\tPlaylistItemGetData? getData = null;\n\t\t\tvar playResource = await resourceFactory.Load(link);\n\t\t\tplaylistManager.ModifyPlaylist(listId, plist =>\n\t\t\t{\n\t\t\t\tif (index < 0 || index >= plist.Items.Count)\n\t\t\t\t\tthrow new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError);\n\n\t\t\t\tvar item = PlaylistItem.From(playResource);\n\t\t\t\tplist.Insert(index, item).UnwrapThrow();\n\t\t\t\tgetData = resourceFactory.ToApiFormat(item);\n\t\t\t\t//getData.Index = plist.Items.Count - 1;\n\t\t\t}).UnwrapThrow();\n\t\t\treturn JsonValue.Create(getData!, strings.info_ok);\n\t\t}\n\n\t\t[Command(\"list item get\", \"_undocumented\")]\n\t\tpublic static PlaylistItem CommandListItemMove(PlaylistManager playlistManager, string name, int index)\n\t\t{\n\t\t\tvar plist = playlistManager.LoadPlaylist(name).UnwrapThrow();\n\t\t\tif (index < 0 || index >= plist.Items.Count)\n\t\t\t\tthrow new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError);\n\n\t\t\treturn plist[index];\n\t\t}\n\n\t\t[Command(\"list item move\")] // TODO return modified elements\n\t\tpublic static void CommandListItemMove(PlaylistManager playlistManager, string listId, int from, int to)\n\t\t{\n\t\t\tplaylistManager.ModifyPlaylist(listId, playlist =>\n\t\t\t{\n\t\t\t\tif (from < 0 || from >= playlist.Items.Count\n\t\t\t\t\t|| to < 0 || to >= playlist.Items.Count)\n\t\t\t\t{\n\t\t\t\t\tthrow new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError);\n\t\t\t\t}\n\n\t\t\t\tif (from == to)\n\t\t\t\t\treturn;\n\n\t\t\t\tvar plitem = playlist[from];\n\t\t\t\tplaylist.RemoveAt(from);\n\t\t\t\tplaylist.Insert(to, plitem).UnwrapThrow();\n\t\t\t}).UnwrapThrow();\n\t\t}\n\n\t\t[Command(\"list item delete\")] // TODO return modified elements\n\t\tpublic static JsonEmpty CommandListItemDelete(PlaylistManager playlistManager, string listId, int index /* TODO param */)\n\t\t{\n\t\t\tPlaylistItem? deletedItem = null;\n\t\t\tplaylistManager.ModifyPlaylist(listId, plist =>\n\t\t\t{\n\t\t\t\tif (index < 0 || index >= plist.Items.Count)\n\t\t\t\t\tthrow new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError);\n\n\t\t\t\tdeletedItem = plist[index];\n\t\t\t\tplist.RemoveAt(index);\n\t\t\t}).UnwrapThrow();\n\t\t\treturn new JsonEmpty(string.Format(strings.info_removed, deletedItem));\n\t\t}\n\n\t\t[Command(\"list item name\")] // TODO return modified elements\n\t\tpublic static void CommandListItemName(PlaylistManager playlistManager, string listId, int index, string title)\n\t\t{\n\t\t\tplaylistManager.ModifyPlaylist(listId, plist =>\n\t\t\t{\n\t\t\t\tif (index < 0 || index >= plist.Items.Count)\n\t\t\t\t\tthrow new CommandException(strings.error_playlist_item_index_out_of_range, CommandExceptionReason.CommandError);\n\n\t\t\t\tplist[index].AudioResource.ResourceTitle = title;\n\t\t\t}).UnwrapThrow();\n\t\t}\n\n\t\t[Command(\"list list\")]\n\t\t[Usage(\"<pattern>\", \"Filters all lists cantaining the given pattern.\")]\n\t\tpublic static JsonArray<PlaylistInfo> CommandListList(PlaylistManager playlistManager, string? pattern = null)\n\t\t{\n\t\t\tvar files = playlistManager.GetAvailablePlaylists(pattern).UnwrapThrow();\n\t\t\tif (files.Length <= 0)\n\t\t\t\treturn new JsonArray<PlaylistInfo>(files, strings.error_playlist_not_found);\n\n\t\t\treturn new JsonArray<PlaylistInfo>(files, fi => string.Join(\", \", fi.Select(x => x.Id)));\n\t\t}\n\n\t\t[Command(\"list merge\")]\n\t\tpublic static void CommandListMerge(PlaylistManager playlistManager, string baseListId, string mergeListId) // future overload?: (IROP, IROP) -> IROP\n\t\t{\n\t\t\tvar otherList = playlistManager.LoadPlaylist(mergeListId).UnwrapThrow();\n\t\t\tplaylistManager.ModifyPlaylist(baseListId, playlist =>\n\t\t\t{\n\t\t\t\tplaylist.AddRange(otherList.Items).UnwrapThrow();\n\t\t\t}).UnwrapThrow();\n\t\t}\n\n\t\t[Command(\"list name\")]\n\t\tpublic static void CommandListName(PlaylistManager playlistManager, string listId, string title)\n\t\t\t=> playlistManager.ModifyPlaylist(listId, plist => plist.SetTitle(title)).UnwrapThrow();\n\n\t\t[Command(\"list play\")]\n\t\tpublic static async Task CommandListPlayInternal(PlaylistManager playlistManager, PlayManager playManager, InvokerData invoker, string listId, int? index = null)\n\t\t{\n\t\t\tvar plist = playlistManager.LoadPlaylist(listId).UnwrapThrow();\n\n\t\t\tif (plist.Items.Count == 0)\n\t\t\t\tthrow new CommandException(strings.error_playlist_is_empty);\n\n\t\t\tif (index != null && (index.Value < 0 || index.Value >= plist.Items.Count))\n\t\t\t\tthrow new CommandException(strings.error_playlist_item_index_out_of_range);\n\n\t\t\tawait playManager.Play(invoker, plist.Items, index ?? 0);\n\t\t}\n\n\t\t[Command(\"list queue\")]\n\t\tpublic static async Task CommandListQueue(PlaylistManager playlistManager, PlayManager playManager, InvokerData invoker, string listId)\n\t\t{\n\t\t\tvar plist = playlistManager.LoadPlaylist(listId).UnwrapThrow();\n\t\t\tawait playManager.Enqueue(invoker, plist.Items);\n\t\t}\n\n\t\t[Command(\"list show\")]\n\t\t[Usage(\"<name> <index>\", \"Lets you specify the starting index from which songs should be listed.\")]\n\t\tpublic static JsonValue<PlaylistInfo> CommandListShow(PlaylistManager playlistManager, ResolveContext resourceFactory, string listId, int? offset = null, int? count = null)\n\t\t{\n\t\t\tconst int maxSongs = 20;\n\t\t\tvar plist = playlistManager.LoadPlaylist(listId).UnwrapThrow();\n\t\t\tint offsetV = Tools.Clamp(offset ?? 0, 0, plist.Items.Count);\n\t\t\tint countV = Tools.Clamp(count ?? maxSongs, 0, Math.Min(maxSongs, plist.Items.Count - offsetV));\n\t\t\tvar items = plist.Items.Skip(offsetV).Take(countV).Select(x => resourceFactory.ToApiFormat(x)).ToArray();\n\t\t\tvar plInfo = new PlaylistInfo(listId, plist.Title)\n\t\t\t{\n\t\t\t\tSongCount = plist.Items.Count,\n\t\t\t\tDisplayOffset = offsetV,\n\t\t\t\tItems = items,\n\t\t\t};\n\n\t\t\treturn JsonValue.Create(plInfo, x =>\n\t\t\t{\n\t\t\t\tvar tmb = new TextModBuilder();\n\t\t\t\ttmb.AppendFormat(strings.cmd_list_show_header, x.Title.Mod().Bold(), x.SongCount.ToString()).Append(\"\\n\");\n\t\t\t\tvar index = x.DisplayOffset;\n\t\t\t\tforeach (var plitem in x.Items!)\n\t\t\t\t\ttmb.Append((index++).ToString()).Append(\": \").AppendLine(plitem.Title);\n\t\t\t\treturn tmb.ToString();\n\t\t\t});\n\t\t}\n\n\t\t[Command(\"next\")]\n\t\tpublic static async Task CommandNext(PlayManager playManager, InvokerData invoker)\n\t\t\t=> await playManager.Next(invoker);\n\n\t\t[Command(\"param\", \"_undocumented\")] // TODO add documentation, when name decided\n\t\tpublic static async Task<object?> CommandParam(ExecutionInformation info, int index)\n\t\t{\n\t\t\tif (!info.TryGet<AliasContext>(out var ctx) || ctx.Arguments is null)\n\t\t\t\tthrow new CommandException(\"No parameter available\", CommandExceptionReason.CommandError);\n\n\t\t\tif (index < 0 || index >= ctx.Arguments.Count)\n\t\t\t\treturn null;\n\n\t\t\tvar backup = ctx.Arguments;\n\t\t\tctx.Arguments = null;\n\t\t\tvar result = await backup[index].Execute(info, Array.Empty<ICommand>());\n\t\t\tctx.Arguments = backup;\n\t\t\treturn result;\n\t\t}\n\n\t\t[Command(\"pm\")]\n\t\tpublic static string CommandPm(ClientCall invoker)\n\t\t{\n\t\t\tinvoker.Visibiliy = TextMessageTargetMode.Private;\n\t\t\treturn string.Format(strings.cmd_pm_hi, invoker.NickName ?? \"Anonymous\");\n\t\t}\n\n\t\t[Command(\"pm channel\", \"_undocumented\")] // TODO\n\t\tpublic static Task CommandPmChannel(Ts3Client ts3Client, string message) => ts3Client.SendChannelMessage(message);\n\n\t\t[Command(\"pm server\", \"_undocumented\")] // TODO\n\t\tpublic static Task CommandPmServer(Ts3Client ts3Client, string message) => ts3Client.SendServerMessage(message);\n\n\t\t[Command(\"pm user\")]\n\t\tpublic static Task CommandPmUser(Ts3Client ts3Client, ushort clientId, string message) => ts3Client.SendMessage(message, (ClientId)clientId);\n\n\t\t[Command(\"pause\")]\n\t\tpublic static void CommandPause(Player playerConnection) => playerConnection.Paused = !playerConnection.Paused;\n\n\t\t[Command(\"play\")]\n\t\tpublic static async Task CommandPlay(PlayManager playManager, Player playerConnection, InvokerData invoker)\n\t\t{\n\t\t\tif (!playManager.IsPlaying)\n\t\t\t\tawait playManager.Play(invoker);\n\t\t\telse\n\t\t\t\tplayerConnection.Paused = false;\n\t\t}\n\n\t\t[Command(\"play\")]\n\t\tpublic static async Task CommandPlay(PlayManager playManager, InvokerData invoker, string url, params string[] attributes)\n\t\t\t=> await playManager.Play(invoker, url, meta: PlayManager.ParseAttributes(attributes));\n\n\t\t[Command(\"play\")]\n\t\tpublic static async Task CommandPlay(PlayManager playManager, InvokerData invoker, IAudioResourceResult rsc, params string[] attributes)\n\t\t\t=> await playManager.Play(invoker, rsc.AudioResource, meta: PlayManager.ParseAttributes(attributes));\n\n\t\t[Command(\"plugin list\")]\n\t\tpublic static JsonArray<PluginStatusInfo> CommandPluginList(PluginManager pluginManager, Bot? bot = null)\n\t\t\t=> new JsonArray<PluginStatusInfo>(pluginManager.GetPluginOverview(bot), PluginManager.FormatOverview);\n\n\t\t[Command(\"plugin unload\")]\n\t\tpublic static void CommandPluginUnload(PluginManager pluginManager, string identifier, Bot? bot = null)\n\t\t{\n\t\t\tvar result = pluginManager.StopPlugin(identifier, bot);\n\t\t\tif (result != PluginResponse.Ok)\n\t\t\t\tthrow new CommandException(string.Format(strings.error_plugin_error, result /*TODO*/), CommandExceptionReason.CommandError);\n\t\t}\n\n\t\t[Command(\"plugin load\")]\n\t\tpublic static void CommandPluginLoad(PluginManager pluginManager, string identifier, Bot? bot = null)\n\t\t{\n\t\t\tvar result = pluginManager.StartPlugin(identifier, bot);\n\t\t\tif (result != PluginResponse.Ok)\n\t\t\t\tthrow new CommandException(string.Format(strings.error_plugin_error, result /*TODO*/), CommandExceptionReason.CommandError);\n\t\t}\n\n\t\t[Command(\"previous\")]\n\t\tpublic static async Task CommandPrevious(PlayManager playManager, InvokerData invoker)\n\t\t\t=> await playManager.Previous(invoker);\n\n\t\t[Command(\"print\")]\n\t\tpublic static string CommandPrint(params string[] parameter)\n\t\t{\n\t\t\t// XXX << Design changes expected >>\n\t\t\tvar strb = new StringBuilder();\n\t\t\tforeach (var param in parameter)\n\t\t\t\tstrb.Append(param);\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\t[Command(\"quiz\")]\n\t\tpublic static JsonValue<bool> CommandQuiz(Bot bot) => new JsonValue<bool>(bot.QuizMode, string.Format(strings.info_status_quizmode, bot.QuizMode ? strings.info_on : strings.info_off));\n\t\t[Command(\"quiz on\")]\n\t\tpublic static async Task CommandQuizOn(Bot bot, PlayManager playManager)\n\t\t{\n\t\t\tbot.QuizMode = true;\n\t\t\tif (playManager.IsPlaying)\n\t\t\t\tawait bot.GenerateStatusImage(true, playManager.CurrentPlayData);\n\t\t\tawait bot.UpdateBotStatus();\n\t\t}\n\t\t[Command(\"quiz off\")]\n\t\tpublic static async Task CommandQuizOff(Bot bot, PlayManager playManager, ClientCall? invoker = null)\n\t\t{\n\t\t\tif (invoker != null && invoker.Visibiliy == TextMessageTargetMode.Private)\n\t\t\t\tthrow new CommandException(strings.cmd_quiz_off_no_cheating, CommandExceptionReason.CommandError);\n\t\t\tbot.QuizMode = false;\n\t\t\tif (playManager.IsPlaying)\n\t\t\t\tawait bot.GenerateStatusImage(true, playManager.CurrentPlayData);\n\t\t\tawait bot.UpdateBotStatus();\n\t\t}\n\n\t\t[Command(\"random\")]\n\t\tpublic static JsonValue<bool> CommandRandom(PlaylistManager playlistManager) => new JsonValue<bool>(playlistManager.Random, string.Format(strings.info_status_random, playlistManager.Random ? strings.info_on : strings.info_off));\n\t\t[Command(\"random on\")]\n\t\tpublic static void CommandRandomOn(PlaylistManager playlistManager) => playlistManager.Random = true;\n\t\t[Command(\"random off\")]\n\t\tpublic static void CommandRandomOff(PlaylistManager playlistManager) => playlistManager.Random = false;\n\t\t[Command(\"random seed\", \"cmd_random_seed_help\")]\n\t\tpublic static string CommandRandomSeed(PlaylistManager playlistManager)\n\t\t{\n\t\t\tstring seed = Util.FromSeed(playlistManager.Seed);\n\t\t\treturn string.IsNullOrEmpty(seed) ? strings.info_empty : seed;\n\t\t}\n\t\t[Command(\"random seed\", \"cmd_random_seed_string_help\")]\n\t\tpublic static void CommandRandomSeed(PlaylistManager playlistManager, string newSeed)\n\t\t{\n\t\t\tif (newSeed.Any(c => !char.IsLetter(c)))\n\t\t\t\tthrow new CommandException(strings.cmd_random_seed_only_letters_allowed, CommandExceptionReason.CommandError);\n\t\t\tplaylistManager.Seed = Util.ToSeed(newSeed.ToLowerInvariant());\n\t\t}\n\t\t[Command(\"random seed\", \"cmd_random_seed_int_help\")]\n\t\tpublic static void CommandRandomSeed(PlaylistManager playlistManager, int newSeed) => playlistManager.Seed = newSeed;\n\n\t\t[Command(\"repeat\")]\n\t\tpublic static JsonValue<LoopMode> CommandRepeat(PlaylistManager playlistManager)\n\t\t\t=> new JsonValue<LoopMode>(playlistManager.Loop, x => x switch\n\t\t\t{\n\t\t\t\tLoopMode.Off => strings.cmd_repeat_info_off,\n\t\t\t\tLoopMode.One => strings.cmd_repeat_info_one,\n\t\t\t\tLoopMode.All => strings.cmd_repeat_info_all,\n\t\t\t\t_ => throw Tools.UnhandledDefault(playlistManager.Loop),\n\t\t\t});\n\t\t[Command(\"repeat off\")]\n\t\tpublic static void CommandRepeatOff(PlaylistManager playlistManager) => playlistManager.Loop = LoopMode.Off;\n\t\t[Command(\"repeat one\")]\n\t\tpublic static void CommandRepeatOne(PlaylistManager playlistManager) => playlistManager.Loop = LoopMode.One;\n\t\t[Command(\"repeat all\")]\n\t\tpublic static void CommandRepeatAll(PlaylistManager playlistManager) => playlistManager.Loop = LoopMode.All;\n\n\t\t[Command(\"rights can\")]\n\t\tpublic static async Task<JsonArray<string>> CommandRightsCan(ExecutionInformation info, RightsManager rightsManager, params string[] rights)\n\t\t\t=> new JsonArray<string>(await rightsManager.GetRightsSubset(info, rights), r => r.Count > 0 ? string.Join(\", \", r) : strings.info_empty);\n\n\t\t[Command(\"rights reload\")]\n\t\tpublic static JsonEmpty CommandRightsReload(RightsManager rightsManager)\n\t\t{\n\t\t\tif (rightsManager.Reload())\n\t\t\t\treturn new JsonEmpty(strings.info_ok);\n\n\t\t\t// TODO: this can be done nicer by returning the errors and warnings from parsing\n\t\t\tthrow new CommandException(strings.cmd_rights_reload_error_parsing_file, CommandExceptionReason.CommandError);\n\t\t}\n\n\t\t[Command(\"rng\")]\n\t\t[Usage(\"\", \"Gets a number between 0 and 100\")]\n\t\t[Usage(\"<max>\", \"Gets a number between 0 and <max>\")]\n\t\t[Usage(\"<min> <max>\", \"Gets a number between <min> and <max>\")]\n\t\tpublic static int CommandRng(int? first = null, int? second = null)\n\t\t{\n\t\t\tif (first != null && second != null)\n\t\t\t{\n\t\t\t\treturn Tools.Random.Next(Math.Min(first.Value, second.Value), Math.Max(first.Value, second.Value));\n\t\t\t}\n\t\t\telse if (first != null)\n\t\t\t{\n\t\t\t\tif (first.Value <= 0)\n\t\t\t\t\tthrow new CommandException(strings.cmd_rng_value_must_be_positive, CommandExceptionReason.CommandError);\n\t\t\t\treturn Tools.Random.Next(first.Value);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn Tools.Random.Next(0, 100);\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"seek\")]\n\t\t[Usage(\"<sec>\", \"Time in seconds\")]\n\t\t[Usage(\"<min:sec>\", \"Time in Minutes:Seconds\")]\n\t\t[Usage(\"<0h0m0s>\", \"Time in hours, minutes and seconds\")]\n\t\tpublic static async Task CommandSeek(Player player, TimeSpan position)\n\t\t{\n\t\t\t//if (!parsed)\n\t\t\t//\tthrow new CommandException(strings.cmd_seek_invalid_format, CommandExceptionReason.CommandError);\n\t\t\tif (position < TimeSpan.Zero || position > player.Length)\n\t\t\t\tthrow new CommandException(strings.cmd_seek_out_of_range, CommandExceptionReason.CommandError);\n\n\t\t\tawait player.Seek(position);\n\t\t}\n\n\t\tprivate static IList<AudioResource> GetSearchResult(this UserSession session)\n\t\t{\n\t\t\tif (!session.Get<IList<AudioResource>>(SessionConst.SearchResult, out var sessionList))\n\t\t\t\tthrow new CommandException(strings.error_select_empty, CommandExceptionReason.CommandError);\n\n\t\t\treturn sessionList;\n\t\t}\n\n\t\tprivate static AudioResource GetSingleSearchResult(this UserSession session, int index)\n\t\t{\n\t\t\tvar sessionList = session.GetSearchResult();\n\n\t\t\tif (index < 0 || index >= sessionList.Count)\n\t\t\t\tthrow new CommandException(string.Format(strings.error_value_not_in_range, 0, sessionList.Count), CommandExceptionReason.CommandError);\n\n\t\t\treturn sessionList[index];\n\t\t}\n\n\t\tprivate static JsonArray<AudioResource> FormatSearchResult(IList<AudioResource> list, CallerInfo callerInfo)\n\t\t\t=> new JsonArray<AudioResource>(list, searchResults =>\n\t\t\t{\n\t\t\t\tif (searchResults.Count == 0)\n\t\t\t\t\treturn strings.cmd_search_no_result;\n\n\t\t\t\tvar tmb = new TextModBuilder(callerInfo.IsColor);\n\t\t\t\ttmb.AppendFormat(\n\t\t\t\t\tstrings.cmd_search_header.Mod().Bold(),\n\t\t\t\t\t$\"!search play <{strings.info_number}>\".Mod().Italic(),\n\t\t\t\t\t$\"!search add <{strings.info_number}>\".Mod().Italic()).Append(\"\\n\");\n\t\t\t\tfor (int i = 0; i < searchResults.Count; i++)\n\t\t\t\t{\n\t\t\t\t\ttmb.AppendFormat(\"{0}: {1}\\n\", i.ToString().Mod().Bold(), searchResults[i].ResourceTitle);\n\t\t\t\t}\n\n\t\t\t\treturn tmb.ToString();\n\t\t\t});\n\n\t\t[Command(\"search add\", \"_undocumented\")] // TODO Doc\n\t\tpublic static async Task CommandSearchAdd(PlayManager playManager, InvokerData invoker, UserSession session, int index)\n\t\t\t=> await playManager.Enqueue(invoker, session.GetSingleSearchResult(index));\n\n\t\t[Command(\"search from\", \"_undocumented\")] // TODO Doc\n\t\tpublic static async Task<JsonArray<AudioResource>> PropagiateSearch(UserSession session, CallerInfo callerInfo, ResolveContext resolver, string resolverName, string query)\n\t\t{\n\t\t\tvar list = await resolver.Search(resolverName, query);\n\t\t\tsession.Set(SessionConst.SearchResult, list);\n\t\t\treturn FormatSearchResult(list, callerInfo);\n\t\t}\n\n\t\t[Command(\"search get\", \"_undocumented\")] // TODO Doc\n\t\tpublic static AudioResource CommandSearchGet(UserSession session, int index)\n\t\t\t=> session.GetSingleSearchResult(index);\n\n\t\t[Command(\"search play\", \"_undocumented\")] // TODO Doc\n\t\tpublic static async Task CommandSeachPlay(PlayManager playManager, ClientCall clientCall, UserSession session, int index)\n\t\t\t=> await playManager.Play(clientCall, session.GetSingleSearchResult(index));\n\n\t\t[Command(\"search show\", \"_undocumented\")] // TODO Doc\n\t\tpublic static JsonArray<AudioResource> CommandSearchShow(UserSession session, CallerInfo callerInfo)\n\t\t\t=> FormatSearchResult(session.GetSearchResult(), callerInfo);\n\n\t\t[Command(\"server tree\", \"_undocumented\")]\n\t\tpublic static JsonValue<Connection> CommandServerTree(Connection book, ApiCall _)\n\t\t{\n\t\t\treturn JsonValue.Create(book);\n\t\t}\n\n\t\t[Command(\"settings\")]\n\t\tpublic static void CommandSettings()\n\t\t\t=> throw new CommandException(string.Format(strings.cmd_settings_empty_usage, \"'rights.path', 'web.api.enabled', 'tools.*'\"), CommandExceptionReason.MissingParameter);\n\n\t\t[Command(\"settings copy\")]\n\t\tpublic static void CommandSettingsCopy(ConfRoot config, string from, string to) => config.CopyBotConfig(from, to).UnwrapThrow();\n\n\t\t[Command(\"settings create\")]\n\t\tpublic static void CommandSettingsCreate(ConfRoot config, string name) => config.CreateBotConfig(name).UnwrapThrow();\n\n\t\t[Command(\"settings delete\")]\n\t\tpublic static void CommandSettingsDelete(ConfRoot config, string name) => config.DeleteBotConfig(name).UnwrapThrow();\n\n\t\t[Command(\"settings get\")]\n\t\tpublic static ConfigPart CommandSettingsGet(ConfBot config, string? path = null)\n\t\t\t=> SettingsGet(config, path);\n\n\t\t[Command(\"settings set\")]\n\t\tpublic static void CommandSettingsSet(ConfBot config, string path, string? value = null)\n\t\t{\n\t\t\tSettingsSet(config, path, value);\n\t\t\tif (!config.SaveWhenExists())\n\t\t\t{\n\t\t\t\tthrow new CommandException(\"Value was set but could not be saved to file. All changes are temporary and will be lost when the bot restarts.\",\n\t\t\t\t\tCommandExceptionReason.CommandError);\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"settings bot get\", \"cmd_settings_get_help\")]\n\t\tpublic static async Task<ConfigPart> CommandSettingsBotGet(BotManager bots, ConfRoot config, string botName, string? path = null)\n\t\t{\n\t\t\tvar bot = bots.GetBotLock(botName);\n\t\t\treturn await GetConf(bot, config, botName, b => CommandSettingsGet(b, path));\n\t\t}\n\n\t\t[Command(\"settings bot set\", \"cmd_settings_set_help\")]\n\t\tpublic static async Task CommandSettingsBotSet(BotManager bots, ConfRoot config, string botName, string path, string? value = null)\n\t\t{\n\t\t\tvar bot = bots.GetBotLock(botName);\n\t\t\tawait GetConf(bot, config, botName, b => { CommandSettingsSet(b, path, value); return null!; });\n\t\t}\n\n\t\t[Command(\"settings bot reload\")]\n\t\tpublic static void CommandSettingsReload(ConfRoot config, string? name = null)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(name))\n\t\t\t\tconfig.ClearBotConfigCache();\n\t\t\telse\n\t\t\t\tconfig.ClearBotConfigCache(name);\n\t\t}\n\n\t\t[Command(\"settings global get\")]\n\t\tpublic static ConfigPart CommandSettingsGlobalGet(ConfRoot config, string? path = null)\n\t\t\t=> SettingsGet(config, path);\n\n\t\t[Command(\"settings global set\")]\n\t\tpublic static void CommandSettingsGlobalSet(ConfRoot config, string path, string? value = null)\n\t\t{\n\t\t\tSettingsSet(config, path, value);\n\t\t\tif (!config.Save())\n\t\t\t{\n\t\t\t\tthrow new CommandException(\"Value was set but could not be saved to file. All changes are temporary and will be lost when the bot restarts.\",\n\t\t\t\t\tCommandExceptionReason.CommandError);\n\t\t\t}\n\t\t}\n\n\t\t//[Command(\"settings global reload\")]\n\t\tpublic static void CommandSettingsGlobalReload(ConfRoot config)\n\t\t{\n\t\t\t// TODO\n\t\t\tthrow new NotImplementedException();\n\t\t}\n\n\t\tprivate static async Task<ConfigPart> GetConf(Bot? bot, ConfRoot config, string name, Func<ConfBot, ConfigPart> scheduledAction)\n\t\t{\n\t\t\tif (bot != null)\n\t\t\t{\n\t\t\t\tif (bot.Injector.TryGet<ConfBot>(out var conf))\n\t\t\t\t\treturn await bot.Scheduler.InvokeAsync(() => Task.FromResult(scheduledAction(conf)));\n\t\t\t\telse\n\t\t\t\t\tthrow new CommandException(\"Missing ConfBot\", CommandExceptionReason.CommandError);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar getTemplateResult = config.GetBotConfig(name);\n\t\t\t\tif (!getTemplateResult.Ok)\n\t\t\t\t\tthrow new CommandException(strings.error_bot_does_not_exist, getTemplateResult.Error, CommandExceptionReason.CommandError);\n\t\t\t\treturn await Task.FromResult(scheduledAction(getTemplateResult.Value));\n\t\t\t}\n\t\t}\n\n\t\tprivate static ConfigPart SettingsGet(ConfigPart config, string? path = null) => config.ByPathAsArray(path ?? \"\").SettingsGetSingle();\n\n\t\tprivate static void SettingsSet(ConfigPart config, string path, string? value)\n\t\t{\n\t\t\tvar setConfig = config.ByPathAsArray(path).SettingsGetSingle();\n\t\t\tif (setConfig is IJsonSerializable jsonConfig)\n\t\t\t{\n\t\t\t\tvar result = jsonConfig.FromJson(value ?? \"\");\n\t\t\t\tif (!result.Ok)\n\t\t\t\t\tthrow new CommandException($\"Failed to set the value ({result.Error}).\", CommandExceptionReason.CommandError); // LOC: TODO\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new CommandException(\"This value currently cannot be set.\", CommandExceptionReason.CommandError); // LOC: TODO\n\t\t\t}\n\t\t}\n\n\t\tprivate static ConfigPart SettingsGetSingle(this ConfigPart[] configPartsList)\n\t\t{\n\t\t\tif (configPartsList.Length == 0)\n\t\t\t{\n\t\t\t\tthrow new CommandException(strings.error_config_no_key_found, CommandExceptionReason.CommandError);\n\t\t\t}\n\t\t\telse if (configPartsList.Length == 1)\n\t\t\t{\n\t\t\t\treturn configPartsList[0];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new CommandException(\n\t\t\t\t\tstring.Format(\n\t\t\t\t\t\tstrings.error_config_multiple_keys_found + \"\\n\",\n\t\t\t\t\t\tstring.Join(\"\\n  \", configPartsList.Take(3).Select(kvp => kvp.Key))),\n\t\t\t\t\tCommandExceptionReason.CommandError);\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"settings help\")]\n\t\tpublic static string CommandSettingsHelp(ConfRoot config, string path)\n\t\t{\n\t\t\tvar part = SettingsGet(config, path);\n\t\t\treturn string.IsNullOrEmpty(part.Documentation) ? strings.info_empty : part.Documentation;\n\t\t}\n\n\t\t[Command(\"song\")]\n\t\tpublic static JsonValue<CurrentSongInfo> CommandSong(PlayManager playManager, Player player, Bot bot, ClientCall? invoker = null)\n\t\t{\n\t\t\tif (playManager.CurrentPlayData is null)\n\t\t\t\tthrow new CommandException(strings.info_currently_not_playing, CommandExceptionReason.CommandError);\n\t\t\tif (bot.QuizMode && invoker != null && playManager.CurrentPlayData.Invoker.ClientUid != invoker.ClientUid)\n\t\t\t\tthrow new CommandException(strings.info_quizmode_is_active, CommandExceptionReason.CommandError);\n\n\t\t\tvar position = player.Position ?? TimeSpan.Zero;\n\t\t\tvar length = player.Length ?? playManager.CurrentPlayData.PlayResource.SongInfo?.Length ?? TimeSpan.Zero;\n\t\t\treturn JsonValue.Create(\n\t\t\t\tnew CurrentSongInfo\n\t\t\t\t{\n\t\t\t\t\tTitle = playManager.CurrentPlayData.ResourceData.ResourceTitle,\n\t\t\t\t\tAudioType = playManager.CurrentPlayData.ResourceData.AudioType,\n\t\t\t\t\tLink = playManager.CurrentPlayData.SourceLink,\n\t\t\t\t\tPosition = position,\n\t\t\t\t\tLength = length,\n\t\t\t\t\tPaused = player.Paused,\n\t\t\t\t},\n\t\t\t\tx =>\n\t\t\t\t{\n\t\t\t\t\tvar tmb = new StringBuilder();\n\t\t\t\t\ttmb.Append(x.Paused ? \"⏸ \" : \"► \");\n\t\t\t\t\ttmb.AppendFormat(\"[url={0}]{1}[/url]\", x.Link, x.Title);\n\t\t\t\t\ttmb.Append(\" [\");\n\t\t\t\t\ttmb.Append(x.Length.TotalHours >= 1 || x.Position.TotalHours >= 1\n\t\t\t\t\t\t? $\"{x.Position:hh\\\\:mm\\\\:ss}/{x.Length:hh\\\\:mm\\\\:ss}\"\n\t\t\t\t\t\t: $\"{x.Position:mm\\\\:ss}/{x.Length:mm\\\\:ss}\");\n\t\t\t\t\ttmb.Append(\"]\");\n\t\t\t\t\treturn tmb.ToString();\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\t[Command(\"stop\")]\n\t\tpublic static void CommandStop(PlayManager playManager) => playManager.Stop();\n\n\t\t[Command(\"subscribe\")]\n\t\tpublic static void CommandSubscribe(IVoiceTarget targetManager, ClientCall invoker)\n\t\t{\n\t\t\tif (invoker.ClientId != null)\n\t\t\t\ttargetManager.WhisperClientSubscribe(invoker.ClientId.Value);\n\t\t}\n\n\t\t[Command(\"subscribe tempchannel\")]\n\t\tpublic static void CommandSubscribeTempChannel(IVoiceTarget targetManager, ClientCall? invoker = null, ChannelId? channel = null)\n\t\t{\n\t\t\tvar subChan = channel ?? invoker?.ChannelId ?? ChannelId.Null;\n\t\t\tif (subChan != ChannelId.Null)\n\t\t\t\ttargetManager.WhisperChannelSubscribe(true, subChan);\n\t\t}\n\n\t\t[Command(\"subscribe channel\")]\n\t\tpublic static void CommandSubscribeChannel(IVoiceTarget targetManager, ClientCall? invoker = null, params ChannelId[] channels)\n\t\t{\n\t\t\tif (channels.Length == 0)\n\t\t\t{\n\t\t\t\tvar subChan = invoker?.ChannelId;\n\t\t\t\tif (subChan.HasValue)\n\t\t\t\t\ttargetManager.WhisperChannelSubscribe(false, subChan.Value);\n\t\t\t}\n\t\t\telse targetManager.WhisperChannelSubscribe(false, channels);\n\t\t}\n\n\t\t[Command(\"subscribe client\")]\n\t\tpublic static void CommandSubscribeUser(IVoiceTarget targetManager, ClientId client)\n\t\t{\n\t\t\ttargetManager.WhisperClientSubscribe(client);\n\t\t}\n\n\t\t[Command(\"system info\", \"_undocumented\")]\n\t\tpublic static JsonValue CommandSystemInfo(SystemMonitor systemMonitor)\n\t\t{\n\t\t\tvar sysInfo = systemMonitor.GetReport();\n\t\t\treturn JsonValue.Create(new\n\t\t\t{\n\t\t\t\tmemory = sysInfo.Memory,\n\t\t\t\tcpu = sysInfo.Cpu,\n\t\t\t\tstarttime = systemMonitor.StartTime,\n\t\t\t}, x => new TextModBuilder().AppendFormat(\n\t\t\t\t\"\\ncpu: {0}% \\nmemory: {1} \\nstartime: {2}\".Mod().Bold(),\n\t\t\t\t\t(x.cpu.Last() * 100).ToString(\"0.#\"),\n\t\t\t\t\tUtil.FormatBytesHumanReadable(x.memory.Last()),\n\t\t\t\t\tx.starttime.ToString(Thread.CurrentThread.CurrentCulture)).ToString()\n\t\t\t);\n\t\t}\n\n\t\t[Command(\"system quit\", \"cmd_quit_help\")]\n\t\tpublic static JsonEmpty CommandSystemQuit(Core core, CallerInfo caller, UserSession? session = null, string? param = null)\n\t\t{\n\t\t\tconst string force = \"force\";\n\n\t\t\tif (caller.ApiCall || param == force)\n\t\t\t{\n\t\t\t\tcore.Stop();\n\t\t\t\treturn new JsonEmpty(string.Empty);\n\t\t\t}\n\n\t\t\tTask<string?> ResponseQuit(string message)\n\t\t\t{\n\t\t\t\tif (TextUtil.GetAnswer(message) == Answer.Yes)\n\t\t\t\t{\n\t\t\t\t\tCommandSystemQuit(core, caller, session, force);\n\t\t\t\t}\n\t\t\t\treturn Task.FromResult<string?>(null);\n\t\t\t}\n\n\t\t\tsession.SetResponse(ResponseQuit);\n\t\t\treturn new JsonEmpty(strings.cmd_quit_confirm + YesNoOption);\n\t\t}\n\n\t\t[Command(\"take\")]\n\t\t[Usage(\"<count> <text>\", \"Take only <count> parts of the text\")]\n\t\t[Usage(\"<count> <start> <text>\", \"Take <count> parts, starting with the part at <start>\")]\n\t\t[Usage(\"<count> <start> <delimiter> <text>\", \"Specify another delimiter for the parts than spaces\")]\n\t\tpublic static async Task<string> CommandTake(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tif (arguments.Count < 2)\n\t\t\t\tthrow new CommandException(strings.error_cmd_at_least_two_argument, CommandExceptionReason.MissingParameter);\n\n\t\t\tint start = 0;\n\t\t\tstring? delimiter = null;\n\n\t\t\t// Get count\n\t\t\tvar res = await arguments[0].ExecuteToString(info, Array.Empty<ICommand>());\n\t\t\tif (!int.TryParse(res, out int count) || count < 0)\n\t\t\t\tthrow new CommandException(\"Count must be an integer >= 0\", CommandExceptionReason.CommandError); // LOC: TODO\n\n\t\t\tif (arguments.Count > 2)\n\t\t\t{\n\t\t\t\t// Get start\n\t\t\t\tres = await arguments[1].ExecuteToString(info, Array.Empty<ICommand>());\n\t\t\t\tif (!int.TryParse(res, out start) || start < 0)\n\t\t\t\t\tthrow new CommandException(\"Start must be an integer >= 0\", CommandExceptionReason.CommandError); // LOC: TODO\n\t\t\t}\n\n\t\t\t// Get delimiter if exists\n\t\t\tif (arguments.Count > 3)\n\t\t\t\tdelimiter = await arguments[2].ExecuteToString(info, Array.Empty<ICommand>());\n\n\t\t\tstring text = await arguments[Math.Min(arguments.Count - 1, 3)].ExecuteToString(info, Array.Empty<ICommand>());\n\n\t\t\tvar splitted = delimiter is null\n\t\t\t\t? text.Split()\n\t\t\t\t: text.Split(new[] { delimiter }, StringSplitOptions.None);\n\t\t\tif (splitted.Length < start + count)\n\t\t\t\tthrow new CommandException(strings.cmd_take_not_enough_arguements, CommandExceptionReason.CommandError);\n\t\t\tvar splittedarr = splitted.Skip(start).Take(count).ToArray();\n\n\t\t\treturn string.Join(delimiter ?? \" \", splittedarr);\n\t\t}\n\n\t\t[Command(\"unsubscribe\")]\n\t\tpublic static void CommandUnsubscribe(IVoiceTarget targetManager, ClientCall invoker)\n\t\t{\n\t\t\tif (invoker.ClientId != null)\n\t\t\t\ttargetManager.WhisperClientUnsubscribe(invoker.ClientId.Value);\n\t\t}\n\n\t\t[Command(\"unsubscribe channel\")]\n\t\tpublic static void CommandUnsubscribeChannel(IVoiceTarget targetManager, ClientCall? invoker = null, params ChannelId[] channels)\n\t\t{\n\t\t\tif (channels.Length == 0)\n\t\t\t{\n\t\t\t\tvar subChan = invoker?.ChannelId;\n\t\t\t\tif (subChan.HasValue)\n\t\t\t\t\ttargetManager.WhisperChannelUnsubscribe(false, subChan.Value);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttargetManager.WhisperChannelUnsubscribe(false, channels);\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"unsubscribe temporary\")]\n\t\tpublic static void CommandUnsubscribeTemporary(IVoiceTarget targetManager) => targetManager.ClearTemporary();\n\n\t\t[Command(\"unsubscribe client\")]\n\t\tpublic static void CommandUnsubscribeUser(IVoiceTarget targetManager, ClientId client)\n\t\t{\n\t\t\ttargetManager.WhisperClientUnsubscribe(client);\n\t\t}\n\n\t\t[Command(\"version\")]\n\t\tpublic static JsonValue<BuildData> CommandVersion() => new JsonValue<BuildData>(SystemData.AssemblyData, d => d.ToLongString());\n\n\t\t[Command(\"volume\")]\n\t\tpublic static JsonValue<float> CommandVolume(Player playerConnection)\n\t\t\t=> new JsonValue<float>(playerConnection.Volume, string.Format(strings.cmd_volume_current, playerConnection.Volume.ToString(\"0.#\")));\n\n\t\t[Command(\"volume\")]\n\t\t[Usage(\"<level>\", \"A new volume level between 0 and 100.\")]\n\t\t[Usage(\"+/-<level>\", \"Adds or subtracts a value from the current volume.\")]\n\t\tpublic static void CommandVolume(ExecutionInformation info, Player playerConnection, CallerInfo caller, ConfBot config, string volume, UserSession? session = null)\n\t\t{\n\t\t\tvolume = volume.Trim();\n\t\t\tbool relPos = volume.StartsWith(\"+\", StringComparison.Ordinal);\n\t\t\tbool relNeg = volume.StartsWith(\"-\", StringComparison.Ordinal);\n\t\t\tstring numberString = (relPos || relNeg) ? volume.Remove(0, 1).TrimStart() : volume;\n\n\t\t\tif (!float.TryParse(numberString, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsedVolume))\n\t\t\t\tthrow new CommandException(strings.cmd_volume_parse_error, CommandExceptionReason.CommandError);\n\n\t\t\tfloat curVolume = playerConnection.Volume;\n\t\t\tfloat newVolume;\n\t\t\tif (relPos) newVolume = curVolume + parsedVolume;\n\t\t\telse if (relNeg) newVolume = curVolume - parsedVolume;\n\t\t\telse newVolume = parsedVolume;\n\n\t\t\tif (newVolume < AudioValues.MinVolume || newVolume > AudioValues.MaxVolume)\n\t\t\t\tthrow new CommandException(string.Format(strings.cmd_volume_is_limited, AudioValues.MinVolume, AudioValues.MaxVolume), CommandExceptionReason.CommandError);\n\n\t\t\tif (newVolume <= config.Audio.MaxUserVolume || newVolume <= curVolume || caller.ApiCall)\n\t\t\t{\n\t\t\t\tplayerConnection.Volume = newVolume;\n\t\t\t}\n\t\t\telse if (session != null)\n\t\t\t{\n\t\t\t\tasync Task<string?> ResponseVolume(string message)\n\t\t\t\t{\n\t\t\t\t\tif (TextUtil.GetAnswer(message) == Answer.Yes)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (await info.HasRights(RightHighVolume))\n\t\t\t\t\t\t\tplayerConnection.Volume = newVolume;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\treturn strings.cmd_volume_missing_high_volume_permission;\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tsession.SetResponse(ResponseVolume);\n\t\t\t\tthrow new CommandException(strings.cmd_volume_high_volume_confirm + YesNoOption, CommandExceptionReason.CommandError);\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"whisper all\")]\n\t\tpublic static void CommandWhisperAll(IVoiceTarget targetManager) => CommandWhisperGroup(targetManager, GroupWhisperType.AllClients, GroupWhisperTarget.AllChannels);\n\n\t\t[Command(\"whisper group\")]\n\t\tpublic static void CommandWhisperGroup(IVoiceTarget targetManager, GroupWhisperType type, GroupWhisperTarget target, ulong? targetId = null)\n\t\t{\n\t\t\tif (type == GroupWhisperType.ServerGroup || type == GroupWhisperType.ChannelGroup)\n\t\t\t{\n\t\t\t\tif (targetId is null)\n\t\t\t\t\tthrow new CommandException(strings.cmd_whisper_group_missing_target, CommandExceptionReason.CommandError);\n\t\t\t\ttargetManager.SetGroupWhisper(type, target, targetId.Value);\n\t\t\t\ttargetManager.SendMode = TargetSendMode.WhisperGroup;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (targetId != null)\n\t\t\t\t\tthrow new CommandException(strings.cmd_whisper_group_superfluous_target, CommandExceptionReason.CommandError);\n\t\t\t\ttargetManager.SetGroupWhisper(type, target, 0);\n\t\t\t\ttargetManager.SendMode = TargetSendMode.WhisperGroup;\n\t\t\t}\n\t\t}\n\n\t\t[Command(\"whisper list\")]\n\t\tpublic static JsonObject CommandWhisperList(IVoiceTarget targetManager)\n\t\t{\n\t\t\treturn JsonValue.Create(new\n\t\t\t{\n#pragma warning disable IDE0037\n\t\t\t\tSendMode = targetManager.SendMode,\n\t\t\t\tGroupWhisper = targetManager.SendMode == TargetSendMode.WhisperGroup ?\n\t\t\t\tnew\n\t\t\t\t{\n\t\t\t\t\tTarget = targetManager.GroupWhisperTarget,\n\t\t\t\t\tTargetId = targetManager.GroupWhisperTargetId,\n\t\t\t\t\tType = targetManager.GroupWhisperType,\n\t\t\t\t}\n\t\t\t\t: null,\n\t\t\t\tWhisperClients = targetManager.WhisperClients,\n\t\t\t\tWhisperChannel = targetManager.WhisperChannel,\n#pragma warning restore IDE0037\n\t\t\t},\n\t\t\tx =>\n\t\t\t{\n\t\t\t\tvar strb = new StringBuilder(strings.cmd_whisper_list_header);\n\t\t\t\tstrb.AppendLine();\n\t\t\t\tswitch (x.SendMode)\n\t\t\t\t{\n\t\t\t\tcase TargetSendMode.None: strb.Append(strings.cmd_whisper_list_target_none); break;\n\t\t\t\tcase TargetSendMode.Voice: strb.Append(strings.cmd_whisper_list_target_voice); break;\n\t\t\t\tcase TargetSendMode.Whisper:\n\t\t\t\t\tstrb.Append(strings.cmd_whisper_list_target_whisper_clients).Append(\": [\").Append(string.Join(\",\", x.WhisperClients)).Append(\"]\\n\");\n\t\t\t\t\tstrb.Append(strings.cmd_whisper_list_target_whisper_channel).Append(\": [\").Append(string.Join(\",\", x.WhisperChannel)).Append(\"]\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase TargetSendMode.WhisperGroup:\n\t\t\t\t\tif (x.GroupWhisper is null) throw new ArgumentNullException();\n\t\t\t\t\tstrb.AppendFormat(strings.cmd_whisper_list_target_whispergroup, x.GroupWhisper.Type, x.GroupWhisper.Target, x.GroupWhisper.TargetId);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(x.SendMode);\n\t\t\t\t}\n\t\t\t\treturn strb.ToString();\n\t\t\t});\n\t\t}\n\n\t\t[Command(\"whisper off\")]\n\t\tpublic static void CommandWhisperOff(IVoiceTarget targetManager) => targetManager.SendMode = TargetSendMode.Voice;\n\n\t\t[Command(\"whisper subscription\")]\n\t\tpublic static void CommandWhisperSubsription(IVoiceTarget targetManager) => targetManager.SendMode = TargetSendMode.Whisper;\n\n\t\t[Command(\"xecute\")]\n\t\tpublic static async Task CommandXecute(ExecutionInformation info, IReadOnlyList<ICommand> arguments)\n\t\t{\n\t\t\tforeach (var arg in arguments)\n\t\t\t\tawait arg.Execute(info, Array.Empty<ICommand>());\n\t\t}\n\t\t// ReSharper enable UnusedMember.Global\n\n\t\tpublic static async ValueTask<bool> HasRights(this ExecutionInformation info, params string[] rights)\n\t\t{\n\t\t\tif (!info.TryGet<CallerInfo>(out var caller)) caller = null;\n\t\t\tif (caller?.SkipRightsChecks ?? false)\n\t\t\t\treturn true;\n\t\t\tif (!info.TryGet<RightsManager>(out var rightsManager))\n\t\t\t\treturn false;\n\t\t\treturn await rightsManager.HasAllRights(info, rights);\n\t\t}\n\n\t\tpublic static async Task Write(this ExecutionInformation info, string message)\n\t\t{\n\t\t\tif (!info.TryGet<Ts3Client>(out var ts3Client))\n\t\t\t\tthrow new CommandException(strings.error_no_teamspeak_in_context);\n\n\t\t\tif (!info.TryGet<ClientCall>(out var invoker))\n\t\t\t\tthrow new CommandException(strings.error_no_invoker_in_context);\n\n\t\t\tif (invoker.Visibiliy is null || invoker.ClientId is null)\n\t\t\t\tthrow new CommandException(strings.error_invoker_not_visible);\n\n\t\t\tvar behaviour = LongTextBehaviour.Split;\n\t\t\tvar limit = 1;\n\t\t\tif (info.TryGet<ConfBot>(out var config))\n\t\t\t{\n\t\t\t\tbehaviour = config.Commands.LongMessage;\n\t\t\t\tlimit = config.Commands.LongMessageSplitLimit;\n\t\t\t}\n\n\t\t\tforeach (var msgPart in LongTextTransform.Split(message, behaviour, ts3Client.ServerConstants.MaxSizeTextMessage, limit))\n\t\t\t{\n\t\t\t\tswitch (invoker.Visibiliy.Value)\n\t\t\t\t{\n\t\t\t\tcase TextMessageTargetMode.Private:\n\t\t\t\t\tawait ts3Client.SendMessage(msgPart, invoker.ClientId.Value);\n\t\t\t\t\tbreak;\n\t\t\t\tcase TextMessageTargetMode.Channel:\n\t\t\t\t\tawait ts3Client.SendChannelMessage(msgPart);\n\t\t\t\t\tbreak;\n\t\t\t\tcase TextMessageTargetMode.Server:\n\t\t\t\t\tawait ts3Client.SendServerMessage(msgPart);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(invoker.Visibiliy.Value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic static void UseComplexityTokens(this ExecutionInformation info, int count)\n\t\t{\n\t\t\tif (!info.TryGet<CallerInfo>(out var caller) || caller.CommandComplexityCurrent + count > caller.CommandComplexityMax)\n\t\t\t\tthrow new CommandException(strings.error_cmd_complexity_reached, CommandExceptionReason.CommandError);\n\t\t\tcaller.CommandComplexityCurrent += count;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/LoopMode.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Playlists\n{\n\tpublic enum LoopMode\n\t{\n\t\tOff,\n\t\tOne,\n\t\tAll,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/Parser/JspfContent.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing PlaylistsNET.Content;\nusing PlaylistsNET.Models;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace TS3AudioBot.Playlists.Parser\n{\n\tpublic class JspfContent : IPlaylistParser<XspfPlaylist>, IPlaylistWriter<XspfPlaylist>\n\t{\n\t\tpublic XspfPlaylist GetFromStream(Stream stream)\n\t\t{\n\t\t\tvar serializer = new JsonSerializer();\n\t\t\tusing var sr = new StreamReader(stream);\n\t\t\tusing var jsonTextReader = new JsonTextReader(sr);\n\t\t\treturn serializer.Deserialize<XspfPlaylist>(jsonTextReader) ?? throw new NullReferenceException(\"Data empty\");\n\t\t}\n\n\t\tpublic XspfPlaylist GetFromString(string playlistString)\n\t\t{\n\t\t\tthrow new NotImplementedException();\n\t\t}\n\n\t\tpublic string ToText(XspfPlaylist playlist)\n\t\t{\n\t\t\treturn JsonConvert.SerializeObject(playlist);\n\t\t}\n\t}\n\n\tpublic class XspfPlaylist : IBasePlaylist\n\t{\n\t\t[JsonProperty(PropertyName = \"title\")]\n\t\tpublic string? Title { get; set; }\n\t\t[JsonProperty(PropertyName = \"creator\")]\n\t\tpublic string? Creator { get; set; }\n\n\t\t[JsonProperty(PropertyName = \"track\")]\n\t\tpublic List<XspfPlaylistEntry>? PlaylistEntries { get; set; }\n\n\t\tpublic string? Path { get; set; }\n\t\tpublic string? FileName { get; set; }\n\n\t\tpublic XspfPlaylist()\n\t\t{\n\t\t}\n\n\t\tpublic List<string> GetTracksPaths() => PlaylistEntries.Select(x => x.Location.FirstOrDefault()).Where(x => x != null).ToList();\n\t}\n\n\tpublic class XspfPlaylistEntry\n\t{\n\t\tpublic XspfPlaylistEntry() { }\n\n\t\t[JsonProperty(PropertyName = \"title\")]\n\t\tpublic string? Title { get; set; }\n\t\t[JsonProperty(PropertyName = \"duration\")]\n\t\tpublic long? Duration { get; set; } // MS : TODO timespan converter\n\n\t\t[JsonProperty(PropertyName = \"meta\")]\n\t\t[JsonConverter(typeof(JspfMetaConverter))]\n\t\tpublic List<XspfMeta>? Meta { get; set; }\n\n\t\t[JsonProperty(PropertyName = \"location\")]\n\t\tpublic List<string>? Location { get; set; }\n\t}\n\n\tpublic class XspfMeta\n\t{\n\t\tpublic string Key { get; set; }\n\t\tpublic string Value { get; set; }\n\n\t\tpublic XspfMeta(string key, string value)\n\t\t{\n\t\t\tKey = key;\n\t\t\tValue = value;\n\t\t}\n\t}\n\n\tinternal class JspfMetaConverter : JsonConverter<XspfMeta>\n\t{\n\t\tpublic override XspfMeta ReadJson(JsonReader reader, Type objectType, XspfMeta? existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t{\n\t\t\tvar key = reader.ReadAsString();\n\t\t\tvar value = reader.ReadAsString();\n\t\t\tif (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))\n\t\t\t\tthrow new FormatException();\n\t\t\treturn new XspfMeta(key, value);\n\t\t}\n\n\t\tpublic override void WriteJson(JsonWriter writer, XspfMeta? value, JsonSerializer serializer)\n\t\t{\n\t\t\tif (value is null) throw new ArgumentNullException(nameof(value));\n\t\t\twriter.WriteStartObject();\n\t\t\twriter.WritePropertyName(value.Key);\n\t\t\twriter.WriteValue(value.Value);\n\t\t\twriter.WriteEndObject();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/Playlist.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.Playlists\n{\n\tpublic class Playlist : IReadOnlyPlaylist\n\t{\n\t\tprivate const int MaxSongs = 1000;\n\t\tprivate string title;\n\t\tpublic string Title { get => title; set => SetTitle(value); }\n\t\tprivate readonly List<PlaylistItem> items;\n\t\tpublic IReadOnlyList<PlaylistItem> Items => items;\n\n\t\tpublic PlaylistItem this[int i] => items[i];\n\n\t\tpublic Playlist() :\n\t\t\tthis(new List<PlaylistItem>())\n\t\t{ }\n\n\t\tpublic Playlist(List<PlaylistItem> items)\n\t\t{\n\t\t\tthis.items = items ?? throw new ArgumentNullException(nameof(items));\n\t\t\ttitle = string.Empty;\n\t\t}\n\n\t\tpublic Playlist SetTitle(string newTitle)\n\t\t{\n\t\t\tnewTitle = newTitle.Replace(\"\\r\", \"\").Replace(\"\\n\", \"\");\n\t\t\ttitle = newTitle.Substring(0, Math.Min(newTitle.Length, 256));\n\t\t\treturn this;\n\t\t}\n\n\t\tprivate int GetMaxAdd(int amount)\n\t\t{\n\t\t\tint remainingSlots = Math.Max(MaxSongs - items.Count, 0);\n\t\t\treturn Math.Min(amount, remainingSlots);\n\t\t}\n\n\t\tpublic E<LocalStr> Add(PlaylistItem song)\n\t\t{\n\t\t\tif (GetMaxAdd(1) > 0)\n\t\t\t{\n\t\t\t\titems.Add(song);\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\treturn ErrorFull;\n\t\t}\n\n\t\tpublic E<LocalStr> AddRange(IEnumerable<PlaylistItem> songs)\n\t\t{\n\t\t\tvar maxAddCount = GetMaxAdd(MaxSongs);\n\t\t\tif (maxAddCount > 0)\n\t\t\t{\n\t\t\t\titems.AddRange(songs.Take(maxAddCount));\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\treturn ErrorFull;\n\t\t}\n\n\t\tpublic void RemoveAt(int index) => items.RemoveAt(index);\n\n\t\tpublic E<LocalStr> Insert(int index, PlaylistItem song)\n\t\t{\n\t\t\tif (GetMaxAdd(1) > 0)\n\t\t\t{\n\t\t\t\titems.Insert(index, song);\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\treturn ErrorFull;\n\t\t}\n\n\t\tpublic void Clear() => items.Clear();\n\n\t\tprivate static readonly E<LocalStr> ErrorFull = new LocalStr(\"Playlist is full\"); // TODO: Loc\n\t}\n\n\tpublic interface IReadOnlyPlaylist\n\t{\n\t\tPlaylistItem this[int i] { get; }\n\t\tstring Title { get; }\n\t\tIReadOnlyList<PlaylistItem> Items { get; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/PlaylistApiExtensions.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TS3AudioBot.ResourceFactories;\nusing TS3AudioBot.Web.Model;\n\nnamespace TS3AudioBot.Playlists\n{\n\tpublic static class PlaylistApiExtensions\n\t{\n\t\tpublic static PlaylistItemGetData ToApiFormat(this ResolveContext resourceFactory, PlaylistItem item)\n\t\t{\n\t\t\tvar resource = item.AudioResource;\n\t\t\treturn new PlaylistItemGetData\n\t\t\t{\n\t\t\t\tLink = resourceFactory.RestoreLink(resource),\n\t\t\t\tTitle = resource.ResourceTitle,\n\t\t\t\tAudioType = resource.AudioType,\n\t\t\t};\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/PlaylistIO.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing TS3AudioBot.Algorithm;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.ResourceFactories;\nusing TS3AudioBot.Web.Model;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Playlists\n{\n\tpublic class PlaylistIO : IDisposable\n\t{\n\t\tprivate readonly ConfBot confBot;\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate readonly Dictionary<string, PlaylistMeta> playlistInfo = new Dictionary<string, PlaylistMeta>();\n\t\tprivate readonly LruCache<string, Playlist> playlistCache = new LruCache<string, Playlist>(16);\n\t\tprivate readonly HashSet<string> dirtyList = new HashSet<string>();\n\t\tprivate readonly ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();\n\t\tprivate bool reloadFolderCache = true;\n\t\tprivate const int FileVersion = 3;\n\n\t\tpublic PlaylistIO(ConfBot confBot)\n\t\t{\n\t\t\tthis.confBot = confBot;\n\t\t}\n\n\t\tprivate FileInfo? NameToFile(string listId)\n\t\t{\n\t\t\tvar localDir = confBot.LocalConfigDir;\n\t\t\tif (localDir is null)\n\t\t\t\treturn null;\n\t\t\treturn new FileInfo(Path.Combine(localDir, BotPaths.Playlists, listId));\n\t\t}\n\n\t\tpublic R<Playlist, LocalStr> Read(string listId) => ReadInternal(listId, false, false);\n\n\t\tprivate R<Playlist, LocalStr> ReadInternal(string listId, bool hasReadLock, bool hasWriteLock)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (!hasReadLock && !hasWriteLock)\n\t\t\t\t{\n\t\t\t\t\trwLock.EnterReadLock();\n\t\t\t\t\thasReadLock = true;\n\t\t\t\t}\n\n\t\t\t\tif (playlistCache.TryGetValue(listId, out var playlist))\n\t\t\t\t{\n\t\t\t\t\treturn playlist;\n\t\t\t\t}\n\n\t\t\t\tif (!hasWriteLock)\n\t\t\t\t{\n\t\t\t\t\trwLock.ExitReadLock();\n\t\t\t\t\thasReadLock = false;\n\n\t\t\t\t\trwLock.EnterWriteLock();\n\t\t\t\t\thasWriteLock = true;\n\t\t\t\t}\n\n\t\t\t\tvar result = ReadFromFile(listId);\n\n\t\t\t\tif (result.Ok)\n\t\t\t\t{\n\t\t\t\t\tplaylistCache.Set(listId, result.Value);\n\t\t\t\t\treturn result.Value;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn result.Error;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tif (hasReadLock)\n\t\t\t\t\trwLock.ExitReadLock();\n\t\t\t\tif (hasWriteLock)\n\t\t\t\t\trwLock.ExitWriteLock();\n\t\t\t}\n\t\t}\n\n\t\tprivate R<Playlist, LocalStr> ReadFromFile(string listId, bool headOnly = false)\n\t\t{\n\t\t\tvar fi = NameToFile(listId);\n\t\t\tif (fi is null || !fi.Exists)\n\t\t\t\treturn new LocalStr(strings.error_playlist_not_found);\n\n\t\t\tusing var sr = new StreamReader(fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read), Tools.Utf8Encoder);\n\t\t\tvar metaRes = ReadHeadStream(sr);\n\t\t\tif (!metaRes.Ok)\n\t\t\t\treturn metaRes.Error;\n\t\t\tvar meta = metaRes.Value;\n\n\t\t\tplaylistInfo[listId] = meta;\n\n\t\t\tvar plist = new Playlist\n\t\t\t{\n\t\t\t\tTitle = meta.Title\n\t\t\t};\n\n\t\t\tif (headOnly)\n\t\t\t\treturn plist;\n\n\t\t\t// read content\n\t\t\tstring? line;\n\t\t\twhile ((line = sr.ReadLine()) != null)\n\t\t\t{\n\t\t\t\tvar kvp = line.Split(new[] { ':' }, 2);\n\t\t\t\tif (kvp.Length < 2) continue;\n\n\t\t\t\tstring key = kvp[0];\n\t\t\t\tstring value = kvp[1];\n\n\t\t\t\tswitch (key)\n\t\t\t\t{\n\t\t\t\t// Legacy entry\n\t\t\t\tcase \"rs\":\n\t\t\t\t\t{\n\t\t\t\t\t\tvar rskvp = value.Split(new[] { ':' }, 2);\n\t\t\t\t\t\tif (kvp.Length < 2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tLog.Warn(\"Erroneus playlist split count: {0}\", line);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstring content = rskvp[1];\n\n\t\t\t\t\t\tvar rsSplit = content.Split(new[] { ',' }, 3);\n\t\t\t\t\t\tif (rsSplit.Length < 3)\n\t\t\t\t\t\t\tgoto default;\n\t\t\t\t\t\tif (!string.IsNullOrWhiteSpace(rsSplit[0]))\n\t\t\t\t\t\t\tplist.Add(new PlaylistItem(new AudioResource(Uri.UnescapeDataString(rsSplit[1]), Uri.UnescapeDataString(rsSplit[2]), rsSplit[0])));\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tgoto default;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\tcase \"rsj\":\n\t\t\t\t\tvar res = JsonConvert.DeserializeObject<AudioResource>(value);\n\t\t\t\t\tplist.Add(new PlaylistItem(res));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"id\":\n\t\t\t\tcase \"ln\":\n\t\t\t\t\tLog.Warn(\"Deprecated playlist data block: {0}\", line);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tLog.Warn(\"Erroneus playlist data block: {0}\", line);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmeta.Count = plist.Items.Count;\n\t\t\treturn plist;\n\t\t}\n\n\t\tprivate R<PlaylistMeta, LocalStr> ReadHeadStream(StreamReader sr)\n\t\t{\n\t\t\tstring? line;\n\t\t\tint version = -1;\n\n\t\t\t// read header\n\t\t\twhile ((line = sr.ReadLine()) != null)\n\t\t\t{\n\t\t\t\tif (string.IsNullOrEmpty(line))\n\t\t\t\t\tbreak;\n\n\t\t\t\tvar kvp = line.Split(new[] { ':' }, 2);\n\t\t\t\tif (kvp.Length < 2) continue;\n\n\t\t\t\tstring key = kvp[0];\n\t\t\t\tstring value = kvp[1];\n\n\t\t\t\tswitch (key)\n\t\t\t\t{\n\t\t\t\tcase \"version\":\n\t\t\t\t\tversion = int.Parse(value);\n\t\t\t\t\tif (version > FileVersion)\n\t\t\t\t\t\treturn new LocalStr(\"The file version is too new and can't be read.\"); // LOC: TODO\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"meta\":\n\t\t\t\t\tvar meta = JsonConvert.DeserializeObject<PlaylistMeta>(value);\n\t\t\t\t\tmeta.Version = version;\n\t\t\t\t\treturn meta;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new PlaylistMeta { Title = \"\", Count = 0, Version = version };\n\t\t}\n\n\t\tpublic E<LocalStr> Write(string listId, IReadOnlyPlaylist list)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\trwLock.EnterWriteLock();\n\n\t\t\t\tvar result = WriteToFile(listId, list);\n\t\t\t\tdirtyList.Remove(listId);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\trwLock.ExitWriteLock();\n\t\t\t}\n\t\t}\n\n\t\tprivate E<LocalStr> WriteToFile(string listId, IReadOnlyPlaylist plist)\n\t\t{\n\t\t\tvar fi = NameToFile(listId);\n\t\t\tif (fi is null)\n\t\t\t\treturn new LocalStr(strings.error_playlist_no_store_directory);\n\t\t\tvar dir = fi.Directory;\n\t\t\tif (!dir.Exists)\n\t\t\t\tdir.Create();\n\n\t\t\tusing (var sw = new StreamWriter(fi.Open(FileMode.Create, FileAccess.Write, FileShare.Read), Tools.Utf8Encoder))\n\t\t\t{\n\t\t\t\tvar serializer = new JsonSerializer\n\t\t\t\t{\n\t\t\t\t\tFormatting = Formatting.None,\n\t\t\t\t};\n\n\t\t\t\tvar meta = playlistInfo.GetOrNew(listId);\n\t\t\t\tmeta.Title = plist.Title;\n\t\t\t\tmeta.Count = plist.Items.Count;\n\t\t\t\tmeta.Version = FileVersion;\n\n\t\t\t\tsw.WriteLine(\"version:\" + FileVersion);\n\t\t\t\tsw.Write(\"meta:\");\n\t\t\t\tserializer.Serialize(sw, meta);\n\t\t\t\tsw.WriteLine();\n\n\t\t\t\tsw.WriteLine();\n\n\t\t\t\tforeach (var pli in plist.Items)\n\t\t\t\t{\n\t\t\t\t\tsw.Write(\"rsj:\");\n\t\t\t\t\tserializer.Serialize(sw, pli.AudioResource);\n\t\t\t\t\tsw.WriteLine();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tpublic E<LocalStr> Delete(string listId)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\trwLock.EnterWriteLock();\n\t\t\t\treturn DeleteInternal(listId);\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\trwLock.ExitWriteLock();\n\t\t\t}\n\t\t}\n\n\t\tprivate E<LocalStr> DeleteInternal(string listId)\n\t\t{\n\t\t\tvar fi = NameToFile(listId);\n\t\t\tbool cached = playlistInfo.ContainsKey(listId);\n\n\t\t\tif (!cached && (fi is null || !fi.Exists))\n\t\t\t\treturn new LocalStr(strings.error_playlist_not_found);\n\n\t\t\tplaylistCache.Remove(listId);\n\t\t\tplaylistInfo.Remove(listId);\n\t\t\tdirtyList.Remove(listId);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tfi?.Delete();\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\tcatch (IOException) { return new LocalStr(strings.error_io_in_use); }\n\t\t\tcatch (System.Security.SecurityException) { return new LocalStr(strings.error_io_missing_permission); }\n\t\t}\n\n\t\tpublic R<PlaylistInfo[], LocalStr> ListPlaylists(string? pattern)\n\t\t{\n\t\t\tif (confBot.LocalConfigDir is null)\n\t\t\t\treturn new LocalStr(\"Temporary bots cannot have playlists\"); // TODO do this for all other methods too\n\n\t\t\tbool hasWriteLock = false;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (reloadFolderCache)\n\t\t\t\t{\n\t\t\t\t\trwLock.EnterWriteLock();\n\t\t\t\t\thasWriteLock = true;\n\n\t\t\t\t\tvar di = new DirectoryInfo(Path.Combine(confBot.LocalConfigDir, BotPaths.Playlists));\n\t\t\t\t\tif (!di.Exists)\n\t\t\t\t\t\treturn Array.Empty<PlaylistInfo>();\n\n\t\t\t\t\tIEnumerable<FileInfo> fileEnu;\n\t\t\t\t\tif (string.IsNullOrEmpty(pattern))\n\t\t\t\t\t\tfileEnu = di.EnumerateFiles();\n\t\t\t\t\telse\n\t\t\t\t\t\tfileEnu = di.EnumerateFiles(pattern, SearchOption.TopDirectoryOnly); // TODO exceptions\n\n\t\t\t\t\tplaylistInfo.Clear();\n\t\t\t\t\tforeach (var fi in fileEnu)\n\t\t\t\t\t{\n\t\t\t\t\t\tReadFromFile(fi.Name, true);\n\t\t\t\t\t}\n\n\t\t\t\t\treloadFolderCache = false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trwLock.EnterReadLock();\n\t\t\t\t\thasWriteLock = false;\n\t\t\t\t}\n\n\t\t\t\treturn playlistInfo.Select(kvp => new PlaylistInfo(kvp.Key, kvp.Value.Title)\n\t\t\t\t{\n\t\t\t\t\tSongCount = kvp.Value.Count\n\t\t\t\t}).ToArray();\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tif (hasWriteLock)\n\t\t\t\t\trwLock.ExitWriteLock();\n\t\t\t\telse\n\t\t\t\t\trwLock.ExitReadLock();\n\t\t\t}\n\t\t}\n\n\t\tpublic void ReloadFolderCache() => reloadFolderCache = true;\n\n\t\tpublic bool Exists(string listId)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\trwLock.EnterWriteLock();\n\t\t\t\treturn ExistsInternal(listId);\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\trwLock.ExitWriteLock();\n\t\t\t}\n\t\t}\n\n\t\tpublic bool ExistsInternal(string listId)\n\t\t{\n\t\t\tif (playlistInfo.ContainsKey(listId))\n\t\t\t\treturn true;\n\t\t\tvar fi = NameToFile(listId);\n\t\t\treturn fi is null || fi.Exists;\n\t\t}\n\n\t\tpublic void Flush()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\trwLock.EnterWriteLock();\n\n\t\t\t\tforeach (var name in dirtyList)\n\t\t\t\t{\n\t\t\t\t\tif (playlistCache.TryGetValue(name, out var plist))\n\t\t\t\t\t\tWriteToFile(name, plist);\n\t\t\t\t}\n\n\t\t\t\tdirtyList.Clear();\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\trwLock.ExitWriteLock();\n\t\t\t}\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tFlush();\n\n\t\t\trwLock.Dispose();\n\t\t}\n\t}\n\n\tpublic class PlaylistMeta\n\t{\n\t\t[JsonProperty(PropertyName = \"count\")]\n\t\tpublic int Count { get; set; }\n\t\t[JsonProperty(PropertyName = \"title\")]\n\t\tpublic string Title { get; set; } = string.Empty;\n\t\t[JsonIgnore]\n\t\tpublic int Version { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/PlaylistItem.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TS3AudioBot.Audio;\nusing TS3AudioBot.CommandSystem.CommandResults;\nusing TS3AudioBot.ResourceFactories;\n\nnamespace TS3AudioBot.Playlists\n{\n\tpublic class PlaylistItem : IAudioResourceResult, IMetaContainer\n\t{\n\t\tpublic PlayInfo? PlayInfo { get; set; }\n\t\tpublic AudioResource AudioResource { get; }\n\n\t\tpublic PlaylistItem(AudioResource resource, PlayInfo? meta = null)\n\t\t{\n\t\t\tAudioResource = resource ?? throw new ArgumentNullException(nameof(resource));\n\t\t\tPlayInfo = meta;\n\t\t}\n\n\t\tpublic static PlaylistItem From(PlayResource playResource)\n\t\t{\n\t\t\treturn new PlaylistItem(playResource.AudioResource, playResource.PlayInfo);\n\t\t}\n\n\t\tpublic override string ToString() => AudioResource.ResourceTitle ?? $\"{AudioResource.AudioType}: {AudioResource.ResourceId}\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/PlaylistManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Playlists.Shuffle;\nusing TS3AudioBot.Web.Model;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Playlists\n{\n\tpublic sealed class PlaylistManager\n\t{\n\t\tprivate readonly PlaylistIO playlistPool;\n\t\tprivate const string mixName = \".mix\";\n\t\tprivate readonly Playlist mixList = new Playlist() { Title = \"Now Playing\" };\n\t\tprivate readonly object listLock = new object();\n\t\tpublic IReadOnlyPlaylist CurrentList => mixList;\n\n\t\tprivate IShuffleAlgorithm shuffle;\n\n\t\tprivate readonly IShuffleAlgorithm NormalOrder = new NormalOrder();\n\t\tprivate readonly IShuffleAlgorithm RandomOrder = new LinearFeedbackShiftRegister();\n\n\t\tpublic int Index { get => shuffle.Index; set => shuffle.Index = value; }\n\n\t\tpublic PlaylistItem? Current => MoveIndex(null, true);\n\n\t\tprivate bool random;\n\t\tpublic bool Random\n\t\t{\n\t\t\tget => random;\n\t\t\tset\n\t\t\t{\n\t\t\t\trandom = value;\n\t\t\t\tvar index = shuffle.Index;\n\t\t\t\tif (random)\n\t\t\t\t\tshuffle = RandomOrder;\n\t\t\t\telse\n\t\t\t\t\tshuffle = NormalOrder;\n\t\t\t\tshuffle.Index = index;\n\t\t\t}\n\t\t}\n\n\t\tpublic int Seed { get => shuffle.Seed; set => shuffle.Seed = value; }\n\n\t\t/// <summary>Loop mode for the current playlist.</summary>\n\t\tpublic LoopMode Loop { get; set; } = LoopMode.Off;\n\n\t\tpublic PlaylistManager(ConfPlaylists _, PlaylistIO playlistPool)\n\t\t{\n\t\t\tthis.playlistPool = playlistPool;\n\t\t\tshuffle = NormalOrder;\n\t\t}\n\n\t\tpublic PlaylistItem? Next(bool manually = true) => MoveIndex(forward: true, manually);\n\n\t\tpublic PlaylistItem? Previous(bool manually = true) => MoveIndex(forward: false, manually);\n\n\t\tinternal PlaylistItem? MoveIndex(bool? forward, bool manually)\n\t\t{\n\t\t\tlock (listLock)\n\t\t\t{\n\t\t\t\tif (mixList.Items.Count == 0)\n\t\t\t\t\treturn null;\n\n\t\t\t\tif (shuffle.Length != mixList.Items.Count)\n\t\t\t\t\tshuffle.Length = mixList.Items.Count;\n\t\t\t\tif (shuffle.Index < 0 || shuffle.Index >= mixList.Items.Count)\n\t\t\t\t\tshuffle.Index = 0;\n\n\t\t\t\t// When next/prev was requested manually (via command) we ignore the loop one\n\t\t\t\t// mode and instead move the index.\n\t\t\t\tif ((Loop == LoopMode.One && !manually) || forward is null)\n\t\t\t\t\treturn mixList[shuffle.Index];\n\n\t\t\t\tbool listEnded;\n\t\t\t\tif (forward == true)\n\t\t\t\t\tlistEnded = shuffle.Next();\n\t\t\t\telse\n\t\t\t\t\tlistEnded = shuffle.Prev();\n\n\t\t\t\t// Get a new seed when one play-through ended.\n\t\t\t\tif (listEnded && Random)\n\t\t\t\t\tSetRandomSeed();\n\n\t\t\t\t// If a next/prev request goes over the bounds of the list while loop mode is off\n\t\t\t\t// but was requested manually we act as if the list was looped.\n\t\t\t\t// This will give a more intuitive behaviour when the list is shuffeled (and also if not)\n\t\t\t\t// as the end might not be clear or visible.\n\t\t\t\tif (Loop == LoopMode.Off && listEnded && !manually)\n\t\t\t\t\treturn null;\n\n\t\t\t\treturn mixList[shuffle.Index];\n\t\t\t}\n\t\t}\n\n\t\tpublic void Queue(PlaylistItem item)\n\t\t\t=> ModifyPlaylist(mixName, mix => mix.Add(item).UnwrapThrow());\n\n\t\tpublic void Queue(IEnumerable<PlaylistItem> items)\n\t\t\t=> ModifyPlaylist(mixName, mix => mix.AddRange(items).UnwrapThrow());\n\n\t\tpublic void Clear()\n\t\t\t=> ModifyPlaylist(mixName, mix => mix.Clear());\n\n\t\tprivate void SetRandomSeed()\n\t\t{\n\t\t\tshuffle.Seed = Tools.Random.Next();\n\t\t}\n\n\t\tpublic R<IReadOnlyPlaylist, LocalStr> LoadPlaylist(string listId)\n\t\t{\n\t\t\tR<Playlist, LocalStr> res;\n\t\t\tif (listId.StartsWith(\".\", StringComparison.Ordinal))\n\t\t\t{\n\t\t\t\tres = GetSpecialPlaylist(listId);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar checkName = Util.IsSafeFileName(listId);\n\t\t\t\tif (!checkName.Ok)\n\t\t\t\t\treturn checkName.Error;\n\t\t\t\tres = playlistPool.Read(listId);\n\t\t\t}\n\n\t\t\tif (!res.Ok)\n\t\t\t\treturn res.Error;\n\t\t\treturn res.Value;\n\t\t}\n\n\t\tpublic E<LocalStr> CreatePlaylist(string listId, string? title = null)\n\t\t{\n\t\t\tvar checkName = Util.IsSafeFileName(listId);\n\t\t\tif (!checkName.Ok)\n\t\t\t\treturn checkName;\n\t\t\tif (playlistPool.Exists(listId))\n\t\t\t\treturn new LocalStr(\"Already exists\");\n\t\t\treturn playlistPool.Write(listId, new Playlist().SetTitle(title ?? listId));\n\t\t}\n\n\t\tpublic bool ExistsPlaylist(string listId)\n\t\t{\n\t\t\tif (GetSpecialPlaylist(listId))\n\t\t\t\treturn true;\n\t\t\tvar checkName = Util.IsSafeFileName(listId);\n\t\t\tif (!checkName.Ok)\n\t\t\t\treturn false;\n\t\t\treturn playlistPool.Exists(listId);\n\t\t}\n\n\t\tpublic E<LocalStr> ModifyPlaylist(string listId, Action<Playlist> action)\n\t\t{\n\t\t\tvar res = GetSpecialPlaylist(listId);\n\t\t\tif (res)\n\t\t\t{\n\t\t\t\tvar plist = res.Value;\n\t\t\t\tlock (listLock)\n\t\t\t\t{\n\t\t\t\t\taction(plist);\n\t\t\t\t}\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar checkName = Util.IsSafeFileName(listId);\n\t\t\t\tif (!checkName.Ok)\n\t\t\t\t\treturn checkName.Error;\n\t\t\t\tres = playlistPool.Read(listId);\n\t\t\t\tif (!res.Ok)\n\t\t\t\t\treturn res.Error;\n\t\t\t\tvar plist = res.Value;\n\t\t\t\tlock (listLock)\n\t\t\t\t{\n\t\t\t\t\taction(plist);\n\t\t\t\t}\n\t\t\t\treturn playlistPool.Write(listId, plist);\n\t\t\t}\n\t\t}\n\n\t\tpublic E<LocalStr> DeletePlaylist(string listId)\n\t\t{\n\t\t\tvar checkName = Util.IsSafeFileName(listId);\n\t\t\tif (!checkName.Ok)\n\t\t\t\treturn checkName.Error;\n\n\t\t\treturn playlistPool.Delete(listId);\n\t\t}\n\n\t\tpublic R<PlaylistInfo[], LocalStr> GetAvailablePlaylists(string? pattern = null) => playlistPool.ListPlaylists(pattern);\n\n\t\tprivate R<Playlist, LocalStr> GetSpecialPlaylist(string listId)\n\t\t{\n\t\t\treturn listId switch\n\t\t\t{\n\t\t\t\tmixName => mixList,\n\t\t\t\t_ => new LocalStr(strings.error_playlist_special_not_found),\n\t\t\t};\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/Shuffle/IShuffleAlgorithm.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Playlists.Shuffle\n{\n\tpublic interface IShuffleAlgorithm\n\t{\n\t\tint Seed { get; set; }\n\t\tint Length { get; set; }\n\t\tint Index { get; set; }\n\t\t// Returns true if the step reached the end of the list and wrapped around\n\t\tbool Next();\n\t\t// Returns true if the step reached the end of the list and wrapped around\n\t\tbool Prev();\n\t}\n\n\t// Output conventions:\n\t//\n\t// if Index = x, x >= Length\n\t//   => Index = Tools.MathMod(Index, Length)\n\t// if Index = x, x < 0\n\t//   => Index : undefined\n\t// if Index = x, Length < 0\n\t//   => Index = -1\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/Shuffle/LinearFeedbackShiftRegister.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Playlists.Shuffle\n{\n\tpublic class LinearFeedbackShiftRegister : IShuffleAlgorithm\n\t{\n\t\tprivate int register = 1; // aka index\n\t\tprivate int mask;\n\t\tprivate int maskLength;\n\t\tprivate int seed;\n\t\tprivate int length;\n\t\tprivate int startRegister;\n\t\tprivate bool needsRecalc = true;\n\n\t\tpublic int Seed { get => seed; set { needsRecalc |= seed != value; seed = value; } }\n\t\tpublic int Length { get => length; set { needsRecalc |= length != value; length = value; } }\n\t\tpublic int Index\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (Length <= 0)\n\t\t\t\t\treturn -1;\n\t\t\t\treturn Tools.MathMod(register + Seed, Length);\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (Length <= 0)\n\t\t\t\t\treturn;\n\t\t\t\tRecalc();\n\t\t\t\tregister = Tools.MathMod(value - Seed, Length);\n\t\t\t\tstartRegister = register;\n\t\t\t}\n\t\t}\n\n\t\tprivate void Recalc()\n\t\t{\n\t\t\tif (!needsRecalc) return;\n\t\t\tneedsRecalc = false;\n\n\t\t\tif (Length <= 0) return;\n\t\t\tregister = (register % Length) + 1;\n\n\t\t\t// get the highest set bit (+1) to hold at least all values with a power of 2\n\t\t\tint maxPow = 31;\n\t\t\twhile (((1 << maxPow) & Length) == 0 && maxPow >= 0)\n\t\t\t\tmaxPow--;\n\t\t\tmaxPow++;\n\t\t\tmask = GenerateGaloisMask(maxPow, seed);\n\t\t\tmaskLength = 1 << maxPow;\n\t\t}\n\n\t\tpublic bool Next()\n\t\t{\n\t\t\tif (Length <= 0) return false;\n\t\t\tRecalc();\n\t\t\tdo\n\t\t\t{\n\t\t\t\tregister = NextOf(register);\n\t\t\t} while ((uint)register > Length);\n\t\t\treturn register == startRegister;\n\t\t}\n\n\t\tprivate int NextOf(int val)\n\t\t{\n\t\t\tvar lsb = val & 1;\n\t\t\tval >>= 1;\n\t\t\tval ^= -lsb & mask;\n\t\t\treturn val;\n\t\t}\n\n\t\tpublic bool Prev()\n\t\t{\n\t\t\tif (Length <= 0) return false;\n\t\t\tRecalc();\n\t\t\tdo\n\t\t\t{\n\t\t\t\tregister = PrevOf(register);\n\t\t\t} while ((uint)register > Length);\n\t\t\treturn register == startRegister;\n\t\t}\n\n\t\tprivate int PrevOf(int val)\n\t\t{\n\t\t\tvar v0 = PrevOfTest(val, 0);\n\t\t\tvar v1 = PrevOfTest(val, 1);\n\t\t\tif (v0 < maskLength && NextOf(v0) == val)\n\t\t\t\treturn v0;\n\t\t\tif (v1 < maskLength && NextOf(v1) == val)\n\t\t\t\treturn v1;\n\t\t\tthrow new InvalidOperationException();\n\t\t}\n\n\t\tprivate int PrevOfTest(int val, int lsb)\n\t\t{\n\t\t\tvar pval = (-lsb & mask) ^ val;\n\t\t\treturn (pval << 1) | lsb;\n\t\t}\n\n\t\tprivate static int GenerateGaloisMask(int bits, int seedOffset)\n\t\t{\n\t\t\tif (bits == 1) return 1;\n\t\t\tif (bits == 2) return 3;\n\n\t\t\tint start = 1 << (bits - 1);\n\t\t\tint end = 1 << (bits);\n\t\t\tint diff = end - start;\n\n\t\t\tfor (int i = 0; i < diff; i++)\n\t\t\t{\n\t\t\t\tint checkMask = Tools.MathMod(i + seedOffset, diff) + start;\n\t\t\t\tif (NumberOfSetBits(checkMask) % 2 != 0) continue;\n\n\t\t\t\tif (TestLfsr(checkMask, end))\n\t\t\t\t\treturn checkMask;\n\t\t\t}\n\t\t\tthrow new InvalidOperationException();\n\t\t}\n\n\t\tprivate static bool TestLfsr(int mask, int max)\n\t\t{\n\t\t\tconst int start = 1;\n\t\t\tint field = start;\n\n\t\t\tfor (int i = 2; i < max; i++)\n\t\t\t{\n\t\t\t\tint lsb = field & 1;\n\t\t\t\tfield >>= 1;\n\t\t\t\tfield ^= -lsb & mask;\n\t\t\t\tif (field == start) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate static int NumberOfSetBits(int i)\n\t\t{\n#if NETCOREAPP3_1\n\t\t\tif (System.Runtime.Intrinsics.X86.Popcnt.IsSupported)\n\t\t\t\treturn unchecked((int)System.Runtime.Intrinsics.X86.Popcnt.PopCount((uint)i));\n#endif\n\t\t\ti -= ((i >> 1) & 0x55555555);\n\t\t\ti = (i & 0x33333333) + ((i >> 2) & 0x33333333);\n\t\t\treturn (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/Shuffle/ListedShuffle.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Linq;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Playlists.Shuffle\n{\n\tpublic class ListedShuffle : IShuffleAlgorithm\n\t{\n\t\tprivate int[] permutation = Array.Empty<int>();\n\n\t\tprivate bool needsRecalc = true;\n\t\tprivate int index;\n\t\tprivate int seed;\n\t\tprivate int length;\n\n\t\tpublic int Seed\n\t\t{\n\t\t\tget => seed;\n\t\t\tset { needsRecalc |= seed != value; seed = value; }\n\t\t}\n\t\tpublic int Length\n\t\t{\n\t\t\tget => length;\n\t\t\tset { needsRecalc |= length != value; length = value; }\n\t\t}\n\t\tpublic int Index\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (Length <= 0) return -1;\n\t\t\t\tGenList();\n\t\t\t\treturn permutation[index];\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (Length <= 0) return;\n\t\t\t\tGenList();\n\t\t\t\tindex = Array.IndexOf(permutation, Tools.MathMod(value, permutation.Length));\n\t\t\t}\n\t\t}\n\n\t\tprivate void GenList()\n\t\t{\n\t\t\tif (!needsRecalc) return;\n\t\t\tneedsRecalc = false;\n\n\t\t\tif (Length <= 0) return;\n\n\t\t\tvar rngeesus = new Random(seed);\n\t\t\tpermutation = Enumerable.Range(0, length).Select(i => i).OrderBy(_ => rngeesus.Next()).ToArray();\n\t\t\tindex %= Length;\n\t\t}\n\n\t\tpublic bool Next()\n\t\t{\n\t\t\tif (Length <= 0)\n\t\t\t\treturn false;\n\t\t\tGenList();\n\t\t\tindex = (index + 1) % permutation.Length;\n\t\t\treturn index == 0;\n\t\t}\n\t\tpublic bool Prev()\n\t\t{\n\t\t\tif (Length <= 0)\n\t\t\t\treturn false;\n\t\t\tGenList();\n\t\t\tindex = ((index - 1) % permutation.Length + permutation.Length) % permutation.Length;\n\t\t\treturn index == permutation.Length - 1;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Playlists/Shuffle/NormalOrder.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Playlists.Shuffle\n{\n\tpublic class NormalOrder : IShuffleAlgorithm\n\t{\n\t\tpublic int Seed { get; set; }\n\t\tpublic int Length { get; set; }\n\t\tpublic int Index { get; set; }\n\n\t\tpublic bool Next()\n\t\t{\n\t\t\tIndex = Tools.MathMod(Index + 1, Length);\n\t\t\treturn Index == 0;\n\t\t}\n\n\t\tpublic bool Prev()\n\t\t{\n\t\t\tIndex = Tools.MathMod(Index - 1, Length);\n\t\t\treturn Index == Length - 1;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Plugins/ITabPlugin.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.Plugins\n{\n\tpublic interface ITabPlugin : IDisposable\n\t{\n\t\tvoid Initialize();\n\t}\n\n\tpublic interface ICorePlugin : ITabPlugin { }\n\n\tpublic interface IBotPlugin : ITabPlugin { }\n\n\tpublic interface IPluginMeta\n\t{\n\t\tstring Name { get; }\n\t\tstring Description { get; }\n\t\tstring Author { get; }\n\t\tUri ProjectUrl { get; }\n\t\tVersion Version { get; }\n\t}\n\n\t[AttributeUsage(AttributeTargets.Class, Inherited = false)]\n\t[Obsolete(\"Static Plugins are deprecated, use an ICorePlugin instead\")]\n\tpublic sealed class StaticPluginAttribute : Attribute { }\n}\n"
  },
  {
    "path": "TS3AudioBot/Plugins/Plugin.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.Emit;\nusing Microsoft.CodeAnalysis.Text;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Security.Cryptography;\nusing System.Text;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.ResourceFactories;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Plugins\n{\n\tinternal class Plugin\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tprivate readonly CoreInjector coreInjector;\n\t\tprivate readonly ResourceResolver resourceResolver;\n\t\tprivate readonly BotManager botManager;\n\n\t\tprivate byte[]? md5CacheSum;\n\t\tprivate PluginObjects? corePlugin;\n\t\tprivate readonly Dictionary<Bot, PluginObjects> botPluginList = new Dictionary<Bot, PluginObjects>();\n\t\tprivate IResolver? factoryObject;\n\t\tprivate Type? pluginType;\n\t\tprivate PluginStatus status;\n\n\t\tinternal PluginType Type { get; private set; }\n\t\tpublic int Id { get; }\n\t\tpublic FileInfo File { get; }\n\t\t// TODO remove after plugin rework\n\t\tinternal PluginObjects CorePlugin => corePlugin!;\n\n\t\tpublic Plugin(CoreInjector coreInjector, ResourceResolver resourceResolver, BotManager botManager, FileInfo file, int id)\n\t\t{\n\t\t\tthis.coreInjector = coreInjector;\n\t\t\tthis.resourceResolver = resourceResolver;\n\t\t\tthis.botManager = botManager;\n\n\t\t\tcorePlugin = null;\n\t\t\tFile = file;\n\t\t\tId = id;\n\t\t\tstatus = PluginStatus.Off;\n\t\t\tType = PluginType.None;\n\t\t}\n\n\t\tpublic string Name\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (CheckStatus(null) == PluginStatus.Error)\n\t\t\t\t\treturn $\"{File.Name} (Error)\";\n\n\t\t\t\tvar name = pluginType?.Name ?? File.Name;\n\n\t\t\t\tswitch (Type)\n\t\t\t\t{\n\t\t\t\tcase PluginType.Factory:\n\t\t\t\t\tif (factoryObject?.ResolverFor != null)\n\t\t\t\t\t\treturn $\"{factoryObject.ResolverFor}-factory\";\n\t\t\t\t\treturn $\"{name} (Factory)\";\n\t\t\t\tcase PluginType.BotPlugin:\n\t\t\t\t\treturn $\"{name} (BotPlugin)\";\n\t\t\t\tcase PluginType.CorePlugin:\n\t\t\t\t\treturn $\"{name} (CorePlugin)\";\n\t\t\t\tcase PluginType.Commands:\n\t\t\t\t\treturn $\"{name} (Commands)\";\n\t\t\t\tcase PluginType.None:\n\t\t\t\t\treturn $\"{File.Name} (Unknown)\";\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(Type);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic PluginStatus CheckStatus(Bot? bot)\n\t\t{\n\t\t\tif (Type != PluginType.BotPlugin)\n\t\t\t\treturn status;\n\t\t\tif (status == PluginStatus.Disabled\n\t\t\t\t|| status == PluginStatus.Error\n\t\t\t\t|| status == PluginStatus.Off)\n\t\t\t\treturn status;\n\t\t\tif (bot is null)\n\t\t\t\treturn PluginStatus.NotAvailable;\n\t\t\tif (status == PluginStatus.Ready)\n\t\t\t\treturn botPluginList.ContainsKey(bot) ? PluginStatus.Active : PluginStatus.Ready;\n\t\t\tif (status == PluginStatus.Active)\n\t\t\t\tthrow new InvalidOperationException(\"BotPlugin must not be active\");\n\t\t\tthrow Tools.UnhandledDefault(status);\n\t\t}\n\n\t\tpublic PluginResponse Load()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (PluginManager.IsIgnored(File))\n\t\t\t\t\treturn PluginResponse.Disabled;\n\n\t\t\t\tvar locStatus = CheckStatus(null);\n\t\t\t\tvar cacheOk = Md5EqualsCache();\n\t\t\t\tif (locStatus != PluginStatus.Off && cacheOk)\n\t\t\t\t{\n\t\t\t\t\treturn locStatus == PluginStatus.Ready || locStatus == PluginStatus.Active\n\t\t\t\t\t\t? PluginResponse.Ok\n\t\t\t\t\t\t: PluginResponse.UnknownError;\n\t\t\t\t}\n\n\t\t\t\tUnload();\n\n\t\t\t\tPluginResponse result;\n\t\t\t\tswitch (File.Extension)\n\t\t\t\t{\n\t\t\t\tcase \".cs\":\n\t\t\t\t\tresult = PrepareSource();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \".dll\":\n\t\t\t\tcase \".exe\":\n\t\t\t\t\tresult = PrepareBinary();\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new InvalidProgramException();\n\t\t\t\t}\n\n\t\t\t\tstatus = result == PluginResponse.Ok ? PluginStatus.Ready : PluginStatus.Error;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (BadImageFormatException bifex)\n\t\t\t{\n\t\t\t\tLog.Warn(\"Plugin \\\"{0}\\\" has an invalid format: {1} (Add a \\\"{0}.ignore\\\" file to ignore this file)\",\n\t\t\t\t\tFile.Name,\n\t\t\t\t\tbifex.InnerException?.Message ?? bifex.Message);\n\t\t\t\tstatus = PluginStatus.Error;\n\t\t\t\treturn PluginResponse.InvalidBinary;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Warn(\"Plugin \\\"{0}\\\" failed to prepare: {1}\",\n\t\t\t\t\tFile.Name,\n\t\t\t\t\tex.Message);\n\t\t\t\tstatus = PluginStatus.Error;\n\t\t\t\treturn PluginResponse.Crash;\n\t\t\t}\n\t\t}\n\n\t\tprivate bool Md5EqualsCache()\n\t\t{\n\t\t\tusing var md5 = MD5.Create();\n\t\t\tusing var stream = System.IO.File.OpenRead(File.FullName);\n\t\t\tvar newHashSum = md5.ComputeHash(stream);\n\t\t\tif (md5CacheSum is null)\n\t\t\t{\n\t\t\t\tmd5CacheSum = newHashSum;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar equals = md5CacheSum.SequenceEqual(newHashSum);\n\t\t\tmd5CacheSum = newHashSum;\n\t\t\treturn equals;\n\t\t}\n\n\t\tprivate PluginResponse PrepareBinary()\n\t\t{\n\t\t\t// Do not use 'Assembly.LoadFile' as otherwise we cannot replace the dll\n\t\t\t// on windows aymore after it's opened once.\n\t\t\tvar asmBin = System.IO.File.ReadAllBytes(File.FullName);\n\t\t\tvar pdbFile = File.FullName[0..^File.Extension.Length] + \".pdb\";\n\t\t\tbyte[]? pdbBin = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (System.IO.File.Exists(pdbFile))\n\t\t\t\t\tpdbBin = System.IO.File.ReadAllBytes(pdbFile);\n\t\t\t}\n\t\t\tcatch (Exception ex) { Log.Debug(ex, \"No pdb file found\"); }\n\t\t\tvar assembly = Assembly.Load(asmBin, pdbBin);\n\t\t\treturn InitializeAssembly(assembly);\n\t\t}\n\n\t\tprivate PluginResponse PrepareSource()\n\t\t{\n\t\t\tvar param = AppDomain.CurrentDomain.GetAssemblies()\n\t\t\t\t.Where(asm => !asm.IsDynamic && !string.IsNullOrEmpty(asm.Location))\n\t\t\t\t.Select(asm => MetadataReference.CreateFromFile(asm.Location))\n\t\t\t\t.Concat(new[] { MetadataReference.CreateFromFile(Assembly.GetExecutingAssembly().Location) }).ToArray();\n\n\t\t\tusing var pluginFileStream = System.IO.File.OpenRead(File.FullName);\n\t\t\tvar sourceTree = CSharpSyntaxTree.ParseText(SourceText.From(pluginFileStream));\n\n\t\t\tvar compilation = CSharpCompilation.Create($\"plugin_{File.Name}_{Tools.Random.Next()}\")\n\t\t\t\t.WithOptions(new CSharpCompilationOptions(\n\t\t\t\t\toutputKind: OutputKind.DynamicallyLinkedLibrary,\n\t\t\t\t\toptimizationLevel: OptimizationLevel.Release))\n\t\t\t\t.AddReferences(param)\n\t\t\t\t.AddSyntaxTrees(sourceTree);\n\n\t\t\tusing var ms_assembly = new MemoryStream();\n\t\t\tusing var ms_pdb = new MemoryStream();\n\t\t\tvar result = compilation.Emit(ms_assembly, ms_pdb,\n\t\t\t\toptions: new EmitOptions()\n\t\t\t\t\t.WithDebugInformationFormat(DebugInformationFormat.PortablePdb)\n\t\t\t\t);\n\n\t\t\tif (result.Success)\n\t\t\t{\n\t\t\t\tms_assembly.Seek(0, SeekOrigin.Begin);\n\t\t\t\tms_pdb.Seek(0, SeekOrigin.Begin);\n\t\t\t\tvar assembly = Assembly.Load(ms_assembly.ToArray(), ms_pdb.ToArray());\n\t\t\t\treturn InitializeAssembly(assembly);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbool containsErrors = false;\n\t\t\t\tvar strb = new StringBuilder();\n\t\t\t\tstrb.AppendFormat(\"Plugin \\\"{0}\\\" [{1}] compiler notifications:\\n\", File.Name, Id);\n\t\t\t\tforeach (var error in result.Diagnostics)\n\t\t\t\t{\n\t\t\t\t\tvar position = error.Location.GetLineSpan();\n\t\t\t\t\tcontainsErrors |= error.WarningLevel == 0;\n\t\t\t\t\tstrb.AppendFormat(\"{0} L{1}/C{2}: {3}\\n\",\n\t\t\t\t\t\terror.WarningLevel == 0 ? \"Error\" : ((DiagnosticSeverity)(error.WarningLevel - 1)).ToString(),\n\t\t\t\t\t\tposition.StartLinePosition.Line + 1,\n\t\t\t\t\t\tposition.StartLinePosition.Character,\n\t\t\t\t\t\terror.GetMessage());\n\t\t\t\t}\n\t\t\t\tstrb.Length--; // remove last linebreak\n\t\t\t\tLog.Warn(strb.ToString());\n\t\t\t\treturn PluginResponse.CompileError;\n\t\t\t}\n\t\t}\n\n\t\tprivate PluginResponse InitializeAssembly(Assembly assembly)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar allTypes = assembly.GetExportedTypes();\n\t\t\t\tvar pluginTypes = allTypes.Where(t => typeof(ITabPlugin).IsAssignableFrom(t)).ToArray();\n\t\t\t\tvar factoryTypes = allTypes.Where(t => typeof(IResolver).IsAssignableFrom(t)).ToArray();\n#pragma warning disable CS0618 // Type or member is obsolete\n\t\t\t\tvar commandsTypes = allTypes.Where(t => t.GetCustomAttribute<StaticPluginAttribute>() != null).ToArray();\n#pragma warning restore CS0618 // Type or member is obsolete\n\n\t\t\t\tif (pluginTypes.Length + factoryTypes.Length + commandsTypes.Length > 1)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(\"Any source or binary plugin file may contain one plugin or factory at most. ({})\", Name);\n\t\t\t\t\treturn PluginResponse.TooManyPlugins;\n\t\t\t\t}\n\t\t\t\tif (pluginTypes.Length + factoryTypes.Length + commandsTypes.Length == 0)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(\"Any source or binary plugin file must contain at least one plugin or factory. ({})\", Name);\n\t\t\t\t\treturn PluginResponse.NoTypeMatch;\n\t\t\t\t}\n\n\t\t\t\tif (pluginTypes.Length == 1)\n\t\t\t\t{\n\t\t\t\t\tpluginType = pluginTypes[0];\n\t\t\t\t\tif (typeof(IBotPlugin).IsAssignableFrom(pluginType))\n\t\t\t\t\t\tType = PluginType.BotPlugin;\n\t\t\t\t\telse if (typeof(ICorePlugin).IsAssignableFrom(pluginType))\n\t\t\t\t\t\tType = PluginType.CorePlugin;\n\t\t\t\t\telse\n\t\t\t\t\t\tthrow new InvalidOperationException(\"Do not inherit from 'ITabPlugin', instead use 'IBotPlugin' or 'ICorePlugin'\");\n\t\t\t\t}\n\t\t\t\telse if (factoryTypes.Length == 1)\n\t\t\t\t{\n\t\t\t\t\tpluginType = factoryTypes[0];\n\t\t\t\t\tType = PluginType.Factory;\n\t\t\t\t}\n\t\t\t\telse if (commandsTypes.Length == 1)\n\t\t\t\t{\n\t\t\t\t\tpluginType = commandsTypes[0];\n\t\t\t\t\tType = PluginType.Commands;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tType = PluginType.None;\n\t\t\t\t\tthrow new InvalidOperationException();\n\t\t\t\t}\n\n\t\t\t\treturn PluginResponse.Ok;\n\t\t\t}\n\t\t\tcatch (TypeLoadException tlex)\n\t\t\t{\n\t\t\t\tLog.Warn(nameof(InitializeAssembly) + \" failed, The file \\\"{0}\\\" seems to be missing some dependecies ({1})\", File.Name, tlex.Message);\n\t\t\t\treturn PluginResponse.MissingDependency;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, nameof(InitializeAssembly) + \" failed: {0}\", ex.Message);\n\t\t\t\treturn PluginResponse.Crash;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Starts the plugin to have all its functionality available in the bot.\n\t\t/// This call requires this plugin to be in the <see cref=\"PluginStatus.Ready\"/> state.\n\t\t/// Changes the status to <see cref=\"PluginStatus.Active\"/> when successful or <see cref=\"PluginStatus.Error\"/> otherwise.\n\t\t/// </summary>\n\t\t/// <param name=\"bot\">The bot instance where this plugin should be started. Can be null when not required.</param>\n\t\tpublic PluginResponse Start(Bot? bot)\n\t\t{\n\t\t\tswitch (CheckStatus(bot))\n\t\t\t{\n\t\t\tcase PluginStatus.Disabled:\n\t\t\t\treturn PluginResponse.Disabled;\n\n\t\t\tcase PluginStatus.Off:\n\t\t\t\tvar response = Load();\n\t\t\t\tif (response != PluginResponse.Ok)\n\t\t\t\t\treturn response;\n\t\t\t\tgoto case PluginStatus.Ready;\n\n\t\t\tcase PluginStatus.Ready:\n\t\t\t\treturn StartInternal(bot) ? PluginResponse.Ok : PluginResponse.UnknownError;\n\n\t\t\tcase PluginStatus.Active:\n\t\t\t\treturn PluginResponse.Ok;\n\n\t\t\tcase PluginStatus.Error:\n\t\t\t\treturn PluginResponse.UnknownError;\n\n\t\t\tcase PluginStatus.NotAvailable:\n\t\t\t\treturn PluginResponse.MissingContext;\n\n\t\t\tdefault:\n\t\t\t\tthrow new ArgumentOutOfRangeException();\n\t\t\t}\n\t\t}\n\n\t\tprivate bool StartInternal(Bot? bot)\n\t\t{\n\t\t\tif (CheckStatus(bot) != PluginStatus.Ready)\n\t\t\t\tthrow new InvalidOperationException(\"This plugin has not yet been prepared\");\n\t\t\tif (pluginType is null)\n\t\t\t\tthrow new InvalidOperationException(\"Plugin not correctly initialized\");\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tswitch (Type)\n\t\t\t\t{\n\t\t\t\tcase PluginType.None:\n\t\t\t\t\tthrow new InvalidOperationException(\"A 'None' plugin cannot be loaded\");\n\n\t\t\t\tcase PluginType.BotPlugin:\n\t\t\t\t\tif (bot is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Error(\"This plugin needs to be activated on a bot instance.\");\n\t\t\t\t\t\tstatus = PluginStatus.Error;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (botPluginList.ContainsKey(bot))\n\t\t\t\t\t\tthrow new InvalidOperationException(\"Plugin is already instantiated on this bot\");\n\n\t\t\t\t\tvar botPluginObjs = CreatePluginObjects(bot.Injector, pluginType, false);\n\t\t\t\t\tbotPluginList.Add(bot, botPluginObjs);\n\t\t\t\t\tbotPluginObjs.Plugin.Initialize();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase PluginType.CorePlugin:\n\t\t\t\t\tcorePlugin = CreatePluginObjects(coreInjector, pluginType, false);\n\t\t\t\t\tbotManager.IterateAll(b =>\n\t\t\t\t\t{\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (b.Injector.TryGet<CommandManager>(out var commandManager))\n\t\t\t\t\t\t\t\tcommandManager.RegisterCollection(corePlugin.Bag);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (Exception ex) { Log.Error(ex, \"Failed to register commands from plugin '{0}' for bot '{1}'\", Name, b.Id); }\n\t\t\t\t\t});\n\t\t\t\t\tcorePlugin.Plugin.Initialize();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase PluginType.Factory:\n\t\t\t\t\tfactoryObject = (IResolver)Activator.CreateInstance(pluginType)!;\n\t\t\t\t\tresourceResolver.AddResolver(factoryObject);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase PluginType.Commands:\n\t\t\t\t\tcorePlugin = CreatePluginObjects(coreInjector, pluginType, true);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(Type);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tif (ex is MissingMethodException)\n\t\t\t\t\tLog.Error(ex, \"Factories needs a parameterless constructor.\");\n\t\t\t\telse\n\t\t\t\t\tLog.Error(ex, \"Plugin '{0}' failed to load: {1}.\", Name, ex.Message);\n\t\t\t\tStop(bot);\n\t\t\t\tif (Type != PluginType.BotPlugin)\n\t\t\t\t\tstatus = PluginStatus.Error;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (Type != PluginType.BotPlugin)\n\t\t\t\tstatus = PluginStatus.Active;\n\n\t\t\treturn true;\n\t\t}\n\n\t\t// Note, the 'isStatic' flag is only temporary while StaticPlugins are being\n\t\t// deprecated, after that this distinction is not necessary anymore and\n\t\t// can be removed.\n\t\tpublic static PluginObjects CreatePluginObjects(IInjector injector, Type type, bool isStatic)\n\t\t{\n\t\t\tobject? pluginInstance = null;\n\t\t\tif (!isStatic)\n\t\t\t{\n\t\t\t\tif (!injector.TryCreate(type, out pluginInstance))\n\t\t\t\t\tthrow new Exception(\"Plugin is missing dependencies\");\n\t\t\t\tinjector.FillProperties(pluginInstance);\n\t\t\t}\n\t\t\tif (!injector.TryGet<CommandManager>(out var commandManager))\n\t\t\t\tthrow new Exception(\"Bot has no CommandSystem\");\n\n\t\t\tvar pluginObjs = new PluginObjects(\n\t\t\t\t(ITabPlugin)pluginInstance!,\n\t\t\t\tnew PluginCommandBag(pluginInstance, type),\n\t\t\t\tcommandManager);\n\n\t\t\tpluginObjs.CommandManager.RegisterCollection(pluginObjs.Bag);\n\t\t\treturn pluginObjs;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Stops the plugin and removes all its functionality available in the bot.\n\t\t/// Changes the status from <see cref=\"PluginStatus.Active\"/> to <see cref=\"PluginStatus.Ready\"/> when successful or <see cref=\"PluginStatus.Error\"/> otherwise.\n\t\t/// </summary>\n\t\t/// <param name=\"bot\">The bot instance where this plugin should be stopped. Can be null when not required.</param>\n\t\tpublic PluginResponse Stop(Bot? bot)\n\t\t{\n\t\t\tswitch (Type)\n\t\t\t{\n\t\t\tcase PluginType.None:\n\t\t\t\tbreak;\n\n\t\t\tcase PluginType.BotPlugin:\n\t\t\t\tif (bot is null)\n\t\t\t\t{\n\t\t\t\t\tforeach (var pluginObjs in botPluginList.Values)\n\t\t\t\t\t\tDestroyPluginObjects(pluginObjs);\n\t\t\t\t\tbotPluginList.Clear();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (botPluginList.Remove(bot, out var pluginObjs))\n\t\t\t\t\t\tDestroyPluginObjects(pluginObjs);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase PluginType.CorePlugin:\n\t\t\t\tif (corePlugin != null)\n\t\t\t\t{\n\t\t\t\t\tbotManager.IterateAll(b =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (b.Injector.TryGet<CommandManager>(out var commandManager))\n\t\t\t\t\t\t\tcommandManager.UnregisterCollection(corePlugin.Bag);\n\t\t\t\t\t});\n\t\t\t\t\tDestroyPluginObjects(corePlugin);\n\t\t\t\t\tcorePlugin = null;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase PluginType.Factory:\n\t\t\t\tif (factoryObject != null)\n\t\t\t\t\tresourceResolver.RemoveResolver(factoryObject);\n\t\t\t\tbreak;\n\n\t\t\tcase PluginType.Commands:\n\t\t\t\tif (corePlugin != null)\n\t\t\t\t\tDestroyPluginObjects(corePlugin);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(Type);\n\t\t\t}\n\n\t\t\tstatus = PluginStatus.Ready;\n\n\t\t\treturn PluginResponse.Ok;\n\t\t}\n\n\t\tprivate void DestroyPluginObjects(PluginObjects pluginObjs)\n\t\t{\n\t\t\tpluginObjs.CommandManager.UnregisterCollection(pluginObjs.Bag);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tpluginObjs.Plugin?.Dispose();\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Plugin '{0}' threw an exception while disposing\", Name);\n\t\t\t}\n\t\t}\n\n\t\tpublic void Unload()\n\t\t{\n\t\t\tStop(null);\n\n\t\t\tpluginType = null;\n\n\t\t\tif (CheckStatus(null) == PluginStatus.Ready)\n\t\t\t\tstatus = PluginStatus.Off;\n\t\t}\n\n\t\tpublic override string ToString() => Name;\n\t}\n\n\tpublic enum PluginType\n\t{\n\t\tNone,\n\t\tBotPlugin,\n\t\tCorePlugin,\n\t\tFactory,\n\t\tCommands,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Plugins/PluginCommandBag.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing TS3AudioBot.CommandSystem;\n\nnamespace TS3AudioBot.Plugins\n{\n\tinternal class PluginCommandBag : ICommandBag\n\t{\n\t\tpublic IReadOnlyCollection<BotCommand> BagCommands { get; }\n\t\tpublic IReadOnlyCollection<string> AdditionalRights => Array.Empty<string>();\n\n\t\tpublic PluginCommandBag(object? obj, Type t)\n\t\t{\n\t\t\tBagCommands = CommandManager.GetBotCommands(obj, t).ToArray();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Plugins/PluginExtensions.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing NLog;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\n\nnamespace TS3AudioBot.Plugins\n{\n\tpublic static class PluginExtensions\n\t{\n\t\t[MethodImpl(MethodImplOptions.NoInlining)]\n\t\tpublic static Logger GetLogger()\n\t\t{\n\t\t\tvar cls = new StackTrace()?.GetFrame(1)?.GetMethod()?.DeclaringType?.Name ?? \"Unknown\";\n\t\t\treturn LogManager.GetLogger($\"TS3AudioBot.Plugins.{cls}\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Plugins/PluginManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.ResourceFactories;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Plugins\n{\n\t// Start Plugin:\n\t// ! Start plugins before rights system to ensure all rights are loaded\n\t// - Get all commands\n\t// - Validate\n\t//   - 0/1 Plugin\n\t//     - Command name conflict\n\t//   - 0/1 Factory\n\t//     - Facory name conflict\n\t// - [ Instantiate plugin (Depending on type) ]\n\t// - Add commands to command manager\n\t// - Start config to system?\n\n\tpublic class PluginManager : IDisposable\n\t{\n\t\tprivate readonly ConfPlugins config;\n\t\tprivate readonly CoreInjector coreInjector;\n\t\tprivate readonly ResourceResolver resourceResolver;\n\t\tprivate readonly BotManager botManager;\n\t\tprivate readonly Dictionary<string, Plugin> plugins = new Dictionary<string, Plugin>();\n\t\tprivate readonly HashSet<int> usedIds = new HashSet<int>();\n\t\tprivate readonly object pluginsLock = new object();\n\n\t\t// TODO remove after plugin rework\n\t\tinternal ICollection<Plugin> Plugins => plugins.Values;\n\n\t\tpublic PluginManager(ConfPlugins config, CoreInjector coreInjector, ResourceResolver resourceResolver, BotManager botManager)\n\t\t{\n\t\t\tthis.config = config;\n\t\t\tthis.coreInjector = coreInjector;\n\t\t\tthis.resourceResolver = resourceResolver;\n\t\t\tthis.botManager = botManager;\n\t\t}\n\n\t\tprivate void CheckAndClearPlugins(Bot? bot)\n\t\t{\n\t\t\tClearMissingFiles();\n\t\t\tCheckLocalPlugins(bot);\n\t\t}\n\n\t\t/// <summary>Updates the plugin dictionary with new and changed plugins.</summary>\n\t\t/// <param name=\"bot\">A bot instance when the plugin is a bot local plugin.</param>\n\t\tprivate void CheckLocalPlugins(Bot? bot)\n\t\t{\n\t\t\tvar dir = new DirectoryInfo(config.Path);\n\t\t\tif (!dir.Exists)\n\t\t\t\treturn;\n\n\t\t\tforeach (var file in dir.EnumerateFiles())\n\t\t\t{\n\t\t\t\tif (plugins.TryGetValue(file.Name, out var plugin))\n\t\t\t\t{\n\t\t\t\t\tvar status = plugin.CheckStatus(bot);\n\t\t\t\t\tswitch (status)\n\t\t\t\t\t{\n\t\t\t\t\tcase PluginStatus.Disabled:\n\t\t\t\t\tcase PluginStatus.Active:\n\t\t\t\t\tcase PluginStatus.NotAvailable:\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase PluginStatus.Ready:\n\t\t\t\t\tcase PluginStatus.Off:\n\t\t\t\t\tcase PluginStatus.Error:\n\t\t\t\t\t\tplugin.Load();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow Tools.UnhandledDefault(status);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (IsIgnored(file))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tplugin = new Plugin(coreInjector, resourceResolver, botManager, file, GetFreeId());\n\n\t\t\t\t\tif (plugin.Load() == PluginResponse.Disabled)\n\t\t\t\t\t{\n\t\t\t\t\t\tRemovePlugin(plugin);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tplugins.Add(file.Name, plugin);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>Unloads all Plugins which have no corresponding file anymore and removes from the index list.</summary>\n\t\tprivate void ClearMissingFiles()\n\t\t{\n\t\t\t// at first find all missing and ignored files\n\t\t\tvar missingFiles = plugins.Where(kvp =>\n\t\t\t{\n\t\t\t\tkvp.Value.File.Refresh();\n\t\t\t\treturn !kvp.Value.File.Exists || IsIgnored(kvp.Value.File);\n\t\t\t}).ToArray();\n\n\t\t\t// unload if it is loaded and remove\n\t\t\tforeach (var misFile in missingFiles)\n\t\t\t\tRemovePlugin(misFile.Value);\n\t\t}\n\n\t\tpublic static bool IsIgnored(FileInfo file) =>\n\t\t\t(file.Extension != \".cs\" && file.Extension != \".dll\" && file.Extension != \".exe\")\n\t\t\t|| File.Exists(file.FullName + \".ignore\");\n\n\t\tprivate Plugin TryGetPlugin(string identifier)\n\t\t{\n\t\t\tif (plugins.TryGetValue(identifier, out var plugin))\n\t\t\t\treturn plugin;\n\n\t\t\tif (int.TryParse(identifier, out int num))\n\t\t\t\treturn plugins.Values.FirstOrDefault(p => p.Id == num);\n\n\t\t\treturn plugins.Values.FirstOrDefault(p => p.Name == identifier);\n\t\t}\n\n\t\tprivate int GetFreeId()\n\t\t{\n\t\t\tint id = 0;\n\t\t\twhile (usedIds.Contains(id))\n\t\t\t\tid++;\n\t\t\tusedIds.Add(id);\n\t\t\treturn id;\n\t\t}\n\n\t\tpublic PluginResponse StartPlugin(string identifier, Bot? bot)\n\t\t{\n\t\t\tlock (pluginsLock)\n\t\t\t{\n\t\t\t\tCheckLocalPlugins(bot);\n\n\t\t\t\treturn TryGetPlugin(identifier)?.Start(bot) ?? PluginResponse.PluginNotFound;\n\t\t\t}\n\t\t}\n\n\t\tpublic PluginResponse StopPlugin(string identifier, Bot? bot)\n\t\t{\n\t\t\tlock (pluginsLock)\n\t\t\t{\n\t\t\t\treturn TryGetPlugin(identifier)?.Stop(bot) ?? PluginResponse.PluginNotFound;\n\t\t\t}\n\t\t}\n\n\t\tinternal void StopPlugins(Bot bot)\n\t\t{\n\t\t\tforeach (var plugin in plugins.Values)\n\t\t\t{\n\t\t\t\tif (plugin.Type == PluginType.BotPlugin && plugin.CheckStatus(bot) == PluginStatus.Active)\n\t\t\t\t\tplugin.Stop(bot);\n\t\t\t}\n\t\t}\n\n\t\tprivate void RemovePlugin(Plugin plugin)\n\t\t{\n\t\t\tusedIds.Remove(plugin.Id);\n\t\t\tplugins.Remove(plugin.File.Name);\n\t\t\tplugin.Unload();\n\t\t}\n\n\t\tpublic PluginStatusInfo[] GetPluginOverview(Bot? bot)\n\t\t{\n\t\t\tlock (pluginsLock)\n\t\t\t{\n\t\t\t\tCheckAndClearPlugins(bot);\n\n\t\t\t\treturn plugins.Values.Select(plugin =>\n\t\t\t\t\tnew PluginStatusInfo(\n\t\t\t\t\t\tplugin.Id,\n\t\t\t\t\t\tplugin.Name,\n\t\t\t\t\t\tplugin.CheckStatus(bot),\n\t\t\t\t\t\tplugin.Type\n\t\t\t\t\t)\n\t\t\t\t).ToArray();\n\t\t\t}\n\t\t}\n\n\t\tpublic static string FormatOverview(ICollection<PluginStatusInfo> pluginList)\n\t\t{\n\t\t\tif (pluginList.Count == 0)\n\t\t\t\treturn \"No plugins found!\";\n\n\t\t\tvar strb = new StringBuilder();\n\t\t\tstrb.AppendLine(\"All available plugins:\");\n\t\t\tvar digits = (int)Math.Floor(Math.Log10(pluginList.Count) + 1);\n\t\t\tforeach (var plugin in pluginList)\n\t\t\t{\n\t\t\t\tstrb.Append(\"#\").Append(plugin.Id.ToString(\"D\" + digits, CultureInfo.InvariantCulture)).Append('|');\n\t\t\t\tswitch (plugin.Status)\n\t\t\t\t{\n\t\t\t\tcase PluginStatus.Off: strb.Append(\"OFF\"); break;\n\t\t\t\tcase PluginStatus.Ready: strb.Append(\"RDY\"); break;\n\t\t\t\tcase PluginStatus.Active: strb.Append(\"+ON\"); break;\n\t\t\t\tcase PluginStatus.Disabled: strb.Append(\"UNL\"); break;\n\t\t\t\tcase PluginStatus.Error: strb.Append(\"ERR\"); break;\n\t\t\t\tcase PluginStatus.NotAvailable: strb.Append(\"N/A\"); break;\n\t\t\t\tdefault: throw Tools.UnhandledDefault(plugin.Status);\n\t\t\t\t}\n\t\t\t\tstrb.Append('|').AppendLine(plugin.Name ?? \"<not loaded>\");\n\t\t\t}\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tforeach (var plugin in plugins.Values)\n\t\t\t\tplugin.Unload();\n\t\t}\n\t}\n\n\tpublic class PluginStatusInfo\n\t{\n\t\tpublic int Id { get; }\n\t\tpublic string Name { get; }\n\t\tpublic PluginStatus Status { get; }\n\t\tpublic PluginType Type { get; }\n\n\t\tpublic PluginStatusInfo(int id, string name, PluginStatus status, PluginType type)\n\t\t{\n\t\t\tId = id;\n\t\t\tName = name;\n\t\t\tStatus = status;\n\t\t\tType = type;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Plugins/PluginObjects.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TS3AudioBot.CommandSystem;\n\nnamespace TS3AudioBot.Plugins\n{\n\tinternal class PluginObjects\n\t{\n\t\tpublic PluginCommandBag Bag { get; set; }\n\t\tpublic ITabPlugin Plugin { get; set; }\n\t\tpublic CommandManager CommandManager { get; set; }\n\n\t\tpublic PluginObjects(ITabPlugin plugin, PluginCommandBag bag, CommandManager commandManager)\n\t\t{\n\t\t\tBag = bag;\n\t\t\tPlugin = plugin;\n\t\t\tCommandManager = commandManager;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Plugins/PluginResponse.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Plugins\n{\n\tpublic enum PluginResponse\n\t{\n\t\tOk,\n\t\tCrash,\n\t\tMissingDependency,\n\t\tMissingContext,\n\t\tInvalidBinary,\n\t\tNoTypeMatch,\n\t\tTooManyPlugins,\n\t\tUnknownError,\n\t\tPluginNotFound,\n\t\tCompileError,\n\t\tDisabled,\n\t\tNotSupported,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Plugins/PluginStatus.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Plugins\n{\n\tpublic enum PluginStatus\n\t{\n\t\t/// <summary>The plugin has just been found and is ready to be prepared.</summary>\n\t\tOff,\n\t\t/// <summary>The plugin is valid and ready to be loaded.</summary>\n\t\tReady,\n\t\t/// <summary>The plugin is currently active.</summary>\n\t\tActive,\n\t\t/// <summary>The plugin has been plugged off intentionally and will not be prepared with the next scan.</summary>\n\t\tDisabled,\n\t\t/// <summary>The plugin failed to load.</summary>\n\t\tError,\n\t\t/// <summary>The plugin needs to be checked/loaded withing a Bot context.</summary>\n\t\tNotAvailable,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Properties/PublishProfiles/FolderProfile.pubxml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nhttps://go.microsoft.com/fwlink/?LinkID=208121.\n-->\n<Project>\n  <PropertyGroup>\n    <Configuration>Release</Configuration>\n    <Platform>Any CPU</Platform>\n    <PublishDir>bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\</PublishDir>\n    <PublishProtocol>FileSystem</PublishProtocol>\n    <_TargetId>Folder</_TargetId>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <RuntimeIdentifier>linux-x64</RuntimeIdentifier>\n    <SelfContained>true</SelfContained>\n    <PublishSingleFile>false</PublishSingleFile>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "TS3AudioBot/Properties/PublishProfiles/FolderProfile.pubxml.user",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nhttps://go.microsoft.com/fwlink/?LinkID=208121.\n-->\n<Project>\n  <PropertyGroup>\n    <History>True|2023-03-15T11:23:15.0443243Z;True|2023-03-15T19:22:42.0669401+08:00;True|2023-03-15T19:22:08.8924841+08:00;True|2023-03-13T19:37:32.7540375+08:00;True|2023-03-13T11:34:41.6395482+08:00;True|2023-03-13T11:33:57.4556721+08:00;True|2023-03-13T11:28:32.3649863+08:00;True|2023-03-12T01:02:59.3104461+08:00;</History>\n    <LastFailureDetails />\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "TS3AudioBot/Properties.cs",
    "content": "using System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"TS3ABotUnitTests\")]\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/AudioResource.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing TS3AudioBot.CommandSystem.CommandResults;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic class AudioResource : IAudioResourceResult\n\t{\n\t\t/// <summary>The resource type.</summary>\n\t\t[JsonProperty(PropertyName = \"type\")]\n\t\tpublic string AudioType { get; set; }\n\t\t/// <summary>An identifier to create the song. This id is uniqe among all resources with the same resource type string of a factory.</summary>\n\t\t[JsonProperty(PropertyName = \"resid\")]\n\t\tpublic string ResourceId { get; set; }\n\t\t/// <summary>The display title.</summary>\n\t\t[JsonProperty(PropertyName = \"title\")]\n\t\tpublic string? ResourceTitle { get; set; }\n\t\t/// <summary>Additional data to resolve the link.</summary>\n\t\t[JsonProperty(PropertyName = \"add\", NullValueHandling = NullValueHandling.Ignore)]\n\t\tpublic Dictionary<string, string>? AdditionalData { get; set; }\n\t\t/// <summary>An identifier wich is unique among all <see cref=\"AudioResource\"/> and resource type string of a factory.</summary>\n\t\t[JsonIgnore]\n\t\tpublic string UniqueId => ResourceId + AudioType;\n\t\t[JsonIgnore]\n\t\tAudioResource IAudioResourceResult.AudioResource => this;\n\n#pragma warning disable CS8618 // Required for serialization\n\t\tpublic AudioResource() { }\n#pragma warning restore CS8618\n\n\t\tpublic AudioResource(string resourceId, string? resourceTitle, string audioType, Dictionary<string, string>? additionalData = null)\n\t\t{\n\t\t\tResourceId = resourceId;\n\t\t\tResourceTitle = resourceTitle;\n\t\t\tAudioType = audioType;\n\t\t\tAdditionalData = additionalData;\n\t\t}\n\n\t\tpublic AudioResource Add(string key, string value)\n\t\t{\n\t\t\tAdditionalData ??= new Dictionary<string, string>();\n\t\t\tAdditionalData.Add(key, value);\n\t\t\treturn this;\n\t\t}\n\n\t\tpublic string? Get(string key)\n\t\t{\n\t\t\tif (AdditionalData is null)\n\t\t\t\treturn null;\n\t\t\treturn AdditionalData.TryGetValue(key, out var value) ? value : null;\n\t\t}\n\n\t\tpublic override bool Equals(object? obj)\n\t\t{\n\t\t\tif (!(obj is AudioResource other))\n\t\t\t\treturn false;\n\n\t\t\treturn AudioType == other.AudioType\n\t\t\t\t&& ResourceId == other.ResourceId;\n\t\t}\n\n\t\tpublic override int GetHashCode() => HashCode.Combine(AudioType, ResourceId);\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn $\"{AudioType} ID:{ResourceId}\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/AudioTags/AudioTagReader.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\n\nnamespace TS3AudioBot.ResourceFactories.AudioTags\n{\n\tinternal static class AudioTagReader\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate static readonly Dictionary<string, Tag> TagDict = new Dictionary<string, Tag>();\n\n\t\tstatic AudioTagReader()\n\t\t{\n\t\t\tRegister(new Id3_1());\n\t\t\tRegister(new Id3_2());\n\t\t}\n\n\t\tprivate static void Register(Tag tagHeader)\n\t\t{\n\t\t\tTagDict.Add(tagHeader.TagId, tagHeader);\n\t\t}\n\n\t\tpublic static HeaderData? GetData(Stream fileStream)\n\t\t{\n\t\t\tvar sr = new BinaryReader(fileStream);\n\t\t\tstring tag = Encoding.ASCII.GetString(sr.ReadBytes(3));\n\t\t\tif (TagDict.TryGetValue(tag, out var tagHeader))\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar data = tagHeader.GetData(sr);\n\t\t\t\t\tif (data is null)\n\t\t\t\t\t\treturn null;\n\t\t\t\t\tdata.Title = data.Title?.TrimEnd('\\0');\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\t\t\t\tcatch (IOException) { }\n\t\t\t\tcatch (FormatException fex) { Log.Debug(fex, \"Audiotag has an invalid format\"); }\n\t\t\t\tcatch (Exception ex) { Log.Warn(ex, \"Unknown error while parsing audiotag\"); }\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate abstract class Tag\n\t\t{\n\t\t\tpublic abstract string TagId { get; }\n\t\t\tpublic abstract HeaderData GetData(BinaryReader fileStream);\n\t\t}\n\n\t\t// ReSharper disable InconsistentNaming\n\t\tprivate class Id3_1 : Tag\n\t\t{\n\t\t\tprivate const int TitleLength = 30;\n\t\t\tpublic override string TagId => \"TAG\";\n\n\t\t\tpublic override HeaderData GetData(BinaryReader fileStream)\n\t\t\t{\n\t\t\t\t// 3 bytes skipped for TagID\n\t\t\t\treturn new HeaderData\n\t\t\t\t{\n\t\t\t\t\tTitle = Encoding.ASCII.GetString(fileStream.ReadBytes(TitleLength)),\n\t\t\t\t\tPicture = null,\n\t\t\t\t};\n\n\t\t\t\t// ignore other blocks\n\t\t\t}\n\t\t}\n\n\t\tprivate class Id3_2 : Tag\n\t\t{\n\t\t\tprivate readonly int v2_TT2 = FrameIdV2(\"TT2\"); // Title\n\t\t\tprivate readonly int v2_PIC = FrameIdV2(\"PIC\"); // Picture\n\t\t\tprivate readonly uint v3_TIT2 = FrameIdV3(\"TIT2\"); // Title\n\t\t\tprivate readonly uint v3_APIC = FrameIdV3(\"APIC\"); // Picture\n\t\t\tprivate readonly uint v3_PIC0 = FrameIdV3(\"PIC\\0\"); // Picture\n\n\t\t\tpublic override string TagId => \"ID3\";\n\n\t\t\t// ReSharper disable UnusedVariable\n#pragma warning disable IDE0059 // Unnecessary assignment of a value\n\t\t\tpublic override HeaderData GetData(BinaryReader fileStream)\n\t\t\t{\n\t\t\t\tvar retdata = new HeaderData();\n\n\t\t\t\t// using the official id3 tag documentation\n\t\t\t\t// http://id3.org/id3v2.3.0#ID3_tag_version_2.3.0\n\n\t\t\t\t// read + validate header                                    [10 bytes]\n\t\t\t\t// skipped for TagID                                         >03 bytes\n\t\t\t\tbyte versionMajor = fileStream.ReadByte(); //                >01 bytes\n\t\t\t\tbyte version_minor = fileStream.ReadByte(); //               >01 bytes\n\t\t\t\tbyte data_flags = fileStream.ReadByte(); //                  >01 bytes\n\t\t\t\tint tagSize = fileStream.ReadId3Int(); //                    >04 bytes\n\n\t\t\t\t// start at 0, the header is excluded from `tagSize`\n\t\t\t\tint readCount = 0;\n\n\t\t\t\t#region ID3v2\n\t\t\t\tif (versionMajor == 2)\n\t\t\t\t{\n\t\t\t\t\twhile (readCount < tagSize)\n\t\t\t\t\t{\n\t\t\t\t\t\t// frame header                                      [06 bytes]\n\t\t\t\t\t\tint frameId = fileStream.ReadInt24Be(); //           >03 bytes\n\t\t\t\t\t\tint frameSize = fileStream.ReadInt24Be(); //         >03 bytes\n\t\t\t\t\t\treadCount += 6;\n\n\t\t\t\t\t\tif (readCount + frameSize > tagSize)\n\t\t\t\t\t\t\tthrow new FormatException(\"Frame position+size exceedes header size\");\n\n\t\t\t\t\t\tif (frameId == v2_TT2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar textBuffer = fileStream.ReadBytes(frameSize);\n\t\t\t\t\t\t\tretdata.Title = DecodeString(textBuffer[0], textBuffer, 1, frameSize - 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (frameId == v2_PIC)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar textEncoding = fileStream.ReadByte();\n\t\t\t\t\t\t\tvar imageType = fileStream.ReadInt24Be(); // JPG or PNG (or other?)\n\t\t\t\t\t\t\tvar pictureType = fileStream.ReadByte();\n\t\t\t\t\t\t\tvar description = new List<byte>();\n\t\t\t\t\t\t\tbyte textByte;\n\t\t\t\t\t\t\twhile ((textByte = fileStream.ReadByte()) != 0)\n\t\t\t\t\t\t\t\tdescription.Add(textByte);\n\n\t\t\t\t\t\t\tretdata.Picture = fileStream.ReadBytes(frameSize - (description.Count + 5));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (frameId == 0) { break; }\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfileStream.ReadBytes(frameSize);\n\t\t\t\t\t\t\treadCount += frameSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t#endregion\n\t\t\t\t#region ID3v3/4\n\t\t\t\telse if (versionMajor == 3 || versionMajor == 4)\n\t\t\t\t{\n\t\t\t\t\twhile (readCount < tagSize)\n\t\t\t\t\t{\n\t\t\t\t\t\t// frame header                                        [10 bytes]\n\t\t\t\t\t\tuint frameId = fileStream.ReadUInt32Be(); //           >04 bytes\n\t\t\t\t\t\tint frameSize = versionMajor == 4 //                   >04 bytes\n\t\t\t\t\t\t\t? fileStream.ReadId3Int()\n\t\t\t\t\t\t\t: fileStream.ReadInt32Be();\n\t\t\t\t\t\tushort frame_flags = fileStream.ReadUInt16Be(); //     >02 bytes\n\t\t\t\t\t\treadCount += 10;\n\n\t\t\t\t\t\tif ((frameId & 0xFF) == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// legacy tags start here which we don't support\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (frameSize <= 0 || readCount + frameSize > tagSize)\n\t\t\t\t\t\t\tthrow new FormatException(\"Frame position+size exceedes header size\");\n\n\t\t\t\t\t\t// content\n\t\t\t\t\t\tif (frameId == v3_TIT2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar textBuffer = fileStream.ReadBytes(frameSize);\n\t\t\t\t\t\t\t// is a string, so the first byte is a indicator byte\n\t\t\t\t\t\t\tretdata.Title = DecodeString(textBuffer[0], textBuffer, 1, frameSize - 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (frameId == v3_APIC || frameId == v3_PIC0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar textEncoding = fileStream.ReadByte(); //                                  >01 bytes\n\t\t\t\t\t\t\tvar mimeLen = ReadNullTermString(fileStream, 0, null); //                     >?? bytes\n\t\t\t\t\t\t\tvar pictureType = fileStream.ReadByte(); //                                   >01 bytes\n\t\t\t\t\t\t\tvar descriptionLen = ReadNullTermString(fileStream, textEncoding, null); //   >?? bytes\n\n\t\t\t\t\t\t\tretdata.Picture = fileStream.ReadBytes(frameSize - (mimeLen + descriptionLen + 2));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (frameId == 0) { break; }\n\t\t\t\t\t\telse { fileStream.ReadBytes(frameSize); }\n\t\t\t\t\t\treadCount += frameSize;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t#endregion\n\t\t\t\telse\n\t\t\t\t\tthrow new FormatException(\"Major id3 tag version not supported\");\n\n\t\t\t\treturn retdata;\n\t\t\t}\n#pragma warning restore IDE0059 // Unnecessary assignment of a value\n\t\t\t// ReSharper restore UnusedVariable\n\n\t\t\tprivate static int ReadNullTermString(BinaryReader fileStream, byte encoding, List<byte>? text)\n\t\t\t{\n\t\t\t\tbool unicode = encoding == 1 || encoding == 2;\n\n\t\t\t\tif (!unicode)\n\t\t\t\t{\n\t\t\t\t\tint read = 0;\n\t\t\t\t\tbyte textByte;\n\t\t\t\t\twhile ((textByte = fileStream.ReadByte()) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\ttext?.Add(textByte);\n\t\t\t\t\t\tread++;\n\t\t\t\t\t}\n\t\t\t\t\treturn read + 1; // +1 = null-byte\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar buffer = new byte[2];\n\t\t\t\t\tint read = 0;\n\t\t\t\t\twhile (fileStream.Read(buffer, 0, 2) == 2 && (buffer[0] != 0 || buffer[1] != 0))\n\t\t\t\t\t{\n\t\t\t\t\t\ttext?.AddRange(buffer);\n\t\t\t\t\t\tread += 2;\n\t\t\t\t\t}\n\t\t\t\t\treturn read + 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprivate static readonly Encoding UnicodeBeEncoding = new UnicodeEncoding(true, false);\n\t\t\tprivate static Encoding GetEncoding(byte type)\n\t\t\t{\n\t\t\t\treturn type switch\n\t\t\t\t{\n\t\t\t\t\t0 => Encoding.GetEncoding(28591),\n\t\t\t\t\t1 => Encoding.Unicode,\n\t\t\t\t\t2 => UnicodeBeEncoding,\n\t\t\t\t\t3 => Encoding.UTF8,\n\t\t\t\t\t_ => throw new FormatException(\"The id3 tag is damaged\"),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tprivate static string DecodeString(byte type, byte[] textBuffer, int offset, int length)\n\t\t\t\t=> GetEncoding(type).GetString(textBuffer, offset, length);\n\n\t\t\tprivate static int FrameIdV2(string id)\n\t\t\t{\n\t\t\t\treturn BitConverterBigEndian.ToInt24(Encoding.ASCII.GetBytes(id));\n\t\t\t}\n\n\t\t\tprivate static uint FrameIdV3(string id)\n\t\t\t{\n\t\t\t\treturn BitConverterBigEndian.ToUInt32(Encoding.ASCII.GetBytes(id));\n\t\t\t}\n\t\t}\n\n\t\t// ReSharper enable InconsistentNaming\n\t}\n\n\tinternal class HeaderData\n\t{\n\t\tpublic string? Title { get; set; }\n\t\tpublic byte[]? Picture { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/AudioTags/BinaryReaderBigEndianExtensions.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.IO;\nusing System.Runtime.InteropServices;\n\nnamespace TS3AudioBot.ResourceFactories.AudioTags\n{\n\tinternal static class BinaryReaderBigEndianExtensions\n\t{\n\t\tpublic static short ReadInt16Be(this BinaryReader br)\n\t\t{\n\t\t\treturn BitConverterBigEndian.ToInt16(br.ReadBytes(2));\n\t\t}\n\t\tpublic static int ReadInt24Be(this BinaryReader br)\n\t\t{\n\t\t\treturn BitConverterBigEndian.ToInt24(br.ReadBytes(3));\n\t\t}\n\t\tpublic static int ReadInt32Be(this BinaryReader br)\n\t\t{\n\t\t\treturn BitConverterBigEndian.ToInt32(br.ReadBytes(4));\n\t\t}\n\t\tpublic static long ReadInt64Be(this BinaryReader br)\n\t\t{\n\t\t\treturn BitConverterBigEndian.ToInt64(br.ReadBytes(8));\n\t\t}\n\n\t\tpublic static ushort ReadUInt16Be(this BinaryReader br)\n\t\t{\n\t\t\treturn BitConverterBigEndian.ToUInt16(br.ReadBytes(2));\n\t\t}\n\t\tpublic static uint ReadUInt32Be(this BinaryReader br)\n\t\t{\n\t\t\treturn BitConverterBigEndian.ToUInt32(br.ReadBytes(4));\n\t\t}\n\t\tpublic static ulong ReadUInt64Be(this BinaryReader br)\n\t\t{\n\t\t\treturn BitConverterBigEndian.ToUInt64(br.ReadBytes(8));\n\t\t}\n\n\t\tpublic static int ReadId3Int(this BinaryReader br)\n\t\t{\n\t\t\tint num = 0;\n\t\t\tnum |= br.ReadByte() << (3 * 7);\n\t\t\tnum |= br.ReadByte() << (2 * 7);\n\t\t\tnum |= br.ReadByte() << (1 * 7);\n\t\t\tnum |= br.ReadByte() << (0 * 7);\n\t\t\treturn num;\n\t\t}\n\t}\n\n\tinternal static class BitConverterBigEndian\n\t{\n\t\tprivate const int BitsInByte = 8;\n\n\t\tpublic static short ToInt16(byte[] bytes)\n\t\t{\n\t\t\treturn (short)(\n\t\t\t\t(bytes[0] << 1 * BitsInByte) |\n\t\t\t\t(bytes[1] << 0 * BitsInByte));\n\t\t}\n\t\tpublic static int ToInt24(byte[] bytes)\n\t\t{\n\t\t\treturn\n\t\t\t\t(bytes[0] << 2 * BitsInByte) |\n\t\t\t\t(bytes[1] << 1 * BitsInByte) |\n\t\t\t\t(bytes[2] << 0 * BitsInByte);\n\t\t}\n\t\tpublic static int ToInt32(byte[] bytes)\n\t\t{\n\t\t\treturn\n\t\t\t\t(bytes[0] << 3 * BitsInByte) |\n\t\t\t\t(bytes[1] << 2 * BitsInByte) |\n\t\t\t\t(bytes[2] << 1 * BitsInByte) |\n\t\t\t\t(bytes[3] << 0 * BitsInByte);\n\t\t}\n\t\tpublic static long ToInt64(byte[] bytes)\n\t\t{\n\t\t\tReinterpretInt ri;\n\t\t\tri.value = 0;\n\t\t\tri.HDW = // High double word\n\t\t\t\t(bytes[0] << 3 * BitsInByte) |\n\t\t\t\t(bytes[1] << 2 * BitsInByte) |\n\t\t\t\t(bytes[2] << 1 * BitsInByte) |\n\t\t\t\t(bytes[3] << 0 * BitsInByte);\n\t\t\tri.LDW = // Low double word\n\t\t\t\t(bytes[4] << 3 * BitsInByte) |\n\t\t\t\t(bytes[5] << 2 * BitsInByte) |\n\t\t\t\t(bytes[6] << 1 * BitsInByte) |\n\t\t\t\t(bytes[7] << 0 * BitsInByte);\n\t\t\treturn ri.value;\n\t\t}\n\n\t\tpublic static ushort ToUInt16(byte[] bytes)\n\t\t{\n\t\t\treturn (ushort)(\n\t\t\t\t(bytes[0] << 1 * BitsInByte) |\n\t\t\t\t(bytes[1] << 0 * BitsInByte));\n\t\t}\n\t\tpublic static uint ToUInt32(byte[] bytes)\n\t\t{\n\t\t\treturn\n\t\t\t\t((uint)bytes[0] << 3 * BitsInByte) |\n\t\t\t\t((uint)bytes[1] << 2 * BitsInByte) |\n\t\t\t\t((uint)bytes[2] << 1 * BitsInByte) |\n\t\t\t\t((uint)bytes[3] << 0 * BitsInByte);\n\t\t}\n\t\tpublic static ulong ToUInt64(byte[] bytes)\n\t\t{\n\t\t\tReinterpretInt ri;\n\t\t\tri.value = 0;\n\t\t\tri.HDW = // High double word\n\t\t\t\t(bytes[0] << 3 * BitsInByte) |\n\t\t\t\t(bytes[1] << 2 * BitsInByte) |\n\t\t\t\t(bytes[2] << 1 * BitsInByte) |\n\t\t\t\t(bytes[3] << 0 * BitsInByte);\n\t\t\tri.LDW = // Low double word\n\t\t\t\t(bytes[4] << 3 * BitsInByte) |\n\t\t\t\t(bytes[5] << 2 * BitsInByte) |\n\t\t\t\t(bytes[6] << 1 * BitsInByte) |\n\t\t\t\t(bytes[7] << 0 * BitsInByte);\n\t\t\treturn unchecked((ulong)ri.value);\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Explicit)]\n\t\tprivate struct ReinterpretInt\n\t\t{\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic int LDW;\n\t\t\t[FieldOffset(4)]\n\t\t\tpublic int HDW;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic long value;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/AudioTags/M3uReader.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Threading.Tasks;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.ResourceFactories.AudioTags\n{\n\tpublic static class M3uReader\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate const int MaxLineLength = 4096;\n\t\tprivate const int MaxListLength = 1000;\n\t\tprivate static readonly byte[] ExtM3uLine = Tools.Utf8Encoder.GetBytes(\"#EXTM3U\");\n\t\tprivate static readonly byte[] ExtInfLine = Tools.Utf8Encoder.GetBytes(\"#EXTINF\");\n\t\tprivate static readonly byte[] ExtXStreamInfLine = Tools.Utf8Encoder.GetBytes(\"#EXT-X-STREAM-INF\");\n\n\t\tpublic static async Task<List<M3uEntry>> TryGetData(Stream stream)\n\t\t{\n\t\t\tint read = 1;\n\t\t\tint bufferLen = 0;\n\t\t\tvar buffer = new byte[MaxLineLength];\n\t\t\tvar data = new List<M3uEntry>();\n\t\t\tstring? trackTitle = null;\n\t\t\tstring? trackStreamMeta = null;\n\t\t\t//bool extm3u = false;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < MaxListLength; i++)\n\t\t\t\t{\n\t\t\t\t\tif (read > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tread = await stream.ReadAsync(buffer, bufferLen, MaxLineLength - bufferLen);\n\t\t\t\t\t\tbufferLen += read;\n\t\t\t\t\t}\n\n\t\t\t\t\t// find linebreak index\n\t\t\t\t\tint index = Array.IndexOf(buffer, (byte)'\\n', 0, bufferLen);\n\t\t\t\t\tint lb = 1;\n\t\t\t\t\tif (index == -1)\n\t\t\t\t\t\tindex = Array.IndexOf(buffer, (byte)'\\r', 0, bufferLen);\n\t\t\t\t\telse if (index > 0 && buffer[index - 1] == (byte)'\\r')\n\t\t\t\t\t{\n\t\t\t\t\t\tindex--;\n\t\t\t\t\t\tlb = 2;\n\t\t\t\t\t}\n\n\t\t\t\t\tReadOnlyMemory<byte> line;\n\t\t\t\t\tbool atEnd = index == -1;\n\t\t\t\t\tif (atEnd)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (bufferLen == MaxLineLength)\n\t\t\t\t\t\t\tthrow Error.Str(\"Max read buffer exceeded\");\n\t\t\t\t\t\tline = buffer.AsMemory(0, bufferLen);\n\t\t\t\t\t\tbufferLen = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tline = buffer.AsMemory(0, index);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!line.IsEmpty)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (line.Span[0] == (byte)'#')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (line.Span.StartsWith(ExtInfLine))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar dataSlice = line.Slice(ExtInfLine.Length + 1);\n\t\t\t\t\t\t\t\tvar trackInfo = dataSlice.Span.IndexOf((byte)',');\n\t\t\t\t\t\t\t\tif (trackInfo >= 0)\n\t\t\t\t\t\t\t\t\ttrackTitle = dataSlice.Span.Slice(trackInfo + 1).NewUtf8String();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (line.Span.StartsWith(ExtM3uLine))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t//extm3u = true; ???\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (line.Span.StartsWith(ExtXStreamInfLine))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttrackStreamMeta = line.Span.Slice(ExtXStreamInfLine.Length + 1).NewUtf8String();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// else: unsupported m3u tag\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar lineStr = line.Span.NewUtf8String();\n\t\t\t\t\t\t\tif (Uri.TryCreate(lineStr, UriKind.RelativeOrAbsolute, out _))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdata.Add(new M3uEntry(\n\t\t\t\t\t\t\t\t\ttrackUrl: lineStr,\n\t\t\t\t\t\t\t\t\ttitle: trackTitle,\n\t\t\t\t\t\t\t\t\tstreamMeta: trackStreamMeta)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tLog.Debug(\"Skipping invalid playlist entry ({0})\", lineStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttrackTitle = null;\n\t\t\t\t\t\t\ttrackStreamMeta = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!atEnd)\n\t\t\t\t\t{\n\t\t\t\t\t\tindex += lb;\n\t\t\t\t\t\tArray.Copy(buffer, index, buffer, 0, MaxLineLength - index);\n\t\t\t\t\t\tbufferLen -= index;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (atEnd || bufferLen <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (bufferLen < 0)\n\t\t\t\t\t\t\tthrow Error.Str(\"Unexpected buffer underfill\");\n\t\t\t\t\t\treturn data;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow Error.Str(\"List too long\");\n\t\t\t}\n\t\t\tcatch (Exception ex) { throw Error.Exception(ex).Str(\"List too long\"); }\n\t\t}\n\t}\n\n\tpublic class M3uEntry\n\t{\n\t\tpublic string TrackUrl { get; set; }\n\t\tpublic string? Title { get; set; }\n\t\tpublic string? StreamMeta { get; set; }\n\n\t\tpublic M3uEntry(string trackUrl, string? title, string? streamMeta)\n\t\t{\n\t\t\tTrackUrl = trackUrl;\n\t\t\tTitle = title;\n\t\t\tStreamMeta = streamMeta;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/BandcampResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic class BandcampResolver : IResourceResolver, IThumbnailResolver\n\t{\n\t\tprivate static readonly Regex BandcampUrlRegex = new Regex(@\"([\\w_-]+).bandcamp.com/track/([\\w_-]+)\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex TrackLinkRegex = new Regex(@\"\"\"mp3-128\"\"\\s*:\\s*\"\"([^\"\"]*)\"\"\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex TrackNameRegex = new Regex(@\"\"\"title\"\"\\s*:\\s*\"\"([^\"\"]*)\"\"\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex TrackArtRegex = new Regex(@\"\"\"album_art_id\"\"\\s*:\\s*(\\d+)\\s*,\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex TrackMainJsonRegex = new Regex(@\"trackinfo\\s*:(.*),(\\r|\\n)\", Util.DefaultRegexConfig);\n\n\t\tprivate const string AddArtist = \"artist\";\n\t\tprivate const string AddTrack = \"track\";\n\n\t\tpublic string ResolverFor => \"bandcamp\";\n\n\t\tpublic MatchCertainty MatchResource(ResolveContext _, string uri) => BandcampUrlRegex.IsMatch(uri).ToMatchCertainty();\n\n\t\tpublic async Task<PlayResource> GetResource(ResolveContext _, string url)\n\t\t{\n\t\t\tvar match = BandcampUrlRegex.Match(url);\n\t\t\tif (!match.Success)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_invalid_uri);\n\n\t\t\tvar artistName = match.Groups[1].Value;\n\t\t\tvar trackName = match.Groups[2].Value;\n\n\t\t\tvar webSite = await WebWrapper.Request($\"https://{artistName}.bandcamp.com/track/{trackName}\").AsString();\n\n\t\t\tmatch = TrackMainJsonRegex.Match(webSite);\n\t\t\tif (!match.Success)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_missing + \" (TrackMainJsonRegex)\");\n\n\t\t\tJToken jobj;\n\t\t\ttry { jobj = JToken.Parse(match.Groups[1].Value); }\n\t\t\tcatch (JsonReaderException ex) { throw Error.Exception(ex).LocalStr(strings.error_media_internal_missing + \" (TrackMainJsonRegex.JToken)\"); }\n\n\t\t\tif (!(jobj is JArray jarr) || jarr.Count == 0)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_no_stream_extracted);\n\n\t\t\tvar firstTrack = jarr[0];\n\t\t\tJToken? firstTrackFile;\n\t\t\tif (!firstTrack.TryCast<string>(\"track_id\", out var id)\n\t\t\t\t|| !firstTrack.TryCast<string>(\"title\", out var title)\n\t\t\t\t|| (firstTrackFile = firstTrack[\"file\"]) == null\n\t\t\t\t|| !firstTrackFile.TryCast<string>(\"mp3-128\", out var trackObj))\n\t\t\t\tthrow Error.LocalStr(strings.error_media_no_stream_extracted);\n\n\t\t\treturn new BandcampPlayResource(trackObj,\n\t\t\t\tnew AudioResource(id, title, ResolverFor)\n\t\t\t\t\t.Add(AddArtist, artistName)\n\t\t\t\t\t.Add(AddTrack, trackName),\n\t\t\t\tGetTrackArtId(webSite));\n\t\t}\n\n\t\tpublic async Task<PlayResource> GetResourceById(ResolveContext _, AudioResource resource)\n\t\t{\n\t\t\tvar webSite = await DownloadEmbeddedSite(resource.ResourceId);\n\n\t\t\tif (string.IsNullOrEmpty(resource.ResourceTitle))\n\t\t\t{\n\t\t\t\tvar nameMatch = TrackNameRegex.Match(webSite);\n\t\t\t\tresource.ResourceTitle = nameMatch.Success\n\t\t\t\t\t? nameMatch.Groups[1].Value\n\t\t\t\t\t: $\"Bandcamp (id: {resource.ResourceId})\";\n\t\t\t}\n\n\t\t\tvar match = TrackLinkRegex.Match(webSite);\n\t\t\tif (!match.Success)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_missing + \" (TrackLinkRegex)\");\n\n\t\t\treturn new BandcampPlayResource(match.Groups[1].Value, resource, GetTrackArtId(webSite));\n\t\t}\n\n\t\tpublic string RestoreLink(ResolveContext _, AudioResource resource)\n\t\t{\n\t\t\tvar artistName = resource.Get(AddArtist);\n\t\t\tvar trackName = resource.Get(AddTrack);\n\n\t\t\tif (artistName != null && trackName != null)\n\t\t\t\treturn $\"https://{artistName}.bandcamp.com/track/{trackName}\";\n\n\t\t\t// backup when something's wrong with the website\n\t\t\treturn $\"https://bandcamp.com/EmbeddedPlayer/v=2/track={resource.ResourceId}\";\n\t\t}\n\n\t\tprivate static Task<string> DownloadEmbeddedSite(string id)\n\t\t\t=> WebWrapper.Request($\"https://bandcamp.com/EmbeddedPlayer/v=2/track={id}\").AsString();\n\n\t\tpublic async Task GetThumbnail(ResolveContext _, PlayResource playResource, Func<Stream, Task> action)\n\t\t{\n\t\t\tstring? artId = null;\n\t\t\tif (playResource is BandcampPlayResource bandcampPlayResource)\n\t\t\t{\n\t\t\t\tartId = bandcampPlayResource.ArtId;\n\t\t\t}\n\t\t\tif (artId is null)\n\t\t\t{\n\t\t\t\tvar webSite = await DownloadEmbeddedSite(playResource.AudioResource.ResourceId);\n\t\t\t\tartId = GetTrackArtId(webSite);\n\t\t\t}\n\n\t\t\tif (string.IsNullOrEmpty(artId))\n\t\t\t\tthrow Error.LocalStr(strings.error_media_image_not_found);\n\n\t\t\t//  1 : 1600px/1600px\n\t\t\t//  2 :  350px/ 350px\n\t\t\t//  3 :  100px/ 100px / full digital discography\n\t\t\t//  4 :  300px/ 300px\n\t\t\t//  5 :  700px/ 700px\n\t\t\t//  6 :  100px/ 100px\n\t\t\t//  7 :  150px/ 150px / discography\n\t\t\t//  8 :  124px/ 127px\n\t\t\t//  9 :  210px/ 210px / suggestion\n\t\t\t// 10 : 1200px/1200px / main banner\n\t\t\t// 11 :  172px/ 172px\n\t\t\t// 12 :  138px/ 138px\n\t\t\t// 13 :  380px/ 380px\n\t\t\t// 14 :  368px/ 368px\n\t\t\t// 15 :  135px/ 135px\n\t\t\t// 16 :  700px/ 700px\n\t\t\t// 42 :   50px/  50px / supporter\n\t\t\tawait WebWrapper.Request($\"https://f4.bcbits.com/img/a{artId}_4.jpg\").ToStream(action);\n\t\t}\n\n\t\tprivate static string? GetTrackArtId(string site)\n\t\t{\n\t\t\tvar match = TrackArtRegex.Match(site);\n\t\t\tif (!match.Success)\n\t\t\t\treturn null;\n\t\t\treturn match.Groups[1].Value;\n\t\t}\n\n\t\tpublic void Dispose() { }\n\t}\n\n\tpublic class BandcampPlayResource : PlayResource\n\t{\n\t\tpublic string? ArtId { get; set; }\n\n\t\tpublic BandcampPlayResource(string uri, AudioResource baseData, string? artId) : base(uri, baseData)\n\t\t{\n\t\t\tArtId = artId;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/IPlaylistResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Threading.Tasks;\nusing TS3AudioBot.Playlists;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic interface IPlaylistResolver : IResolver\n\t{\n\t\tMatchCertainty MatchPlaylist(ResolveContext ctx, string uri);\n\n\t\tTask<Playlist> GetPlaylist(ResolveContext ctx, string url);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/IResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic interface IResolver : IDisposable\n\t{\n\t\tstring ResolverFor { get; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/IResourceResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic interface IResourceResolver : IResolver\n\t{\n\t\t/// <summary>Check method to ask if a factory can load the given link.</summary>\n\t\t/// <param name=\"uri\">Any link or something similar a user can obtain to pass it here.</param>\n\t\t/// <returns>True if the factory thinks it can parse it, false otherwise.</returns>\n\t\tMatchCertainty MatchResource(ResolveContext ctx, string uri);\n\t\t/// <summary>The factory will try to parse the uri and create a playable resource from it.</summary>\n\t\t/// <param name=\"uri\">Any link or something similar a user can obtain to pass it here.</param>\n\t\t/// <returns>The playable resource if successful, or an error message otherwise</returns>\n\t\tTask<PlayResource> GetResource(ResolveContext ctx, string uri);\n\t\t/// <summary>The factory will try to parse the unique identifier of its scope of responsibility and create a playable resource from it.</summary>\n\t\t/// <param name=\"resource\">A resource containing the unique id for a song this factory is responsible for.</param>\n\t\t/// <returns>The playable resource if successful, or an error message otherwise</returns>\n\t\tTask<PlayResource> GetResourceById(ResolveContext ctx, AudioResource resource);\n\t\t/// <summary>Gets a link to the original site/location. This may differ from the link the resource was orininally created.</summary>\n\t\t/// <param name=\"id\">The unique id for a song this factory is responsible for.</param>\n\t\t/// <returns>The (close to) original link if successful, null otherwise.</returns>\n\t\tstring RestoreLink(ResolveContext ctx, AudioResource resource);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/ISearchResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic interface ISearchResolver : IResolver\n\t{\n\t\tTask<IList<AudioResource>> Search(ResolveContext ctx, string keyword);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/IThumbnailResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.IO;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic interface IThumbnailResolver : IResolver\n\t{\n\t\tTask GetThumbnail(ResolveContext ctx, PlayResource playResource, Func<Stream, Task> action);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/MatchCertainty.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic enum MatchCertainty\n\t{\n\t\t/// <summary>\"Never\" denotes that this factory cannot use this link.</summary>\n\t\tNever = 0,\n\t\t/// <summary>\"OnlyIfLast\" Only gets selected if no higher match was found.</summary>\n\t\tOnlyIfLast,\n\t\t/// <summary>\"Always\" will reserve a link exclusively for all factories which also said \"Always\".</summary>\n\t\tAlways,\n\t}\n\n\tpublic static class MatchCertaintyExtensions\n\t{\n\t\tpublic static MatchCertainty ToMatchCertainty(this bool val) => val ? MatchCertainty.Always : MatchCertainty.Never;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/MediaResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing PlaylistsNET.Content;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Playlists;\nusing TS3AudioBot.ResourceFactories.AudioTags;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic sealed class MediaResolver : IResourceResolver, IPlaylistResolver, IThumbnailResolver\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tpublic string ResolverFor => \"media\";\n\n\t\tpublic MatchCertainty MatchResource(ResolveContext _, string uri) =>\n\t\t\tFile.Exists(uri)\n\t\t\t? MatchCertainty.Always\n\t\t\t: MatchCertainty.OnlyIfLast;\n\n\t\tpublic MatchCertainty MatchPlaylist(ResolveContext _, string uri) =>\n\t\t\tDirectory.Exists(uri) ? MatchCertainty.Always :\n\t\t\tFile.Exists(uri) ? MatchCertainty.Always\n\t\t\t: MatchCertainty.OnlyIfLast;\n\n\t\tpublic Task<PlayResource> GetResource(ResolveContext ctx, string uri)\n\t\t{\n\t\t\treturn GetResourceById(ctx, new AudioResource(uri, null, ResolverFor));\n\t\t}\n\n\t\tpublic async Task<PlayResource> GetResourceById(ResolveContext ctx, AudioResource resource)\n\t\t{\n\t\t\tvar resData = await ValidateFromString(ctx.Config, resource.ResourceId);\n\n\t\t\tif (resData.IsIcyStream)\n\t\t\t{\n\t\t\t\tresource.ResourceTitle = resData.Title;\n\t\t\t\treturn new MediaPlayResource(resData.FullUri, resource, null, true);\n\t\t\t}\n\n\t\t\tif (resource.ResourceTitle is null)\n\t\t\t{\n\t\t\t\tif (!string.IsNullOrWhiteSpace(resData.Title))\n\t\t\t\t\tresource.ResourceTitle = resData.Title;\n\t\t\t\telse\n\t\t\t\t\tresource.ResourceTitle = resource.ResourceId;\n\t\t\t}\n\t\t\treturn new MediaPlayResource(resData.FullUri, resource, resData.Image, false);\n\t\t}\n\n\t\tpublic string RestoreLink(ResolveContext _, AudioResource resource) => resource.ResourceId;\n\n\t\tprivate Task<ResData> ValidateFromString(ConfBot config, string uriStr)\n\t\t{\n\t\t\tvar uri = GetUri(config, uriStr);\n\t\t\treturn ValidateUri(uri);\n\t\t}\n\n\t\tprivate Task<ResData> ValidateUri(Uri uri)\n\t\t{\n\t\t\tif (uri.IsWeb())\n\t\t\t\treturn ValidateWeb(uri);\n\t\t\tif (uri.IsFile())\n\t\t\t\treturn Task.Run(() => ValidateFile(uri));\n\n\t\t\tthrow Error.LocalStr(strings.error_media_invalid_uri);\n\t\t}\n\n\t\tprivate static HeaderData GetStreamHeaderData(Stream stream)\n\t\t{\n\t\t\tvar headerData = AudioTagReader.GetData(stream) ?? new HeaderData();\n\t\t\theaderData.Title ??= string.Empty;\n\t\t\treturn headerData;\n\t\t}\n\n\t\tprivate static async Task<ResData> ValidateWeb(Uri link)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn await WebWrapper.Request(link).WithHeader(\"Icy-MetaData\", \"1\").ToAction(async response =>\n\t\t\t\t{\n\t\t\t\t\tif (response.Headers.GetSingle(\"icy-metaint\") != null)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn new ResData(link.AbsoluteUri, null) { IsIcyStream = true };\n\t\t\t\t\t}\n\t\t\t\t\tvar contentType = response.Headers.GetSingle(\"ContentType\");\n\t\t\t\t\tif (contentType == \"application/vnd.apple.mpegurl\"\n\t\t\t\t\t\t|| contentType == \"application/vnd.apple.mpegurl.audio\")\n\t\t\t\t\t{\n\t\t\t\t\t\treturn new ResData(link.AbsoluteUri, null); // No title meta info\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tusing var stream = await response.Content.ReadAsStreamAsync();\n\t\t\t\t\t\tvar headerData = GetStreamHeaderData(stream);\n\t\t\t\t\t\treturn new ResData(link.AbsoluteUri, headerData.Title) { Image = headerData.Picture };\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Debug(ex, \"Failed to validate song\");\n\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_net_unknown);\n\t\t\t}\n\t\t}\n\n\t\tprivate ResData ValidateFile(Uri foundPath)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing var stream = File.Open(foundPath.LocalPath, FileMode.Open, FileAccess.Read, FileShare.Read);\n\t\t\t\tvar headerData = GetStreamHeaderData(stream);\n\t\t\t\treturn new ResData(foundPath.LocalPath, headerData.Title) { Image = headerData.Picture };\n\t\t\t}\n\t\t\tcatch (UnauthorizedAccessException ex)\n\t\t\t{\n\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_io_missing_permission);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Failed to load song \\\"{0}\\\", because {1}\", foundPath.OriginalString, ex.Message);\n\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_io_unknown_error);\n\t\t\t}\n\t\t}\n\n\t\tprivate Uri GetUri(ConfBot conf, string uri)\n\t\t{\n\t\t\tif (Uri.TryCreate(uri, UriKind.Absolute, out Uri? uriResult))\n\t\t\t{\n\t\t\t\treturn uriResult;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.Trace(\"Finding media path: '{0}'\", uri);\n\n\t\t\t\tUri? file = null;\n\t\t\t\tif (conf.LocalConfigDir != null)\n\t\t\t\t\tfile ??= TryInPath(Path.Combine(conf.LocalConfigDir, BotPaths.Music), uri);\n\t\t\t\tfile ??= TryInPath(conf.GetParent().Factories.Media.Path.Value, uri);\n\n\t\t\t\tif (file is null)\n\t\t\t\t\tthrow Error.LocalStr(strings.error_media_file_not_found);\n\t\t\t\treturn file;\n\t\t\t}\n\t\t}\n\n\t\tprivate static Uri? TryInPath(string pathPrefix, string file)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar musicPathPrefix = Path.GetFullPath(pathPrefix);\n\t\t\t\tvar fullPath = Path.Combine(musicPathPrefix, file);\n\t\t\t\tif (fullPath.StartsWith(musicPathPrefix) && File.Exists(fullPath))\n\t\t\t\t\treturn new Uri(fullPath, UriKind.Absolute);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\twhen (ex is ArgumentException || ex is NotSupportedException || ex is PathTooLongException || ex is System.Security.SecurityException)\n\t\t\t{\n\t\t\t\tLog.Trace(ex, \"Couldn't load resource\");\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic async Task<Playlist> GetPlaylist(ResolveContext ctx, string url)\n\t\t{\n\t\t\tif (Directory.Exists(url)) // TODO rework for security\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar di = new DirectoryInfo(url);\n\t\t\t\t\tvar plist = new Playlist().SetTitle(di.Name);\n\t\t\t\t\tforeach (var file in di.EnumerateFiles())\n\t\t\t\t\t{\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar val = await ValidateFromString(ctx.Config, file.FullName);\n\t\t\t\t\t\t\tvar res = new AudioResource(val.FullUri, string.IsNullOrWhiteSpace(val.Title) ? val.FullUri : val.Title, ResolverFor);\n\t\t\t\t\t\t\tvar addResult = plist.Add(new PlaylistItem(res));\n\t\t\t\t\t\t\tif (!addResult) break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (AudioBotException) { }\n\t\t\t\t\t}\n\n\t\t\t\t\treturn plist;\n\t\t\t\t}\n\t\t\t\tcatch (Exception ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(\"Failed to load playlist \\\"{0}\\\", because {1}\", url, ex.Message);\n\t\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_io_unknown_error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar uri = GetUri(ctx.Config, url);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (uri.IsFile())\n\t\t\t\t{\n\t\t\t\t\tusing var stream = File.OpenRead(uri.AbsolutePath);\n\t\t\t\t\treturn await GetPlaylistContentAsync(stream, url);\n\t\t\t\t}\n\t\t\t\telse if (uri.IsWeb())\n\t\t\t\t{\n\t\t\t\t\treturn await WebWrapper.Request(uri).ToAction(async response =>\n\t\t\t\t\t{\n\t\t\t\t\t\tvar contentType = response.Headers.GetSingle(\"Content-Type\");\n\t\t\t\t\t\tint index = url.LastIndexOf('.');\n\t\t\t\t\t\tstring anyId = index >= 0 ? url.Substring(index) : url;\n\n\t\t\t\t\t\tusing var stream = await response.Content.ReadAsStreamAsync();\n\t\t\t\t\t\treturn await GetPlaylistContentAsync(stream, url, contentType);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow Error.LocalStr(strings.error_media_invalid_uri);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Error opening/reading playlist file\");\n\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_io_unknown_error);\n\t\t\t}\n\t\t}\n\n\t\tprivate Task<Playlist> GetPlaylistContentAsync(Stream stream, string url, string? mime = null)\n\t\t\t=> Task.Run(() => GetPlaylistContent(stream, url, mime));\n\n\t\tprivate Playlist GetPlaylistContent(Stream stream, string url, string? mime = null)\n\t\t{\n\t\t\tstring? name = null;\n\t\t\tList<PlaylistItem> items;\n\t\t\tmime = mime?.ToLowerInvariant();\n\t\t\turl = url.ToLowerInvariant();\n\t\t\tstring anyId = mime ?? url;\n\n\t\t\tswitch (anyId)\n\t\t\t{\n\t\t\tcase \".m3u\":\n\t\t\tcase \".m3u8\":\n\t\t\tcase \"application/mpegurl\":\n\t\t\tcase \"application/x-mpegurl\":\n\t\t\tcase \"audio/mpegurl\":\n\t\t\tcase \"audio/x-mpegurl\":\n\t\t\tcase \"application/vnd.apple.mpegurl\":\n\t\t\tcase \"application/vnd.apple.mpegurl.audio\":\n\t\t\t\t{\n\t\t\t\t\tvar parser = new M3uContent();\n\t\t\t\t\tvar list = parser.GetFromStream(stream);\n\n\t\t\t\t\titems = new List<PlaylistItem>(\n\t\t\t\t\t\tfrom e in list.PlaylistEntries\n\t\t\t\t\t\tselect new PlaylistItem(new AudioResource(e.Path, e.Title, ResolverFor)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tcase \".pls\":\n\t\t\tcase \"audio/x-scpls\":\n\t\t\tcase \"application/x-scpls\":\n\t\t\tcase \"application/pls+xml\":\n\t\t\t\t{\n\t\t\t\t\tvar parser = new PlsContent();\n\t\t\t\t\tvar list = parser.GetFromStream(stream);\n\n\t\t\t\t\titems = new List<PlaylistItem>(\n\t\t\t\t\t\tfrom e in list.PlaylistEntries\n\t\t\t\t\t\tselect new PlaylistItem(new AudioResource(e.Path, e.Title, ResolverFor)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tcase \".wpl\":\n\t\t\t\t{\n\t\t\t\t\tvar parser = new WplContent();\n\t\t\t\t\tvar list = parser.GetFromStream(stream);\n\n\t\t\t\t\titems = new List<PlaylistItem>(\n\t\t\t\t\t\tfrom e in list.PlaylistEntries\n\t\t\t\t\t\tselect new PlaylistItem(new AudioResource(e.Path, e.TrackTitle, ResolverFor)));\n\t\t\t\t\tname = list.Title;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tcase \".zpl\":\n\t\t\t\t{\n\t\t\t\t\tvar parser = new ZplContent();\n\t\t\t\t\tvar list = parser.GetFromStream(stream);\n\n\t\t\t\t\titems = new List<PlaylistItem>(\n\t\t\t\t\t\tfrom e in list.PlaylistEntries\n\t\t\t\t\t\tselect new PlaylistItem(new AudioResource(e.Path, e.TrackTitle, ResolverFor)));\n\t\t\t\t\tname = list.Title;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t// ??\n\t\t\tcase \"application/jspf+json\":\n\t\t\t// ??\n\t\t\tcase \"application/xspf+xml\":\n\t\t\tdefault:\n\t\t\t\tthrow Error.LocalStr(strings.error_media_file_not_found); // TODO Loc \"media not supported\"\n\t\t\t}\n\n\t\t\tif (string.IsNullOrEmpty(name))\n\t\t\t{\n\t\t\t\tvar index = url.LastIndexOfAny(new[] { '\\\\', '/' });\n\t\t\t\tname = index >= 0 ? url.Substring(index) : url;\n\t\t\t}\n\t\t\treturn new Playlist(items).SetTitle(name);\n\t\t}\n\n\t\tpublic async Task GetThumbnail(ResolveContext _, PlayResource playResource, Func<Stream, Task> action)\n\t\t{\n\t\t\tbyte[]? rawImgData;\n\n\t\t\tif (playResource is MediaPlayResource mediaPlayResource)\n\t\t\t{\n\t\t\t\trawImgData = mediaPlayResource.Image;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar uri = new Uri(playResource.PlayUri);\n\n\t\t\t\tif (uri.IsWeb())\n\t\t\t\t\trawImgData = await WebWrapper.Request(uri)\n\t\t\t\t\t\t.ToAction(async response => AudioTagReader.GetData(await response.Content.ReadAsStreamAsync())?.Picture);\n\t\t\t\telse if (uri.IsFile())\n\t\t\t\t\trawImgData = AudioTagReader.GetData(File.OpenRead(uri.LocalPath))?.Picture;\n\t\t\t\telse\n\t\t\t\t\tthrow Error.LocalStr(strings.error_media_invalid_uri);\n\t\t\t}\n\n\t\t\tif (rawImgData is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_image_not_found);\n\n\t\t\tawait action(new MemoryStream(rawImgData));\n\t\t}\n\n\t\tpublic void Dispose() { }\n\t}\n\n\tinternal class ResData\n\t{\n\t\tpublic string FullUri { get; }\n\t\tpublic string? Title { get; }\n\t\tpublic byte[]? Image { get; set; }\n\n\t\tpublic bool IsIcyStream { get; set; } = false;\n\n\t\tpublic ResData(string fullUri, string? title)\n\t\t{\n\t\t\tFullUri = fullUri;\n\t\t\tTitle = title;\n\t\t\tImage = null;\n\t\t}\n\t}\n\n\tinternal static class MediaExt\n\t{\n\t\tpublic static bool IsWeb(this Uri uri)\n\t\t\t=> uri.Scheme == Uri.UriSchemeHttp\n\t\t\t|| uri.Scheme == Uri.UriSchemeHttps;\n\n\t\tpublic static bool IsFile(this Uri uri)\n\t\t\t=> uri.Scheme == Uri.UriSchemeFile;\n\t}\n\n\tpublic class MediaPlayResource : PlayResource\n\t{\n\t\tpublic byte[]? Image { get; }\n\t\tpublic bool IsIcyStream { get; }\n\n\t\tpublic MediaPlayResource(string uri, AudioResource baseData, byte[]? image, bool isIcyStream) : base(uri, baseData)\n\t\t{\n\t\t\tImage = image;\n\t\t\tIsIcyStream = isIcyStream;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/PlayResource.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TS3AudioBot.Audio;\nusing TS3AudioBot.CommandSystem.CommandResults;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic class PlayResource : IAudioResourceResult, IMetaContainer\n\t{\n\t\tpublic AudioResource AudioResource { get; }\n\t\tpublic string PlayUri { get; }\n\t\tpublic PlayInfo? PlayInfo { get; set; }\n\t\tpublic SongInfo? SongInfo { get; set; }\n\n\t\tpublic PlayResource(string uri, AudioResource baseData, PlayInfo? playInfo = null, SongInfo? songInfo = null)\n\t\t{\n\t\t\tAudioResource = baseData;\n\t\t\tPlayUri = uri;\n\t\t\tPlayInfo = playInfo;\n\t\t\tSongInfo = songInfo;\n\t\t}\n\n\t\tpublic override string ToString() => AudioResource.ToString();\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/ResolveContext.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Playlists;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic class ResolveContext\n\t{\n\t\tpublic ResourceResolver Resolver { get; }\n\t\tpublic ConfBot Config { get; }\n\n\t\tpublic ResolveContext(ResourceResolver resolver, ConfBot config)\n\t\t{\n\t\t\tResolver = resolver;\n\t\t\tConfig = config;\n\t\t}\n\n\t\tpublic Task<PlayResource> Load(AudioResource resource) => Resolver.Load(this, resource);\n\t\tpublic Task<PlayResource> Load(string message, string? audioType = null) => Resolver.Load(this, message, audioType);\n\t\tpublic Task<Playlist> LoadPlaylistFrom(string message, string? audioType = null) => Resolver.LoadPlaylistFrom(this, message, audioType);\n\t\tpublic string? RestoreLink(AudioResource res) => Resolver.RestoreLink(this, res);\n\t\tpublic Task GetThumbnail(PlayResource playResource, Func<Stream, Task> action) => Resolver.GetThumbnail(this, playResource, action);\n\t\tpublic Task<IList<AudioResource>> Search(string resolverName, string query) => Resolver.Search(this, resolverName, query);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/ResourceResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Playlists;\nusing TS3AudioBot.ResourceFactories.Youtube;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic sealed class ResourceResolver : IDisposable\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tprivate readonly Dictionary<string, IResolver> allResolvers = new Dictionary<string, IResolver>();\n\t\tprivate readonly List<IPlaylistResolver> listResolvers = new List<IPlaylistResolver>();\n\t\tprivate readonly List<IResourceResolver> resResolvers = new List<IResourceResolver>();\n\t\tprivate readonly List<ISearchResolver> searchResolvers = new List<ISearchResolver>();\n\n\t\tpublic ResourceResolver(ConfFactories conf)\n\t\t{\n\t\t\tAddResolver(new MediaResolver());\n\t\t\tAddResolver(new YoutubeResolver(conf.Youtube));\n\t\t\tAddResolver(new SoundcloudResolver());\n\t\t\tAddResolver(new TwitchResolver());\n\t\t\tAddResolver(new BandcampResolver());\n\t\t}\n\n\t\tprivate T? GetResolverByType<T>(string audioType) where T : class, IResolver =>\n\t\t\t// ToLower for legacy reasons\n\t\t\tallResolvers.TryGetValue(audioType.ToLowerInvariant(), out var resolver) && resolver is T resolverT\n\t\t\t\t? resolverT\n\t\t\t\t: null;\n\n\t\tprivate IEnumerable<(IResourceResolver, MatchCertainty)> GetResResolverByLink(ResolveContext ctx, string uri) =>\n\t\t\tfrom rsv in resResolvers\n\t\t\tlet rsvCertain = rsv.MatchResource(ctx, uri)\n\t\t\twhere rsvCertain != MatchCertainty.Never\n\t\t\torderby rsvCertain descending\n\t\t\tselect (rsv, rsvCertain);\n\n\t\tprivate IEnumerable<(IPlaylistResolver, MatchCertainty)> GetListResolverByLink(ResolveContext ctx, string uri) =>\n\t\t\tfrom rsv in listResolvers\n\t\t\tlet rsvCertain = rsv.MatchPlaylist(ctx, uri)\n\t\t\twhere rsvCertain != MatchCertainty.Never\n\t\t\torderby rsvCertain descending\n\t\t\tselect (rsv, rsvCertain);\n\n\t\tprivate static IEnumerable<T> FilterUsable<T>(IEnumerable<(T, MatchCertainty)> enu)\n\t\t{\n\t\t\tvar highestCertainty = MatchCertainty.Never;\n\t\t\tforeach (var (rsv, cert) in enu)\n\t\t\t{\n\t\t\t\tif ((highestCertainty == MatchCertainty.Always && cert < MatchCertainty.Always)\n\t\t\t\t\t|| (highestCertainty > MatchCertainty.Never && cert <= MatchCertainty.OnlyIfLast))\n\t\t\t\t\tyield break;\n\n\t\t\t\tyield return rsv;\n\n\t\t\t\tif (cert > highestCertainty)\n\t\t\t\t\thighestCertainty = cert;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>Generates a new <see cref=\"PlayResource\"/> which can be played.</summary>\n\t\t/// <param name=\"resource\">An <see cref=\"AudioResource\"/> with at least\n\t\t/// <see cref=\"AudioResource.AudioType\"/> and<see cref=\"AudioResource.ResourceId\"/> set.</param>\n\t\t/// <returns>The playable resource if successful, or an error message otherwise.</returns>\n\t\tpublic async Task<PlayResource> Load(ResolveContext ctx, AudioResource resource)\n\t\t{\n\t\t\tif (resource is null)\n\t\t\t\tthrow new ArgumentNullException(nameof(resource));\n\n\t\t\tvar resolver = GetResolverByType<IResourceResolver>(resource.AudioType);\n\t\t\tif (resolver is null)\n\t\t\t\tthrow CouldNotLoad(string.Format(strings.error_resfac_no_registered_factory, resource.AudioType));\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar sw = Stopwatch.StartNew();\n\t\t\t\tvar result = await resolver.GetResourceById(ctx, resource);\n\t\t\t\tLog.Debug(\"Took {0}ms to resolve resource.\", sw.ElapsedMilliseconds);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tcatch (AudioBotException ex)\n\t\t\t{\n\t\t\t\tthrow CouldNotLoad(ex.Message);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Resource resolver '{0}' threw while trying to resolve '{@resource}'\", resolver.ResolverFor, resource);\n\t\t\t\tthrow CouldNotLoad(strings.error_playmgr_internal_error);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>Generates a new <see cref=\"PlayResource\"/> which can be played.\n\t\t/// The message used will be cleared of bb-tags. Also lets you pick an\n\t\t/// <see cref=\"IResourceResolver\"/> identifier to optionally select a resolver.\n\t\t/// </summary>\n\t\t/// <param name=\"message\">The link/uri to resolve for the resource.</param>\n\t\t/// <param name=\"audioType\">The associated resource type string to a resolver.\n\t\t/// Leave null to let it detect automatically.</param>\n\t\t/// <returns>The playable resource if successful, or an error message otherwise.</returns>\n\t\tpublic async Task<PlayResource> Load(ResolveContext ctx, string message, string? audioType = null)\n\t\t{\n\t\t\tif (string.IsNullOrWhiteSpace(message))\n\t\t\t\tthrow new ArgumentNullException(nameof(message));\n\n\t\t\tvar netlinkurl = TextUtil.ExtractUrlFromBb(message);\n\n\t\t\tif (audioType != null)\n\t\t\t{\n\t\t\t\tvar resolver = GetResolverByType<IResourceResolver>(audioType);\n\t\t\t\tif (resolver is null)\n\t\t\t\t\tthrow CouldNotLoad(string.Format(strings.error_resfac_no_registered_factory, audioType));\n\n\t\t\t\treturn await resolver.GetResource(ctx, netlinkurl);\n\t\t\t}\n\n\t\t\tvar resolvers = FilterUsable(GetResResolverByLink(ctx, netlinkurl));\n\t\t\tList<(string, AudioBotException)>? errors = null;\n\t\t\tforeach (var resolver in resolvers)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar sw = Stopwatch.StartNew();\n\t\t\t\t\tvar result = await resolver.GetResource(ctx, netlinkurl);\n\t\t\t\t\tLog.Debug(\"Took {0}ms to resolve resource.\", sw.ElapsedMilliseconds);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tcatch (AudioBotException ex)\n\t\t\t\t{\n\t\t\t\t\t(errors ??= new List<(string, AudioBotException)>()).Add((resolver.ResolverFor, ex));\n\t\t\t\t\tLog.Trace(\"Resolver {0} failed, result: {1}\", resolver.ResolverFor, ex.Message);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow ToErrorString(errors);\n\t\t}\n\n\t\tpublic async Task<Playlist> LoadPlaylistFrom(ResolveContext ctx, string message, string? audioType = null)\n\t\t{\n\t\t\tif (string.IsNullOrWhiteSpace(message))\n\t\t\t\tthrow new ArgumentNullException(nameof(message));\n\n\t\t\tstring netlinkurl = TextUtil.ExtractUrlFromBb(message);\n\n\t\t\tif (audioType != null)\n\t\t\t{\n\t\t\t\tvar resolver = GetResolverByType<IPlaylistResolver>(audioType);\n\t\t\t\tif (resolver is null)\n\t\t\t\t\tthrow CouldNotLoad(string.Format(strings.error_resfac_no_registered_factory, audioType));\n\n\t\t\t\ttry { return await resolver.GetPlaylist(ctx, netlinkurl); }\n\t\t\t\tcatch (AudioBotException ex) { throw CouldNotLoad(ex.Message); }\n\t\t\t}\n\n\t\t\tvar resolvers = FilterUsable(GetListResolverByLink(ctx, netlinkurl));\n\t\t\tList<(string, AudioBotException)>? errors = null;\n\t\t\tforeach (var resolver in resolvers)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\treturn await resolver.GetPlaylist(ctx, netlinkurl);\n\t\t\t\t}\n\t\t\t\tcatch (AudioBotException ex)\n\t\t\t\t{\n\t\t\t\t\t(errors ??= new List<(string, AudioBotException)>()).Add((resolver.ResolverFor, ex));\n\t\t\t\t\tLog.Trace(\"Resolver {0} failed, result: {1}\", resolver.ResolverFor, ex.Message);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow ToErrorString(errors);\n\t\t}\n\n\t\tpublic string? RestoreLink(ResolveContext ctx, AudioResource res)\n\t\t{\n\t\t\tvar resolver = GetResolverByType<IResourceResolver>(res.AudioType);\n\t\t\tif (resolver is null)\n\t\t\t{\n\t\t\t\tLog.Debug(\"ResourceFactory for '{0}' not found\", res.AudioType);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn resolver.RestoreLink(ctx, res);\n\t\t\t}\n\t\t\tcatch (AudioBotException ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Error resolving link ({0})\", res);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tpublic async Task GetThumbnail(ResolveContext ctx, PlayResource playResource, Func<Stream, Task> action)\n\t\t{\n\t\t\tvar resolver = GetResolverByType<IThumbnailResolver>(playResource.AudioResource.AudioType);\n\t\t\tif (resolver is null)\n\t\t\t\tthrow Error.LocalStr(string.Format(strings.error_resfac_no_registered_factory, playResource.AudioResource.AudioType));\n\n\t\t\tvar sw = Stopwatch.StartNew();\n\t\t\tawait resolver.GetThumbnail(ctx, playResource, action);\n\t\t\tLog.Debug(\"Took {0}ms to load thumbnail.\", sw.ElapsedMilliseconds);\n\t\t}\n\n\t\tpublic async Task<IList<AudioResource>> Search(ResolveContext ctx, string resolverName, string query)\n\t\t{\n\t\t\tvar resolver = GetResolverByType<ISearchResolver>(resolverName);\n\t\t\tif (resolver is null)\n\t\t\t\tthrow CouldNotLoad(string.Format(strings.error_resfac_no_registered_factory, resolverName));\n\t\t\treturn await resolver.Search(ctx, query);\n\t\t}\n\n\t\tpublic void AddResolver(IResolver resolver)\n\t\t{\n\t\t\tif (resolver.ResolverFor.ToLowerInvariant() != resolver.ResolverFor)\n\t\t\t\tthrow new ArgumentException($\"The resolver audio type \\\"{nameof(IResolver.ResolverFor)}\\\" must be in lower case.\", nameof(resolver));\n\t\t\tif (allResolvers.ContainsKey(resolver.ResolverFor))\n\t\t\t\tthrow new ArgumentException(\"A resolver for this type already has been registered.\", nameof(resolver));\n\n\t\t\tif (resolver is IResourceResolver resResolver)\n\t\t\t{\n\t\t\t\tresResolvers.Add(resResolver);\n\t\t\t}\n\t\t\tif (resolver is IPlaylistResolver listResolver)\n\t\t\t{\n\t\t\t\tlistResolvers.Add(listResolver);\n\t\t\t}\n\t\t\tif (resolver is ISearchResolver searchResolver)\n\t\t\t{\n\t\t\t\tsearchResolvers.Add(searchResolver);\n\t\t\t}\n\n\t\t\tallResolvers.Add(resolver.ResolverFor, resolver);\n\t\t}\n\n\t\tpublic void RemoveResolver(IResolver Resolver)\n\t\t{\n\t\t\tif (!allResolvers.Remove(Resolver.ResolverFor))\n\t\t\t\treturn;\n\n\t\t\tif (Resolver is IResourceResolver resResolver)\n\t\t\t\tresResolvers.Remove(resResolver);\n\t\t\tif (Resolver is IPlaylistResolver listResolver)\n\t\t\t\tlistResolvers.Remove(listResolver);\n\t\t\tif (Resolver is ISearchResolver searchResolver)\n\t\t\t\tsearchResolvers.Remove(searchResolver);\n\t\t}\n\n\t\tprivate static AudioBotException CouldNotLoad(string? reason = null)\n\t\t{\n\t\t\tif (reason is null)\n\t\t\t\treturn Error.LocalStr(strings.error_resfac_could_not_load);\n\t\t\tvar strb = new StringBuilder(strings.error_resfac_could_not_load);\n\t\t\tstrb.Append(\" (\").Append(reason).Append(\")\");\n\t\t\treturn Error.LocalStr(strb.ToString());\n\t\t}\n\n\t\tprivate static AudioBotException ToErrorString(List<(string rsv, AudioBotException err)>? errors)\n\t\t{\n\t\t\tif (errors is null || errors.Count == 0)\n\t\t\t\tthrow new ArgumentException(\"No errors provided\", nameof(errors));\n\t\t\tif (errors.Count == 1)\n\t\t\t\treturn CouldNotLoad($\"{errors[0].rsv}: {errors[0].err.Message}\");\n\t\t\treturn CouldNotLoad(strings.error_resfac_multiple_factories_failed);\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tforeach (var resolver in allResolvers.Values)\n\t\t\t\tresolver.Dispose();\n\t\t\tallResolvers.Clear();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/SongInfo.cs",
    "content": "using System;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic class SongInfo\n\t{\n\t\tpublic string? Title { get; set; }\n\t\tpublic string? Track { get; set; }\n\t\tpublic string? Artist { get; set; }\n\t\tpublic TimeSpan? Length { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/SoundcloudResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Playlists;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic sealed class SoundcloudResolver : IResourceResolver, IPlaylistResolver, IThumbnailResolver\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate static readonly Regex SoundcloudLink = new Regex(@\"^https?\\:\\/\\/(www\\.)?soundcloud\\.\", Util.DefaultRegexConfig);\n\t\tprivate const string SoundcloudClientId = \"a9dd3403f858e105d7e266edc162a0c5\";\n\n\t\tprivate const string AddArtist = \"artist\";\n\t\tprivate const string AddTrack = \"track\";\n\n\t\tpublic string ResolverFor => \"soundcloud\";\n\n\t\tpublic MatchCertainty MatchResource(ResolveContext? _, string uri) => SoundcloudLink.IsMatch(uri).ToMatchCertainty();\n\n\t\tpublic MatchCertainty MatchPlaylist(ResolveContext? _, string uri) => MatchResource(null, uri);\n\n\t\tpublic async Task<PlayResource> GetResource(ResolveContext? _, string uri)\n\t\t{\n\t\t\tJsonTrackInfo? track = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttrack = await WebWrapper\n\t\t\t\t\t.Request($\"https://api.soundcloud.com/resolve.json?url={Uri.EscapeUriString(uri)}&client_id={SoundcloudClientId}\")\n\t\t\t\t\t.AsJson<JsonTrackInfo>();\n\t\t\t}\n\t\t\tcatch (Exception ex) { Log.Debug(ex, \"Failed to get via api\"); }\n\n\t\t\tif (track is null)\n\t\t\t{\n\t\t\t\tif (!SoundcloudLink.IsMatch(uri))\n\t\t\t\t\tthrow Error.LocalStr(strings.error_media_invalid_uri);\n\t\t\t\treturn await YoutubeDlWrappedAsync(uri);\n\t\t\t}\n\t\t\tvar resource = CheckAndGet(track);\n\t\t\tif (resource is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_missing + \" (parsedDict)\");\n\t\t\treturn await GetResourceById(resource, false);\n\t\t}\n\n\t\tpublic Task<PlayResource> GetResourceById(ResolveContext _, AudioResource resource) => GetResourceById(resource, true);\n\n\t\tprivate async Task<PlayResource> GetResourceById(AudioResource resource, bool allowNullName)\n\t\t{\n\t\t\tif (SoundcloudLink.IsMatch(resource.ResourceId))\n\t\t\t\treturn await GetResource(null, resource.ResourceId);\n\n\t\t\tif (resource.ResourceTitle is null)\n\t\t\t{\n\t\t\t\tif (!allowNullName) throw Error.LocalStr(strings.error_media_internal_missing + \" (title)\");\n\t\t\t\tstring link = RestoreLink(null, resource);\n\t\t\t\tif (link is null) throw Error.LocalStr(strings.error_media_internal_missing + \" (link)\");\n\t\t\t\treturn await GetResource(null, link);\n\t\t\t}\n\n\t\t\tstring finalRequest = $\"https://api.soundcloud.com/tracks/{resource.ResourceId}/stream?client_id={SoundcloudClientId}\";\n\t\t\treturn new PlayResource(finalRequest, resource);\n\t\t}\n\n\t\tpublic string RestoreLink(ResolveContext? _, AudioResource resource)\n\t\t{\n\t\t\tvar artistName = resource.Get(AddArtist);\n\t\t\tvar trackName = resource.Get(AddTrack);\n\n\t\t\tif (artistName != null && trackName != null)\n\t\t\t\treturn $\"https://soundcloud.com/{artistName}/{trackName}\";\n\n\t\t\treturn \"https://soundcloud.com\";\n\t\t}\n\n\t\tprivate AudioResource? CheckAndGet(JsonTrackInfo track)\n\t\t{\n\t\t\tif (track == null || track.id == 0 || track.title == null\n\t\t\t\t|| track.permalink == null || track.user?.permalink == null)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Parts of track response are empty: {@json}\", track);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn new AudioResource(\n\t\t\t\ttrack.id.ToString(CultureInfo.InvariantCulture),\n\t\t\t\ttrack.title,\n\t\t\t\tResolverFor)\n\t\t\t\t.Add(AddArtist, track.user.permalink)\n\t\t\t\t.Add(AddTrack, track.permalink);\n\t\t}\n\n\t\tprivate async Task<PlayResource> YoutubeDlWrappedAsync(string link)\n\t\t{\n\t\t\tLog.Debug(\"Falling back to youtube-dl!\");\n\n\t\t\tvar response = await YoutubeDlHelper.GetSingleVideo(link);\n\t\t\tvar title = response.title ?? $\"Soundcloud-{link}\";\n\t\t\tvar format = YoutubeDlHelper.FilterBest(response.formats);\n\t\t\tvar url = format?.url;\n\n\t\t\tif (string.IsNullOrEmpty(url))\n\t\t\t\tthrow Error.LocalStr(strings.error_ytdl_empty_response);\n\n\t\t\tLog.Debug(\"youtube-dl succeeded!\");\n\n\t\t\treturn new PlayResource(url, new AudioResource(link, title, ResolverFor));\n\t\t}\n\n\t\tpublic async Task<Playlist> GetPlaylist(ResolveContext _, string url)\n\t\t{\n\t\t\tvar playlist = await WebWrapper\n\t\t\t\t.Request($\"https://api.soundcloud.com/resolve.json?url={Uri.EscapeUriString(url)}&client_id={SoundcloudClientId}\")\n\t\t\t\t.AsJson<JsonPlaylist>();\n\n\t\t\tif (playlist is null || playlist.title is null || playlist.tracks is null)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Parts of playlist response are empty: {@json}\", playlist);\n\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_missing + \" (playlist)\");\n\t\t\t}\n\n\t\t\tvar plist = new Playlist().SetTitle(playlist.title);\n\t\t\tplist.AddRange(\n\t\t\t\tplaylist.tracks.Select(track =>\n\t\t\t\t{\n\t\t\t\t\tvar resource = CheckAndGet(track);\n\t\t\t\t\tif (resource is null)\n\t\t\t\t\t\treturn null!;\n\t\t\t\t\treturn new PlaylistItem(resource);\n\t\t\t\t})\n\t\t\t\t.Where(track => track != null)\n\t\t\t);\n\n\t\t\treturn plist;\n\t\t}\n\n\t\tpublic async Task GetThumbnail(ResolveContext _, PlayResource playResource, Func<Stream, Task> action)\n\t\t{\n\t\t\tvar thumb = await WebWrapper\n\t\t\t\t.Request($\"https://api.soundcloud.com/tracks/{playResource.AudioResource.ResourceId}?client_id={SoundcloudClientId}\")\n\t\t\t\t.AsJson<JsonTumbnailMinimal>();\n\t\t\tif (thumb is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_missing + \" (thumb)\");\n\t\t\tif (thumb.artwork_url is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_missing + \" (artwork_url)\");\n\n\t\t\t// t500x500: 500px×500px\n\t\t\t// crop    : 400px×400px\n\t\t\t// t300x300: 300px×300px\n\t\t\t// large   : 100px×100px \n\t\t\tawait WebWrapper.Request(thumb.artwork_url.Replace(\"-large\", \"-t300x300\")).ToStream(action);\n\t\t}\n\n\t\tpublic void Dispose() { }\n\n#pragma warning disable CS0649, CS0169, IDE1006\n\t\t// ReSharper disable ClassNeverInstantiated.Local, InconsistentNaming\n\t\tprivate class JsonTrackInfo\n\t\t{\n\t\t\tpublic int id { get; set; }\n\t\t\tpublic string? title { get; set; }\n\t\t\tpublic string? permalink { get; set; }\n\t\t\tpublic JsonTrackUser? user { get; set; }\n\t\t}\n\t\tprivate class JsonTrackUser\n\t\t{\n\t\t\tpublic string? permalink { get; set; }\n\t\t}\n\t\tprivate class JsonPlaylist\n\t\t{\n\t\t\tpublic string? title { get; set; }\n\t\t\tpublic JsonTrackInfo[]? tracks { get; set; }\n\t\t}\n\t\tprivate class JsonTumbnailMinimal\n\t\t{\n\t\t\tpublic string? artwork_url { get; set; }\n\t\t}\n\t\t// ReSharper enable ClassNeverInstantiated.Local, InconsistentNaming\n#pragma warning restore CS0649, CS0169, IDE1006\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/TwitchResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic sealed class TwitchResolver : IResourceResolver\n\t{\n\t\tprivate static readonly Regex TwitchMatch = new Regex(@\"^(https?://)?(www\\.)?twitch\\.tv/(\\w+)\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex M3U8ExtMatch = new Regex(@\"#([\\w-]+)(:(([\\w-]+)=(\"\"[^\"\"]*\"\"|[^,]+),?)*)?\", Util.DefaultRegexConfig);\n\t\t//private const string TwitchClientId = \"t9nlhlxnfux3gk2d6z1p093rj2c71i3\";\n\t\t// See: https://github.com/streamlink/streamlink/issues/2680\n\t\tprivate const string TwitchClientIdPrivate = \"kimne78kx3ncx6brgo4mv6wki5h1ko\";\n\n\t\tpublic string ResolverFor => \"twitch\";\n\n\t\tpublic MatchCertainty MatchResource(ResolveContext _, string uri) => TwitchMatch.IsMatch(uri).ToMatchCertainty();\n\n\t\tpublic async Task<PlayResource> GetResource(ResolveContext _, string uri)\n\t\t{\n\t\t\tvar match = TwitchMatch.Match(uri);\n\t\t\tif (!match.Success)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_invalid_uri);\n\t\t\treturn await GetResourceById(null, new AudioResource(match.Groups[3].Value, null, ResolverFor));\n\t\t}\n\n\t\tpublic async Task<PlayResource> GetResourceById(ResolveContext? _, AudioResource resource)\n\t\t{\n\t\t\tvar channel = resource.ResourceId;\n\n\t\t\t// request api token\n\t\t\tvar access = await WebWrapper\n\t\t\t\t.Request($\"https://api.twitch.tv/api/channels/{channel}/access_token\")\n\t\t\t\t.WithHeader(\"Client-ID\", TwitchClientIdPrivate)\n\t\t\t\t.AsJson<JsonAccessToken>();\n\n\t\t\t// request m3u8 file\n\t\t\tif (access is null || access.token is null || access.sig is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_invalid + \" (tokenResult|sigResult)\");\n\t\t\tvar token = Uri.EscapeUriString(access.token);\n\t\t\tvar sig = access.sig;\n\t\t\t// guaranteed to be random, chosen by fair dice roll.\n\t\t\tconst int random = 4;\n\t\t\tvar m3u8 = await WebWrapper\n\t\t\t\t.Request($\"http://usher.twitch.tv/api/channel/hls/{channel}.m3u8?player=twitchweb&&token={token}&sig={sig}&allow_audio_only=true&allow_source=true&type=any&p={random}\")\n\t\t\t\t.AsString();\n\n\t\t\t// parse m3u8 file\n\t\t\tvar dataList = new List<StreamData>();\n\t\t\tusing (var reader = new System.IO.StringReader(m3u8))\n\t\t\t{\n\t\t\t\tvar header = reader.ReadLine();\n\t\t\t\tif (string.IsNullOrEmpty(header) || header != \"#EXTM3U\")\n\t\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_missing + \" (m3uHeader)\");\n\n\t\t\t\twhile (true)\n\t\t\t\t{\n\t\t\t\t\tvar blockInfo = reader.ReadLine();\n\t\t\t\t\tif (string.IsNullOrEmpty(blockInfo))\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tvar match = M3U8ExtMatch.Match(blockInfo);\n\t\t\t\t\tif (!match.Success)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tswitch (match.Groups[1].Value)\n\t\t\t\t\t{\n\t\t\t\t\tcase \"EXT-X-TWITCH-INFO\": break; // Ignore twitch info line\n\t\t\t\t\tcase \"EXT-X-MEDIA\":\n\t\t\t\t\t\tstring? streamInfo = reader.ReadLine();\n\t\t\t\t\t\tMatch infoMatch;\n\t\t\t\t\t\tif (string.IsNullOrEmpty(streamInfo)\n\t\t\t\t\t\t\t|| !(infoMatch = M3U8ExtMatch.Match(streamInfo)).Success\n\t\t\t\t\t\t\t|| infoMatch.Groups[1].Value != \"EXT-X-STREAM-INF\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthrow Error.LocalStr(strings.error_media_internal_missing + \" (m3uStream)\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar streamData = new StreamData();\n\t\t\t\t\t\t// #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000,CODECS=\"mp4a.40.2\",VIDEO=\"audio_only\"\n\t\t\t\t\t\tfor (int i = 0; i < infoMatch.Groups[3].Captures.Count; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstring key = infoMatch.Groups[4].Captures[i].Value.ToUpperInvariant();\n\t\t\t\t\t\t\tstring value = infoMatch.Groups[5].Captures[i].Value;\n\n\t\t\t\t\t\t\tswitch (key)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase \"BANDWIDTH\": streamData.Bandwidth = int.Parse(value, CultureInfo.InvariantCulture); break;\n\t\t\t\t\t\t\tcase \"CODECS\": streamData.Codec = TextUtil.StripQuotes(value); break;\n\t\t\t\t\t\t\tcase \"VIDEO\":\n\t\t\t\t\t\t\t\tstreamData.QualityType = Enum.TryParse(TextUtil.StripQuotes(value), out StreamQuality quality)\n\t\t\t\t\t\t\t\t ? quality\n\t\t\t\t\t\t\t\t : StreamQuality.unknown; break;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstreamData.Url = reader.ReadLine();\n\t\t\t\t\t\tdataList.Add(streamData);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Validation Process\n\n\t\t\tif (dataList.Count <= 0)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_no_stream_extracted);\n\n\t\t\tint codec = SelectStream(dataList);\n\t\t\tif (codec < 0)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_no_stream_extracted);\n\t\t\tvar selectedStream = dataList[codec];\n\t\t\tif (selectedStream.Url == null)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_no_stream_extracted);\n\n\t\t\tif (resource.ResourceTitle == null)\n\t\t\t\tresource.ResourceTitle = $\"Twitch channel: {channel}\";\n\t\t\treturn new PlayResource(selectedStream.Url, resource);\n\t\t}\n\n\t\tprivate static int SelectStream(List<StreamData> list) => list.FindIndex(s => s.QualityType == StreamQuality.audio_only);\n\n\t\tpublic string RestoreLink(ResolveContext _, AudioResource resource) => \"https://www.twitch.tv/\" + resource.ResourceId;\n\n\t\tpublic void Dispose() { }\n\n#pragma warning disable IDE1006 // Naming Styles\n\t\tprivate class JsonAccessToken\n\t\t{\n\t\t\tpublic string? token { get; set; }\n\t\t\tpublic string? sig { get; set; }\n\t\t\tpublic DateTime expires_at { get; set; }\n\t\t}\n#pragma warning restore IDE1006 // Naming Styles\n\t}\n\n\tpublic sealed class StreamData\n\t{\n\t\tpublic StreamQuality QualityType { get; set; }\n\t\tpublic int Bandwidth { get; set; }\n\t\tpublic string? Codec { get; set; }\n\t\tpublic string? Url { get; set; }\n\t}\n\n\tpublic enum StreamQuality\n\t{\n\t\tunknown,\n\t\tchunked,\n\t\thigh,\n\t\tmedium,\n\t\tlow,\n\t\tmobile,\n\t\taudio_only,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/Youtube/Json.cs",
    "content": "namespace TS3AudioBot.ResourceFactories.Youtube\n{\n#pragma warning disable CS0649, CS0169, IDE1006\n\t// ReSharper disable ClassNeverInstantiated.Local, InconsistentNaming\n\tpublic class JsonVideoListResponse // # youtube#videoListResponse\n\t{\n\t\tpublic string? nextPageToken { get; set; }\n\t\tpublic JsonVideo[]? items { get; set; }\n\t}\n\tpublic class JsonVideo // youtube#video\n\t{\n\t\tpublic JsonContentDetails? contentDetails { get; set; }\n\t\tpublic JsonSnippet? snippet { get; set; }\n\t}\n\tpublic class JsonSearchListResponse // youtube#searchListResponse\n\t{\n\t\tpublic JsonSearchResult[]? items { get; set; }\n\t}\n\tpublic class JsonSearchResult // youtube#searchResult\n\t{\n\t\tpublic JsonContentDetails? id { get; set; }\n\t\tpublic JsonSnippet? snippet { get; set; }\n\t}\n\tpublic class JsonContentDetails\n\t{\n\t\tpublic string? videoId { get; set; }\n\t}\n\tpublic class JsonSnippet\n\t{\n\t\tpublic string? title { get; set; }\n\t\tpublic JsonThumbnailList? thumbnails { get; set; }\n\t}\n\tpublic class JsonThumbnailList\n\t{\n\t\tpublic JsonThumbnail? @default { get; set; }\n\t\tpublic JsonThumbnail? medium { get; set; }\n\t\tpublic JsonThumbnail? high { get; set; }\n\t\tpublic JsonThumbnail? standard { get; set; }\n\t\tpublic JsonThumbnail? maxres { get; set; }\n\t}\n\tpublic class JsonThumbnail\n\t{\n\t\tpublic string? url { get; set; }\n\t\tpublic int heigth { get; set; }\n\t\tpublic int width { get; set; }\n\t}\n\t// Custom json\n\tpublic class JsonPlayerResponse\n\t{\n\t\tpublic JsonStreamingData? streamingData { get; set; }\n\t\tpublic JsonVideoDetails? videoDetails { get; set; }\n\t}\n\tpublic class JsonStreamingData\n\t{\n\t\tpublic string? dashManifestUrl { get; set; }\n\t\tpublic string? hlsManifestUrl { get; set; }\n\t}\n\tpublic class JsonVideoDetails\n\t{\n\t\tpublic string? title { get; set; }\n\t\tpublic bool? isLive { get; set; }\n\t\tpublic bool useCipher { get; set; }\n\t\tpublic bool isLiveContent { get; set; }\n\t}\n\tpublic class JsonPlayFormat\n\t{\n\t\tpublic string? mimeType { get; set; }\n\t\tpublic int bitrate { get; set; }\n\t\tpublic string? cipher { get; set; }\n\t\tpublic string? url { get; set; }\n\t}\n\t// ReSharper enable ClassNeverInstantiated.Local, InconsistentNaming\n#pragma warning restore CS0649, CS0169, IDE1006\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/Youtube/LoaderPriority.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.ResourceFactories.Youtube\n{\n\tpublic enum LoaderPriority\n\t{\n\t\tInternal,\n\t\tYoutubeDl\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/Youtube/VideoCodec.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.ResourceFactories.Youtube\n{\n\tpublic enum VideoCodec\n\t{\n\t\tUnknown,\n\t\tMp4,\n\t\tM4A,\n\t\tWebm,\n\t\tFlv,\n\t\tThreeGp,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/Youtube/VideoData.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.ResourceFactories.Youtube\n{\n\tpublic sealed class VideoData\n\t{\n\t\tpublic VideoData(string link, string qualitydesciption, VideoCodec codec, bool audioOnly = false, bool videoOnly = false)\n\t\t{\n\t\t\tLink = link;\n\t\t\tQualitydesciption = qualitydesciption;\n\t\t\tCodec = codec;\n\t\t\tAudioOnly = audioOnly;\n\t\t\tVideoOnly = videoOnly;\n\t\t}\n\n\t\tpublic string Link { get; }\n\t\tpublic string Qualitydesciption { get; }\n\t\tpublic VideoCodec Codec { get; }\n\t\tpublic bool AudioOnly { get; }\n\t\tpublic bool VideoOnly { get; }\n\n\t\tpublic override string ToString() => $\"{Qualitydesciption} @ {Codec} - {Link}\";\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/Youtube/YoutubeResolver.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Audio;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Playlists;\nusing TS3AudioBot.ResourceFactories.AudioTags;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.ResourceFactories.Youtube\n{\n\tpublic sealed class YoutubeResolver : IResourceResolver, IPlaylistResolver, IThumbnailResolver, ISearchResolver\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate static readonly Regex IdMatch = new Regex(@\"(?:(?:&|\\?)v=|youtu\\.be\\/)([\\w\\-_]{11})\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex YtTimestampMatch = new Regex(@\"(?:&|\\?)t=(\\d+)\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex LinkMatch = new Regex(@\"^(https?\\:\\/\\/)?(www\\.|m\\.)?(youtube\\.|youtu\\.be)\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex ListMatch = new Regex(@\"(&|\\?)list=([\\w\\-_]+)\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex StreamCodecMatch = new Regex(@\"CODECS=\"\"([^\"\"]*)\"\"\", Util.DefaultRegexConfig);\n\t\tprivate static readonly Regex StreamBitrateMatch = new Regex(@\"BANDWIDTH=(\\d+)\", Util.DefaultRegexConfig);\n\t\tprivate string YoutubeProjectId => conf.ApiKey.Value;\n\t\tprivate readonly ConfResolverYoutube conf;\n\n\t\tpublic YoutubeResolver(ConfResolverYoutube conf)\n\t\t{\n\t\t\tthis.conf = conf;\n\t\t}\n\n\t\tpublic string ResolverFor => \"youtube\";\n\n\t\tpublic MatchCertainty MatchResource(ResolveContext? _, string uri) =>\n\t\t\tLinkMatch.IsMatch(uri) || IdMatch.IsMatch(uri)\n\t\t\t\t? MatchCertainty.Always\n\t\t\t\t: MatchCertainty.Never;\n\n\t\tpublic MatchCertainty MatchPlaylist(ResolveContext? _, string uri) => ListMatch.IsMatch(uri) ? MatchCertainty.Always : MatchCertainty.Never;\n\n\t\tpublic async Task<PlayResource> GetResource(ResolveContext? _, string uri)\n\t\t{\n\t\t\tMatch matchYtId = IdMatch.Match(uri);\n\t\t\tif (!matchYtId.Success)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_failed_to_parse_id);\n\n\t\t\tvar play = await GetResourceById(null, new AudioResource(matchYtId.Groups[1].Value, null, ResolverFor));\n\t\t\tMatch matchTimestamp = YtTimestampMatch.Match(uri);\n\t\t\tif (matchYtId.Success && int.TryParse(matchTimestamp.Groups[1].Value, out var secs))\n\t\t\t{\n\t\t\t\tplay.PlayInfo ??= new PlayInfo();\n\t\t\t\tplay.PlayInfo.StartOffset = TimeSpan.FromSeconds(secs);\n\t\t\t}\n\t\t\treturn play;\n\t\t}\n\n\t\tpublic async Task<PlayResource> GetResourceById(ResolveContext? _, AudioResource resource)\n\t\t{\n\t\t\tvar priority = conf.ResolverPriority.Value;\n\t\t\tswitch (priority)\n\t\t\t{\n\t\t\tcase LoaderPriority.Internal:\n\t\t\t\ttry { return await ResolveResourceInternal(resource); }\n\t\t\t\tcatch (AudioBotException) { goto case LoaderPriority.YoutubeDl; }\n\n\t\t\tcase LoaderPriority.YoutubeDl:\n\t\t\t\treturn await YoutubeDlWrapped(resource);\n\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(priority);\n\t\t\t}\n\t\t}\n\n\t\tprivate async Task<PlayResource> ResolveResourceInternal(AudioResource resource)\n\t\t{\n\t\t\tvar resulthtml = await WebWrapper.Request($\"https://www.youtube.com/get_video_info?video_id={resource.ResourceId}\").AsString();\n\n\t\t\tvar videoTypes = new List<VideoData>();\n\t\t\tvar dataParse = ParseQueryString(resulthtml);\n\n\t\t\tif (dataParse.TryGetValue(\"player_response\", out var playerData))\n\t\t\t{\n\t\t\t\tvar parsed = JsonConvert.DeserializeObject<JsonPlayerResponse>(playerData[0]);\n\t\t\t\tLog.Debug(\"Extracted data: {@playerData}\", parsed);\n\n\t\t\t\tif (parsed?.videoDetails != null)\n\t\t\t\t{\n\t\t\t\t\tresource.ResourceTitle ??= parsed.videoDetails.title;\n\n\t\t\t\t\tbool isLive = parsed.videoDetails.isLive ?? false;\n\t\t\t\t\tif (isLive && parsed.streamingData?.hlsManifestUrl != null)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn await ParseLiveData(resource, parsed.streamingData.hlsManifestUrl);\n\t\t\t\t\t}\n\t\t\t\t\telse if (isLive)\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Warn(\"Live stream without hls stream data\");\n\t\t\t\t\t}\n\n\t\t\t\t\tParsePlayerData(parsed, videoTypes);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (dataParse.TryGetValue(\"url_encoded_fmt_stream_map\", out var videoDataUnsplit))\n\t\t\t\tParseEncodedFmt(videoDataUnsplit, videoTypes);\n\n\t\t\tif (dataParse.TryGetValue(\"adaptive_fmts\", out videoDataUnsplit))\n\t\t\t\tParseAdaptiveFmt(videoDataUnsplit, videoTypes);\n\n\t\t\t// Validation Process\n\n\t\t\tif (videoTypes.Count <= 0)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_no_stream_extracted);\n\n\t\t\tint codec = SelectStream(videoTypes);\n\t\t\tif (codec < 0)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_no_stream_extracted);\n\n\t\t\tawait ValidateMedia(videoTypes[codec]);\n\n\t\t\tresource.ResourceTitle ??= $\"<YT - no title : {resource.ResourceId}>\";\n\n\t\t\treturn new PlayResource(videoTypes[codec].Link, resource);\n\t\t}\n\n\t\tprivate static async Task<PlayResource> ParseLiveData(AudioResource resource, string requestUrl)\n\t\t{\n\t\t\tList<M3uEntry>? webList = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\twebList = await WebWrapper.Request(requestUrl).ToAction(async response =>\n\t\t\t\t\tawait M3uReader.TryGetData(await response.Content.ReadAsStreamAsync())\n\t\t\t\t);\n\t\t\t}\n\t\t\tcatch (Exception ex) { throw Error.Exception(ex).LocalStr(strings.error_media_internal_invalid); }\n\n\t\t\tconst string AacHe = \"mp4a.40.5\";\n\t\t\tconst string AacLc = \"mp4a.40.2\";\n\n\t\t\tvar streamPref = from item in webList\n\t\t\t\t\t\t\t let codecs = item.StreamMeta != null ? StreamCodecMatch.Match(item.StreamMeta).Groups[1].Value : \"\"\n\t\t\t\t\t\t\t let codecPref = codecs.Contains(AacLc) ? 0\n\t\t\t\t\t\t\t\t : codecs.Contains(AacHe) ? 1\n\t\t\t\t\t\t\t\t : 2\n\t\t\t\t\t\t\t let bitrate = item.StreamMeta != null ? int.Parse(StreamBitrateMatch.Match(item.StreamMeta).Groups[1].Value) : int.MaxValue\n\t\t\t\t\t\t\t orderby codecPref, bitrate ascending\n\t\t\t\t\t\t\t select item;\n\t\t\tvar streamSelect = streamPref.FirstOrDefault();\n\t\t\tif (streamSelect is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_no_stream_extracted);\n\t\t\treturn new PlayResource(streamSelect.TrackUrl, resource);\n\t\t}\n\n\t\tprivate static void ParsePlayerData(JsonPlayerResponse data, List<VideoData> videoTypes)\n\t\t{\n\t\t\t// TODO\n\t\t}\n\n\t\tprivate static void ParseEncodedFmt(List<string> videoDataUnsplit, List<VideoData> videoTypes)\n\t\t{\n\t\t\tif (videoDataUnsplit.Count == 0)\n\t\t\t\treturn;\n\t\t\tstring[] videoData = videoDataUnsplit[0].Split(',');\n\n\t\t\tforeach (string vdat in videoData)\n\t\t\t{\n\t\t\t\tvar videoparse = ParseQueryString(vdat);\n\n\t\t\t\tif (!videoparse.TryGetValue(\"url\", out var vLink))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (!videoparse.TryGetValue(\"type\", out var vType))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (!videoparse.TryGetValue(\"quality\", out var vQuality))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tvar vt = new VideoData(vLink[0], vQuality[0], GetCodec(vType[0]));\n\t\t\t\tvideoTypes.Add(vt);\n\t\t\t}\n\t\t}\n\n\t\tprivate static void ParseAdaptiveFmt(List<string> videoDataUnsplit, List<VideoData> videoTypes)\n\t\t{\n\t\t\tif (videoDataUnsplit.Count == 0)\n\t\t\t\treturn;\n\n\t\t\tstring[] videoData = videoDataUnsplit[0].Split(',');\n\n\t\t\tforeach (string vdat in videoData)\n\t\t\t{\n\t\t\t\tvar videoparse = ParseQueryString(vdat);\n\n\t\t\t\tif (!videoparse.TryGetValue(\"type\", out var vTypeArr))\n\t\t\t\t\tcontinue;\n\t\t\t\tvar vType = vTypeArr[0];\n\n\t\t\t\tbool audioOnly = false;\n\t\t\t\tif (vType.StartsWith(\"video/\", StringComparison.Ordinal))\n\t\t\t\t\tcontinue;\n\t\t\t\telse if (vType.StartsWith(\"audio/\", StringComparison.Ordinal))\n\t\t\t\t\taudioOnly = true;\n\n\t\t\t\tif (!videoparse.TryGetValue(\"url\", out var vLink))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tvar vt = new VideoData(vLink[0], vType, GetCodec(vType), audioOnly, !audioOnly);\n\t\t\t\tvideoTypes.Add(vt);\n\t\t\t}\n\t\t}\n\n\t\tpublic string RestoreLink(ResolveContext _, AudioResource resource) => \"https://youtu.be/\" + resource.ResourceId;\n\n\t\tprivate static int SelectStream(List<VideoData> list)\n\t\t{\n\t\t\tif (Log.IsTraceEnabled)\n\t\t\t{\n\t\t\t\tvar dbg = new System.Text.StringBuilder(\"YT avail codecs: \");\n\t\t\t\tforeach (var yd in list)\n\t\t\t\t\tdbg.Append(yd.Qualitydesciption).Append(\" @ \").Append(yd.Codec).Append(\", \");\n\t\t\t\tLog.Trace(\"{0}\", dbg);\n\t\t\t}\n\n\t\t\tint autoselectIndex = list.FindIndex(t => t.Codec == VideoCodec.M4A);\n\t\t\tif (autoselectIndex == -1)\n\t\t\t\tautoselectIndex = list.FindIndex(t => t.AudioOnly);\n\t\t\tif (autoselectIndex == -1)\n\t\t\t\tautoselectIndex = list.FindIndex(t => !t.VideoOnly);\n\n\t\t\treturn autoselectIndex;\n\t\t}\n\n\t\tprivate static Task ValidateMedia(VideoData media) => WebWrapper.Request(media.Link).Send();\n\n\t\tprivate static VideoCodec GetCodec(string type)\n\t\t{\n\t\t\tstring lowtype = type.ToLowerInvariant();\n\t\t\tbool audioOnly = false;\n\t\t\tstring codecSubStr;\n\t\t\tif (lowtype.StartsWith(\"video/\", StringComparison.Ordinal))\n\t\t\t{\n\t\t\t\tcodecSubStr = lowtype.Substring(\"video/\".Length);\n\t\t\t}\n\t\t\telse if (lowtype.StartsWith(\"audio/\", StringComparison.Ordinal))\n\t\t\t{\n\t\t\t\tcodecSubStr = lowtype.Substring(\"audio/\".Length);\n\t\t\t\taudioOnly = true;\n\t\t\t}\n\t\t\telse return VideoCodec.Unknown;\n\n\t\t\tint codecEnd = codecSubStr.IndexOf(';');\n\t\t\tvar extractedCodec = codecEnd >= 0 ? codecSubStr.Substring(0, codecEnd) : codecSubStr;\n\n\t\t\tswitch (extractedCodec)\n\t\t\t{\n\t\t\tcase \"mp4\":\n\t\t\t\tif (audioOnly)\n\t\t\t\t\treturn VideoCodec.M4A;\n\t\t\t\treturn VideoCodec.Mp4;\n\t\t\tcase \"x-flv\":\n\t\t\t\treturn VideoCodec.Flv;\n\t\t\tcase \"3gpp\":\n\t\t\t\treturn VideoCodec.ThreeGp;\n\t\t\tcase \"webm\":\n\t\t\t\treturn VideoCodec.Webm;\n\t\t\tdefault:\n\t\t\t\treturn VideoCodec.Unknown;\n\t\t\t}\n\t\t}\n\n\t\tpublic async Task<Playlist> GetPlaylist(ResolveContext _, string url)\n\t\t{\n\t\t\tMatch matchYtId = ListMatch.Match(url);\n\t\t\tif (!matchYtId.Success)\n\t\t\t\tthrow Error.LocalStr(strings.error_media_failed_to_parse_id);\n\n\t\t\tstring id = matchYtId.Groups[2].Value;\n\t\t\tif (string.IsNullOrEmpty(YoutubeProjectId))\n\t\t\t\treturn await GetPlaylistYoutubeDl(id, url);\n\t\t\telse\n\t\t\t\treturn await GetPlaylistYoutubeApi(id);\n\t\t}\n\n\t\tprivate async Task<Playlist> GetPlaylistYoutubeApi(string id)\n\t\t{\n\t\t\tvar plist = new Playlist().SetTitle(id);\n\n\t\t\tstring? nextToken = null;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tvar parsed = await WebWrapper.Request(\"https://www.googleapis.com/youtube/v3/playlistItems\"\n\t\t\t\t\t\t+ \"?part=contentDetails,snippet\"\n\t\t\t\t\t\t+ \"&fields=\" + Uri.EscapeDataString(\"items(contentDetails/videoId,snippet/title),nextPageToken\")\n\t\t\t\t\t\t+ \"&maxResults=50\"\n\t\t\t\t\t\t+ \"&playlistId=\" + id\n\t\t\t\t\t\t+ (nextToken != null ? \"&pageToken=\" + nextToken : string.Empty)\n\t\t\t\t\t\t+ \"&key=\" + YoutubeProjectId).AsJson<JsonVideoListResponse>();\n\n\t\t\t\tvar videoItems = parsed.items;\n\t\t\t\tif (!plist.AddRange(\n\t\t\t\t\tvideoItems.Select(item =>\n\t\t\t\t\t\tnew PlaylistItem(\n\t\t\t\t\t\t\tnew AudioResource(\n\t\t\t\t\t\t\t\titem.contentDetails?.videoId ?? throw new NullReferenceException(\"item.contentDetails.videoId was null\"),\n\t\t\t\t\t\t\t\titem.snippet?.title,\n\t\t\t\t\t\t\t\tResolverFor\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)) break;\n\n\t\t\t\tnextToken = parsed.nextPageToken;\n\t\t\t} while (nextToken != null);\n\n\t\t\treturn plist;\n\t\t}\n\n\t\tprivate async Task<Playlist> GetPlaylistYoutubeDl(string id, string url)\n\t\t{\n\t\t\tvar plistData = await YoutubeDlHelper.GetPlaylistAsync(url);\n\t\t\tvar plist = new Playlist().SetTitle(plistData.title ?? $\"youtube-{id}\");\n\t\t\tplist.AddRange(plistData.entries\n\t\t\t\t.Where(entry => entry.id != null)\n\t\t\t\t.Select(entry => new PlaylistItem(\n\t\t\t\t\tnew AudioResource(\n\t\t\t\t\t\tentry.id!,\n\t\t\t\t\t\tentry.title,\n\t\t\t\t\t\tResolverFor\n\t\t\t\t\t)\n\t\t\t\t)));\n\n\t\t\treturn plist;\n\t\t}\n\n\t\tprivate static async Task<PlayResource> YoutubeDlWrapped(AudioResource resource)\n\t\t{\n\t\t\tLog.Debug(\"Falling back to youtube-dl!\");\n\n\t\t\tvar response = await YoutubeDlHelper.GetSingleVideo(resource.ResourceId);\n\t\t\tresource.ResourceTitle = response.AutoTitle ?? $\"Youtube-{resource.ResourceId}\";\n\t\t\tvar songInfo = YoutubeDlHelper.MapToSongInfo(response);\n\t\t\tvar format = YoutubeDlHelper.FilterBest(response.formats);\n\t\t\tvar url = format?.url;\n\n\t\t\tif (string.IsNullOrEmpty(url))\n\t\t\t\tthrow Error.LocalStr(strings.error_ytdl_empty_response);\n\n\t\t\tLog.Debug(\"youtube-dl succeeded!\");\n\t\t\treturn new PlayResource(url, resource, songInfo: songInfo);\n\t\t}\n\n\t\tpublic static Dictionary<string, List<string>> ParseQueryString(string requestQueryString)\n\t\t{\n\t\t\tvar rc = new Dictionary<string, List<string>>();\n\t\t\tstring[] ar1 = requestQueryString.Split('&', '?');\n\t\t\tforeach (string row in ar1)\n\t\t\t{\n\t\t\t\tif (string.IsNullOrEmpty(row)) continue;\n\t\t\t\tint index = row.IndexOf('=');\n\t\t\t\tif (index < 0) continue;\n\t\t\t\tvar param = Uri.UnescapeDataString(row.Substring(0, index).Replace('+', ' '));\n\n\t\t\t\tvar list = rc.GetOrNew(param);\n\t\t\t\tlist.Add(Uri.UnescapeDataString(row.Substring(index + 1).Replace('+', ' ')));\n\t\t\t}\n\t\t\treturn rc;\n\t\t}\n\n\t\tpublic Task GetThumbnail(ResolveContext _, PlayResource playResource, Func<Stream, Task> action)\n\t\t{\n\t\t\t// default  :  120px/ 90px /default.jpg\n\t\t\t// medium   :  320px/180px /mqdefault.jpg\n\t\t\t// high     :  480px/360px /hqdefault.jpg\n\t\t\t// standard :  640px/480px /sddefault.jpg\n\t\t\t// maxres   : 1280px/720px /maxresdefault.jpg\n\t\t\treturn WebWrapper\n\t\t\t\t.Request($\"https://i.ytimg.com/vi/{playResource.AudioResource.ResourceId}/mqdefault.jpg\")\n\t\t\t\t.ToStream(action);\n\t\t}\n\n\t\tpublic async Task<IList<AudioResource>> Search(ResolveContext _, string keyword)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(YoutubeProjectId))\n\t\t\t\treturn await SearchYoutubeDlAsync(keyword);\n\t\t\telse\n\t\t\t\treturn await SearchYoutubeApi(keyword);\n\t\t}\n\n\t\tpublic async Task<IList<AudioResource>> SearchYoutubeApi(string keyword)\n\t\t{\n\t\t\tconst int maxResults = 10;\n\t\t\tvar parsed = await WebWrapper.Request(\n\t\t\t\t\t\"https://www.googleapis.com/youtube/v3/search\"\n\t\t\t\t\t+ \"?part=snippet\"\n\t\t\t\t\t+ \"&fields=\" + Uri.EscapeDataString(\"items(id/videoId,snippet(channelTitle,title))\")\n\t\t\t\t\t+ \"&type=video\"\n\t\t\t\t\t+ \"&safeSearch=none\"\n\t\t\t\t\t+ \"&q=\" + Uri.EscapeDataString(keyword)\n\t\t\t\t\t+ \"&maxResults=\" + maxResults\n\t\t\t\t\t+ \"&key=\" + YoutubeProjectId).AsJson<JsonSearchListResponse>();\n\n\t\t\treturn parsed.items.Select(item => new AudioResource(\n\t\t\t\titem.id?.videoId ?? throw new NullReferenceException(\"item.id.videoId was null\"),\n\t\t\t\titem.snippet?.title,\n\t\t\t\tResolverFor)).ToArray();\n\t\t}\n\n\t\tpublic async Task<IList<AudioResource>> SearchYoutubeDlAsync(string keyword)\n\t\t{\n\t\t\tvar search = await YoutubeDlHelper.GetSearchAsync(keyword);\n\n\t\t\treturn search.entries\n\t\t\t\t.Where(entry => entry.id != null)\n\t\t\t\t.Select(entry => new AudioResource(\n\t\t\t\t\tentry.id!,\n\t\t\t\t\tentry.title,\n\t\t\t\t\tResolverFor\n\t\t\t\t)).ToArray();\n\t\t}\n\n\t\tpublic void Dispose() { }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/ResourceFactories/YoutubeDlHelper.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\n\nnamespace TS3AudioBot.ResourceFactories\n{\n\tpublic static class YoutubeDlHelper\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tpublic static ConfPath? DataObj { private get; set; }\n\t\tprivate static string? YoutubeDlPath => DataObj?.Path.Value;\n\n\t\tprivate const string ParamGetSingleVideo = \" --no-warnings --dump-json --id --\";\n\t\tprivate const string ParamGetPlaylist = \"--no-warnings --yes-playlist --flat-playlist --dump-single-json --id --\";\n\t\tprivate const string ParamGetSearch = \"--no-warnings --flat-playlist --dump-single-json -- ytsearch10:\";\n\n\t\tpublic static async Task<JsonYtdlDump> GetSingleVideo(string id)\n\t\t{\n\t\t\tvar ytdlPath = FindYoutubeDl();\n\t\t\tif (ytdlPath is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_ytdl_not_found);\n\n\t\t\tvar param = $\"{ytdlPath.Value.param}{ParamGetSingleVideo} {id}\";\n\t\t\treturn await RunYoutubeDl<JsonYtdlDump>(ytdlPath.Value.ytdlpath, param);\n\t\t}\n\n\t\tpublic static async Task<JsonYtdlPlaylistDump> GetPlaylistAsync(string url)\n\t\t{\n\t\t\tvar ytdlPath = FindYoutubeDl();\n\t\t\tif (ytdlPath is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_ytdl_not_found);\n\n\t\t\tvar param = $\"{ytdlPath.Value.param}{ParamGetPlaylist} {url}\";\n\t\t\treturn await RunYoutubeDl<JsonYtdlPlaylistDump>(ytdlPath.Value.ytdlpath, param);\n\t\t}\n\n\t\tpublic static async Task<JsonYtdlPlaylistDump> GetSearchAsync(string text)\n\t\t{\n\t\t\tvar ytdlPath = FindYoutubeDl();\n\t\t\tif (ytdlPath is null)\n\t\t\t\tthrow Error.LocalStr(strings.error_ytdl_not_found);\n\n\t\t\tvar param = $\"{ytdlPath.Value.param}{ParamGetSearch}\\\"{text}\\\"\";\n\t\t\treturn await RunYoutubeDl<JsonYtdlPlaylistDump>(ytdlPath.Value.ytdlpath, param);\n\t\t}\n\n\t\tpublic static (string ytdlpath, string param)? FindYoutubeDl()\n\t\t{\n\t\t\tvar youtubeDlPath = YoutubeDlPath;\n\t\t\tif (string.IsNullOrEmpty(youtubeDlPath))\n\t\t\t{\n\t\t\t\t// Default path youtube-dl is suggesting to install\n\t\t\t\tconst string defaultYtDlPath = \"/usr/local/bin/youtube-dl\";\n\t\t\t\tif (File.Exists(defaultYtDlPath))\n\t\t\t\t\treturn (defaultYtDlPath, \"\");\n\n\t\t\t\t// Default path most package managers install to\n\t\t\t\tconst string defaultPkgManPath = \"/usr/bin/youtube-dl\";\n\t\t\t\tif (File.Exists(defaultPkgManPath))\n\t\t\t\t\treturn (defaultPkgManPath, \"\");\n\n\t\t\t\tyoutubeDlPath = Directory.GetCurrentDirectory();\n\t\t\t}\n\n\t\t\tstring fullCustomPath;\n\t\t\ttry { fullCustomPath = Path.GetFullPath(youtubeDlPath); }\n\t\t\tcatch (ArgumentException ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Your youtube-dl path may contain invalid characters\");\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Example: /home/teamspeak/youtube-dl where 'youtube-dl' is the binary\n\t\t\tif (File.Exists(fullCustomPath) || File.Exists(fullCustomPath + \".exe\"))\n\t\t\t\treturn (fullCustomPath, \"\");\n\n\t\t\t// Example: /home/teamspeak where the binary 'youtube-dl' lies in ./teamspeak/\n\t\t\tstring fullCustomPathWithoutFile = Path.Combine(fullCustomPath, \"youtube-dl\");\n\t\t\tif (File.Exists(fullCustomPathWithoutFile) || File.Exists(fullCustomPathWithoutFile + \".exe\"))\n\t\t\t\treturn (fullCustomPathWithoutFile, \"\");\n\n\t\t\t// Example: /home/teamspeak/youtube-dl where 'youtube-dl' is the github project folder\n\t\t\tstring fullCustomPathGhProject = Path.Combine(fullCustomPath, \"youtube_dl\", \"__main__.py\");\n\t\t\tif (File.Exists(fullCustomPathGhProject))\n\t\t\t\treturn (\"python\", $\"\\\"{fullCustomPathGhProject}\\\"\");\n\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic static async Task<T> RunYoutubeDl<T>(string path, string args) where T : notnull\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tbool stdOutDone = false;\n\t\t\t\tvar stdOut = new StringBuilder();\n\t\t\t\tvar stdErr = new StringBuilder();\n\n\t\t\t\tusing var tmproc = new Process();\n\t\t\t\ttmproc.StartInfo.FileName = path;\n\t\t\t\ttmproc.StartInfo.Arguments = args;\n\t\t\t\ttmproc.StartInfo.UseShellExecute = false;\n\t\t\t\ttmproc.StartInfo.CreateNoWindow = true;\n\t\t\t\ttmproc.StartInfo.RedirectStandardOutput = true;\n\t\t\t\ttmproc.StartInfo.RedirectStandardError = true;\n\t\t\t\ttmproc.EnableRaisingEvents = true;\n\t\t\t\ttmproc.Start();\n\t\t\t\ttmproc.OutputDataReceived += (s, e) =>\n\t\t\t\t{\n\t\t\t\t\tif (e.Data is null)\n\t\t\t\t\t\tstdOutDone = true;\n\t\t\t\t\telse\n\t\t\t\t\t\tstdOut.Append(e.Data);\n\t\t\t\t};\n\t\t\t\ttmproc.ErrorDataReceived += (s, e) => stdErr.Append(e.Data);\n\t\t\t\ttmproc.BeginOutputReadLine();\n\t\t\t\ttmproc.BeginErrorReadLine();\n\t\t\t\tawait tmproc.WaitForExitAsync(TimeSpan.FromSeconds(20));\n\n\t\t\t\tif (!tmproc.HasExitedSafe())\n\t\t\t\t{\n\t\t\t\t\ttry { tmproc.Kill(); }\n\t\t\t\t\tcatch (Exception ex) { Log.Debug(ex, \"Failed to kill\"); }\n\t\t\t\t}\n\n\t\t\t\tvar timeout = Stopwatch.StartNew();\n\t\t\t\twhile (!stdOutDone)\n\t\t\t\t{\n\t\t\t\t\tif (timeout.Elapsed >= TimeSpan.FromSeconds(5))\n\t\t\t\t\t{\n\t\t\t\t\t\tstdErr.Append(strings.error_ytdl_empty_response).Append(\" (timeout)\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tawait Task.Delay(50);\n\t\t\t\t}\n\n\t\t\t\tif (stdErr.Length > 0)\n\t\t\t\t{\n\t\t\t\t\tLog.Debug(\"youtube-dl failed to load the resource:\\n{0}\", stdErr);\n\t\t\t\t\tthrow Error.LocalStr(strings.error_ytdl_song_failed_to_load);\n\t\t\t\t}\n\n\t\t\t\treturn ParseResponse<T>(stdOut.ToString());\n\t\t\t}\n\t\t\tcatch (Win32Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Failed to run youtube-dl: {0}\", ex.Message);\n\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_ytdl_failed_to_run);\n\t\t\t}\n\t\t}\n\n\t\tpublic static T ParseResponse<T>(string? json) where T : notnull\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(json))\n\t\t\t\tthrow Error.LocalStr(strings.error_ytdl_empty_response);\n\n\t\t\ttry\n\t\t\t{\n\n\t\t\t\treturn JsonConvert.DeserializeObject<T>(json);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Debug(ex, \"Failed to read youtube-dl json data\");\n\t\t\t\tthrow Error.Exception(ex).LocalStr(strings.error_media_internal_invalid);\n\t\t\t}\n\t\t}\n\n\t\tpublic static JsonYtdlFormat? FilterBest(IEnumerable<JsonYtdlFormat>? formats)\n\t\t{\n\t\t\tLog.Debug(\"Picking from options: {@formats}\", formats);\n\n\t\t\tif (formats is null)\n\t\t\t\treturn null;\n\n\t\t\tJsonYtdlFormat? best = null;\n\t\t\tforeach (var format in formats)\n\t\t\t{\n\t\t\t\tif (format.acodec == \"none\")\n\t\t\t\t\tcontinue;\n\t\t\t\tif (best == null\n\t\t\t\t\t|| format.abr > best.abr\n\t\t\t\t\t|| (format.vcodec == \"none\" && format.abr >= best.abr))\n\t\t\t\t{\n\t\t\t\t\tbest = format;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tLog.Debug(\"Picked: {@format}\", best);\n\t\t\treturn best;\n\t\t}\n\n\t\tpublic static SongInfo MapToSongInfo(JsonYtdlDump dump)\n\t\t{\n\t\t\treturn new SongInfo\n\t\t\t{\n\t\t\t\tTitle = dump.title,\n\t\t\t\tTrack = dump.track,\n\t\t\t\tArtist = dump.artist,\n\t\t\t\tLength = TimeSpan.FromSeconds(dump.duration)\n\t\t\t};\n\t\t}\n\n\t\t// https://stackoverflow.com/a/50461641/2444047\n\t\t/// <summary>\n\t\t/// Waits asynchronously for the process to exit.\n\t\t/// </summary>\n\t\t/// <param name=\"process\">The process to wait for cancellation.</param>\n\t\t/// <param name=\"timeout\">The maximum time to wait for exit before returning anyway.</param>\n\t\t/// <param name=\"cancellationToken\">A cancellation token. If invoked, the task will return\n\t\t/// immediately as canceled.</param>\n\t\t/// <returns>A Task representing waiting for the process to end.</returns>\n\t\tpublic static async Task WaitForExitAsync(this Process process, TimeSpan timeout, CancellationToken cancellationToken = default)\n\t\t{\n\t\t\tvar tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);\n\n\t\t\tvoid Process_Exited(object? sender, EventArgs e)\n\t\t\t{\n\t\t\t\ttcs.TrySetResult(true);\n\t\t\t}\n\n\t\t\tprocess.EnableRaisingEvents = true;\n\t\t\tprocess.Exited += Process_Exited;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (process.HasExited)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar timoutTask = Task.Delay(timeout, cancellationToken);\n\n\t\t\t\tusing (cancellationToken.Register(() => tcs.TrySetCanceled()))\n\t\t\t\t{\n\t\t\t\t\tawait Task.WhenAny(tcs.Task, timoutTask);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tprocess.Exited -= Process_Exited;\n\t\t\t}\n\t\t}\n\t}\n\n#pragma warning disable CS0649, CS0169, IDE1006\n\tpublic abstract class JsonYtdlBase\n\t{\n\t\tpublic string? extractor { get; set; }\n\t\tpublic string? extractor_key { get; set; }\n\t}\n\n\tpublic class JsonYtdlDump : JsonYtdlBase\n\t{\n\t\tpublic string? title { get; set; }\n\t\tpublic string? track { get; set; }\n\t\tpublic string? artist { get; set; }\n\t\t// TODO int -> timespan converter\n\t\tpublic float duration { get; set; }\n\t\tpublic string? id { get; set; }\n\t\tpublic JsonYtdlFormat[]? formats { get; set; }\n\t\tpublic JsonYtdlFormat[]? requested_formats { get; set; }\n\n\t\tpublic string? AutoTitle => track ?? title;\n\t}\n\n\tpublic class JsonYtdlFormat\n\t{\n\t\tpublic string? vcodec { get; set; }\n\t\tpublic string? acodec { get; set; }\n\t\t/// <summary>audioBitRate</summary>\n\t\tpublic float? abr { get; set; }\n\t\t/// <summary>audioSampleRate</summary>\n\t\tpublic float? asr { get; set; }\n\t\t/// <summary>totalBitRate</summary>\n\t\tpublic float? tbr { get; set; }\n\t\t//public object http_headers { get; set; }\n\t\tpublic string? format { get; set; }\n\t\tpublic string? format_id { get; set; }\n\t\tpublic string? url { get; set; }\n\t\tpublic string? ext { get; set; }\n\t}\n\n\tpublic class JsonYtdlPlaylistDump : JsonYtdlBase\n\t{\n\t\tpublic string? id { get; set; }\n\t\tpublic string? title { get; set; }\n\t\tpublic JsonYtdlPlaylistEntry[]? entries { get; set; }\n\t}\n\n\tpublic class JsonYtdlPlaylistEntry\n\t{\n\t\tpublic string? title { get; set; }\n\t\tpublic string? id { get; set; }\n\t}\n#pragma warning restore CS0649, CS0169, IDE1006\n}\n"
  },
  {
    "path": "TS3AudioBot/Resources/DefaultRights.toml",
    "content": "# Rights declaration file\n# For more information about syntax and structure see here:\n# https://github.com/Splamy/TS3AudioBot/wiki/Rights\n\n\"+\" = [\n\t# Basic stuff\n\t\"cmd.help.*\",\n\t\"cmd.pm\",\n\t\"cmd.subscribe\",\n\t\"cmd.unsubscribe\",\n\t\"cmd.kickme.*\",\n\t\"cmd.version\",\n\t\n\t# Getting song info\n\t\"cmd.song\",\n\t\"cmd.repeat\",\n\t\"cmd.random\",\n\n\t# Conditionals and basic scripting\n\t\"cmd.if\",\n\t\"cmd.print\",\n\t\"cmd.rng\",\n\t\"cmd.eval\",\n\t\"cmd.take\",\n\t\"cmd.xecute\",\n\t\"cmd.getmy.*\",\n\t\"cmd.json.*\",\n\t\"cmd.bot.use\",\n\t\"cmd.rights.can\",\n]\n\n# Admin rule\n[[rule]]\n\t# Set your admin Group Ids here, ex: [ 13, 42 ]\n\tgroupid = []\n\t# And/Or your admin Client Uids here\n\tuseruid = [ \"_admin_uid_\" ]\n\t# By default treat requests from localhost as admin\n\tip = [ \"127.0.0.1\", \"::1\" ]\n\n\t\"+\" = \"*\"\n\n# Playing rights\n[[rule]]\n\t# Set Group Ids you want to allow here, ex: [ 13, 42 ]\n\tgroupid = []\n\t# And/Or Client Uids here, ex [ \"uA0U7t4PBxdJ5TLnarsOHQh4/tY=\", \"8CnUQzwT/d9nHNeUaed0RPsDxxk=\" ]\n\tuseruid = []\n\t# Or remove groupid and useruid to allow for everyone\n\n\t\"+\" = [\n\t\t# Play controls\n\t\t\"cmd.play\",\n\t\t\"cmd.pause\",\n\t\t\"cmd.stop\",\n\t\t\"cmd.seek\",\n\t\t\"cmd.volume\",\n\n\t\t# Playlist management\n\t\t\"cmd.list.*\",\n\t\t\"cmd.add\",\n\t\t\"cmd.clear\",\n\t\t\"cmd.previous\",\n\t\t\"cmd.next\",\n\t\t\"cmd.random.*\",\n\t\t\"cmd.repeat.*\",\n\n\t\t# History features\n\t\t\"cmd.history.add\",\n\t\t\"cmd.history.from\",\n\t\t\"cmd.history.id\",\n\t\t\"cmd.history.last\",\n\t\t\"cmd.history.play\",\n\t\t\"cmd.history.till\",\n\t\t\"cmd.history.title\",\n\t]\n"
  },
  {
    "path": "TS3AudioBot/Resources/NLog.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<nlog xmlns=\"http://www.nlog-project.org/schemas/NLog.xsd\"\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      throwConfigExceptions=\"true\">\n\n\t<targets>\n\t\t<!-- Config log to file -->\n\t\t<target xsi:type=\"File\"\n\t\t        name=\"logfile\"\n\t\t        encoding=\"utf-8\"\n\t\t        fileName=\"${currentdir}/logs/ts3audiobot_${cached:${date:format=yyyy-MM-dd_HH_mm_ss}}.log\"\n\t\t        layout=\"${longdate}|${pad:padding=5:inner=${level:uppercase=true}}|${mdlc:item=BotId}|${callsite:includeNamespace=false} ${message}${onexception:${newline}${exception:format=tostring}}\" />\n\t\t<!-- Config log to console -->\n\t\t<target xsi:type=\"ColoredConsole\"\n\t\t        name=\"console\"\n\t\t        encoding=\"utf-8\"\n\t\t        layout=\"${time}|${pad:padding=5:inner=${level:uppercase=true}}|${mdlc:item=BotId}| ${message}\">\n\t\t\t<highlight-row condition=\"level == LogLevel.Info\" foregroundColor=\"Cyan\"/>\n\t\t\t<highlight-row condition=\"level == LogLevel.Warn\" foregroundColor=\"Yellow\"/>\n\t\t\t<highlight-row condition=\"level == LogLevel.Error\" foregroundColor=\"Red\"/>\n\t\t\t<highlight-row condition=\"level == LogLevel.Fatal\" foregroundColor=\"Magenta\"/>\n\t\t</target>\n\t</targets>\n\n\t<rules>\n\t\t<logger name=\"TS3AudioBot.*\" minlevel=\"Info\" writeTo=\"logfile\" />\n\t\t<logger name=\"TS3AudioBot.*\" minlevel=\"Info\" writeTo=\"console\" />\n\t\t<logger name=\"TSLib.*\" minlevel=\"Info\" writeTo=\"logfile\" />\n\t\t<logger name=\"TSLib.*\" minlevel=\"Info\" writeTo=\"console\" />\n\t</rules>\n</nlog>\n"
  },
  {
    "path": "TS3AudioBot/Rights/CreateFileSettings.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Rights\n{\n\tpublic class CreateFileSettings\n\t{\n\t\t// can be null\n\t\tpublic string[]? AdminUids { get; set; } = null;\n\n\t\tpublic bool OverwriteIfExists { get; set; } = false;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/ExecuteContext.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Net;\nusing TSLib;\nusing TSLib.Messages;\n\nnamespace TS3AudioBot.Rights\n{\n\tinternal class ExecuteContext\n\t{\n\t\tpublic string? Host { get; set; }\n\t\tpublic ServerGroupId[]? ServerGroups { get; set; } = Array.Empty<ServerGroupId>();\n\t\tpublic ChannelGroupId? ChannelGroupId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic bool IsApi { get; set; }\n\t\tpublic IPAddress? ApiCallerIp { get; set; }\n\t\tpublic string? ApiToken { get; set; }\n\t\tpublic string? Bot { get; set; }\n\t\tpublic TextMessageTargetMode? Visibiliy { get; set; }\n\t\tpublic PermOverview[]? Permissions { get; set; }\n\n\t\tpublic List<RightsRule> MatchingRules { get; } = new List<RightsRule>();\n\n\t\tpublic HashSet<string> DeclAdd { get; } = new HashSet<string>();\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchApiCallerIp.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Net;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchApiCallerIp : Matcher\n\t{\n\t\tprivate readonly HashSet<IPAddress> requestIps;\n\n\t\tpublic MatchApiCallerIp(IEnumerable<IPAddress> requestIps) => this.requestIps = new HashSet<IPAddress>(requestIps);\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.ApiCallerIp != null && requestIps.Contains(ctx.ApiCallerIp);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchBot.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchBot : Matcher\n\t{\n\t\tprivate readonly HashSet<string> bots;\n\n\t\tpublic MatchBot(IEnumerable<string> bots) => this.bots = new HashSet<string>(bots);\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.Bot != null && bots.Contains(ctx.Bot);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchChannelGroupId.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing TSLib;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchChannelGroupId : Matcher\n\t{\n\t\tprivate readonly HashSet<ChannelGroupId> channelGroupIds;\n\n\t\tpublic MatchChannelGroupId(IEnumerable<ChannelGroupId> channelGroupIds) => this.channelGroupIds = new HashSet<ChannelGroupId>(channelGroupIds);\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.ChannelGroupId != null && channelGroupIds.Contains(ctx.ChannelGroupId.Value);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchClientGroupId.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing TSLib;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchServerGroupId : Matcher\n\t{\n\t\tprivate readonly HashSet<ServerGroupId> serverGroupIds;\n\n\t\tpublic MatchServerGroupId(IEnumerable<ServerGroupId> serverGroupIds) => this.serverGroupIds = new HashSet<ServerGroupId>(serverGroupIds);\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.ServerGroups?.Length > 0 && serverGroupIds.Overlaps(ctx.ServerGroups);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchClientUid.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing TSLib;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchClientUid : Matcher\n\t{\n\t\tprivate readonly HashSet<Uid> clientUids;\n\n\t\tpublic MatchClientUid(IEnumerable<Uid> clientUids) => this.clientUids = new HashSet<Uid>(clientUids);\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.ClientUid != null && clientUids.Contains(ctx.ClientUid);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchHost.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchHost : Matcher\n\t{\n\t\tprivate readonly HashSet<string> hosts;\n\n\t\tpublic MatchHost(IEnumerable<string> hosts) => this.hosts = new HashSet<string>(hosts);\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.Host != null && hosts.Contains(ctx.Host);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchIsApi.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchIsApi : Matcher\n\t{\n\t\tprivate readonly bool isApi;\n\n\t\tpublic MatchIsApi(bool isApi) => this.isApi = isApi;\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.IsApi == isApi;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchPermission.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\nusing TS3AudioBot.Helper;\nusing TSLib;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchPermission : Matcher\n\t{\n\t\tprivate static readonly Regex expressionMatch = new Regex(@\"(\\w+)\\s*(<|>|=|>=|<=|!=)\\s*(-?\\d+|true|false)\", Util.DefaultRegexConfig);\n\t\tprivate readonly Dictionary<TsPermission, (PermCompare, int)> permissions;\n\n\t\tpublic MatchPermission(string[] permissions, ParseContext ctx)\n\t\t{\n\t\t\tthis.permissions = new Dictionary<TsPermission, (PermCompare, int)>(permissions.Length);\n\t\t\tforeach (var expression in permissions)\n\t\t\t{\n\t\t\t\tvar match = expressionMatch.Match(expression);\n\t\t\t\tif (!match.Success)\n\t\t\t\t{\n\t\t\t\t\tctx.Errors.Add($\"The expression \\\"{expression}\\\" is not in the valid form of '<permission><compare><value>'\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar permission = match.Groups[1].Value;\n\t\t\t\tvar compare = match.Groups[2].Value;\n\t\t\t\tvar value = match.Groups[3].Value;\n\n\t\t\t\tif (!Enum.TryParse<TsPermission>(permission, out var permissionId))\n\t\t\t\t{\n\t\t\t\t\tctx.Errors.Add($\"The teamspeak permission \\\"{permission}\\\" was not found\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tPermCompare compareOp;\n\t\t\t\tswitch (compare)\n\t\t\t\t{\n\t\t\t\tcase \"=\": compareOp = PermCompare.Equal; break;\n\t\t\t\tcase \"!=\": compareOp = PermCompare.NotEqual; break;\n\t\t\t\tcase \">\": compareOp = PermCompare.Greater; break;\n\t\t\t\tcase \">=\": compareOp = PermCompare.GreaterOrEqual; break;\n\t\t\t\tcase \"<\": compareOp = PermCompare.Less; break;\n\t\t\t\tcase \"<=\": compareOp = PermCompare.LessOrEqual; break;\n\t\t\t\tdefault: continue;\n\t\t\t\t}\n\n\t\t\t\tif ((value == \"true\" || value == \"false\") && !permission.StartsWith(\"b_\"))\n\t\t\t\t\tctx.Warnings.Add(\"Comparing an integer permission with boolean value.\");\n\n\t\t\t\tint valueNum;\n\t\t\t\tif (value == \"true\")\n\t\t\t\t\tvalueNum = 1;\n\t\t\t\telse if (value == \"false\")\n\t\t\t\t\tvalueNum = 0;\n\t\t\t\telse if (!int.TryParse(value, out valueNum))\n\t\t\t\t{\n\t\t\t\t\tctx.Errors.Add($\"The permission compare value is not valid.\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthis.permissions.Add(permissionId, (compareOp, valueNum));\n\t\t\t}\n\t\t}\n\n\t\tpublic IReadOnlyCollection<TsPermission> ComparingPermissions() => permissions.Keys;\n\n\t\tpublic override bool Matches(ExecuteContext ctx)\n\t\t{\n\t\t\tif (ctx.Permissions == null)\n\t\t\t\treturn false;\n\n\t\t\tforeach (var perm in ctx.Permissions)\n\t\t\t{\n\t\t\t\tif (perm == null)\n\t\t\t\t\tcontinue;\n\t\t\t\tvar permission = perm.PermissionId;\n\t\t\t\tvar value = perm.PermissionValue;\n\t\t\t\tif (permissions.TryGetValue(permission, out (PermCompare op, int value) compare))\n\t\t\t\t{\n\t\t\t\t\tswitch (compare.op)\n\t\t\t\t\t{\n\t\t\t\t\tcase PermCompare.Equal: if (value == compare.value) return true; break;\n\t\t\t\t\tcase PermCompare.NotEqual: if (value != compare.value) return true; break;\n\t\t\t\t\tcase PermCompare.Greater: if (value > compare.value) return true; break;\n\t\t\t\t\tcase PermCompare.GreaterOrEqual: if (value >= compare.value) return true; break;\n\t\t\t\t\tcase PermCompare.Less: if (value < compare.value) return true; break;\n\t\t\t\t\tcase PermCompare.LessOrEqual: if (value <= compare.value) return true; break;\n\t\t\t\t\tdefault: throw Tools.UnhandledDefault(compare.op);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchToken.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchToken : Matcher\n\t{\n\t\tprivate readonly HashSet<string> tokens;\n\n\t\tpublic MatchToken(IEnumerable<string> tokens) => this.tokens = new HashSet<string>(tokens);\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.ApiToken != null && tokens.Contains(ctx.ApiToken);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/MatchVisibility.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Linq;\nusing TSLib;\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal class MatchVisibility : Matcher\n\t{\n\t\tprivate readonly TextMessageTargetMode[] visibility;\n\n\t\tpublic MatchVisibility(TextMessageTargetMode[] visibility) => this.visibility = visibility;\n\n\t\tpublic override bool Matches(ExecuteContext ctx) => ctx.Visibiliy != null && visibility.Contains(ctx.Visibiliy.Value);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/Matcher.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Rights.Matchers\n{\n\tinternal abstract class Matcher\n\t{\n\t\tpublic abstract bool Matches(ExecuteContext ctx);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/Matchers/PermCompare.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Rights\n{\n\tinternal enum PermCompare\n\t{\n\t\tEqual,\n\t\tNotEqual,\n\t\tGreater,\n\t\tGreaterOrEqual,\n\t\tLess,\n\t\tLessOrEqual,\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/ParseContext.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing TSLib;\n\nnamespace TS3AudioBot.Rights\n{\n\tinternal class ParseContext\n\t{\n\t\tpublic List<RightsDecl> Declarations { get; }\n\t\tpublic RightsGroup[] Groups { get; private set; }\n\t\tpublic RightsRule[] Rules { get; private set; }\n\t\tpublic List<string> Errors { get; }\n\t\tpublic List<string> Warnings { get; }\n\t\tpublic ISet<string> RegisteredRights { get; }\n\n\t\tpublic RightsRule RootRule { get; }\n\t\tpublic bool NeedsAvailableGroups { get; set; } = false;\n\t\tpublic bool NeedsAvailableChanGroups { get; set; } = false;\n\t\tpublic TsPermission[] NeedsPermOverview { get; set; } = Array.Empty<TsPermission>();\n\n\t\tpublic ParseContext(ISet<string> registeredRights)\n\t\t{\n\t\t\tDeclarations = new List<RightsDecl>();\n\t\t\tRootRule = new RightsRule();\n\t\t\tErrors = new List<string>();\n\t\t\tWarnings = new List<string>();\n\t\t\tRegisteredRights = registeredRights;\n\t\t\tGroups = Array.Empty<RightsGroup>();\n\t\t\tRules = Array.Empty<RightsRule>();\n\t\t}\n\n\t\tpublic void SplitDeclarations()\n\t\t{\n\t\t\tGroups = Declarations.OfType<RightsGroup>().ToArray();\n\t\t\tRules = Declarations.OfType<RightsRule>().ToArray();\n\t\t}\n\n\t\tpublic (bool hasErrors, string info) AsResult()\n\t\t{\n\t\t\tvar strb = new StringBuilder();\n\t\t\tforeach (var warn in Warnings)\n\t\t\t\tstrb.Append(\"WRN: \").AppendLine(warn);\n\t\t\tif (Errors.Count == 0)\n\t\t\t{\n\t\t\t\tstrb.Append(string.Join(\"\\n\", Rules.Select(x => x.ToString())));\n\t\t\t\tif (strb.Length > 900)\n\t\t\t\t\tstrb.Length = 900;\n\t\t\t\treturn (true, strb.ToString());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tforeach (var err in Errors)\n\t\t\t\t\tstrb.Append(\"ERR: \").AppendLine(err);\n\t\t\t\tif (strb.Length > 900)\n\t\t\t\t\tstrb.Length = 900;\n\t\t\t\treturn (false, strb.ToString());\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/RightsDecl.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing TS3AudioBot.Helper;\n\nnamespace TS3AudioBot.Rights\n{\n\tinternal abstract class RightsDecl\n\t{\n\t\tpublic int Id { get; private set; }\n\t\tpublic int Level { get; set; }\n\n\t\tpublic RightsRule? Parent { get; set; }\n\t\tprivate string[]? includeNames = null;\n\t\tpublic RightsGroup[] Includes { get; set; } = Array.Empty<RightsGroup>();\n\n\t\tpublic string[] DeclAdd { get; set; } = Array.Empty<string>();\n\t\tpublic string[] DeclDeny { get; set; } = Array.Empty<string>();\n\n\t\tpublic virtual bool ParseKey(string key, TomlObject tomlObj, ParseContext ctx)\n\t\t{\n\t\t\tswitch (key)\n\t\t\t{\n\t\t\tcase \"+\":\n\t\t\t\tif (!tomlObj.TryGetValueArray<string>(out var declAdd))\n\t\t\t\t{\n\t\t\t\t\tctx.Errors.Add(\"<+> Field has invalid data.\");\n\t\t\t\t\tdeclAdd = Array.Empty<string>();\n\t\t\t\t}\n\t\t\t\tDeclAdd = declAdd;\n\t\t\t\treturn true;\n\t\t\tcase \"-\":\n\t\t\t\tif (!tomlObj.TryGetValueArray<string>(out var declDeny))\n\t\t\t\t{\n\t\t\t\t\tctx.Errors.Add(\"<-> Field has invalid data.\");\n\t\t\t\t\tdeclDeny = Array.Empty<string>();\n\t\t\t\t}\n\t\t\t\tDeclDeny = declDeny;\n\t\t\t\treturn true;\n\t\t\tcase \"include\":\n\t\t\t\tif (!tomlObj.TryGetValueArray<string>(out var includeNames))\n\t\t\t\t{\n\t\t\t\t\tctx.Errors.Add(\"<include> Field has invalid data.\");\n\t\t\t\t\tincludeNames = null;\n\t\t\t\t}\n\t\t\t\tthis.includeNames = includeNames;\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tpublic bool ParseChilden(TomlTable tomlObj, ParseContext ctx)\n\t\t{\n\t\t\tId = ctx.Declarations.Count;\n\t\t\tctx.Declarations.Add(this);\n\t\t\tbool hasErrors = false;\n\n\t\t\tforeach (var item in tomlObj)\n\t\t\t{\n\t\t\t\tif (!ParseKey(item.Key, item.Value, ctx))\n\t\t\t\t{\n\t\t\t\t\tctx.Errors.Add($\"Unrecognized key <{item.Key}>.\");\n\t\t\t\t\thasErrors = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn !hasErrors;\n\t\t}\n\n\t\tpublic abstract RightsGroup? ResolveGroup(string groupName, ParseContext ctx);\n\n\t\t/// <summary>\n\t\t/// Resolves all include strings to their representative object each.\n\t\t/// </summary>\n\t\t/// <param name=\"ctx\">The parsing context for the current file processing.</param>\n\t\tpublic bool ResolveIncludes(ParseContext ctx)\n\t\t{\n\t\t\tbool hasErrors = false;\n\t\t\tif (includeNames != null)\n\t\t\t{\n\t\t\t\tIncludes = includeNames.Select(x => ResolveGroup(x, ctx)).ToArray()!;\n\t\t\t\tfor (int i = 0; i < includeNames.Length; i++)\n\t\t\t\t{\n\t\t\t\t\tif (Includes[i] is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tctx.Errors.Add($\"Could not find group \\\"{includeNames[i]}\\\" to include.\");\n\t\t\t\t\t\thasErrors = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tincludeNames = null;\n\t\t\t}\n\t\t\treturn !hasErrors;\n\t\t}\n\n\t\tpublic void MergeGroups(IEnumerable<RightsDecl> merge)\n\t\t{\n\t\t\t// this.+ = (include+ - this-) + this+\n\t\t\t// this.- = this-\n\t\t\tforeach (var include in merge)\n\t\t\t\tMergeGroups(include);\n\t\t}\n\n\t\tpublic void MergeGroups(RightsDecl include)\n\t\t{\n\t\t\tDeclAdd = include.DeclAdd.Except(DeclDeny).Concat(DeclAdd).Distinct().ToArray();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/RightsGroup.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Rights\n{\n\tinternal class RightsGroup : RightsDecl\n\t{\n\t\tpublic string Name { get; }\n\n\t\tpublic RightsGroup(string name)\n\t\t{\n\t\t\tName = name;\n\t\t}\n\n\t\tpublic override RightsGroup? ResolveGroup(string groupName, ParseContext ctx)\n\t\t{\n\t\t\tif (Name == groupName)\n\t\t\t\treturn this;\n\t\t\treturn Parent?.ResolveGroup(groupName, ctx);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/RightsManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Rights.Matchers;\nusing TS3AudioBot.Web.Api;\nusing TSLib;\nusing TSLib.Full;\nusing TSLib.Helper;\nusing TSLib.Messages;\n\nnamespace TS3AudioBot.Rights\n{\n\t/// <summary>Permission system of the bot.</summary>\n\tpublic class RightsManager\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate const int RuleLevelSize = 2;\n\n\t\tprivate bool needsRecalculation;\n\t\tprivate readonly ConfRights config;\n\t\tprivate RightsRule? rootRule;\n\t\tprivate HashSet<string> registeredRights = new HashSet<string>();\n\t\tprivate readonly object rootRuleLock = new object();\n\n\t\t// Required Matcher Data:\n\t\t// This variables save whether the current rights setup has at least one rule that\n\t\t// need a certain additional information.\n\t\t// This will save us from making unnecessary query calls.\n\t\tprivate bool needsAvailableGroups = true;\n\t\tprivate bool needsAvailableChanGroups = true;\n\t\tprivate TsPermission[] needsPermOverview = Array.Empty<TsPermission>();\n\n\t\tpublic RightsManager(ConfRights config)\n\t\t{\n\t\t\tthis.config = config;\n\t\t\tneedsRecalculation = true;\n\t\t}\n\n\t\tpublic void SetRightsList(IEnumerable<string> rights)\n\t\t{\n\t\t\tvar newRights = new HashSet<string>(rights);\n\t\t\tif (!registeredRights.SetEquals(newRights))\n\t\t\t{\n\t\t\t\t// TODO validate right names\n\t\t\t\tregisteredRights = newRights;\n\t\t\t\tneedsRecalculation = true;\n\t\t\t}\n\t\t}\n\n\t\tpublic async ValueTask<bool> HasAllRights(ExecutionInformation info, params string[] requestedRights)\n\t\t{\n\t\t\tvar ctx = await GetRightsContext(info);\n\t\t\tvar normalizedRequest = ExpandRights(requestedRights, registeredRights);\n\t\t\treturn ctx.DeclAdd.IsSupersetOf(normalizedRequest);\n\t\t}\n\n\t\tpublic async ValueTask<string[]> GetRightsSubset(ExecutionInformation info, params string[] requestedRights)\n\t\t{\n\t\t\tvar ctx = await GetRightsContext(info);\n\t\t\tvar normalizedRequest = ExpandRights(requestedRights, registeredRights);\n\t\t\treturn ctx.DeclAdd.Intersect(normalizedRequest).ToArray();\n\t\t}\n\n\t\tprivate async ValueTask<ExecuteContext> GetRightsContext(ExecutionInformation info)\n\t\t{\n\t\t\tvar localRootRule = TryGetRootSafe();\n\n\t\t\tif (info.TryGet<ExecuteContext>(out var execCtx))\n\t\t\t\treturn execCtx;\n\n\t\t\texecCtx = new ExecuteContext();\n\n\t\t\tif (info.TryGet<ClientCall>(out var clientCall))\n\t\t\t{\n\t\t\t\texecCtx.ServerGroups = clientCall.ServerGroups;\n\t\t\t\texecCtx.ClientUid = clientCall.ClientUid;\n\t\t\t\texecCtx.Visibiliy = clientCall.Visibiliy;\n\t\t\t\texecCtx.IsApi = false;\n\n\t\t\t\t// Get Required Matcher Data:\n\t\t\t\t// In this region we will iteratively go through different possibilities to obtain\n\t\t\t\t// as much data as we can about our invoker.\n\t\t\t\t// For this step we will prefer query calls which can give us more than one information\n\t\t\t\t// at once and lazily fall back to other calls as long as needed.\n\n\t\t\t\tif (info.TryGet<Ts3Client>(out var ts) && info.TryGet<TsFullClient>(out var tsClient))\n\t\t\t\t{\n\t\t\t\t\tServerGroupId[]? serverGroups = clientCall.ServerGroups;\n\t\t\t\t\tChannelId? channelId = clientCall.ChannelId;\n\t\t\t\t\tClientDbId? databaseId = clientCall.DatabaseId;\n\t\t\t\t\tChannelGroupId? channelGroup = clientCall.ChannelGroup;\n\n\t\t\t\t\tif (clientCall.ClientId != null\n\t\t\t\t\t\t&& ((needsAvailableGroups && serverGroups is null)\n\t\t\t\t\t\t\t|| (needsAvailableChanGroups && channelGroup is null)\n\t\t\t\t\t\t\t|| (needsPermOverview.Length > 0 && (databaseId == null || channelId == null))\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t{\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar clientInfo = await ts.GetClientInfoById(clientCall.ClientId.Value);\n\t\t\t\t\t\t\tserverGroups = clientInfo.ServerGroups;\n\t\t\t\t\t\t\tchannelGroup = clientInfo.ChannelGroup;\n\t\t\t\t\t\t\tdatabaseId = clientInfo.DatabaseId;\n\t\t\t\t\t\t\tchannelId = clientInfo.ChannelId;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (AudioBotException) { }\n\t\t\t\t\t}\n\n\t\t\t\t\tif (needsAvailableGroups && serverGroups is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (databaseId == null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdatabaseId = await ts.GetClientDbIdByUid(clientCall.ClientUid);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch (AudioBotException) { }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (databaseId != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tserverGroups = await ts.GetClientServerGroups(databaseId.Value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch (AudioBotException) { }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texecCtx.ChannelGroupId = channelGroup;\n\t\t\t\t\texecCtx.ServerGroups = serverGroups ?? Array.Empty<ServerGroupId>();\n\n\t\t\t\t\tif (needsPermOverview.Length > 0 && databaseId != null && channelId != null)\n\t\t\t\t\t{\n\t\t\t\t\t\t// TODO check if there is any better way to only get the permissions needed.\n\t\t\t\t\t\tvar result = await tsClient.PermOverview(databaseId.Value, channelId.Value, 0);\n\t\t\t\t\t\tif (result.Ok)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\texecCtx.Permissions = new PermOverview[Enum.GetValues(typeof(TsPermission)).Length];\n\t\t\t\t\t\t\tforeach (var perm in result.Value)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (perm.PermissionId < 0 || (int)perm.PermissionId >= execCtx.Permissions.Length)\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\tvar cur = execCtx.Permissions[(int)perm.PermissionId];\n\t\t\t\t\t\t\t\texecCtx.Permissions[(int)perm.PermissionId] = cur == null ? perm : cur.Combine(perm);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (info.TryGet<ApiCall>(out var apiCallData))\n\t\t\t{\n\t\t\t\texecCtx.ClientUid = apiCallData.ClientUid;\n\t\t\t\texecCtx.ApiToken = apiCallData.Token;\n\t\t\t\texecCtx.ApiCallerIp = apiCallData.IpAddress;\n\t\t\t\texecCtx.IsApi = true;\n\t\t\t}\n\n\t\t\tif (info.TryGet<Bot>(out var bot))\n\t\t\t{\n\t\t\t\tvar botInfo = bot.GetInfo();\n\t\t\t\texecCtx.Bot = botInfo.Name;\n\t\t\t\texecCtx.Host = botInfo.Server;\n\t\t\t}\n\n\t\t\tif (localRootRule != null)\n\t\t\t\tProcessNode(localRootRule, execCtx);\n\n\t\t\tif (execCtx.MatchingRules.Count == 0)\n\t\t\t\treturn execCtx;\n\n\t\t\tforeach (var rule in execCtx.MatchingRules)\n\t\t\t\texecCtx.DeclAdd.UnionWith(rule.DeclAdd);\n\n\t\t\tinfo.AddModule(execCtx);\n\n\t\t\treturn execCtx;\n\t\t}\n\n\t\tprivate RightsRule? TryGetRootSafe()\n\t\t{\n\t\t\tvar localRootRule = rootRule;\n\t\t\tif (localRootRule != null && !needsRecalculation)\n\t\t\t\treturn localRootRule;\n\n\t\t\tlock (rootRuleLock)\n\t\t\t{\n\t\t\t\tif (rootRule != null && !needsRecalculation)\n\t\t\t\t\treturn rootRule;\n\n\t\t\t\trootRule = ReadFile();\n\t\t\t\treturn rootRule;\n\t\t\t}\n\t\t}\n\n\t\tprivate static bool ProcessNode(RightsRule rule, ExecuteContext ctx)\n\t\t{\n\t\t\t// check if node matches\n\t\t\tif (rule.Matches(ctx))\n\t\t\t{\n\t\t\t\tbool hasMatchingChild = false;\n\t\t\t\tforeach (var child in rule.ChildrenRules)\n\t\t\t\t\thasMatchingChild |= ProcessNode(child, ctx);\n\n\t\t\t\tif (!hasMatchingChild)\n\t\t\t\t\tctx.MatchingRules.Add(rule);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tpublic bool Reload()\n\t\t{\n\t\t\tneedsRecalculation = true;\n\t\t\treturn TryGetRootSafe() != null;\n\t\t}\n\n\t\t// Loading and Parsing\n\n\t\tprivate RightsRule? ReadFile()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tCreateDefaultConfigIfNotExists();\n\n\t\t\t\tvar table = Toml.ReadFile(config.Path);\n\t\t\t\tvar ctx = new ParseContext(registeredRights);\n\t\t\t\tRecalculateRights(table, ctx);\n\t\t\t\tforeach (var err in ctx.Errors)\n\t\t\t\t\tLog.Error(err);\n\t\t\t\tforeach (var warn in ctx.Warnings)\n\t\t\t\t\tLog.Warn(warn);\n\n\t\t\t\tif (ctx.Errors.Count == 0)\n\t\t\t\t{\n\t\t\t\t\tneedsAvailableChanGroups = ctx.NeedsAvailableChanGroups;\n\t\t\t\t\tneedsAvailableGroups = ctx.NeedsAvailableGroups;\n\t\t\t\t\tneedsPermOverview = ctx.NeedsPermOverview;\n\t\t\t\t\tneedsRecalculation = false;\n\t\t\t\t\treturn ctx.RootRule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"The rights file could not be parsed\");\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic void CreateDefaultConfigIfNotExists()\n\t\t{\n\t\t\tCreateConfig(new CreateFileSettings { OverwriteIfExists = false });\n\t\t}\n\n\t\tpublic void CreateConfig(CreateFileSettings settings)\n\t\t{\n\t\t\tif (!settings.OverwriteIfExists && File.Exists(config.Path))\n\t\t\t\treturn;\n\n\t\t\tLog.Info(\"Creating new permission file ({@settings})\", settings);\n\n\t\t\tstring? toml = null;\n\t\t\tusing (var fs = Util.GetEmbeddedFile(\"TS3AudioBot.Resources.DefaultRights.toml\")!)\n\t\t\tusing (var reader = new StreamReader(fs, Tools.Utf8Encoder))\n\t\t\t{\n\t\t\t\ttoml = reader.ReadToEnd();\n\t\t\t}\n\n\t\t\tusing (var fs = File.Open(config.Path, FileMode.Create, FileAccess.Write, FileShare.None))\n\t\t\tusing (var writer = new StreamWriter(fs, Tools.Utf8Encoder))\n\t\t\t{\n\t\t\t\tstring replaceAdminUids = settings.AdminUids != null\n\t\t\t\t\t? string.Join(\" ,\", settings.AdminUids.Select(x => $\"\\\"{x}\\\"\"))\n\t\t\t\t\t: string.Empty;\n\t\t\t\ttoml = toml.Replace(\"\\\"_admin_uid_\\\"\", replaceAdminUids);\n\n\t\t\t\twriter.Write(toml);\n\t\t\t}\n\t\t}\n\n\t\tpublic void CreateConfigIfNotExists(bool interactive = false)\n\t\t{\n\t\t\tif (File.Exists(config.Path))\n\t\t\t\treturn;\n\n\t\t\tLog.Warn(\"No permission file found.\");\n\n\t\t\tvar settings = new CreateFileSettings\n\t\t\t{\n\t\t\t\tOverwriteIfExists = false,\n\t\t\t};\n\n\t\t\tif (interactive)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(\"Do you want to set up an admin in the default permission file template? [Y/n]\");\n\t\t\t\tif (Interactive.UserAgree(defaultTo: true))\n\t\t\t\t{\n\t\t\t\t\tvar adminUid = Interactive.LoopAction(\"Please enter an admin uid\", uid =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!Uid.IsValid(uid))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tConsole.WriteLine(\"The uid seems to be invalid, continue anyway? [y/N]\");\n\t\t\t\t\t\t\treturn Interactive.UserAgree(defaultTo: false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t});\n\t\t\t\t\tif (adminUid is null)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsettings.AdminUids = new[] { adminUid };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tCreateConfig(settings);\n\t\t}\n\n\t\tprivate static void RecalculateRights(TomlTable table, ParseContext parseCtx)\n\t\t{\n\t\t\tif (!parseCtx.RootRule.ParseChilden(table, parseCtx))\n\t\t\t\treturn;\n\n\t\t\tparseCtx.SplitDeclarations();\n\n\t\t\tif (!ValidateUniqueGroupNames(parseCtx))\n\t\t\t\treturn;\n\n\t\t\tif (!ResolveIncludes(parseCtx))\n\t\t\t\treturn;\n\n\t\t\tif (!CheckCyclicGroupDependencies(parseCtx))\n\t\t\t\treturn;\n\n\t\t\tBuildLevel(parseCtx.RootRule);\n\n\t\t\tLintDeclarations(parseCtx);\n\n\t\t\tNormalizeRules(parseCtx);\n\n\t\t\tFlattenGroups(parseCtx);\n\n\t\t\tFlattenRules(parseCtx.RootRule);\n\n\t\t\tCheckRequiredCalls(parseCtx);\n\t\t}\n\n\t\tprivate static HashSet<string> ExpandRights(IEnumerable<string> rights, ICollection<string> registeredRights)\n\t\t{\n\t\t\tvar rightsExpanded = new HashSet<string>();\n\t\t\tforeach (var right in rights)\n\t\t\t{\n\t\t\t\tint index = right.IndexOf('*');\n\t\t\t\tif (index < 0)\n\t\t\t\t{\n\t\t\t\t\t// Rule does not contain any wildcards\n\t\t\t\t\trightsExpanded.Add(right);\n\t\t\t\t}\n\t\t\t\telse if (index != 0 && right[index - 1] != '.')\n\t\t\t\t{\n\t\t\t\t\t// Do not permit misused wildcards\n\t\t\t\t\tthrow new ArgumentException($\"The right \\\"{right}\\\" has a misused wildcard.\");\n\t\t\t\t}\n\t\t\t\telse if (index == 0)\n\t\t\t\t{\n\t\t\t\t\t// We are done here when including every possible right\n\t\t\t\t\trightsExpanded.UnionWith(registeredRights);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Add all rights which expand from that wildcard\n\t\t\t\t\tstring subMatch = right.Substring(0, index - 1);\n\t\t\t\t\trightsExpanded.UnionWith(registeredRights.Where(x => x.StartsWith(subMatch)));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn rightsExpanded;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Removes rights which are in the Add and Deny category.\n\t\t/// Expands wildcard declarations to all explicit declarations.\n\t\t/// </summary>\n\t\t/// <param name=\"ctx\">The parsing context for the current file processing.</param>\n\t\tprivate static void NormalizeRules(ParseContext ctx)\n\t\t{\n\t\t\tforeach (var rule in ctx.Rules)\n\t\t\t{\n\t\t\t\tvar denyNormalized = ExpandRights(rule.DeclDeny, ctx.RegisteredRights);\n\t\t\t\trule.DeclDeny = denyNormalized.ToArray();\n\t\t\t\tvar addNormalized = ExpandRights(rule.DeclAdd, ctx.RegisteredRights);\n\t\t\t\taddNormalized.ExceptWith(rule.DeclDeny);\n\t\t\t\trule.DeclAdd = addNormalized.ToArray();\n\n\t\t\t\tvar undeclared = rule.DeclAdd.Except(ctx.RegisteredRights)\n\t\t\t\t\t.Concat(rule.DeclDeny.Except(ctx.RegisteredRights));\n\t\t\t\tforeach (var right in undeclared)\n\t\t\t\t{\n\t\t\t\t\tctx.Warnings.Add($\"Right \\\"{right}\\\" is not registered.\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Checks that each group name can be uniquely identified when resolving.\n\t\t/// </summary>\n\t\t/// <param name=\"ctx\">The parsing context for the current file processing.</param>\n\t\tprivate static bool ValidateUniqueGroupNames(ParseContext ctx)\n\t\t{\n\t\t\tbool hasErrors = false;\n\n\t\t\tforeach (var checkGroup in ctx.Groups)\n\t\t\t{\n\t\t\t\t// check that the name is unique\n\t\t\t\tvar parent = checkGroup.Parent;\n\t\t\t\twhile (parent != null)\n\t\t\t\t{\n\t\t\t\t\tforeach (var cmpGroup in parent.ChildrenGroups)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (cmpGroup != checkGroup\n\t\t\t\t\t\t\t&& cmpGroup.Name == checkGroup.Name)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tctx.Errors.Add($\"Ambiguous group name: {checkGroup.Name}\");\n\t\t\t\t\t\t\thasErrors = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparent = parent.Parent;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn !hasErrors;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Resolves all include strings to their representative object each.\n\t\t/// </summary>\n\t\t/// <param name=\"ctx\">The parsing context for the current file processing.</param>\n\t\tprivate static bool ResolveIncludes(ParseContext ctx)\n\t\t{\n\t\t\tbool hasErrors = false;\n\n\t\t\tforeach (var decl in ctx.Declarations)\n\t\t\t\thasErrors |= !decl.ResolveIncludes(ctx);\n\n\t\t\treturn !hasErrors;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Checks if group includes form a cyclic dependency.\n\t\t/// </summary>\n\t\t/// <param name=\"ctx\">The parsing context for the current file processing.</param>\n\t\tprivate static bool CheckCyclicGroupDependencies(ParseContext ctx)\n\t\t{\n\t\t\tbool hasErrors = false;\n\n\t\t\tforeach (var checkGroup in ctx.Groups)\n\t\t\t{\n\t\t\t\tvar included = new HashSet<RightsGroup>();\n\t\t\t\tvar remainingIncludes = new Queue<RightsGroup>();\n\t\t\t\tremainingIncludes.Enqueue(checkGroup);\n\n\t\t\t\twhile (remainingIncludes.Count > 0)\n\t\t\t\t{\n\t\t\t\t\tvar include = remainingIncludes.Dequeue();\n\t\t\t\t\tincluded.Add(include);\n\t\t\t\t\tforeach (var newInclude in include.Includes)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (newInclude == checkGroup)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thasErrors = true;\n\t\t\t\t\t\t\tctx.Errors.Add($\"Group \\\"{checkGroup.Name}\\\" has a cyclic include hierarchy.\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!included.Contains(newInclude))\n\t\t\t\t\t\t\tremainingIncludes.Enqueue(newInclude);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn !hasErrors;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Generates hierarchical values for the <see cref=\"RightsDecl.Level\"/> field\n\t\t/// for all rules. This value represents which rule is more specified when\n\t\t/// merging two rule in order to prioritize rights.\n\t\t/// </summary>\n\t\t/// <param name=\"root\">The root element of the hierarchy tree.</param>\n\t\t/// <param name=\"level\">The base level for the root element.</param>\n\t\tprivate static void BuildLevel(RightsDecl root, int level = 0)\n\t\t{\n\t\t\troot.Level = level;\n\t\t\tif (root is RightsRule rootRule)\n\t\t\t{\n\t\t\t\tforeach (var child in rootRule.Children)\n\t\t\t\t{\n\t\t\t\t\tBuildLevel(child, level + RuleLevelSize);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Checks groups and rules for common mistakes and unusual declarations.\n\t\t/// Found stuff will be added as warnings.\n\t\t/// </summary>\n\t\t/// <param name=\"ctx\">The parsing context for the current file processing.</param>\n\t\tprivate static void LintDeclarations(ParseContext ctx)\n\t\t{\n\t\t\t// check if <+> contains <-> decl\n\t\t\tforeach (var decl in ctx.Declarations)\n\t\t\t{\n\t\t\t\tvar uselessAdd = decl.DeclAdd.Intersect(decl.DeclDeny).ToArray();\n\t\t\t\tforeach (var uAdd in uselessAdd)\n\t\t\t\t\tctx.Warnings.Add($\"Rule has declaration \\\"{uAdd}\\\" in \\\"+\\\" and \\\"-\\\"\");\n\t\t\t}\n\n\t\t\t// top level <-> declaration is useless\n\t\t\tforeach (var decl in ctx.Groups)\n\t\t\t{\n\t\t\t\tif (decl.Includes.Length == 0 && decl.DeclDeny.Length > 0)\n\t\t\t\t\tctx.Warnings.Add(\"Rule with \\\"-\\\" declaration but no include to override\");\n\t\t\t}\n\t\t\tvar root = ctx.Rules.First(x => x.Parent is null);\n\t\t\tif (root.Includes.Length == 0 && root.DeclDeny.Length > 0)\n\t\t\t\tctx.Warnings.Add(\"Root rule \\\"-\\\" declaration has no effect\");\n\n\t\t\t// check if rule has no matcher\n\t\t\tforeach (var rule in ctx.Rules)\n\t\t\t{\n\t\t\t\tif (!rule.HasMatcher() && rule.Parent != null)\n\t\t\t\t\tctx.Warnings.Add(\"Rule has no matcher and will always match\");\n\t\t\t}\n\n\t\t\t// check for impossible combinations uid + uid, server + server, perm + perm ?\n\t\t\t// TODO\n\n\t\t\t// check for unused group\n\t\t\tvar unusedGroups = new HashSet<RightsGroup>(ctx.Groups);\n\t\t\tforeach (var decl in ctx.Declarations)\n\t\t\t{\n\t\t\t\tforeach (var include in decl.Includes)\n\t\t\t\t{\n\t\t\t\t\tunusedGroups.Remove(include);\n\t\t\t\t}\n\t\t\t}\n\t\t\tforeach (var uGroup in unusedGroups)\n\t\t\t\tctx.Warnings.Add($\"Group \\\"{uGroup.Name}\\\" is never included in a rule\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Sums up all includes for each group and includes them directly into the\n\t\t/// <see cref=\"RightsDecl.DeclAdd\"/> and <see cref=\"RightsDecl.DeclDeny\"/>.\n\t\t/// </summary>\n\t\t/// <param name=\"ctx\">The parsing context for the current file processing.</param>\n\t\tprivate static void FlattenGroups(ParseContext ctx)\n\t\t{\n\t\t\tvar notReachable = new Queue<RightsGroup>(ctx.Groups);\n\t\t\tvar currentlyReached = new HashSet<RightsGroup>(ctx.Groups.Where(x => x.Includes.Length == 0));\n\n\t\t\twhile (notReachable.Count > 0)\n\t\t\t{\n\t\t\t\tvar item = notReachable.Dequeue();\n\t\t\t\tif (currentlyReached.IsSupersetOf(item.Includes))\n\t\t\t\t{\n\t\t\t\t\tcurrentlyReached.Add(item);\n\n\t\t\t\t\titem.MergeGroups(item.Includes);\n\t\t\t\t\titem.Includes = Array.Empty<RightsGroup>();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnotReachable.Enqueue(item);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Sums up all includes and parent rule declarations for each rule and includes them\n\t\t/// directly into the <see cref=\"RightsDecl.DeclAdd\"/> and <see cref=\"RightsDecl.DeclDeny\"/>.\n\t\t/// </summary>\n\t\t/// <param name=\"root\">The root element of the hierarchy tree.</param>\n\t\tprivate static void FlattenRules(RightsRule root)\n\t\t{\n\t\t\tif (root.Parent != null)\n\t\t\t\troot.MergeGroups(root.Parent);\n\t\t\troot.MergeGroups(root.Includes);\n\t\t\troot.Includes = Array.Empty<RightsGroup>();\n\n\t\t\tforeach (var child in root.ChildrenRules)\n\t\t\t\tFlattenRules(child);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Checks which ts3client calls need to made to get all information\n\t\t/// for the required matcher.\n\t\t/// </summary>\n\t\t/// <param name=\"ctx\">The parsing context for the current file processing.</param>\n\t\tprivate static void CheckRequiredCalls(ParseContext ctx)\n\t\t{\n\t\t\tvar needsPermOverview = new HashSet<TsPermission>();\n\n\t\t\tforeach (var group in ctx.Rules)\n\t\t\t{\n\t\t\t\tforeach (var matcher in group.Matcher)\n\t\t\t\t{\n\t\t\t\t\tswitch (matcher)\n\t\t\t\t\t{\n\t\t\t\t\tcase MatchServerGroupId _:\n\t\t\t\t\t\tctx.NeedsAvailableGroups = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MatchChannelGroupId _:\n\t\t\t\t\t\tctx.NeedsAvailableChanGroups = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MatchPermission sgid:\n\t\t\t\t\t\tneedsPermOverview.UnionWith(sgid.ComparingPermissions());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.NeedsPermOverview = needsPermOverview.Count > 0 ? needsPermOverview.ToArray() : Array.Empty<TsPermission>();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Rights/RightsRule.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Nett;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Rights.Matchers;\nusing TSLib;\n\nnamespace TS3AudioBot.Rights\n{\n\t// Adding a new Matcher:\n\t// 1) Add public MatchHashSet\n\t// 2) Add To Has Matches condition when empty\n\t// 3) Add To FillNull when not declared\n\t// 4) Add new case to ParseKey switch\n\t// 5) Add Property in the ExecuteContext class\n\t// 6) Add match condition to RightManager.ProcessNode\n\t// 7) Set value in RightManager.GetRightsContext\n\n\tinternal class RightsRule : RightsDecl\n\t{\n\t\tpublic List<RightsDecl> Children { get; set; }\n\t\tpublic IEnumerable<RightsRule> ChildrenRules => Children.OfType<RightsRule>();\n\t\tpublic IEnumerable<RightsGroup> ChildrenGroups => Children.OfType<RightsGroup>();\n\n\t\tpublic List<Matcher> Matcher { get; }\n\n\t\tpublic RightsRule()\n\t\t{\n\t\t\tChildren = new List<RightsDecl>();\n\t\t\tMatcher = new List<Matcher>();\n\t\t}\n\n\t\tpublic bool HasMatcher() => Matcher.Count > 0;\n\n\t\tpublic bool Matches(ExecuteContext ctx)\n\t\t{\n\t\t\tif (!HasMatcher())\n\t\t\t\treturn true;\n\n\t\t\tforeach (var matcher in Matcher)\n\t\t\t{\n\t\t\t\tif (matcher.Matches(ctx))\n\t\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tpublic override bool ParseKey(string key, TomlObject tomlObj, ParseContext ctx)\n\t\t{\n\t\t\tif (base.ParseKey(key, tomlObj, ctx))\n\t\t\t\treturn true;\n\n\t\t\tswitch (key)\n\t\t\t{\n\t\t\tcase \"host\":\n\t\t\t\tif (tomlObj.TryGetValueArray<string>(out var host)) Matcher.Add(new MatchHost(host));\n\t\t\t\telse ctx.Errors.Add(\"<host> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"groupid\":\n\t\t\t\tif (tomlObj.TryGetValueArray<ulong>(out var servergroupid)) Matcher.Add(new MatchServerGroupId(servergroupid.Select(ServerGroupId.To)));\n\t\t\t\telse ctx.Errors.Add(\"<groupid> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"channelgroupid\":\n\t\t\t\tif (tomlObj.TryGetValueArray<ulong>(out var channelgroupid)) Matcher.Add(new MatchChannelGroupId(channelgroupid.Select(ChannelGroupId.To)));\n\t\t\t\telse ctx.Errors.Add(\"<channelgroupid> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"useruid\":\n\t\t\t\tif (tomlObj.TryGetValueArray<string>(out var useruid)) Matcher.Add(new MatchClientUid(useruid.Select(Uid.To)));\n\t\t\t\telse ctx.Errors.Add(\"<useruid> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"perm\":\n\t\t\t\tif (tomlObj.TryGetValueArray<string>(out var perm)) Matcher.Add(new MatchPermission(perm, ctx));\n\t\t\t\telse ctx.Errors.Add(\"<perm> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"apitoken\":\n\t\t\t\tif (tomlObj.TryGetValueArray<string>(out var apitoken)) Matcher.Add(new MatchToken(apitoken));\n\t\t\t\telse ctx.Errors.Add(\"<apitoken> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"bot\":\n\t\t\t\tif (tomlObj.TryGetValueArray<string>(out var bot)) Matcher.Add(new MatchBot(bot));\n\t\t\t\telse ctx.Errors.Add(\"<bot> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"isapi\":\n\t\t\t\tif (tomlObj.TryGetValue<bool>(out var isapi)) Matcher.Add(new MatchIsApi(isapi));\n\t\t\t\telse ctx.Errors.Add(\"<isapi> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"ip\":\n\t\t\t\tif (tomlObj.TryGetValueArray<string>(out var ip))\n\t\t\t\t{\n\t\t\t\t\tMatcher.Add(new MatchApiCallerIp(ip.Select(x =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (IPAddress.TryParse(x, out var ipa))\n\t\t\t\t\t\t\treturn ipa;\n\t\t\t\t\t\tctx.Errors.Add($\"<ip> Field value '{x}' could not be parsed.\");\n\t\t\t\t\t\treturn null!;\n\t\t\t\t\t}).Where(x => x != null)));\n\t\t\t\t}\n\t\t\t\telse ctx.Errors.Add(\"<ip> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"visibility\":\n\t\t\t\tif (tomlObj.TryGetValueArray<TextMessageTargetMode>(out var visibility)) Matcher.Add(new MatchVisibility(visibility));\n\t\t\t\telse ctx.Errors.Add(\"<visibility> Field has invalid data.\");\n\t\t\t\treturn true;\n\t\t\tcase \"rule\":\n\t\t\t\tif (tomlObj.TomlType == TomlObjectType.ArrayOfTables)\n\t\t\t\t{\n\t\t\t\t\tvar childTables = (TomlTableArray)tomlObj;\n\t\t\t\t\tforeach (var childTable in childTables.Items)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar rule = new RightsRule();\n\t\t\t\t\t\tChildren.Add(rule);\n\t\t\t\t\t\trule.Parent = this;\n\t\t\t\t\t\trule.ParseChilden(childTable, ctx);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tctx.Errors.Add(\"Misused key with reserved name \\\"rule\\\".\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\t// group\n\t\t\t\tif (key.StartsWith(\"$\"))\n\t\t\t\t{\n\t\t\t\t\tif (tomlObj.TomlType == TomlObjectType.Table)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar childTable = (TomlTable)tomlObj;\n\t\t\t\t\t\tvar group = new RightsGroup(key);\n\t\t\t\t\t\tChildren.Add(group);\n\t\t\t\t\t\tgroup.Parent = this;\n\t\t\t\t\t\tgroup.ParseChilden(childTable, ctx);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tctx.Errors.Add($\"Misused key for group declaration: {key}.\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tpublic override RightsGroup? ResolveGroup(string groupName, ParseContext ctx)\n\t\t{\n\t\t\tforeach (var child in ChildrenGroups)\n\t\t\t{\n\t\t\t\tif (child.Name == groupName)\n\t\t\t\t\treturn child;\n\t\t\t}\n\t\t\treturn Parent?.ResolveGroup(groupName, ctx);\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn $\"[+:{string.Join(\",\", DeclAdd)} | -:{string.Join(\",\", DeclDeny)}]\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Sessions/AnonymousSession.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Sessions\n{\n\tinternal class AnonymousSession : UserSession\n\t{\n\t\tpublic AnonymousSession()\n\t\t{\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Sessions/ApiToken.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Sessions\n{\n\tinternal class ApiToken\n\t{\n\t\tpublic const int TokenLen = 32;\n\t\tpublic static readonly TimeSpan DefaultTokenTimeout = TimeSpan.MaxValue;\n\n\t\tpublic string Value { get; }\n\t\tpublic DateTime Timeout { get; }\n\t\tpublic bool ApiTokenActive => Tools.Now <= Timeout;\n\n\t\tpublic ApiToken(string value, DateTime timeout)\n\t\t{\n\t\t\tValue = value;\n\t\t\tTimeout = timeout;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Sessions/SessionManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing TSLib;\n\nnamespace TS3AudioBot.Sessions\n{\n\t/// <summary>Management for clients talking with the bot.</summary>\n\tpublic class SessionManager\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\t// Map: Id => UserSession\n\t\tprivate readonly Dictionary<ClientId, UserSession> openSessions = new Dictionary<ClientId, UserSession>();\n\n\t\tpublic UserSession GetOrCreateSession(ClientId clientId)\n\t\t{\n\t\t\tlock (openSessions)\n\t\t\t{\n\t\t\t\tif (openSessions.TryGetValue(clientId, out var session))\n\t\t\t\t\treturn session;\n\n\t\t\t\tLog.Debug(\"ClientId {0} created session with the bot\", clientId);\n\t\t\t\tsession = new UserSession();\n\t\t\t\topenSessions.Add(clientId, session);\n\t\t\t\treturn session;\n\t\t\t}\n\t\t}\n\n\t\tpublic UserSession? GetSession(ClientId id)\n\t\t{\n\t\t\tlock (openSessions)\n\t\t\t{\n\t\t\t\tif (openSessions.TryGetValue(id, out var session))\n\t\t\t\t\treturn session;\n\t\t\t\telse\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tpublic void RemoveSession(ClientId id)\n\t\t{\n\t\t\tlock (openSessions)\n\t\t\t{\n\t\t\t\topenSessions.Remove(id);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Sessions/TokenManager.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing LiteDB;\nusing System;\nusing System.Collections.Generic;\nusing TS3AudioBot.Helper;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Sessions\n{\n\tpublic class TokenManager\n\t{\n\t\tprivate const string TokenFormat = \"{0}:{1}\";\n\n\t\tprivate const string ApiTokenTable = \"apiToken\";\n\t\tprivate readonly LiteCollection<DbApiToken> dbTokenList;\n\t\tprivate readonly Dictionary<string, ApiToken> dbTokenCache = new Dictionary<string, ApiToken>();\n\n\t\tpublic TokenManager(DbStore database)\n\t\t{\n\t\t\tdbTokenList = database.GetCollection<DbApiToken>(ApiTokenTable);\n\t\t\tdbTokenList.EnsureIndex(x => x.UserUid, true);\n\t\t\tdbTokenList.EnsureIndex(x => x.Token, true);\n\t\t}\n\n\t\tpublic string GenerateToken(string authId, TimeSpan? timeout = null)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(authId))\n\t\t\t\tthrow new ArgumentNullException(nameof(authId));\n\n\t\t\tvar token = new ApiToken(\n\t\t\t\tTextUtil.GenToken(ApiToken.TokenLen),\n\t\t\t\tAddTimeSpanSafe(Tools.Now, timeout ?? ApiToken.DefaultTokenTimeout));\n\n\t\t\tdbTokenCache[authId] = token;\n\n\t\t\tdbTokenList.Upsert(new DbApiToken\n\t\t\t{\n\t\t\t\tUserUid = authId,\n\t\t\t\tToken = token.Value,\n\t\t\t\tValidUntil = token.Timeout\n\t\t\t});\n\n\t\t\treturn string.Format(TokenFormat, authId, token.Value);\n\t\t}\n\n\t\tprivate static DateTime AddTimeSpanSafe(DateTime dateTime, TimeSpan addSpan)\n\t\t{\n\t\t\tif (addSpan == TimeSpan.MaxValue)\n\t\t\t\treturn DateTime.MaxValue;\n\t\t\tif (addSpan == TimeSpan.MinValue)\n\t\t\t\treturn DateTime.MinValue;\n\t\t\tif (dateTime == DateTime.MaxValue)\n\t\t\t\treturn DateTime.MaxValue;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\treturn dateTime + addSpan;\n\t\t\t}\n\t\t\tcatch (ArgumentOutOfRangeException)\n\t\t\t{\n\t\t\t\treturn addSpan >= TimeSpan.Zero ? DateTime.MaxValue : DateTime.MinValue;\n\t\t\t}\n\t\t}\n\n\t\tinternal ApiToken? GetToken(string authId)\n\t\t{\n\t\t\tif (dbTokenCache.TryGetValue(authId, out var token)\n\t\t\t\t&& token.ApiTokenActive)\n\t\t\t\treturn token;\n\n\t\t\tvar dbToken = dbTokenList.FindById(authId);\n\t\t\tif (dbToken is null || dbToken.Token is null)\n\t\t\t\treturn null;\n\n\t\t\tif (dbToken.ValidUntil < Tools.Now)\n\t\t\t{\n\t\t\t\tdbTokenList.Delete(authId);\n\t\t\t\tdbTokenCache.Remove(authId);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\ttoken = new ApiToken(dbToken.Token, dbToken.ValidUntil);\n\t\t\tdbTokenCache[authId] = token;\n\t\t\treturn token;\n\t\t}\n\n\t\tprivate class DbApiToken\n\t\t{\n\t\t\t[BsonId]\n\t\t\tpublic string? UserUid { get; set; }\n\t\t\tpublic string? Token { get; set; }\n\t\t\tpublic DateTime ValidUntil { get; set; }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Sessions/UserSession.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing TS3AudioBot.CommandSystem;\nusing Response = System.Func<string, System.Threading.Tasks.Task<string?>>;\n\nnamespace TS3AudioBot.Sessions\n{\n\tpublic class UserSession\n\t{\n\t\tprivate const string ResponseKey = \"response\";\n\n\t\tprivate Dictionary<string, object>? assocMap;\n\t\tprotected bool lockToken;\n\n\t\tpublic Response? ResponseProcessor => Get<Response>(ResponseKey, out var val) ? val : null;\n\n\t\tpublic UserSession() { }\n\n\t\tpublic void SetResponseInstance(Response responseProcessor) => Set(ResponseKey, responseProcessor);\n\n\t\tpublic void ClearResponse() => Set<Response?>(ResponseKey, null);\n\n\t\tpublic bool Get<TData>(string key, [MaybeNullWhen(false)] out TData value) where TData : notnull\n\t\t{\n\t\t\tvalue = default!;\n\n\t\t\tif (assocMap is null)\n\t\t\t\treturn false;\n\n\t\t\tif (!assocMap.TryGetValue(key, out var valueObj))\n\t\t\t\treturn false;\n\n\t\t\tif (!(valueObj is TData valueT))\n\t\t\t\treturn false;\n\n\t\t\tvalue = valueT;\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic void Set<TData>(string key, TData data)\n\t\t{\n\t\t\tif (assocMap is null)\n\t\t\t\tassocMap = new Dictionary<string, object>();\n\n\t\t\tif (data is null)\n\t\t\t\tassocMap.Remove(key);\n\t\t\telse\n\t\t\t\tassocMap[key] = data;\n\t\t}\n\t}\n\n\tpublic static class UserSessionExtensions\n\t{\n\t\tpublic static void SetResponse(this UserSession? session, Response responseProcessor)\n\t\t{\n\t\t\tif (session is null)\n\t\t\t\tthrow new CommandException(\"No session context\", CommandExceptionReason.CommandError);\n\t\t\tsession.SetResponseInstance(responseProcessor);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Setup.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing CommandLine;\nusing CommandLine.Text;\nusing NLog;\nusing System;\nusing System.Globalization;\nusing System.IO;\nusing System.Runtime;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Environment;\nusing TS3AudioBot.Helper;\nusing TSLib.Helper;\nusing TSLib.Scheduler;\n\nnamespace TS3AudioBot\n{\n\tinternal static class Setup\n\t{\n\t\tprivate static readonly Logger Log = LogManager.GetCurrentClassLogger();\n\n\t\tpublic const int ExitCodeOk = 0;\n\t\tpublic const int ExitCodeMalformedArguments = 1;\n\t\tpublic const int ExitCodeLibopusLoadError = 2;\n\n\t\tpublic static int Main(string[] args)\n\t\t{\n\t\t\tThread.CurrentThread.Name = \"TAB Main\";\n\t\t\tTools.SetLogId(\"Core\");\n\n\t\t\tvar parsedArgs = new Parser(with =>\n\t\t\t{\n\t\t\t\twith.AutoHelp = true;\n\t\t\t\twith.AutoVersion = false;\n\t\t\t}).ParseArguments<ParameterData?>(args);\n\t\t\tParameterData? setup = parsedArgs.MapResult(ok => ok, _ => null);\n\n\t\t\tif (setup is null)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(HelpText.AutoBuild(parsedArgs, h =>\n\t\t\t\t{\n\t\t\t\t\th.Heading = $\"TS3AudioBot {SystemData.AssemblyData}\";\n\t\t\t\t\th.Copyright = \"\";\n\t\t\t\t\treturn HelpText.DefaultParsingErrorsHandler(parsedArgs, h);\n\t\t\t\t}));\n\t\t\t\treturn ExitCodeMalformedArguments;\n\t\t\t}\n\n\t\t\tif (setup.ShowVersion)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(SystemData.AssemblyData.ToLongString());\n\t\t\t\treturn ExitCodeOk;\n\t\t\t}\n\n\t\t\tif (setup.ShowStatsExample)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(\"The bot will contribute to the stats counter about once per day.\");\n\t\t\t\tConsole.WriteLine(\"We do NOT store any IP or identifiable information.\");\n\t\t\t\tConsole.WriteLine(\"Please keep this feature enabled to help us improve and grow.\");\n\t\t\t\tConsole.WriteLine(\"An example stats packet looks like this:\");\n\t\t\t\tConsole.WriteLine(Stats.CreateExample());\n\t\t\t\treturn ExitCodeOk;\n\t\t\t}\n\n\t\t\tSetupLog();\n\t\t\tif (!SetupLibopus())\n\t\t\t\treturn ExitCodeLibopusLoadError;\n\n\t\t\tif (setup.Llgc)\n\t\t\t\tEnableLlgc();\n\n\t\t\tif (!setup.HideBanner)\n\t\t\t\tLogHeader();\n\n\t\t\tDedicatedTaskScheduler.FromCurrentThread(() => StartBot(setup));\n\t\t\treturn ExitCodeOk;\n\t\t}\n\n\t\tprivate static async void StartBot(ParameterData setup)\n\t\t{\n\t\t\t// Initialize the actual core\n\t\t\tvar core = new Core((DedicatedTaskScheduler)TaskScheduler.Current, setup.ConfigFile);\n\n\t\t\tawait core.Run(setup);\n\t\t}\n\n\t\tpublic static void SetupLog()\n\t\t{\n\t\t\tif (LogManager.Configuration is null)\n\t\t\t{\n\t\t\t\tvar configFileInfo = new FileInfo(\"NLog.config\");\n\t\t\t\tif (!configFileInfo.Exists)\n\t\t\t\t{\n\t\t\t\t\tusing var configStream = Util.GetEmbeddedFile(\"TS3AudioBot.Resources.NLog.config\")!;\n\t\t\t\t\tusing var configFileStream = configFileInfo.OpenWrite();\n\t\t\t\t\tconfigStream.CopyTo(configFileStream);\n\t\t\t\t}\n\t\t\t\tLogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(configFileInfo.FullName);\n\t\t\t}\n\t\t\telse if (LogManager.Configuration.AllTargets.Count == 0)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(\"Your NLog target config is empty. Nothing will be logged!\");\n\t\t\t\tConsole.WriteLine(\"Please refer to https://github.com/NLog/NLog/wiki/Configuration-file to learn more how to set up your own logging configuration.\");\n\t\t\t}\n\t\t}\n\n\t\tpublic static bool SetupLibopus()\n\t\t{\n\t\t\tbool loaded = TSLib.Audio.Opus.NativeMethods.PreloadLibrary();\n\t\t\tif (!loaded)\n\t\t\t\tLog.Error(\"Couldn't find libopus. Make sure it is installed or placed in the correct folder.\");\n\t\t\treturn loaded;\n\t\t}\n\n\t\tpublic static void EnableLlgc()\n\t\t{\n\t\t\tGCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;\n\t\t}\n\n\t\tpublic static void LogHeader()\n\t\t{\n\t\t\tLog.Info(\"[============ TS3AudioBot started =============]\");\n\t\t\tLog.Info(\"[ Date: {0}\", DateTime.Now.ToString(\"dddd, dd MMMM yyyy HH:mm:ss\", CultureInfo.InvariantCulture));\n\t\t\tLog.Info(\"[ Version: {0}\", SystemData.AssemblyData);\n\t\t\tLog.Info(\"[ Build: {0}\", SystemData.AssemblyData.BuildConfiguration);\n\t\t\tLog.Info(\"[ Platform: {0}\", SystemData.PlatformData);\n\t\t\tLog.Info(\"[ Runtime: {0} ServerGC:{1} GC:{2}\", SystemData.RuntimeData.FullName, GCSettings.IsServerGC, GCSettings.LatencyMode);\n\t\t\tLog.Info(\"[ Opus: {0}\", TSLib.Audio.Opus.NativeMethods.Info);\n\t\t\t// ffmpeg\n\t\t\t// youtube-dl\n\t\t\tLog.Info(\"[==============================================]\");\n\t\t}\n\t}\n\n\tpublic class ParameterData\n\t{\n\t\t[Option('c', \"config\", Default = null, HelpText = \"Specify the path to the ts3audiobot.toml config file.\")]\n\t\tpublic string? ConfigFile { get; set; }\n\t\t[Option(\"skip-checks\", HelpText = \"Skips checking the system for all required tools.\")]\n\t\tpublic bool SkipVerifications { get; set; }\n\t\t[Option(\"hide-banner\", HelpText = \"Do not print the version information header.\")]\n\t\tpublic bool HideBanner { get; set; }\n\t\t[Option(\"non-interactive\", HelpText = \"Disables console prompts from setup tools.\")]\n\t\tpublic bool NonInteractive { get; set; }\n\t\tpublic bool Interactive => !NonInteractive;\n\t\t[Option(\"no-llgc\", Hidden = true)]\n\t\tpublic bool NoLlgc { get; set; }\n\t\tpublic bool Llgc => !NoLlgc;\n\t\t[Option(\"stats-disabled\", HelpText = \"Disables sending to the global stats tracker.\")]\n\t\tpublic bool StatsDisabled { get; set; }\n\t\tpublic bool SendStats => !StatsDisabled;\n\t\t[Option(\"stats-example\", HelpText = \"Shows you what the bot sends to the global stats tracker.\")]\n\t\tpublic bool ShowStatsExample { get; set; }\n\t\t[Option('V', \"version\", HelpText = \"Gets the bot version.\")]\n\t\tpublic bool ShowVersion { get; set; }\n\n\t\t// -i --interactive, minimal ui/console tool to execute basic stuff like\n\t\t// create bot, excute commands\n\n\t\t// --setup setup the entire environment (-y to skip for user input?)\n\t\t// > libopus (self-compile/apt-get)\n\t\t// > ffmpeg (apt-get)\n\t\t// > youtube-dl (repo/apt-get)\n\t\t// > check NLog.config exists\n\t\t// > Crete new bot (see --new-bot)\n\n\t\t// --new-bot name={} address={} server_password={} ?\n\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/TS3AudioBot.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <RootNamespace>TS3AudioBot</RootNamespace>\n    <AssemblyName>TS3AudioBot</AssemblyName>\n    <OutputType>Exe</OutputType>\n    <LangVersion>8.0</LangVersion>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>\n    <RollForward>Major</RollForward>\n\n    <Nullable>enable</Nullable>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <Prefer32Bit>false</Prefer32Bit>\n    <DebugType>portable</DebugType>\n\n    <ApplicationIcon>Media\\favicon.ico</ApplicationIcon>\n\n    <NeutralLanguage>en</NeutralLanguage>\n\n    <StartupObject>TS3AudioBot.Setup</StartupObject>\n\n    <ServerGarbageCollection>true</ServerGarbageCollection>\n    <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>\n\n    <RepositoryUrl>https://github.com/Splamy/TS3AudioBot.git</RepositoryUrl>\n    <RepositoryType>git</RepositoryType>\n    <PublishRepositoryUrl>true</PublishRepositoryUrl>\n\n    <GenerateAssemblyInfo>true</GenerateAssemblyInfo>\n    <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>\n    <GenerateAssemblyInformationalVersionAttribute>false</GenerateAssemblyInformationalVersionAttribute>\n    <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"CliWrap\" Version=\"3.1.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.8.0\" />\n    <PackageReference Include=\"NLog\" Version=\"4.7.3\" />\n    <PackageReference Include=\"Newtonsoft.Json\" Version=\"12.0.3\" />\n    <PackageReference Include=\"LiteDB\" Version=\"4.1.4\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.Cors\" Version=\"2.2.0\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.Server.Kestrel\" Version=\"2.2.0\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.StaticFiles\" Version=\"2.2.0\" />\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"3.7.0\">\n      <ExcludeAssets>analyzers</ExcludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"Nett\" Version=\"0.15.0\" />\n    <PackageReference Include=\"PlaylistsNET\" Version=\"1.1.2\" />\n    <PackageReference Include=\"SixLabors.ImageSharp\" Version=\"1.0.0\" />\n    <TrimmerRootAssembly Include=\"System.Text.Json\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Include=\"Resources\\DefaultRights.toml\" />\n    <EmbeddedResource Include=\"Media\\SleepingKitty.png\" />\n    <EmbeddedResource Include=\"Resources\\NLog.config\">\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n  </ItemGroup>\n\n  <ItemGroup>\n    <Content Include=\"lib\\x64\\libopus.dll\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n      <PackagePath>.</PackagePath>\n      <Pack>true</Pack>\n    </Content>\n    <Content Include=\"lib\\x86\\libopus.dll\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n      <PackagePath>.</PackagePath>\n      <Pack>true</Pack>\n    </Content>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\TSLib\\TSLib.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Localization\\strings.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>strings.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Update=\"Localization\\strings.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>strings.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n\n  <Target Name=\"GenerateGitVersion\" BeforeTargets=\"BeforeCompile\">\n    <ItemGroup>\n      <VersionBuildScript Include=\"build.csx\" />\n      <VersionBuildOutputFile Include=\"$(IntermediateOutputPath)Version.g.cs\" />\n    </ItemGroup>\n    <Exec Command=\"dotnet tool install --global dotnet-script\" IgnoreExitCode=\"true\" />\n    <Exec Command=\"dotnet tool install --global GitVersion.Tool\" IgnoreExitCode=\"true\" />\n    <Exec Command=\"dotnet script @(VersionBuildScript) -- @(VersionBuildOutputFile) $(Configuration)\" IgnoreExitCode=\"true\">\n      <Output TaskParameter=\"ExitCode\" PropertyName=\"GitverExit\" />\n    </Exec>\n    <ItemGroup Condition=\"$(GitverExit) == '0'\">\n      <FileWrites Include=\"@(VersionBuildOutputFile)\" />\n      <Compile Include=\"@(VersionBuildOutputFile)\">\n        <AutoGen>True</AutoGen>\n      </Compile>\n    </ItemGroup>\n  </Target>\n</Project>\n"
  },
  {
    "path": "TS3AudioBot/TS3AudioBot.csproj.user",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"Current\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <_LastSelectedProfileId>C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\Properties\\PublishProfiles\\FolderProfile.pubxml</_LastSelectedProfileId>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "TS3AudioBot/Ts3Client.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Algorithm;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TSLib;\nusing TSLib.Commands;\nusing TSLib.Full;\nusing TSLib.Helper;\nusing TSLib.Messages;\nusing CmdE = System.Threading.Tasks.Task<System.E<TS3AudioBot.Localization.LocalStr>>;\n\nnamespace TS3AudioBot\n{\n\tpublic sealed class Ts3Client\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate readonly Id id;\n\n\t\tpublic event AsyncEventHandler? OnBotConnected;\n\t\tpublic event AsyncEventHandler<DisconnectEventArgs>? OnBotDisconnected;\n\t\tpublic event AsyncEventHandler? OnBotStoppedReconnecting;\n\t\tpublic event AsyncEventHandler<TextMessage>? OnMessageReceived;\n\t\tpublic event AsyncEventHandler<AloneChanged>? OnAloneChanged;\n\t\tpublic event EventHandler? OnWhisperNoTarget;\n\n\t\tprivate static readonly string[] QuitMessages = {\n\t\t\t\"I'm outta here\", \"You're boring\", \"Have a nice day\", \"Bye\", \"Good night\",\n\t\t\t\"Nothing to do here\", \"Taking a break\", \"Lorem ipsum dolor sit amet…\",\n\t\t\t\"Nothing can hold me back\", \"It's getting quiet\", \"Drop the bazzzzzz\",\n\t\t\t\"Never gonna give you up\", \"Never gonna let you down\", \"Keep rockin' it\",\n\t\t\t\"?\", \"c(ꙩ_Ꙩ)ꜿ\", \"I'll be back\", \"Your advertisement could be here\",\n\t\t\t\"connection lost\", \"disconnected\", \"Requested by API.\",\n\t\t\t\"Robert'); DROP TABLE students;--\", \"It works!! No, wait...\",\n\t\t\t\"Notice me, senpai\", \":wq\", \"Soon™\", \"It's not a bug, it's a feature\"\n\t\t};\n\n\t\tprivate bool closed = false;\n\t\tprivate int reconnectCounter;\n\t\tprivate ReconnectType? lastReconnect;\n\n\t\tprivate readonly ConfBot config;\n\t\tprivate readonly TsFullClient ts3FullClient;\n\t\tprivate IdentityData? identity;\n\t\tprivate List<ClientList> clientbuffer = new List<ClientList>();\n\t\tprivate bool clientbufferOutdated = true;\n\t\tprivate readonly TimedCache<ClientDbId, ClientDbInfo> clientDbNames = new TimedCache<ClientDbId, ClientDbInfo>();\n\t\tprivate readonly LruCache<Uid, ClientDbId> dbIdCache = new LruCache<Uid, ClientDbId>(128);\n\t\tprivate bool alone = true;\n\t\tprivate ChannelId? reconnectChannel = null;\n\t\tprivate ClientId[] ownChannelClients = Array.Empty<ClientId>();\n\n\t\tpublic bool Connected => ts3FullClient.Connected;\n\t\tpublic TsConst ServerConstants => ts3FullClient.ServerConstants;\n\n\t\tpublic Ts3Client(ConfBot config, TsFullClient ts3FullClient, Id id)\n\t\t{\n\t\t\tthis.id = id;\n\n\t\t\tthis.ts3FullClient = ts3FullClient;\n\t\t\tts3FullClient.OnEachTextMessage += ExtendedTextMessage;\n\t\t\tts3FullClient.OnErrorEvent += TsFullClient_OnErrorEvent;\n\t\t\tts3FullClient.OnDisconnected += TsFullClient_OnDisconnected;\n\t\t\tts3FullClient.OnEachClientMoved += async (_, e) =>\n\t\t\t{\n\t\t\t\tUpdateReconnectChannel(e.ClientId, e.TargetChannelId);\n\t\t\t\tif (AloneRecheckRequired(e.ClientId, e.TargetChannelId)) await IsAloneRecheck();\n\t\t\t};\n\t\t\tts3FullClient.OnEachClientEnterView += async (_, e) =>\n\t\t\t{\n\t\t\t\tUpdateReconnectChannel(e.ClientId, e.TargetChannelId);\n\t\t\t\tif (AloneRecheckRequired(e.ClientId, e.TargetChannelId)) await IsAloneRecheck();\n\t\t\t\telse if (AloneRecheckRequired(e.ClientId, e.SourceChannelId)) await IsAloneRecheck();\n\t\t\t};\n\t\t\tts3FullClient.OnEachClientLeftView += async (_, e) =>\n\t\t\t{\n\t\t\t\tUpdateReconnectChannel(e.ClientId, e.TargetChannelId);\n\t\t\t\tif (AloneRecheckRequired(e.ClientId, e.TargetChannelId)) await IsAloneRecheck();\n\t\t\t\telse if (AloneRecheckRequired(e.ClientId, e.SourceChannelId)) await IsAloneRecheck();\n\t\t\t};\n\n\t\t\tthis.config = config;\n\t\t\tidentity = null;\n\t\t}\n\n\t\tpublic E<string> Connect()\n\t\t{\n\t\t\t// get or compute identity\n\t\t\tvar identityConf = config.Connect.Identity;\n\t\t\tif (string.IsNullOrEmpty(identityConf.PrivateKey))\n\t\t\t{\n\t\t\t\tidentity = TsCrypt.GenerateNewIdentity();\n\t\t\t\tidentityConf.PrivateKey.Value = identity.PrivateKeyString;\n\t\t\t\tidentityConf.Offset.Value = identity.ValidKeyOffset;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar identityResult = TsCrypt.LoadIdentityDynamic(identityConf.PrivateKey.Value, identityConf.Offset.Value);\n\t\t\t\tif (!identityResult.Ok)\n\t\t\t\t{\n\t\t\t\t\tLog.Error(\"The identity from the config file is corrupted. Remove it to generate a new one next start; or try to repair it.\");\n\t\t\t\t\treturn \"Corrupted identity\";\n\t\t\t\t}\n\t\t\t\tidentity = identityResult.Value;\n\t\t\t\tidentityConf.PrivateKey.Value = identity.PrivateKeyString;\n\t\t\t\tidentityConf.Offset.Value = identity.ValidKeyOffset;\n\t\t\t}\n\n\t\t\t// check required security level\n\t\t\tif (identityConf.Level.Value >= 0 && identityConf.Level.Value <= 160)\n\t\t\t\tUpdateIndentityToSecurityLevel(identityConf.Level.Value);\n\t\t\telse if (identityConf.Level.Value != -1)\n\t\t\t\tLog.Warn(\"Invalid config value for 'Level', enter a number between '0' and '160' or '-1' to adapt automatically.\");\n\t\t\tconfig.SaveWhenExists();\n\n\t\t\treconnectCounter = 0;\n\t\t\tlastReconnect = null;\n\t\t\treconnectChannel = null;\n\t\t\tts3FullClient.QuitMessage = Tools.PickRandom(QuitMessages);\n\t\t\tClearAllCaches();\n\t\t\t_ = ConnectClient();\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tprivate async Task ConnectClient()\n\t\t{\n\t\t\tif (identity is null) throw new InvalidOperationException();\n\n\t\t\tif (closed)\n\t\t\t\treturn;\n\n\t\t\tTsVersionSigned? versionSign;\n\t\t\tif (!string.IsNullOrEmpty(config.Connect.ClientVersion.Build.Value))\n\t\t\t{\n\t\t\t\tvar versionConf = config.Connect.ClientVersion;\n\t\t\t\tversionSign = TsVersionSigned.TryParse(versionConf.Build, versionConf.Platform.Value, versionConf.Sign);\n\n\t\t\t\tif (versionSign is null)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(\"Invalid version sign, falling back to unknown :P\");\n\t\t\t\t\tversionSign = TsVersionSigned.VER_WIN_3_X_X;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (Tools.IsLinux)\n\t\t\t{\n\t\t\t\tversionSign = TsVersionSigned.VER_LIN_3_X_X;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tversionSign = TsVersionSigned.VER_WIN_3_X_X;\n\t\t\t}\n\n\t\t\tvar connectionConfig = new ConnectionDataFull(config.Connect.Address, identity,\n\t\t\t\tversionSign: versionSign,\n\t\t\t\tusername: config.Connect.Name,\n\t\t\t\tserverPassword: config.Connect.ServerPassword.Get(),\n\t\t\t\tdefaultChannel: reconnectChannel?.ToPath() ?? config.Connect.Channel,\n\t\t\t\tdefaultChannelPassword: config.Connect.ChannelPassword.Get(),\n\t\t\t\tlogId: id);\n\n\t\t\tconfig.SaveWhenExists().UnwrapToLog(Log);\n\n\t\t\tif (!(await ts3FullClient.Connect(connectionConfig)).GetOk(out var error))\n\t\t\t{\n\t\t\t\tLog.Error(\"Could not connect: {0}\", error.ErrorFormat());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tLog.Info(\"Client connected.\");\n\t\t\treconnectCounter = 0;\n\t\t\tlastReconnect = null;\n\n\t\t\tawait OnBotConnected.InvokeAsync(this);\n\t\t}\n\n\t\tpublic async Task Disconnect()\n\t\t{\n\t\t\tclosed = true;\n\t\t\tawait ts3FullClient.Disconnect();\n\t\t\tts3FullClient.Dispose();\n\t\t}\n\n\t\tprivate void UpdateIndentityToSecurityLevel(int targetLevel)\n\t\t{\n\t\t\tif (identity is null) throw new InvalidOperationException();\n\t\t\tif (TsCrypt.GetSecurityLevel(identity) < targetLevel)\n\t\t\t{\n\t\t\t\tLog.Info(\"Calculating up to required security level: {0}\", targetLevel);\n\t\t\t\tTsCrypt.ImproveSecurity(identity, targetLevel);\n\t\t\t\tconfig.Connect.Identity.Offset.Value = identity.ValidKeyOffset;\n\t\t\t}\n\t\t}\n\n\t\t#region TSLib functions wrapper\n\n\t\tpublic Task SendMessage(string message, ClientId clientId) => ts3FullClient.SendPrivateMessage(message, clientId).UnwrapThrow();\n\t\tpublic Task SendChannelMessage(string message) => ts3FullClient.SendChannelMessage(message).UnwrapThrow();\n\t\tpublic Task SendServerMessage(string message) => ts3FullClient.SendServerMessage(message, 1).UnwrapThrow();\n\n\t\tpublic Task KickClientFromServer(params ClientId[] clientId) => ts3FullClient.KickClientFromServer(clientId).UnwrapThrow();\n\t\tpublic Task KickClientFromChannel(params ClientId[] clientId) => ts3FullClient.KickClientFromChannel(clientId).UnwrapThrow();\n\n\t\tpublic Task ChangeDescription(string description)\n\t\t\t=> ts3FullClient.ChangeDescription(description).UnwrapThrow();\n\n\t\tpublic Task ChangeBadges(string badgesString)\n\t\t{\n\t\t\tif (!badgesString.StartsWith(\"overwolf=\") && !badgesString.StartsWith(\"badges=\"))\n\t\t\t\tbadgesString = \"overwolf=0:badges=\" + badgesString;\n\t\t\treturn ts3FullClient.ChangeBadges(badgesString).UnwrapThrow();\n\t\t}\n\n\t\tpublic Task ChangeName(string name)\n\t\t\t=> ts3FullClient.ChangeName(name).UnwrapThrow(e =>\n\t\t\t\t(e == TsErrorCode.parameter_invalid_size ? strings.error_ts_invalid_name : null, false)\n\t\t\t);\n\n\t\tpublic Task<ClientList> GetCachedClientById(ClientId id) => ClientBufferRequest(client => client.ClientId == id);\n\n\t\tpublic async Task<ClientList> GetFallbackedClientById(ClientId id)\n\t\t{\n\t\t\ttry { return await ClientBufferRequest(client => client.ClientId == id); }\n\t\t\tcatch (AudioBotException) { }\n\t\t\tLog.Warn(\"Slow double request due to missing or wrong permission configuration!\");\n\t\t\tClientList clientInfo = await ts3FullClient.Send<ClientList>(\"clientinfo\", new CommandParameter(\"clid\", id))\n\t\t\t\t.MapToSingle()\n\t\t\t\t.UnwrapThrow(_ => (strings.error_ts_no_client_found, true));\n\t\t\tclientInfo.ClientId = id;\n\t\t\tclientbuffer.Add(clientInfo);\n\t\t\treturn clientInfo;\n\t\t}\n\n\t\tpublic async Task<ClientList> GetClientByName(string name)\n\t\t{\n\t\t\tawait RefreshClientBuffer(false);\n\t\t\tvar client = Filter.DefaultFilter.Filter(\n\t\t\t\tclientbuffer.Select(cb => new KeyValuePair<string, ClientList>(cb.Name, cb)), name).FirstOrDefault().Value;\n\t\t\tif (client is null)\n\t\t\t\tthrow new CommandException(strings.error_ts_no_client_found);\n\t\t\treturn client;\n\t\t}\n\n\t\tprivate async Task<ClientList> ClientBufferRequest(Predicate<ClientList> pred)\n\t\t{\n\t\t\tawait RefreshClientBuffer(false);\n\t\t\tvar clientData = clientbuffer.Find(pred);\n\t\t\tif (clientData is null)\n\t\t\t\tthrow new CommandException(strings.error_ts_no_client_found);\n\t\t\treturn clientData;\n\t\t}\n\n\t\tpublic async ValueTask RefreshClientBuffer(bool force)\n\t\t{\n\t\t\tif (clientbufferOutdated || force)\n\t\t\t{\n\t\t\t\tvar result = await ts3FullClient.ClientList(ClientListOptions.uid);\n\t\t\t\tif (!result)\n\t\t\t\t{\n\t\t\t\t\tLog.Debug(\"Clientlist failed ({0})\", result.Error.ErrorFormat());\n\t\t\t\t\tthrow new TeamSpeakErrorCommandException(result.Error.FormatLocal().Str, result.Error);\n\t\t\t\t}\n\t\t\t\tclientbuffer = result.Value.ToList();\n\t\t\t\tclientbufferOutdated = false;\n\t\t\t}\n\t\t}\n\n\t\tpublic async Task<ServerGroupId[]> GetClientServerGroups(ClientDbId dbId)\n\t\t{\n\t\t\tvar result = await ts3FullClient.ServerGroupsByClientDbId(dbId).UnwrapThrow(_ => (strings.error_ts_no_client_found, true));\n\t\t\treturn result.Select(csg => csg.ServerGroupId).ToArray();\n\t\t}\n\n\t\tpublic async Task<ClientDbInfo> GetDbClientByDbId(ClientDbId clientDbId)\n\t\t{\n\t\t\tif (clientDbNames.TryGetValue(clientDbId, out var clientData))\n\t\t\t\treturn clientData;\n\n\t\t\tclientData = await ts3FullClient.ClientDbInfo(clientDbId).UnwrapThrow(_ => (strings.error_ts_no_client_found, true));\n\t\t\tclientDbNames.Set(clientDbId, clientData);\n\t\t\treturn clientData;\n\t\t}\n\n\t\tpublic Task<ClientInfo> GetClientInfoById(ClientId id) => ts3FullClient.ClientInfo(id).UnwrapThrow(_ => (strings.error_ts_no_client_found, true));\n\n\t\tpublic async Task<ClientDbId> GetClientDbIdByUid(Uid uid)\n\t\t{\n\t\t\tif (dbIdCache.TryGetValue(uid, out var dbid))\n\t\t\t\treturn dbid;\n\n\t\t\tvar client = await ts3FullClient.GetClientDbIdFromUid(uid).UnwrapThrow(_ => (strings.error_ts_no_client_found, true));\n\n\t\t\tdbIdCache.Set(client.ClientUid, client.ClientDbId);\n\t\t\treturn client.ClientDbId;\n\t\t}\n\n\t\tpublic async Task SetupRights(string? key)\n\t\t{\n\t\t\tvar self = ts3FullClient.Book.Self();\n\t\t\tif (self is null)\n\t\t\t{\n\t\t\t\tLog.Error(\"Getting self failed\");\n\t\t\t\tthrow new CommandException(strings.cmd_bot_setup_error);\n\t\t\t}\n\t\t\tvar myDbId = self.DatabaseId;\n\n\t\t\t// Check all own server groups\n\t\t\tServerGroupId[] groups;\n\t\t\tbool groupsOk;\n\t\t\ttry { groups = await GetClientServerGroups(myDbId); groupsOk = true; }\n\t\t\tcatch { groups = Array.Empty<ServerGroupId>(); groupsOk = false; }\n\n\t\t\t// Add self to master group (via token)\n\t\t\tif (!string.IsNullOrEmpty(key))\n\t\t\t{\n\t\t\t\tvar privKeyUseResult = await ts3FullClient.PrivilegeKeyUse(key);\n\t\t\t\tif (!privKeyUseResult.Ok)\n\t\t\t\t{\n\t\t\t\t\tLog.Error(\"Using privilege key failed ({0})\", privKeyUseResult.Error.ErrorFormat());\n\t\t\t\t\tthrow new CommandException(strings.cmd_bot_setup_error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remember new group (or check if in new group at all)\n\t\t\tvar groupDiff = Array.Empty<ServerGroupId>();\n\t\t\tif (groupsOk)\n\t\t\t{\n\t\t\t\tServerGroupId[] groupsNew;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tgroupsNew = await GetClientServerGroups(myDbId);\n\t\t\t\t\tgroupDiff = groupsNew.Except(groups).ToArray();\n\t\t\t\t}\n\t\t\t\tcatch { }\n\t\t\t}\n\n\t\t\tif (config.BotGroupId == 0)\n\t\t\t{\n\t\t\t\t// Create new Bot group\n\t\t\t\tvar botGroup = await ts3FullClient.ServerGroupAdd(\"ServerBot\");\n\t\t\t\tif (botGroup.Ok)\n\t\t\t\t{\n\t\t\t\t\tconfig.BotGroupId.Value = botGroup.Value.ServerGroupId.Value;\n\n\t\t\t\t\t// Add self to new group\n\t\t\t\t\tvar grpresult = await ts3FullClient.ServerGroupAddClient(botGroup.Value.ServerGroupId, myDbId);\n\t\t\t\t\tif (!grpresult.Ok)\n\t\t\t\t\t\tLog.Error(\"Adding group failed ({0})\", grpresult.Error.ErrorFormat());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst int max = 75;\n\t\t\tconst int ava = 500000; // max size in bytes for the avatar\n\n\t\t\t// Add various rights to the bot group\n\t\t\tvar permresult = await ts3FullClient.ServerGroupAddPerm((ServerGroupId)config.BotGroupId.Value,\n\t\t\t\tnew[] {\n\t\t\t\t\tTsPermission.i_client_whisper_power, // + Required for whisper channel playing\n\t\t\t\t\tTsPermission.i_client_private_textmessage_power, // + Communication\n\t\t\t\t\tTsPermission.b_client_server_textmessage_send, // + Communication\n\t\t\t\t\tTsPermission.b_client_channel_textmessage_send, // + Communication\n\n\t\t\t\t\tTsPermission.b_client_modify_dbproperties, // ? Dont know but seems also required for the next one\n\t\t\t\t\tTsPermission.b_client_modify_description, // + Used to change the description of our bot\n\t\t\t\t\tTsPermission.b_client_info_view, // (+) only used as fallback usually\n\t\t\t\t\tTsPermission.b_virtualserver_client_list, // ? Dont know but seems also required for the next one\n\n\t\t\t\t\tTsPermission.i_channel_subscribe_power, // + Required to find user to communicate\n\t\t\t\t\tTsPermission.b_virtualserver_client_dbinfo, // + Required to get basic user information for history, api, etc...\n\t\t\t\t\tTsPermission.i_client_talk_power, // + Required for normal channel playing\n\t\t\t\t\tTsPermission.b_client_modify_own_description, // ? not sure if this makes b_client_modify_description superfluous\n\n\t\t\t\t\tTsPermission.b_group_is_permanent, // + Group should stay even if bot disconnects\n\t\t\t\t\tTsPermission.i_client_kick_from_channel_power, // + Optional for kicking\n\t\t\t\t\tTsPermission.i_client_kick_from_server_power, // + Optional for kicking\n\t\t\t\t\tTsPermission.i_client_max_clones_uid, // + In case that bot times out and tries to join again\n\n\t\t\t\t\tTsPermission.b_client_ignore_antiflood, // + The bot should be resistent to forced spam attacks\n\t\t\t\t\tTsPermission.b_channel_join_ignore_password, // + The noble bot will not abuse this power\n\t\t\t\t\tTsPermission.b_channel_join_permanent, // + Allow joining to all channel even on strict servers\n\t\t\t\t\tTsPermission.b_channel_join_semi_permanent, // + Allow joining to all channel even on strict servers\n\n\t\t\t\t\tTsPermission.b_channel_join_temporary, // + Allow joining to all channel even on strict servers\n\t\t\t\t\tTsPermission.b_channel_join_ignore_maxclients, // + Allow joining full channels\n\t\t\t\t\tTsPermission.i_channel_join_power, // + Allow joining to all channel even on strict servers\n\t\t\t\t\tTsPermission.b_client_permissionoverview_view, // + Scanning through given perms for rights system\n\n\t\t\t\t\tTsPermission.i_client_max_avatar_filesize, // + Uploading thumbnails as avatar\n\t\t\t\t\tTsPermission.b_client_use_channel_commander, // + Enable channel commander\n\t\t\t\t\tTsPermission.b_client_ignore_bans, // + The bot should be resistent to bans\n\t\t\t\t\tTsPermission.b_client_ignore_sticky, // + Should skip weird movement restrictions\n\n\t\t\t\t\tTsPermission.i_client_max_channel_subscriptions, // + Required to find user to communicate\n\t\t\t\t},\n\t\t\t\tnew[] {\n\t\t\t\t\tmax, max,   1,   1,\n\t\t\t\t\t  1,   1,   1,   1,\n\t\t\t\t\tmax,   1, max,   1,\n\t\t\t\t\t  1, max, max,   4,\n\t\t\t\t\t  1,   1,   1,   1,\n\t\t\t\t\t  1,   1, max,   1,\n\t\t\t\t\tava,   1,   1,   1,\n\t\t\t\t\t -1,\n\t\t\t\t},\n\t\t\t\tnew[] {\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse,\n\t\t\t\t},\n\t\t\t\tnew[] {\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse, false, false, false,\n\t\t\t\t\tfalse,\n\t\t\t\t});\n\n\t\t\tif (!permresult)\n\t\t\t\tLog.Error(\"Adding permissions failed ({0})\", permresult.Error.ErrorFormat());\n\n\t\t\t// Leave master group again\n\t\t\tif (groupDiff.Length > 0)\n\t\t\t{\n\t\t\t\tforeach (var grp in groupDiff)\n\t\t\t\t{\n\t\t\t\t\tvar grpresult = await ts3FullClient.ServerGroupDelClient(grp, myDbId);\n\t\t\t\t\tif (!grpresult.Ok)\n\t\t\t\t\t\tLog.Error(\"Removing group failed ({0})\", grpresult.Error.ErrorFormat());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic Task UploadAvatar(System.IO.Stream stream)\n\t\t\t=> ts3FullClient.UploadAvatar(stream).UnwrapThrow(e =>\n\t\t\t\t(e == TsErrorCode.permission_invalid_size ? strings.error_ts_file_too_big : null, false)\n\t\t\t);\n\n\t\tpublic Task DeleteAvatar() => ts3FullClient.DeleteAvatar().UnwrapThrow();\n\n\t\tpublic Task MoveTo(ChannelId channelId, string? password = null)\n\t\t\t=> ts3FullClient.ClientMove(ts3FullClient.ClientId, channelId, password).UnwrapThrow(_ => (strings.error_ts_cannot_move, true));\n\n\t\tpublic Task SetChannelCommander(bool isCommander)\n\t\t\t=> ts3FullClient.ChangeIsChannelCommander(isCommander).UnwrapThrow(_ => (strings.error_ts_cannot_set_commander, true));\n\n\t\tpublic async Task<bool> IsChannelCommander()\n\t\t\t=> (await GetClientInfoById(ts3FullClient.ClientId)).IsChannelCommander;\n\n\t\tpublic void InvalidateClientBuffer() => clientbufferOutdated = true;\n\n\t\tprivate void ClearAllCaches()\n\t\t{\n\t\t\tInvalidateClientBuffer();\n\t\t\tdbIdCache.Clear();\n\t\t\tclientDbNames.Clear();\n\t\t\talone = true;\n\t\t\townChannelClients = Array.Empty<ClientId>();\n\t\t}\n\n\t\t#endregion\n\n\t\t#region Events\n\n\t\tprivate void TsFullClient_OnErrorEvent(object? sender, CommandError error)\n\t\t{\n\t\t\tswitch (error.Id)\n\t\t\t{\n\t\t\tcase TsErrorCode.whisper_no_targets:\n\t\t\t\tOnWhisperNoTarget?.Invoke(this, EventArgs.Empty);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tLog.Debug(\"Got ts3 error event: {0}\", error.ErrorFormat());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tprivate async void TsFullClient_OnDisconnected(object? sender, DisconnectEventArgs e)\n\t\t{\n\t\t\tawait OnBotDisconnected.InvokeAsync(this, e);\n\n\t\t\tif (e.Error != null)\n\t\t\t{\n\t\t\t\tvar error = e.Error;\n\t\t\t\tswitch (error.Id)\n\t\t\t\t{\n\t\t\t\tcase TsErrorCode.client_could_not_validate_identity:\n\t\t\t\t\tif (config.Connect.Identity.Level.Value == -1 && !string.IsNullOrEmpty(error.ExtraMessage))\n\t\t\t\t\t{\n\t\t\t\t\t\tint targetSecLevel = int.Parse(error.ExtraMessage);\n\t\t\t\t\t\tUpdateIndentityToSecurityLevel(targetSecLevel); // TODO Async\n\t\t\t\t\t\tawait ConnectClient();\n\t\t\t\t\t\treturn; // skip triggering event, we want to reconnect\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Warn(\"The server reported that the security level you set is not high enough.\" +\n\t\t\t\t\t\t\t\"Increase the value to '{0}' or set it to '-1' to generate it on demand when connecting.\", error.ExtraMessage);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TsErrorCode.client_too_many_clones_connected:\n\t\t\t\t\tLog.Warn(\"Another client with the same identity is already connected.\");\n\t\t\t\t\tif (await TryReconnect(ReconnectType.Error))\n\t\t\t\t\t\treturn;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TsErrorCode.connect_failed_banned:\n\t\t\t\t\tLog.Warn(\"This bot is banned.\");\n\t\t\t\t\tif (await TryReconnect(ReconnectType.Ban))\n\t\t\t\t\t\treturn;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tLog.Warn(\"Could not connect: {0}\", error.ErrorFormat());\n\t\t\t\t\tif (await TryReconnect(ReconnectType.Error))\n\t\t\t\t\t\treturn;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tLog.Debug(\"Bot disconnected. Reason: {0}\", e.ExitReason);\n\n\t\t\t\tif (await TryReconnect(e.ExitReason switch\n\t\t\t\t{\n\t\t\t\t\tReason.Timeout => ReconnectType.Timeout,\n\t\t\t\t\tReason.SocketError => ReconnectType.Timeout,\n\t\t\t\t\tReason.KickedFromServer => ReconnectType.Kick,\n\t\t\t\t\tReason.ServerShutdown => ReconnectType.ServerShutdown,\n\t\t\t\t\tReason.ServerStopped => ReconnectType.ServerShutdown,\n\t\t\t\t\tReason.Banned => ReconnectType.Ban,\n\t\t\t\t\t_ => ReconnectType.None\n\t\t\t\t})) return;\n\t\t\t}\n\n\t\t\tawait OnBotStoppedReconnecting.InvokeAsync(this);\n\t\t}\n\n\t\tprivate async Task<bool> TryReconnect(ReconnectType type)\n\t\t{\n\t\t\tif (closed)\n\t\t\t\treturn false;\n\n\t\t\t// Check if we want to keep the last disconnect type\n\t\t\tif (type == ReconnectType.Timeout && lastReconnect == ReconnectType.ServerShutdown)\n\t\t\t{\n\t\t\t\ttype = lastReconnect.Value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (lastReconnect != type)\n\t\t\t\t\treconnectCounter = 0;\n\t\t\t\tlastReconnect = type;\n\t\t\t}\n\n\t\t\tTimeSpan? delay;\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\tcase ReconnectType.Timeout: delay = config.Reconnect.OnTimeout.GetValueAsTime(reconnectCounter); break;\n\t\t\tcase ReconnectType.Kick: delay = config.Reconnect.OnKick.GetValueAsTime(reconnectCounter); break;\n\t\t\tcase ReconnectType.Ban: delay = config.Reconnect.OnBan.GetValueAsTime(reconnectCounter); break;\n\t\t\tcase ReconnectType.ServerShutdown: delay = config.Reconnect.OnShutdown.GetValueAsTime(reconnectCounter); break;\n\t\t\tcase ReconnectType.Error: delay = config.Reconnect.OnError.GetValueAsTime(reconnectCounter); break;\n\t\t\tcase ReconnectType.None:\n\t\t\t\treturn false;\n\t\t\tdefault: throw Tools.UnhandledDefault(type);\n\t\t\t}\n\t\t\treconnectCounter++;\n\n\t\t\tif (delay == null)\n\t\t\t{\n\t\t\t\tLog.Info(\"Reconnect strategy for '{0}' has reached the end. Closing instance.\", type);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tLog.Info(\"Trying to reconnect because of {0}. Delaying reconnect for {1:0} seconds\", type, delay.Value.TotalSeconds);\n\t\t\tawait Task.Delay(delay.Value); // TODO: Async add cancellation token ?\n\t\t\tawait ConnectClient();\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate async void ExtendedTextMessage(object? sender, TextMessage textMessage)\n\t\t{\n\t\t\t// Prevent loopback of own textmessages\n\t\t\tif (textMessage.InvokerId == ts3FullClient.ClientId)\n\t\t\t\treturn;\n\t\t\tawait OnMessageReceived.InvokeAsync(sender, textMessage);\n\t\t}\n\n\t\tprivate void UpdateReconnectChannel(ClientId clientId, ChannelId channelId)\n\t\t{\n\t\t\tif (clientId == ts3FullClient.ClientId && channelId != ChannelId.Null)\n\t\t\t\treconnectChannel = channelId;\n\t\t}\n\n\t\tprivate bool AloneRecheckRequired(ClientId clientId, ChannelId channelId)\n\t\t\t=> ownChannelClients.Contains(clientId) || channelId == ts3FullClient.Book.Self()?.Channel;\n\n\t\tprivate async ValueTask IsAloneRecheck()\n\t\t{\n\t\t\tvar self = ts3FullClient.Book.Self();\n\t\t\tif (self is null)\n\t\t\t\treturn;\n\t\t\tvar ownChannel = self.Channel;\n\t\t\townChannelClients = ts3FullClient.Book.Clients.Values.Where(c => c.Channel == ownChannel && c != self).Select(c => c.Id).ToArray();\n\t\t\tvar newAlone = ownChannelClients.Length == 0;\n\t\t\tif (newAlone != alone)\n\t\t\t{\n\t\t\t\talone = newAlone;\n\t\t\t\tawait OnAloneChanged.InvokeAsync(this, new AloneChanged(newAlone));\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\tprivate enum ReconnectType\n\t\t{\n\t\t\tNone,\n\t\t\tTimeout,\n\t\t\tKick,\n\t\t\tBan,\n\t\t\tServerShutdown,\n\t\t\tError\n\t\t}\n\t}\n\n\tpublic class AloneChanged : EventArgs\n\t{\n\t\tpublic bool Alone { get; }\n\n\t\tpublic AloneChanged(bool alone)\n\t\t{\n\t\t\tAlone = alone;\n\t\t}\n\t}\n\n\tinternal static class CommandErrorExtentions\n\t{\n\t\tpublic static async Task<T> UnwrapThrow<T>(this Task<R<T, CommandError>> task, Func<TsErrorCode, (string? loc, bool msg)>? prefix = null) where T : notnull\n\t\t{\n\t\t\tvar result = await task;\n\t\t\tif (result.Ok)\n\t\t\t\treturn result.Value;\n\t\t\telse\n\t\t\t\tthrow new TeamSpeakErrorCommandException(result.Error.FormatLocal(prefix).Str, result.Error);\n\t\t}\n\n\t\tpublic static async Task UnwrapThrow(this Task<E<CommandError>> task, Func<TsErrorCode, (string? loc, bool msg)>? prefix = null)\n\t\t{\n\t\t\tvar result = await task;\n\t\t\tif (!result.Ok)\n\t\t\t\tthrow new TeamSpeakErrorCommandException(result.Error.FormatLocal(prefix).Str, result.Error);\n\t\t}\n\n\t\tpublic static async Task<R<T, LocalStr>> FormatLocal<T>(this Task<R<T, CommandError>> task, Func<TsErrorCode, (string? loc, bool msg)>? prefix = null) where T : notnull\n\t\t\t=> (await task).FormatLocal(prefix);\n\n\t\tpublic static R<T, LocalStr> FormatLocal<T>(this R<T, CommandError> cmdErr, Func<TsErrorCode, (string? loc, bool msg)>? prefix = null) where T : notnull\n\t\t{\n\t\t\tif (cmdErr.Ok)\n\t\t\t\treturn cmdErr.Value;\n\t\t\treturn cmdErr.Error.FormatLocal(prefix);\n\t\t}\n\n\t\tpublic static async CmdE FormatLocal(this Task<E<CommandError>> task, Func<TsErrorCode, (string? loc, bool msg)>? prefix = null)\n\t\t\t=> (await task).FormatLocal(prefix);\n\n\t\tpublic static E<LocalStr> FormatLocal(this E<CommandError> cmdErr, Func<TsErrorCode, (string? loc, bool msg)>? prefix = null)\n\t\t{\n\t\t\tif (cmdErr.Ok)\n\t\t\t\treturn R.Ok;\n\t\t\treturn cmdErr.Error.FormatLocal(prefix);\n\t\t}\n\n\t\tpublic static LocalStr FormatLocal(this CommandError err, Func<TsErrorCode, (string? loc, bool msg)>? prefix = null)\n\t\t{\n\t\t\tvar strb = new StringBuilder();\n\t\t\tbool msg = true;\n\n\t\t\tif (prefix != null)\n\t\t\t{\n\t\t\t\tstring? prefixStr;\n\t\t\t\t(prefixStr, msg) = prefix(err.Id);\n\t\t\t\tif (prefixStr != null)\n\t\t\t\t{\n\t\t\t\t\tstrb.Append(prefixStr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strb.Length == 0)\n\t\t\t{\n\t\t\t\tstrb.Append(strings.error_ts_unknown_error);\n\t\t\t}\n\n\t\t\tif (msg)\n\t\t\t{\n\t\t\t\tif (strb.Length > 0)\n\t\t\t\t\tstrb.Append(\" (\");\n\t\t\t\tvar localStr = LocalizationManager.GetString(\"error_ts_code_\" + (uint)err.Id);\n\t\t\t\tif (localStr != null)\n\t\t\t\t\tstrb.Append(localStr);\n\t\t\t\telse\n\t\t\t\t\tstrb.Append(err.Message);\n\t\t\t\tstrb.Append(')');\n\t\t\t}\n\n\t\t\tif (err.MissingPermissionId != TsPermission.undefined)\n\t\t\t\tstrb.Append(\" (\").Append(err.MissingPermissionId).Append(')');\n\n\t\t\treturn new LocalStr(strb.ToString());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Upgrader.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TS3AudioBot.Dependency;\n\nnamespace TS3AudioBot\n{\n\tinternal static class Upgrader\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate const string CoreTable = \"core\";\n\t\tprivate const int CurrentVersion = 1;\n\n\t\tpublic static void PerformUpgrades(CoreInjector injector)\n\t\t{\n\t\t\tvar database = injector.GetModuleOrThrow<DbStore>();\n\t\t\tvar meta = database.GetMetaData(CoreTable);\n\n\t\t\tvoid Advance(int version, string? explanation)\n\t\t\t{\n\t\t\t\tmeta.Version = version;\n\t\t\t\tdatabase.UpdateMetaData(meta);\n\t\t\t\tif (explanation != null)\n\t\t\t\t\tLog.Info(\"Upgrading data to ver {0}. {1}\", version, explanation);\n\t\t\t}\n\n\t\t\tswitch (meta.Version)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\t// Case 0 should always jump to the lastest version, since it gets created on first start.\n\t\t\t\tAdvance(CurrentVersion, null);\n\t\t\t\tgoto case CurrentVersion;\n\n\t\t\tcase CurrentVersion:\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tLog.Warn(\"It seems that you downgraded your TS3AB version. \" +\n\t\t\t\t\t\"Due to automatic upgrades some stuff might not work anymore, be advised. \" +\n\t\t\t\t\t\"It is recommended to backup data before upgrading to unstable/beta builds if you intend to downgrade again.\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/ApiCall.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Net;\nusing TSLib;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic class ApiCall : InvokerData\n\t{\n\t\tpublic string? Token { get; set; }\n\t\tpublic IPAddress? IpAddress { get; set; }\n\t\tpublic Uri? RequestUrl { get; set; }\n\t\tpublic string? Body { get; set; }\n\n\t\tpublic static ApiCall CreateAnonymous() => new ApiCall(Uid.Anonymous);\n\n\t\tpublic ApiCall(Uid clientUid, IPAddress? ipAddress = null, Uri? requestUrl = null, string? token = null, string? body = null) : base(clientUid)\n\t\t{\n\t\t\tToken = token;\n\t\t\tIpAddress = ipAddress;\n\t\t\tRequestUrl = requestUrl;\n\t\t\tBody = body;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/DataStream.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Microsoft.AspNetCore.Http;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic class DataStream\n\t{\n\t\tprivate readonly Func<HttpResponse, Task> writeFunc;\n\n\t\tpublic DataStream(Func<HttpResponse, Task> writeFunc)\n\t\t{\n\t\t\tthis.writeFunc = writeFunc;\n\t\t}\n\n\t\tpublic Task WriteOut(HttpResponse response) => writeFunc(response);\n\n\t\tpublic override string? ToString() => null;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/JsonArray.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic class JsonArray<T> : JsonValue<IList<T>>\n\t{\n\t\tpublic JsonArray(IList<T> value, string msg) : base(value, msg) { }\n\t\tpublic JsonArray(IList<T> value, Func<IList<T>, string>? asString = null)\n\t\t\t: base(value, asString)\n\t\t{ }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/JsonEmpty.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic class JsonEmpty : JsonObject\n\t{\n\t\tprivate readonly string message;\n\t\tpublic JsonEmpty(string msg) { message = msg; }\n\n\t\tpublic override object GetSerializeObject() => string.Empty;\n\t\tpublic override string Serialize() => string.Empty;\n\t\tpublic override string ToString() => message;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/JsonError.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing TS3AudioBot.CommandSystem;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic class JsonError : JsonObject\n\t{\n\t\tprivate static readonly JsonSerializerSettings ErrorSerializeSettings = new JsonSerializerSettings\n\t\t{\n\t\t\tNullValueHandling = NullValueHandling.Ignore,\n\t\t};\n\n\t\tprivate readonly CommandExceptionReason reason;\n\t\tpublic int ErrorCode => (int)reason;\n\t\tpublic string ErrorName => reason.ToString();\n\t\tpublic string ErrorMessage { get; }\n\t\tpublic string? HelpMessage { get; set; }\n\t\tpublic string? HelpLink { get; set; }\n\n\t\tpublic JsonError(string msg, CommandExceptionReason reason)\n\t\t{\n\t\t\tErrorMessage = msg;\n\t\t\tthis.reason = reason;\n\t\t}\n\n\t\tpublic override string Serialize() => JsonConvert.SerializeObject(GetSerializeObject(), ErrorSerializeSettings);\n\t\tpublic override string ToString() => ErrorMessage;\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/JsonObject.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing TS3AudioBot.CommandSystem.CommandResults;\nusing TS3AudioBot.Helper;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic abstract class JsonObject : IWrappedResult\n\t{\n\t\tprivate static readonly JsonSerializerSettings DefaultSettigs = new JsonSerializerSettings();\n\n\t\tstatic JsonObject()\n\t\t{\n\t\t\tDefaultSettigs.Converters.Add(new IJsonSerializableConverter());\n\t\t\tDefaultSettigs.Converters.Add(new TimeSpanConverter());\n\t\t}\n\n\t\tprotected JsonObject() { }\n\n\t\tobject? IWrappedResult.Content => GetSerializeObject();\n\t\tpublic virtual object GetSerializeObject() => this;\n\t\tpublic virtual string Serialize() => JsonConvert.SerializeObject(GetSerializeObject(), DefaultSettigs);\n\t\tpublic override abstract string ToString();\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/JsonValue.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\nusing TS3AudioBot.CommandSystem;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic class JsonValue<T> : JsonValue where T : notnull\n\t{\n\t\tprotected Func<T, string>? AsString { get; }\n\n\t\tnew public T Value => (T)base.Value;\n\n\t\tpublic JsonValue(T value) : base(value) { }\n\t\tpublic JsonValue(T value, string msg) : base(value, msg) { }\n\t\tpublic JsonValue(T value, Func<T, string>? asString) : base(value)\n\t\t{\n\t\t\tAsString = asString;\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tif (AsStringResult is null)\n\t\t\t{\n\t\t\t\tif (AsString != null)\n\t\t\t\t\tAsStringResult = AsString.Invoke(Value);\n\t\t\t\telse\n\t\t\t\t\tAsStringResult = Value?.ToString() ?? string.Empty;\n\t\t\t}\n\t\t\treturn AsStringResult;\n\t\t}\n\t}\n\n\tpublic abstract class JsonValue : JsonObject\n\t{\n\t\tprotected string? AsStringResult { get; set; }\n\t\tpublic object Value { get; }\n\n\t\tprotected JsonValue(object value) { Value = value; AsStringResult = null; }\n\t\tprotected JsonValue(object value, string msg) { Value = value; AsStringResult = msg ?? string.Empty; }\n\n\t\tpublic override object GetSerializeObject() => Value;\n\n\t\tpublic override string Serialize()\n\t\t{\n\t\t\tvar seriObj = GetSerializeObject();\n\t\t\tif (seriObj != null && CommandSystemTypes.BasicTypes.Contains(seriObj.GetType()))\n\t\t\t\treturn JsonConvert.SerializeObject(this);\n\t\t\treturn base.Serialize();\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tif (AsStringResult is null)\n\t\t\t\tAsStringResult = Value?.ToString() ?? string.Empty;\n\t\t\treturn AsStringResult;\n\t\t}\n\n\t\t// static creator methods for anonymous stuff\n\n\t\tpublic static JsonValue<T> Create<T>(T anon) where T : notnull => new JsonValue<T>(anon);\n\t\tpublic static JsonValue<T> Create<T>(T anon, string msg) where T : notnull => new JsonValue<T>(anon, msg);\n\t\tpublic static JsonValue<T> Create<T>(T anon, Func<T, string>? asString) where T : notnull => new JsonValue<T>(anon, asString);\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/OpenApiGenerator.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.CommandSystem.Commands;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic static class OpenApiGenerator\n\t{\n\t\tprivate static readonly JsonSerializer seri = JsonSerializer.CreateDefault();\n\n\t\tstatic OpenApiGenerator()\n\t\t{\n\t\t\tseri.NullValueHandling = NullValueHandling.Ignore;\n\t\t}\n\n\t\tpublic static JObject Generate(CommandManager commandManager, BotInfo[] bots)\n\t\t{\n\t\t\tvar paths = new JObject();\n\n\t\t\tvar addedCommandPaths = new HashSet<string>();\n\n\t\t\tforeach (var command in commandManager.AllCommands)\n\t\t\t{\n\t\t\t\tvar token = GenerateCommand(commandManager, command, addedCommandPaths);\n\t\t\t\tif (token != null)\n\t\t\t\t\tpaths.Add(token);\n\t\t\t}\n\n\t\t\tconst string defaultAuthSchemeName = \"default_basic\";\n\n\t\t\treturn\n\t\t\tnew JObject(\n\t\t\t\tnew JProperty(\"openapi\", \"3.0.0\"),\n\t\t\t\tJPropObj(\"info\",\n\t\t\t\t\tnew JProperty(\"version\", \"1.0.0\"),\n\t\t\t\t\tnew JProperty(\"title\", \"Ts3AudioBot API\"),\n\t\t\t\t\tnew JProperty(\"description\", \"The Ts3AudioBot api interface.\")\n\t\t\t\t),\n\t\t\t\tnew JProperty(\"paths\",\n\t\t\t\t\tpaths\n\t\t\t\t),\n\t\t\t\tnew JProperty(\"servers\",\n\t\t\t\t\tnew JArray(\n\t\t\t\t\t\tnew JObject(\n\t\t\t\t\t\t\tnew JProperty(\"url\", \"/api\"),\n\t\t\t\t\t\t\tnew JProperty(\"description\", \"Your Ts3AudioBot server.\")\n\t\t\t\t\t\t)\n\t\t\t\t\t).Chain(x =>\n\t\t\t\t\t{\n\t\t\t\t\t\tforeach (var bot in bots)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tx.Add(new JObject(\n\t\t\t\t\t\t\t\tnew JProperty(\"url\", $\"/api/bot/use/{bot.Id}/(/\"),\n\t\t\t\t\t\t\t\tnew JProperty(\"description\", $\"Bot {bot.Name}\")\n\t\t\t\t\t\t\t));\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tJPropObj(\"components\",\n\t\t\t\t\tJPropObj(\"securitySchemes\",\n\t\t\t\t\t\tJPropObj(defaultAuthSchemeName,\n\t\t\t\t\t\t\tnew JProperty(\"type\", \"http\"),\n\t\t\t\t\t\t\tnew JProperty(\"scheme\", \"basic\")\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\tnew JProperty(\"security\",\n\t\t\t\t\tnew JArray(\n\t\t\t\t\t\tnew JObject(\n\t\t\t\t\t\t\tnew JProperty(defaultAuthSchemeName, new JArray())\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tprivate static JToken? GenerateCommand(CommandManager commandManager, BotCommand command, HashSet<string> addedCommandPaths)\n\t\t{\n\t\t\tvar parameters = new JArray();\n\n\t\t\tvar pathBuilder = new StringBuilder();\n\t\t\tpathBuilder.Append(\"/\");\n\t\t\tpathBuilder.Append(command.InvokeName.Replace(' ', '/'));\n\t\t\tforeach (var param in command.CommandParameter)\n\t\t\t{\n\t\t\t\tswitch (param.Kind)\n\t\t\t\t{\n\t\t\t\tcase ParamKind.Unknown:\n\t\t\t\t\tbreak;\n\t\t\t\tcase ParamKind.SpecialArguments:\n\t\t\t\t\tbreak;\n\t\t\t\tcase ParamKind.Dependency:\n\t\t\t\t\tbreak;\n\t\t\t\tcase ParamKind.NormalCommand:\n\t\t\t\tcase ParamKind.NormalParam:\n\t\t\t\tcase ParamKind.NormalArray:\n\t\t\t\tcase ParamKind.NormalTailString:\n\t\t\t\t\tif (param.Kind == ParamKind.NormalArray)\n\t\t\t\t\t\tpathBuilder.Append(\"/{\").Append(param.Name).Append(\"}...\");\n\t\t\t\t\telse\n\t\t\t\t\t\tpathBuilder.Append(\"/{\").Append(param.Name).Append(\"}\");\n\n\t\t\t\t\tvar addparam = new JObject(\n\t\t\t\t\t\tnew JProperty(\"name\", param.Name),\n\t\t\t\t\t\tnew JProperty(\"in\", \"path\"),\n\t\t\t\t\t\tnew JProperty(\"description\", \"useful help\"),\n\t\t\t\t\t\tnew JProperty(\"required\", true) // param.optional\n\t\t\t\t\t);\n\n\t\t\t\t\tvar paramschema = NormalToSchema(param.Type);\n\t\t\t\t\tif (paramschema != null)\n\t\t\t\t\t\taddparam.Add(\"schema\", JObject.FromObject(paramschema, seri));\n\t\t\t\t\tparameters.Add(addparam);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(param.Kind);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar path = pathBuilder.ToString();\n\n\t\t\tif (addedCommandPaths.Contains(path))\n\t\t\t\treturn null;\n\t\t\taddedCommandPaths.Add(path);\n\n\t\t\t// check tag\n\n\t\t\tvar tags = new JArray();\n\t\t\tint spaceIndex = command.InvokeName.IndexOf(' ');\n\t\t\tstring baseName = spaceIndex >= 0 ? command.InvokeName.Substring(0, spaceIndex) : command.InvokeName;\n\t\t\tvar commandroot = commandManager.RootGroup.GetCommand(baseName);\n\t\t\tswitch (commandroot)\n\t\t\t{\n\t\t\tcase null:\n\t\t\t\tbreak;\n\t\t\tcase CommandGroup group:\n\t\t\t\ttags.Add(baseName);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// build final command\n\n\t\t\tvar reponseschema = NormalToSchema(command.CommandReturn);\n\n\t\t\treturn\n\t\t\tJPropObj(path,\n\t\t\t\tJPropObj(\"get\",\n\t\t\t\t\tnew JProperty(\"tags\", tags),\n\t\t\t\t\tnew JProperty(\"description\", command.Description),\n\t\t\t\t\tnew JProperty(\"parameters\", parameters),\n\t\t\t\t\tnew JProperty(\"responses\",\n\t\t\t\t\t\tnew JObject().Chain(r =>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (reponseschema != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tr.Add(\n\t\t\t\t\t\t\t\t\tJPropObj(\"200\",\n\t\t\t\t\t\t\t\t\t\tnew JProperty(\"description\", \"Successful\"),\n\t\t\t\t\t\t\t\t\t\tnew JProperty(\"content\",\n\t\t\t\t\t\t\t\t\t\t\tnew JObject(\n\t\t\t\t\t\t\t\t\t\t\t\tJPropObj(\"application/json\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tnew JProperty(\"schema\", JObject.FromObject(reponseschema, seri))\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tr.Add(\n\t\t\t\t\t\t\t\t\tJPropObj(\"204\",\n\t\t\t\t\t\t\t\t\t\tnew JProperty(\"description\", \"Successful\")\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tprivate static T Chain<T>(this T token, Action<T> func) where T : JToken\n\t\t{\n\t\t\tfunc.Invoke(token);\n\t\t\treturn token;\n\t\t}\n\n\t\tprivate static JProperty JPropObj(string name, params object[] token)\n\t\t{\n\t\t\treturn new JProperty(name, new JObject(token));\n\t\t}\n\n\t\tprivate static OApiSchema? NormalToSchema(Type type)\n\t\t{\n\t\t\ttype = FunctionCommand.UnwrapReturnType(type);\n\n\t\t\tif (type.IsArray)\n\t\t\t{\n\t\t\t\treturn new OApiSchema(\"array\")\n\t\t\t\t{\n\t\t\t\t\tItems = NormalToSchema(type.GetElementType()!)\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (type == typeof(bool)) return OApiSchema.FromBasic(\"boolean\");\n\t\t\telse if (type == typeof(sbyte)) return OApiSchema.FromBasic(\"integer\", \"int8\");\n\t\t\telse if (type == typeof(byte)) return OApiSchema.FromBasic(\"integer\", \"uint8\");\n\t\t\telse if (type == typeof(short)) return OApiSchema.FromBasic(\"integer\", \"int16\");\n\t\t\telse if (type == typeof(ushort)) return OApiSchema.FromBasic(\"integer\", \"uint16\");\n\t\t\telse if (type == typeof(int)) return OApiSchema.FromBasic(\"integer\", \"int32\");\n\t\t\telse if (type == typeof(uint)) return OApiSchema.FromBasic(\"integer\", \"uint32\");\n\t\t\telse if (type == typeof(long)) return OApiSchema.FromBasic(\"integer\", \"int64\");\n\t\t\telse if (type == typeof(ulong)) return OApiSchema.FromBasic(\"integer\", \"uint64\");\n\t\t\telse if (type == typeof(float)) return OApiSchema.FromBasic(\"number\", \"float\");\n\t\t\telse if (type == typeof(double)) return OApiSchema.FromBasic(\"number\", \"double\");\n\t\t\telse if (type == typeof(TimeSpan)) return OApiSchema.FromBasic(\"string\", \"duration\");\n\t\t\telse if (type == typeof(DateTime)) return OApiSchema.FromBasic(\"string\", \"date-time\");\n\t\t\telse if (type == typeof(string)) return OApiSchema.FromBasic(\"string\", null);\n\t\t\telse if (type == typeof(JsonEmpty) || type == typeof(void)) return null;\n\t\t\telse if (type == typeof(JsonObject) || type == typeof(object)) return OApiSchema.FromBasic(\"object\");\n\t\t\telse if (type == typeof(ICommand)) return OApiSchema.FromBasic(\"λ\");\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn OApiSchema.FromBasic(type.Name);\n\t\t\t}\n\t\t}\n\n\t\tprivate class OApiSchema\n\t\t{\n\t\t\t[JsonProperty(PropertyName = \"type\")]\n\t\t\tpublic string Type { get; set; }\n\t\t\t[JsonProperty(PropertyName = \"format\")]\n\t\t\tpublic string? Format { get; set; }\n\t\t\t[JsonProperty(PropertyName = \"additionalProperties\")]\n\t\t\tpublic OApiSchema? AdditionalProperties { get; set; }\n\t\t\t[JsonProperty(PropertyName = \"items\")]\n\t\t\tpublic OApiSchema? Items { get; set; }\n\n\t\t\tpublic OApiSchema(string type)\n\t\t\t{\n\t\t\t\tType = type;\n\t\t\t}\n\n\t\t\tpublic static OApiSchema FromBasic(string type, string? format = null) => new OApiSchema(type) { Format = format };\n\n\t\t\tpublic OApiSchema ObjWrap() => new OApiSchema(\"object\") { AdditionalProperties = this };\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/TimeSpanConverter.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tinternal class TimeSpanConverter : JsonConverter<TimeSpan>\n\t{\n\t\tpublic override void WriteJson(JsonWriter writer, TimeSpan value, JsonSerializer serializer)\n\t\t{\n\t\t\twriter.WriteValue(value.TotalSeconds);\n\t\t}\n\n\t\tpublic override TimeSpan ReadJson(JsonReader reader, Type objectType, TimeSpan existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t{\n\t\t\tfloat secs = (float?)reader.Value ?? 0;\n\t\t\treturn TimeSpan.FromSeconds(secs);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Api/WebApi.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Http.Features;\nusing System;\nusing System.Globalization;\nusing System.IO;\nusing System.Net;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Algorithm;\nusing TS3AudioBot.Audio;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.CommandSystem.Ast;\nusing TS3AudioBot.CommandSystem.Commands;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Dependency;\nusing TS3AudioBot.Environment;\nusing TS3AudioBot.Helper;\nusing TS3AudioBot.Localization;\nusing TS3AudioBot.Sessions;\nusing TSLib;\nusing TSLib.Helper;\n\nnamespace TS3AudioBot.Web.Api\n{\n\tpublic sealed class WebApi\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tprivate static readonly Uri Dummy = new Uri(\"http://dummy/\");\n\n\t\tprivate const string ErrorNoUserOrToken = \"Unknown user or no active token found\";\n\t\tprivate const string ErrorAuthFailure = \"Authentication failed\";\n\t\tprivate const string ErrorAnonymousDisabled = \"This bot does not allow anonymous api requests\";\n\t\tprivate const string ErrorUnsupportedScheme = \"Unsupported authentication scheme\";\n\n\t\tpublic bool AllowAnonymousRequest { get; set; } = true;\n\t\tprivate readonly ConfWebApi config;\n\t\tprivate readonly CoreInjector coreInjector;\n\t\tprivate readonly TokenManager tokenManager;\n\t\tprivate readonly Stats stats;\n\n\t\tpublic WebApi(ConfWebApi config, CoreInjector coreInjector, TokenManager tokenManager, Stats stats)\n\t\t{\n\t\t\tthis.config = config;\n\t\t\tthis.coreInjector = coreInjector;\n\t\t\tthis.tokenManager = tokenManager;\n\t\t\tthis.stats = stats;\n\t\t}\n\n\t\tpublic async Task ProcessApiV1Call(HttpContext context)\n\t\t{\n\t\t\tvar request = context.Request;\n\t\t\tvar response = context.Response;\n\n\t\t\tresponse.ContentType = \"application/json\";\n\t\t\tresponse.Headers[\"Access-Control-Allow-Origin\"] = \"*\";\n\t\t\tresponse.Headers[\"CacheControl\"] = \"no-cache, no-store, must-revalidate\";\n\n\t\t\tvar authResult = Authenticate(context.Request);\n\t\t\tif (!authResult.Ok)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Authorization failed!\");\n\t\t\t\tawait ReturnError(new CommandException(authResult.Error, CommandExceptionReason.Unauthorized), response);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!AllowAnonymousRequest && authResult.Value.ClientUid == Uid.Null)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Unauthorized request!\");\n\t\t\t\tawait ReturnError(new CommandException(ErrorAnonymousDisabled, CommandExceptionReason.Unauthorized), response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar apiCallData = authResult.Value;\n\t\t\tvar remoteAddress = context.Connection?.RemoteIpAddress;\n\t\t\tif (remoteAddress is null)\n\t\t\t{\n\t\t\t\tLog.Warn(\"Remote has no IP, ignoring request\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (IPAddress.IsLoopback(remoteAddress)\n\t\t\t\t&& request.Headers.TryGetValue(\"X-Real-IP\", out var realIpStr)\n\t\t\t\t&& IPAddress.TryParse(realIpStr, out var realIp))\n\t\t\t{\n\t\t\t\tremoteAddress = realIp;\n\t\t\t}\n\t\t\tapiCallData.IpAddress = remoteAddress;\n\t\t\tapiCallData.RequestUrl = new Uri(Dummy, context.Features.Get<IHttpRequestFeature>().RawTarget);\n\n\t\t\tLog.Info(\"{0} Requested: {1}\", remoteAddress, apiCallData.RequestUrl.PathAndQuery);\n\n\t\t\tvar command = BuildCommand(apiCallData.RequestUrl);\n\n\t\t\tif (!(await ProcessBodyData(request, apiCallData)).GetOk(out var err))\n\t\t\t{\n\t\t\t\tawait ReturnError(err, response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar execInfo = BuildContext(apiCallData);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tstats.TrackCommandApiCall();\n\t\t\t\tThread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;\n\t\t\t\tvar res = await command.Execute(execInfo, Array.Empty<ICommand>());\n\n\t\t\t\tif (res is null)\n\t\t\t\t{\n\t\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.NoContent;\n\t\t\t\t}\n\t\t\t\telse if (res is DataStream data)\n\t\t\t\t{\n\t\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.OK;\n\t\t\t\t\tusing (response.Body)\n\t\t\t\t\t{\n\t\t\t\t\t\tawait data.WriteOut(response);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (!(res is JsonObject json))\n\t\t\t\t\t\tjson = JsonValue.Create(res);\n\n\t\t\t\t\tvar returnString = json.Serialize();\n\t\t\t\t\tresponse.StatusCode = returnString.Length == 0 ? (int)HttpStatusCode.NoContent : (int)HttpStatusCode.OK;\n\t\t\t\t\tusing var responseStream = new StreamWriter(response.Body);\n\t\t\t\t\tawait responseStream.WriteAsync(returnString);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tawait ReturnError(ex, response);\n\t\t\t}\n\t\t}\n\n\t\tprivate ICommand BuildCommand(Uri requestUrl)\n\t\t{\n\t\t\tstring apirequest = requestUrl.OriginalString.Substring(requestUrl.GetLeftPart(UriPartial.Authority).Length + \"/api\".Length);\n\t\t\tvar ast = CommandParser.ParseCommandRequest(apirequest, '/', '/');\n\t\t\tUnescapeAstTree(ast);\n\t\t\tLog.Trace(ast.ToString);\n\t\t\treturn CommandManager.AstToCommandResult(ast);\n\t\t}\n\n\t\tprivate ExecutionInformation BuildContext(ApiCall apiCallData)\n\t\t{\n\t\t\tvar execInfo = new ExecutionInformation(coreInjector);\n\t\t\texecInfo.AddModule(new CallerInfo(true)\n\t\t\t{\n\t\t\t\tSkipRightsChecks = false,\n\t\t\t\tCommandComplexityMax = config.CommandComplexity,\n\t\t\t\tIsColor = false,\n\t\t\t});\n\t\t\texecInfo.AddModule<InvokerData>(apiCallData);\n\t\t\texecInfo.AddModule(apiCallData);\n\t\t\texecInfo.AddModule(Filter.GetFilterByNameOrDefault(config.Matcher));\n\t\t\treturn execInfo;\n\t\t}\n\n\t\tprivate async Task<E<Exception>> ProcessBodyData(HttpRequest request, ApiCall apiCallData)\n\t\t{\n\t\t\tif (request.ContentType != \"application/json\")\n\t\t\t\treturn R.Ok;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing (var sr = new StreamReader(request.Body, Tools.Utf8Encoder))\n\t\t\t\t\tapiCallData.Body = await sr.ReadToEndAsync();\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Failed to parse request Body\");\n\t\t\t\treturn ex;\n\t\t\t}\n\t\t}\n\n\t\tprivate static async Task ReturnError(Exception ex, HttpResponse response)\n\t\t{\n\t\t\tLog.Debug(ex, \"Api Exception\");\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tJsonError? jsonError = null;\n\n\t\t\t\tswitch (ex)\n\t\t\t\t{\n\t\t\t\tcase CommandException cex:\n\t\t\t\t\tjsonError = ReturnCommandError(cex, response);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AudioBotException abex:\n\t\t\t\t\tjsonError = new JsonError(abex.Message, CommandExceptionReason.CommandError);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NotImplementedException _:\n\t\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.NotImplemented;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EntityTooLargeException _:\n\t\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.RequestEntityTooLarge;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tLog.Error(ex, \"Unknown command error\");\n\t\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.InternalServerError;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tjsonError ??= new JsonError(ex.Message, CommandExceptionReason.Unknown);\n\t\t\t\tusing var responseStream = new StreamWriter(response.Body);\n\t\t\t\tawait responseStream.WriteAsync(jsonError.Serialize());\n\t\t\t}\n\t\t\tcatch (Exception htex) { Log.Warn(htex, \"Failed to respond to HTTP request.\"); }\n\t\t}\n\n\t\tprivate static JsonError ReturnCommandError(CommandException ex, HttpResponse response)\n\t\t{\n\t\t\tvar jsonError = new JsonError(ex.Message, ex.Reason);\n\n\t\t\tswitch (ex.Reason)\n\t\t\t{\n\t\t\tcase CommandExceptionReason.Unknown:\n\t\t\tcase CommandExceptionReason.InternalError:\n\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.InternalServerError;\n\t\t\t\tbreak;\n\n\t\t\tcase CommandExceptionReason.Unauthorized:\n\t\t\t\tjsonError.HelpMessage += \"You have to authenticate yourself to call this method.\";\n\t\t\t\tjsonError.HelpLink = \"https://github.com/Splamy/TS3AudioBot/wiki/WebAPI#authentication\";\n\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.Unauthorized;\n\t\t\t\tbreak;\n\n\t\t\tcase CommandExceptionReason.MissingRights:\n\t\t\t\tjsonError.HelpLink = \"https://github.com/Splamy/TS3AudioBot/wiki/FAQ#missing-rights\";\n\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.Forbidden;\n\t\t\t\tbreak;\n\n\t\t\tcase CommandExceptionReason.AmbiguousCall:\n\t\t\tcase CommandExceptionReason.MissingParameter:\n\t\t\tcase CommandExceptionReason.NotSupported:\n\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.BadRequest;\n\t\t\t\tbreak;\n\n\t\t\tcase CommandExceptionReason.MissingContext:\n\t\t\t\tif (ex is MissingContextCommandException mcex)\n\t\t\t\t{\n\t\t\t\t\tif (mcex.MissingType == typeof(ClientCall))\n\t\t\t\t\t{\n\t\t\t\t\t\tjsonError.HelpMessage += strings.error_not_available_from_api;\n\t\t\t\t\t}\n\t\t\t\t\telse if (mcex.MissingType == typeof(UserSession))\n\t\t\t\t\t{\n\t\t\t\t\t\tjsonError.HelpMessage += \"Creating UserSessions via api is currently not implemented yet.\";\n\t\t\t\t\t}\n\t\t\t\t\telse if (mcex.MissingType == typeof(Bot) || mcex.MissingType == typeof(Player)\n\t\t\t\t\t\t|| mcex.MissingType == typeof(PlayManager) || mcex.MissingType == typeof(Ts3Client)\n\t\t\t\t\t\t|| mcex.MissingType == typeof(IVoiceTarget) || mcex.MissingType == typeof(IVoiceTarget)\n\t\t\t\t\t\t|| mcex.MissingType == typeof(ConfBot))\n\t\t\t\t\t{\n\t\t\t\t\t\tjsonError.HelpMessage += \"You are trying to call a command which is specific to a bot. \" +\n\t\t\t\t\t\t\t\"Use '!bot use' to switch to a bot instance\";\n\t\t\t\t\t\tjsonError.HelpLink = \"https://github.com/Splamy/TS3AudioBot/wiki/FAQ#api-missing-context\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tgoto case CommandExceptionReason.CommandError;\n\n\t\t\tcase CommandExceptionReason.CommandError:\n\t\t\tcase CommandExceptionReason.NoReturnMatch:\n\t\t\t\tresponse.StatusCode = 422; // Unprocessable Entity\n\t\t\t\tbreak;\n\n\t\t\tcase CommandExceptionReason.FunctionNotFound:\n\t\t\t\tresponse.StatusCode = (int)HttpStatusCode.NotFound;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(ex.Reason);\n\t\t\t}\n\n\t\t\treturn jsonError;\n\t\t}\n\n\t\tprivate static void UnescapeAstTree(AstNode node)\n\t\t{\n\t\t\tswitch (node.Type)\n\t\t\t{\n\t\t\tcase AstType.Command:\n\t\t\t\tvar astCom = (AstCommand)node;\n\t\t\t\tforeach (var child in astCom.Parameter)\n\t\t\t\t\tUnescapeAstTree(child);\n\t\t\t\tbreak;\n\t\t\tcase AstType.Value:\n\t\t\t\tvar astVal = (AstValue)node;\n\t\t\t\tastVal.Value = Uri.UnescapeDataString(astVal.Value);\n\t\t\t\tbreak;\n\t\t\tcase AstType.Error: break;\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(node.Type);\n\t\t\t}\n\t\t}\n\n\t\tprivate R<ApiCall, string> Authenticate(HttpRequest request)\n\t\t{\n\t\t\tif (!request.Headers.TryGetValue(\"Authorization\", out var headerVal))\n\t\t\t\treturn ApiCall.CreateAnonymous();\n\n\t\t\tvar authParts = headerVal.ToString().Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries);\n\t\t\tif (authParts.Length < 2)\n\t\t\t\treturn ErrorAuthFailure;\n\n\t\t\tif (!string.Equals(authParts[0], \"BASIC\", StringComparison.OrdinalIgnoreCase))\n\t\t\t\treturn ErrorUnsupportedScheme;\n\n\t\t\tstring userUid;\n\t\t\tstring token;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar data = Convert.FromBase64String(authParts[1]);\n\t\t\t\tvar index = Array.IndexOf(data, (byte)':');\n\n\t\t\t\tif (index < 0)\n\t\t\t\t\treturn ErrorAuthFailure;\n\t\t\t\tuserUid = Tools.Utf8Encoder.GetString(data, 0, index);\n\t\t\t\ttoken = Tools.Utf8Encoder.GetString(data, index + 1, data.Length - (index + 1));\n\t\t\t}\n\t\t\tcatch (Exception) { return \"Malformed base64 string\"; }\n\n\t\t\tvar dbToken = tokenManager.GetToken(userUid);\n\t\t\tif (dbToken is null)\n\t\t\t\treturn ErrorNoUserOrToken;\n\n\t\t\tif (dbToken.Value != token)\n\t\t\t\treturn ErrorAuthFailure;\n\n\t\t\treturn new ApiCall((Uid)userUid, token: dbToken.Value);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Model/CurrentSongInfo.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\nusing System;\n\nnamespace TS3AudioBot.Web.Model\n{\n\tpublic class CurrentSongInfo : PlaylistItemGetData\n\t{\n\t\t[JsonProperty(PropertyName = \"Position\")]\n\t\tpublic TimeSpan Position { get; set; }\n\t\t[JsonProperty(PropertyName = \"Length\")]\n\t\tpublic TimeSpan Length { get; set; }\n\t\t[JsonProperty(PropertyName = \"Paused\")]\n\t\tpublic bool Paused { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Model/PlaylistInfo.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\n\nnamespace TS3AudioBot.Web.Model\n{\n\tpublic class PlaylistInfo\n\t{\n\t\t// TODO better names\n\t\t[JsonProperty(PropertyName = \"Id\")]\n\t\tpublic string Id { get; set; }\n\t\t[JsonProperty(PropertyName = \"Title\")]\n\t\tpublic string Title { get; set; }\n\n\t\t/// <summary>How many songs are in the entire playlist</summary>\n\t\t[JsonProperty(PropertyName = \"SongCount\")]\n\t\tpublic int SongCount { get; set; }\n\t\t/// <summary>From which index the itemization begins.</summary>\n\t\t[JsonProperty(PropertyName = \"DisplayOffset\")]\n\t\tpublic int DisplayOffset { get; set; }\n\t\t/// <summary>The playlist items for the request.\n\t\t/// This might only be a part of the entire playlist.\n\t\t/// Check <see cref=\"SongCount\"> for the entire count.</summary>\n\t\t[JsonProperty(PropertyName = \"Items\", NullValueHandling = NullValueHandling.Ignore)]\n\t\tpublic PlaylistItemGetData[]? Items { get; set; }\n\n\t\tpublic PlaylistInfo(string id, string title)\n\t\t{\n\t\t\tId = id;\n\t\t\tTitle = title;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Model/PlaylistItemGetData.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TS3AudioBot.Web.Model\n{\n\tpublic class PlaylistItemGetData\n\t{\n\t\t// Optional, useful when adding a single element to a list\n\t\t// public int? Index { get; set; }\n\t\tpublic string? Link { get; set; }\n\t\tpublic string? Title { get; set; }\n\t\tpublic string? AudioType { get; set; }\n\t\t// Link\n\t\t// AlbumCover\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/Model/QueueInfo.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Newtonsoft.Json;\n\nnamespace TS3AudioBot.Web.Model\n{\n\tpublic class QueueInfo : PlaylistInfo\n\t{\n\t\t[JsonProperty(PropertyName = \"PlaybackIndex\")]\n\t\tpublic int PlaybackIndex { get; set; }\n\n\t\tpublic QueueInfo(string id, string title) : base(id, title)\n\t\t{\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/Web/WebServer.cs",
    "content": "// TS3AudioBot - An advanced Musicbot for Teamspeak 3\n// Copyright (C) 2017  TS3AudioBot contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Logging;\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot.Config;\nusing TS3AudioBot.Dependency;\n\nnamespace TS3AudioBot.Web\n{\n\tpublic sealed class WebServer : IDisposable\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tprivate CancellationTokenSource? cancelToken;\n\t\tprivate readonly ConfWeb config;\n\t\tprivate readonly CoreInjector coreInjector;\n\t\tprivate Api.WebApi? api;\n\n\t\tpublic WebServer(ConfWeb config, CoreInjector coreInjector)\n\t\t{\n\t\t\tthis.config = config;\n\t\t\tthis.coreInjector = coreInjector;\n\t\t}\n\n\t\t// TODO write server to be reload-able\n\t\tpublic void StartWebServer()\n\t\t{\n\t\t\tvar startWebServer = false;\n\n\t\t\tif (config.Api.Enabled || config.Interface.Enabled)\n\t\t\t{\n\t\t\t\tif (!config.Api.Enabled)\n\t\t\t\t\tLog.Warn(\"The api is required for the webinterface to work properly; The api is now implicitly enabled. Enable the api in the config to remove this warning.\");\n\n\t\t\t\tif (!coreInjector.TryCreate<Api.WebApi>(out var api))\n\t\t\t\t\tthrow new Exception(\"Could not create Api object.\");\n\n\t\t\t\tthis.api = api;\n\t\t\t\tstartWebServer = true;\n\t\t\t}\n\n\t\t\tif (startWebServer)\n\t\t\t{\n\t\t\t\tStartWebServerInternal();\n\t\t\t}\n\t\t}\n\n\t\tpublic string? FindWebFolder()\n\t\t{\n\t\t\tvar webData = config.Interface;\n\t\t\tif (string.IsNullOrEmpty(webData.Path))\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < 5; i++)\n\t\t\t\t{\n\t\t\t\t\tvar up = Path.Combine(Enumerable.Repeat(\"..\", i).ToArray());\n\t\t\t\t\tvar checkDir = Path.Combine(up, \"WebInterface\");\n\t\t\t\t\tif (Directory.Exists(checkDir))\n\t\t\t\t\t\treturn Path.GetFullPath(checkDir);\n\t\t\t\t}\n\n\t\t\t\tvar asmPath = Path.GetDirectoryName(typeof(Core).Assembly.Location)!;\n\t\t\t\tvar asmWebPath = Path.GetFullPath(Path.Combine(asmPath, \"WebInterface\"));\n\t\t\t\tif (Directory.Exists(asmWebPath))\n\t\t\t\t\treturn asmWebPath;\n\t\t\t}\n\t\t\telse if (Directory.Exists(webData.Path))\n\t\t\t{\n\t\t\t\treturn Path.GetFullPath(webData.Path);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate void StartWebServerInternal()\n\t\t{\n\t\t\tcancelToken?.Cancel();\n\t\t\tcancelToken?.Dispose();\n\t\t\tcancelToken = new CancellationTokenSource();\n\n\t\t\tvar host = new WebHostBuilder()\n\t\t\t\t.SuppressStatusMessages(true)\n\t\t\t\t.ConfigureLogging((context, logging) =>\n\t\t\t\t{\n\t\t\t\t\tlogging.ClearProviders();\n\t\t\t\t})\n\t\t\t\t.UseKestrel(kestrel =>\n\t\t\t\t{\n\t\t\t\t\tkestrel.Limits.MaxRequestBodySize = 3_000_000; // 3 MiB should be enough\n\t\t\t\t})\n\t\t\t\t.ConfigureServices(services =>\n\t\t\t\t{\n\t\t\t\t\tservices.AddCors(options =>\n\t\t\t\t\t{\n\t\t\t\t\t\toptions.AddPolicy(\"TS3AB\", builder =>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbuilder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.Configure(app =>\n\t\t\t\t{\n\t\t\t\t\tapp.UseCors(\"TS3AB\");\n\n\t\t\t\t\tif (api != null) // api enabled\n\t\t\t\t\t{\n\t\t\t\t\t\tapp.Map(new PathString(\"/api\"), map =>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmap.Run(async ctx =>\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tusing var _ = NLog.MappedDiagnosticsLogicalContext.SetScoped(\"BotId\", \"Api\");\n\t\t\t\t\t\t\t\tawait Log.SwallowAsync(() => api.ProcessApiV1Call(ctx));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (config.Interface.Enabled)\n\t\t\t\t\t{\n\t\t\t\t\t\tapp.UseFileServer();\n\t\t\t\t\t}\n\n\t\t\t\t\tvar applicationLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();\n\t\t\t\t\tapplicationLifetime.ApplicationStopping.Register(OnShutdown);\n\t\t\t\t});\n\n\t\t\tif (config.Interface.Enabled)\n\t\t\t{\n\t\t\t\tvar baseDir = FindWebFolder();\n\t\t\t\tif (baseDir is null)\n\t\t\t\t{\n\t\t\t\t\tLog.Error(\"Can't find a WebInterface path to host. Try specifying the path to host in the config\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thost.UseWebRoot(baseDir);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar addrs = config.Hosts.Value;\n\t\t\tif (addrs.Contains(\"*\"))\n\t\t\t{\n\t\t\t\thost.ConfigureKestrel(kestrel => { kestrel.ListenAnyIP(config.Port.Value); });\n\t\t\t}\n\t\t\telse if (addrs.Count == 1 && addrs[0] == \"localhost\")\n\t\t\t{\n\t\t\t\thost.ConfigureKestrel(kestrel => { kestrel.ListenLocalhost(config.Port.Value); });\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thost.UseUrls(addrs.Select(uri => new UriBuilder(uri) { Port = config.Port }.Uri.AbsoluteUri).ToArray());\n\t\t\t}\n\n\t\t\tLog.Info(\"Starting Webserver on port {0}\", config.Port.Value);\n\t\t\tnew Func<Task>(async () =>\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tawait host.Build().RunAsync(cancelToken.Token);\n\t\t\t\t}\n\t\t\t\tcatch (Exception ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Error(ex, \"The webserver could not be started\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t})();\n\t\t}\n\n\t\tpublic void OnShutdown()\n\t\t{\n\t\t\tLog.Info(\"WebServer has closed\");\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tLog.Info(\"WebServer is closing\");\n\n\t\t\tcancelToken?.Cancel();\n\t\t\tcancelToken?.Dispose();\n\t\t\tcancelToken = null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TS3AudioBot/build.csx",
    "content": "#r \"nuget: SimpleExec, 6.2.0\"\n#r \"nuget: Newtonsoft.Json, 12.0.3\"\n\nusing Newtonsoft.Json;\nusing static SimpleExec.Command;\n\nif (Args.Count == 0) {\n\tWriteLine(\"This script is itended to be used in the build pipeline\");\n\treturn 1;\n}\n\nstring outFile = Args[0];\nstring buildConfig = Args[1];\n\nstring json = Read(\"dotnet\", \"gitversion\");\n\nvar version = JsonConvert.DeserializeAnonymousType(json, new {\n\tFullSemVer = \"\",\n\tBranchName = \"\",\n\tSha = \"\",\n\n\tAssemblySemVer = \"\",\n\tAssemblySemFileVer = \"\",\n\tInformationalVersion = \"\",\n});\n\nvar genFile = $@\"\n[assembly: System.Reflection.AssemblyVersion(\"\"{version.AssemblySemVer}\"\")]\n[assembly: System.Reflection.AssemblyFileVersion(\"\"{version.AssemblySemFileVer}\"\")]\n[assembly: System.Reflection.AssemblyInformationalVersion(\"\"{version.InformationalVersion}\"\")]\n\nnamespace TS3AudioBot.Environment\n{{\n\tpartial class BuildData {{\n\t\tpartial void GetDataInternal() {{\n\t\t\tthis.Version = \"\"{version.FullSemVer}\"\";\n\t\t\tthis.Branch = \"\"{version.BranchName}\"\";\n\t\t\tthis.CommitSha = \"\"{version.Sha}\"\";\n\n\t\t\tthis.BuildConfiguration = \"\"{buildConfig}\"\";\n\t\t}}\n\t}}\n}}\n\";\n\nConsole.WriteLine(\"Generated Version {0}\", version.FullSemVer);\nvar writeFull = Path.GetFullPath(outFile);\n//WriteLine(\"Writing to {0}\", writeFull);\nFile.WriteAllText(writeFull, genFile);\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/TS3AudioBot.1.0.0.nuspec",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd\">\n  <metadata>\n    <id>TS3AudioBot</id>\n    <version>1.0.0</version>\n    <authors>TS3AudioBot</authors>\n    <description>Package Description</description>\n    <repository type=\"git\" url=\"https://github.com/Splamy/TS3AudioBot.git\" />\n    <dependencies>\n      <group targetFramework=\".NETCoreApp3.1\">\n        <dependency id=\"Splamy.TSLib\" version=\"1.1.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"CliWrap\" version=\"3.1.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"CommandLineParser\" version=\"2.8.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"LiteDB\" version=\"4.1.4\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Microsoft.AspNetCore.Cors\" version=\"2.2.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Microsoft.AspNetCore.Server.Kestrel\" version=\"2.2.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Microsoft.AspNetCore.StaticFiles\" version=\"2.2.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Microsoft.CodeAnalysis.CSharp\" version=\"3.7.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"NLog\" version=\"4.7.3\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Nett\" version=\"0.15.0\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"Newtonsoft.Json\" version=\"12.0.3\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"PlaylistsNET\" version=\"1.1.2\" exclude=\"Build,Analyzers\" />\n        <dependency id=\"SixLabors.ImageSharp\" version=\"1.0.0\" exclude=\"Build,Analyzers\" />\n      </group>\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.json\" target=\"lib\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.json\" />\n    <file src=\"C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.dll\" target=\"lib\\netcoreapp3.1\\TS3AudioBot.dll\" />\n    <file src=\"C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\lib\\x64\\libopus.dll\" target=\".\\libopus.dll\" />\n  </files>\n</package>"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v7.0\", FrameworkDisplayName = \".NET 7.0\")]\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Debug\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n[assembly: System.Resources.NeutralResourcesLanguageAttribute(\"en\")]\n[assembly: System.Runtime.Versioning.TargetPlatformAttribute(\"Windows7.0\")]\n[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute(\"Windows7.0\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.AssemblyInfoInputs.cache",
    "content": "4efb224719327bf3510b3a91aa702db77e89b788\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.TargetFramework = net7.0-windows\nbuild_property.TargetPlatformMinVersion = 7.0\nbuild_property.UsingMicrosoftNETSdkWeb = \nbuild_property.ProjectTypeGuids = \nbuild_property.InvariantGlobalization = \nbuild_property.PlatformNeutralAssembly = \nbuild_property.EnforceExtendedAnalyzerRules = \nbuild_property._SupportedPlatformList = Linux,macOS,Windows\nbuild_property.RootNamespace = TS3AudioBot\nbuild_property.ProjectDir = C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.csproj.CopyComplete",
    "content": ""
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.csproj.CoreCompileInputs.cache",
    "content": "ef947e7377dc5c9f212fca8011c4a3fe43611636\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\TS3AudioBot.exe\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\lib\\x64\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\lib\\x86\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\TS3AudioBot.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\TS3AudioBot.runtimeconfig.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\CliWrap.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\CommandLine.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Heijden.Dns.Portable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\LiteDB.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Connections.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Cors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Hosting.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Http.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Http.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Http.Features.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Server.Kestrel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Server.Kestrel.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Server.Kestrel.Https.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.StaticFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.AspNetCore.WebUtilities.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.CodeAnalysis.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.CodeAnalysis.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Configuration.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Configuration.Binder.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Configuration.EnvironmentVariables.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Configuration.FileExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.DependencyInjection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.DependencyInjection.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.FileProviders.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.FileProviders.Physical.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.FileSystemGlobbing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Logging.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Logging.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.ObjectPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Options.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Extensions.WebEncoders.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Microsoft.Net.Http.Headers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Nett.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Newtonsoft.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\NLog.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\PlaylistsNET.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\BouncyCastle.Crypto.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\SixLabors.ImageSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\Chaos.NaCl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\System.IO.Pipelines.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\cs\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\de\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\es\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\fr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\it\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\ja\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\ko\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\pl\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\pt-BR\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\ru\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\tr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\zh-Hans\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\zh-Hant\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\cs\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\de\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\es\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\fr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\it\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\ja\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\ko\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\pl\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\pt-BR\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\ru\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\tr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\zh-Hans\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\zh-Hant\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\net7.0-windows\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.csproj.SuggestedBindingRedirects.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.Localization.strings.resources\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.csproj.GenerateResource.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.csproj.CopyComplete\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\refint\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\TS3AudioBot.genruntimeconfig.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\net7.0-windows\\ref\\TS3AudioBot.dll\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.csproj.SuggestedBindingRedirects.cache",
    "content": "cc5ef2302008f569ee5df7947a4243981cb35797\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.dll.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Pipelines\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.2.1\" newVersion=\"4.0.2.1\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.VisualBasic.Core\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-12.0.0.0\" newVersion=\"12.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Win32.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Win32.Registry\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Buffers\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Concurrent\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Immutable\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.NonGeneric\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Specialized\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel.Annotations\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel.EventBasedAsync\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel.TypeConverter\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Console\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Data.Common\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Contracts\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Debug\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.DiagnosticSource\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.FileVersionInfo\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Process\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.StackTrace\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.TextWriterTraceListener\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tools\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.TraceSource\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tracing\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Drawing.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Compression.ZipFile\" publicKeyToken=\"b77a5c561934e089\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Compression\" publicKeyToken=\"b77a5c561934e089\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.FileSystem.AccessControl\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.FileSystem.DriveInfo\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.FileSystem.Watcher\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.FileSystem\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.IsolatedStorage\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.MemoryMappedFiles\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Pipes.AccessControl\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Pipes\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq.Expressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq.Parallel\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq.Queryable\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Memory\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.HttpListener\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Mail\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NameResolution\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NetworkInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Ping\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Requests\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Security\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.ServicePoint\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Sockets\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.WebClient\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.WebHeaderCollection\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.WebProxy\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.WebSockets.Client\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.WebSockets\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ObjectModel\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.ILGeneration\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.Lightweight\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Metadata\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Resources.ResourceManager\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Resources.Writer\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.VisualC\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.InteropServices.RuntimeInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.InteropServices\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Intrinsics\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Loader\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Numerics\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Serialization.Formatters\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Serialization.Json\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Serialization.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Serialization.Xml\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.AccessControl\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Claims\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Algorithms\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Cng\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Csp\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.X509Certificates\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Principal.Windows\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding.CodePages\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encodings.Web\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.RegularExpressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Overlapped\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks.Extensions\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks.Parallel\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Thread\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.ThreadPool\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Timer\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Transactions.Local\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.HttpUtility\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Xml.ReaderWriter\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Xml.XDocument\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Xml.XPath.XDocument\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Xml.XPath\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Xml.XmlSerializer\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-7.0.0.0\" newVersion=\"7.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"netstandard\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.0.0\" newVersion=\"2.1.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "TS3AudioBot/obj/Debug/net7.0-windows/TS3AudioBot.genruntimeconfig.cache",
    "content": "7e35779a7f8ad652cae26250ac9575323be437a4\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v3.1\", FrameworkDisplayName = \"\")]\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Debug\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n[assembly: System.Resources.NeutralResourcesLanguageAttribute(\"en\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.AssemblyInfoInputs.cache",
    "content": "c475f89158c62771af519d032a12f1bd5df5cb32\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TS3AudioBot\nbuild_property.ProjectDir = G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.csproj.CopyComplete",
    "content": ""
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.csproj.CoreCompileInputs.cache",
    "content": "5db711007006312b76b0f7995644fd3c8cfa0999\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.exe\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\lib\\x64\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\lib\\x86\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.dev.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\CliWrap.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\CommandLine.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Heijden.Dns.Portable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\LiteDB.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Connections.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Cors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Features.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Https.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.StaticFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.WebUtilities.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.CodeAnalysis.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.CodeAnalysis.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.Binder.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.EnvironmentVariables.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.FileExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.DependencyInjection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.DependencyInjection.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.FileProviders.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.FileProviders.Physical.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.FileSystemGlobbing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Logging.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Logging.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.ObjectPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Options.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.WebEncoders.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Net.Http.Headers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Nett.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Newtonsoft.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\NLog.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\PlaylistsNET.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\BouncyCastle.Crypto.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\SixLabors.ImageSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Chaos.NaCl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\System.IO.Pipelines.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\cs\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\de\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\es\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\fr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\it\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ja\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ko\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\pl\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\pt-BR\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ru\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\tr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\zh-Hans\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\zh-Hant\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\cs\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\de\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\es\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\fr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\it\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ja\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ko\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\pl\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\pt-BR\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ru\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\tr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\zh-Hans\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\zh-Hant\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.SuggestedBindingRedirects.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.Localization.strings.resources\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.GenerateResource.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.CopyComplete\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.genruntimeconfig.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.exe\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\lib\\x64\\libopus.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\lib\\x86\\libopus.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.dll.config\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.deps.json\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.json\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.dev.json\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\CliWrap.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\CommandLine.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Heijden.Dns.Portable.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\LiteDB.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Connections.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Cors.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Http.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Extensions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Features.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Core.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Https.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.StaticFiles.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.AspNetCore.WebUtilities.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.CodeAnalysis.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.CodeAnalysis.CSharp.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.Binder.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.EnvironmentVariables.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Configuration.FileExtensions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.DependencyInjection.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.DependencyInjection.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.FileProviders.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.FileProviders.Physical.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.FileSystemGlobbing.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Hosting.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Logging.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Logging.Abstractions.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.ObjectPool.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Options.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.Primitives.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Extensions.WebEncoders.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Microsoft.Net.Http.Headers.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Nett.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Newtonsoft.Json.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\NLog.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\PlaylistsNET.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\BouncyCastle.Crypto.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\SixLabors.ImageSharp.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\Chaos.NaCl.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\System.IO.Pipelines.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\cs\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\de\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\es\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\fr\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\it\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ja\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ko\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\pl\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\pt-BR\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ru\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\tr\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\zh-Hans\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\zh-Hant\\Microsoft.CodeAnalysis.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\cs\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\de\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\es\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\fr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\it\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ja\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ko\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\pl\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\pt-BR\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\ru\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\tr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\zh-Hans\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\zh-Hant\\Microsoft.CodeAnalysis.CSharp.resources.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TSLib.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Debug\\netcoreapp3.1\\TSLib.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.AssemblyReference.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.dll.config\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.Localization.strings.resources\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.GenerateResource.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.AssemblyInfoInputs.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.AssemblyInfo.cs\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.CoreCompileInputs.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.csproj.CopyComplete\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Debug\\netcoreapp3.1\\TS3AudioBot.genruntimeconfig.cache\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.csproj.SuggestedBindingRedirects.cache",
    "content": "ef24e4af7229c939c818abac044d4f1b112c94d6\n"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.dll.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Pipelines\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.2.1\" newVersion=\"4.0.2.1\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.6.0\" newVersion=\"4.0.6.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Concurrent\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.15.0\" newVersion=\"4.0.15.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Immutable\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.2.5.0\" newVersion=\"1.2.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.NonGeneric\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Console\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Debug\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.DiagnosticSource\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Process\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tools\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tracing\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.FileSystem\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq.Expressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Memory\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.1.0\" newVersion=\"4.2.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NameResolution\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NetworkInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Security\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Sockets\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.6.0\" newVersion=\"4.1.6.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.ILGeneration\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.Lightweight\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Metadata\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.4.5.0\" newVersion=\"1.4.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Resources.ResourceManager\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.InteropServices.RuntimeInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Algorithms\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.3.2.0\" newVersion=\"4.3.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Csp\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.X509Certificates\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encodings.Web\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.RegularExpressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks.Extensions\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.3.1.0\" newVersion=\"4.3.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.ThreadPool\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Timer\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"netstandard\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.0.0\" newVersion=\"2.1.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "TS3AudioBot/obj/Debug/netcoreapp3.1/TS3AudioBot.genruntimeconfig.cache",
    "content": "49f0521b9c3237f06c1aac9d1aaf96b21b297ab3\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/net7.0-windows/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v7.0\", FrameworkDisplayName = \".NET 7.0\")]\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/net7.0-windows/TS3AudioBot.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Release\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n[assembly: System.Resources.NeutralResourcesLanguageAttribute(\"en\")]\n[assembly: System.Runtime.Versioning.TargetPlatformAttribute(\"Windows7.0\")]\n[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute(\"Windows7.0\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/net7.0-windows/TS3AudioBot.AssemblyInfoInputs.cache",
    "content": "e28135d739ac8256182642272e8c3b73f5d97434\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/net7.0-windows/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.TargetFramework = net7.0-windows\nbuild_property.TargetPlatformMinVersion = 7.0\nbuild_property.UsingMicrosoftNETSdkWeb = \nbuild_property.ProjectTypeGuids = \nbuild_property.InvariantGlobalization = \nbuild_property.PlatformNeutralAssembly = \nbuild_property.EnforceExtendedAnalyzerRules = \nbuild_property._SupportedPlatformList = Linux,macOS,Windows\nbuild_property.RootNamespace = TS3AudioBot\nbuild_property.ProjectDir = C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v3.1\", FrameworkDisplayName = \".NET Core 3.1\")]\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/PublishOutputs.25bc18e9a6.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\lib\\x64\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\lib\\x86\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\TS3AudioBot.exe\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\TS3AudioBot.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\TS3AudioBot.runtimeconfig.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\CliWrap.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\CommandLine.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Heijden.Dns.Portable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\LiteDB.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Connections.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Cors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Hosting.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Http.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Http.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Http.Features.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Server.Kestrel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Server.Kestrel.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Server.Kestrel.Https.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.StaticFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.AspNetCore.WebUtilities.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.CodeAnalysis.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.CodeAnalysis.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Configuration.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Configuration.Binder.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Configuration.EnvironmentVariables.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Configuration.FileExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.DependencyInjection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.DependencyInjection.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.FileProviders.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.FileProviders.Physical.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.FileSystemGlobbing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Logging.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Logging.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.ObjectPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Options.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Extensions.WebEncoders.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Microsoft.Net.Http.Headers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Nett.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Newtonsoft.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\NLog.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\PlaylistsNET.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\BouncyCastle.Crypto.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\SixLabors.ImageSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\Chaos.NaCl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\System.IO.Pipelines.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\cs\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\de\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\es\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\fr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\it\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\ja\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\ko\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\pl\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\pt-BR\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\ru\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\tr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\zh-Hans\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\zh-Hant\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\cs\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\de\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\es\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\fr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\it\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\ja\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\ko\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\pl\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\pt-BR\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\ru\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\tr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\zh-Hans\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\zh-Hant\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\TSLib.pdb\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Release\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n[assembly: System.Resources.NeutralResourcesLanguageAttribute(\"en\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.AssemblyInfoInputs.cache",
    "content": "50117c7602ecaf17a93e18fb5ca5b06974bd2274\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TS3AudioBot\nbuild_property.ProjectDir = G:\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.csproj.CopyComplete",
    "content": ""
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.csproj.CoreCompileInputs.cache",
    "content": "d276b449706cfe9bac91ee685a58212440e6d58d\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TS3AudioBot.exe\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\lib\\x64\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\lib\\x86\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TS3AudioBot.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.dev.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\CliWrap.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\CommandLine.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Heijden.Dns.Portable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\LiteDB.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Connections.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Cors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Http.Features.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Https.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.StaticFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.AspNetCore.WebUtilities.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.CodeAnalysis.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.CodeAnalysis.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Configuration.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Configuration.Binder.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Configuration.EnvironmentVariables.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Configuration.FileExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.DependencyInjection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.DependencyInjection.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.FileProviders.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.FileProviders.Physical.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.FileSystemGlobbing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Logging.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Logging.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.ObjectPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Options.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Extensions.WebEncoders.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Microsoft.Net.Http.Headers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Nett.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Newtonsoft.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\NLog.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\PlaylistsNET.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\BouncyCastle.Crypto.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\SixLabors.ImageSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\Chaos.NaCl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\System.IO.Pipelines.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\cs\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\de\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\es\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\fr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\it\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\ja\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\ko\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\pl\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\pt-BR\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\ru\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\tr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\zh-Hans\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\zh-Hant\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\cs\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\de\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\es\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\fr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\it\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\ja\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\ko\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\pl\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\pt-BR\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\ru\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\tr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\zh-Hans\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\zh-Hant\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.csproj.SuggestedBindingRedirects.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.Localization.strings.resources\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.csproj.GenerateResource.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.csproj.CopyComplete\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\TS3AudioBot.genruntimeconfig.cache\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.csproj.SuggestedBindingRedirects.cache",
    "content": "ef24e4af7229c939c818abac044d4f1b112c94d6\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.dll.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Pipelines\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.2.1\" newVersion=\"4.0.2.1\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Concurrent\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.15.0\" newVersion=\"4.0.15.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Immutable\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.2.5.0\" newVersion=\"1.2.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.NonGeneric\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Console\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Debug\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.DiagnosticSource\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Process\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tools\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tracing\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.FileSystem\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq.Expressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Memory\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.1.0\" newVersion=\"4.2.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NameResolution\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NetworkInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Security\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Sockets\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.6.0\" newVersion=\"4.1.6.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.ILGeneration\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.Lightweight\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Metadata\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.4.5.0\" newVersion=\"1.4.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Resources.ResourceManager\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.6.0\" newVersion=\"4.0.6.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.InteropServices.RuntimeInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Algorithms\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.3.2.0\" newVersion=\"4.3.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Csp\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.X509Certificates\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encodings.Web\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.RegularExpressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks.Extensions\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.3.1.0\" newVersion=\"4.3.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.ThreadPool\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Timer\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"netstandard\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.0.0\" newVersion=\"2.1.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/TS3AudioBot.genruntimeconfig.cache",
    "content": "e1f5521c98efcbfc4d650d650b6eeca110972c10\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v3.1\", FrameworkDisplayName = \".NET Core 3.1\")]\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/PublishOutputs.c54adf16a2.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\lib\\x64\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\lib\\x86\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\TS3AudioBot\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\TS3AudioBot.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\TS3AudioBot.runtimeconfig.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.VisualBasic.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.VisualBasic.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Win32.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Win32.Registry.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.AppContext.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Buffers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Collections.Concurrent.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Collections.Immutable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Collections.NonGeneric.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Collections.Specialized.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Collections.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ComponentModel.Annotations.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ComponentModel.DataAnnotations.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ComponentModel.EventBasedAsync.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ComponentModel.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ComponentModel.TypeConverter.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ComponentModel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Console.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Data.Common.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Data.DataSetExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Data.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.Contracts.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.Debug.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.DiagnosticSource.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.FileVersionInfo.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.Process.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.StackTrace.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.TextWriterTraceListener.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.Tools.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.TraceSource.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Diagnostics.Tracing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Drawing.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Drawing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Dynamic.Runtime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Globalization.Calendars.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Globalization.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Globalization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Compression.Brotli.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Compression.FileSystem.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Compression.ZipFile.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Compression.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.FileSystem.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.FileSystem.DriveInfo.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.FileSystem.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.FileSystem.Watcher.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.FileSystem.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.IsolatedStorage.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.MemoryMappedFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Pipes.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Pipes.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.UnmanagedMemoryStream.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Linq.Expressions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Linq.Parallel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Linq.Queryable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Memory.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.HttpListener.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Mail.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.NameResolution.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.NetworkInformation.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Ping.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Requests.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Security.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.ServicePoint.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.WebClient.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.WebHeaderCollection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.WebProxy.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.WebSockets.Client.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.WebSockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Numerics.Vectors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Numerics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ObjectModel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Private.DataContractSerialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Private.Uri.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Private.Xml.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Private.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.DispatchProxy.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.Emit.ILGeneration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.Emit.Lightweight.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.Emit.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.Metadata.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.TypeExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Reflection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Resources.Reader.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Resources.ResourceManager.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Resources.Writer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.CompilerServices.VisualC.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Handles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.InteropServices.RuntimeInformation.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.InteropServices.WindowsRuntime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.InteropServices.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Intrinsics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Loader.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Numerics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Serialization.Formatters.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Serialization.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Serialization.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Serialization.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.Serialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.WindowsRuntime.UI.Xaml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.WindowsRuntime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Claims.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.Algorithms.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.Cng.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.Csp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.Encoding.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.OpenSsl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.X509Certificates.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Principal.Windows.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Principal.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.SecureString.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ServiceModel.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ServiceProcess.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Text.Encoding.CodePages.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Text.Encoding.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Text.Encoding.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Text.Encodings.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Text.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Text.RegularExpressions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.Channels.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.Overlapped.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.Tasks.Dataflow.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.Tasks.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.Tasks.Parallel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.Tasks.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.Thread.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.ThreadPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.Timer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Threading.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Transactions.Local.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Transactions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.ValueTuple.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Web.HttpUtility.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Windows.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.ReaderWriter.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.Serialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.XDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.XPath.XDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.XPath.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.XmlDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.XmlSerializer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\WindowsBase.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\mscorlib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\netstandard.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\SOS_README.md\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Globalization.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Compression.Native.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Compression.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Native.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Http.Native.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Http.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Security.Native.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Net.Security.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Private.CoreLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.Native.OpenSsl.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Security.Cryptography.Native.OpenSsl.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\createdump\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\libclrjit.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\libcoreclr.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\libcoreclrtraceptprovider.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\libdbgshim.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\libhostfxr.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\libhostpolicy.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\libmscordaccore.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\libmscordbi.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\CliWrap.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\CommandLine.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Heijden.Dns.Portable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\LiteDB.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Connections.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Cors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Hosting.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Http.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Http.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Http.Features.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.Https.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.StaticFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.AspNetCore.WebUtilities.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.CodeAnalysis.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.CodeAnalysis.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Configuration.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Configuration.Binder.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Configuration.EnvironmentVariables.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Configuration.FileExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.DependencyInjection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.DependencyInjection.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.FileProviders.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.FileProviders.Physical.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.FileSystemGlobbing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Logging.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Logging.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.ObjectPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Options.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Extensions.WebEncoders.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Microsoft.Net.Http.Headers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Nett.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Newtonsoft.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\NLog.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\PlaylistsNET.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\BouncyCastle.Crypto.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\SixLabors.ImageSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\Chaos.NaCl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.IO.Pipelines.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\System.Runtime.CompilerServices.Unsafe.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\cs\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\de\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\es\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\fr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\it\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\ja\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\ko\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\pl\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\pt-BR\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\ru\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\tr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\zh-Hans\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\zh-Hant\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\cs\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\de\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\es\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\fr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\it\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\ja\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\ko\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\pl\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\pt-BR\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\ru\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\tr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\zh-Hans\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\zh-Hant\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\linux-x64\\TSLib.pdb\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Release\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n[assembly: System.Resources.NeutralResourcesLanguageAttribute(\"en\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.AssemblyInfoInputs.cache",
    "content": "50117c7602ecaf17a93e18fb5ca5b06974bd2274\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TS3AudioBot\nbuild_property.ProjectDir = C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.csproj.CopyComplete",
    "content": ""
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.csproj.CoreCompileInputs.cache",
    "content": "d0079f35f2cb1ea4672c113d8c75c7ec8d691736\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\lib\\x64\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\lib\\x86\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.runtimeconfig.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.runtimeconfig.dev.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\CliWrap.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\CommandLine.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Heijden.Dns.Portable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\LiteDB.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Connections.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Cors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Hosting.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Http.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Http.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Http.Features.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.Https.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.StaticFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.AspNetCore.WebUtilities.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.CodeAnalysis.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.CodeAnalysis.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Configuration.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Configuration.Binder.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Configuration.EnvironmentVariables.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Configuration.FileExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.DependencyInjection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.DependencyInjection.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.FileProviders.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.FileProviders.Physical.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.FileSystemGlobbing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Logging.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Logging.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.ObjectPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Options.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Extensions.WebEncoders.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Net.Http.Headers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Nett.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Newtonsoft.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\NLog.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\PlaylistsNET.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\BouncyCastle.Crypto.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\SixLabors.ImageSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Chaos.NaCl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Pipelines.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.CompilerServices.Unsafe.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\cs\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\de\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\es\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\fr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\it\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\ja\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\ko\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\pl\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\pt-BR\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\ru\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\tr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\zh-Hans\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\zh-Hant\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\cs\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\de\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\es\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\fr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\it\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\ja\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\ko\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\pl\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\pt-BR\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\ru\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\tr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\zh-Hans\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\zh-Hant\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.VisualBasic.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.VisualBasic.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Win32.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\Microsoft.Win32.Registry.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.AppContext.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Buffers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Collections.Concurrent.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Collections.Immutable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Collections.NonGeneric.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Collections.Specialized.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Collections.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ComponentModel.Annotations.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ComponentModel.DataAnnotations.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ComponentModel.EventBasedAsync.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ComponentModel.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ComponentModel.TypeConverter.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ComponentModel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Console.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Data.Common.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Data.DataSetExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Data.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.Contracts.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.Debug.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.DiagnosticSource.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.FileVersionInfo.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.Process.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.StackTrace.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.TextWriterTraceListener.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.Tools.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.TraceSource.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Diagnostics.Tracing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Drawing.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Drawing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Dynamic.Runtime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Globalization.Calendars.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Globalization.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Globalization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Compression.Brotli.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Compression.FileSystem.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Compression.ZipFile.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Compression.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.FileSystem.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.FileSystem.DriveInfo.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.FileSystem.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.FileSystem.Watcher.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.FileSystem.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.IsolatedStorage.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.MemoryMappedFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Pipes.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Pipes.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.UnmanagedMemoryStream.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Linq.Expressions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Linq.Parallel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Linq.Queryable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Memory.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.HttpListener.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Mail.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.NameResolution.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.NetworkInformation.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Ping.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Requests.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Security.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.ServicePoint.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.WebClient.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.WebHeaderCollection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.WebProxy.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.WebSockets.Client.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.WebSockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Numerics.Vectors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Numerics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ObjectModel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Private.DataContractSerialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Private.Uri.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Private.Xml.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Private.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.DispatchProxy.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.Emit.ILGeneration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.Emit.Lightweight.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.Emit.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.Metadata.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.TypeExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Reflection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Resources.Reader.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Resources.ResourceManager.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Resources.Writer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.CompilerServices.VisualC.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Handles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.InteropServices.RuntimeInformation.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.InteropServices.WindowsRuntime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.InteropServices.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Intrinsics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Loader.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Numerics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Serialization.Formatters.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Serialization.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Serialization.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Serialization.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.Serialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.WindowsRuntime.UI.Xaml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.WindowsRuntime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Runtime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Claims.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.Algorithms.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.Cng.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.Csp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.Encoding.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.OpenSsl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.X509Certificates.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Principal.Windows.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Principal.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.SecureString.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ServiceModel.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ServiceProcess.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Text.Encoding.CodePages.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Text.Encoding.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Text.Encoding.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Text.Encodings.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Text.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Text.RegularExpressions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.Channels.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.Overlapped.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.Tasks.Dataflow.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.Tasks.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.Tasks.Parallel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.Tasks.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.Thread.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.ThreadPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.Timer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Threading.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Transactions.Local.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Transactions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.ValueTuple.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Web.HttpUtility.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Windows.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.ReaderWriter.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.Serialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.XDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.XPath.XDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.XPath.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.XmlDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.XmlSerializer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\WindowsBase.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\mscorlib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\netstandard.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\SOS_README.md\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Globalization.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Compression.Native.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.IO.Compression.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Native.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Http.Native.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Http.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Security.Native.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Net.Security.Native.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Private.CoreLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.Native.OpenSsl.a\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\System.Security.Cryptography.Native.OpenSsl.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\createdump\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\libclrjit.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\libcoreclr.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\libcoreclrtraceptprovider.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\libdbgshim.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\libhostfxr.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\libhostpolicy.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\libmscordaccore.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\libmscordbi.so\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\linux-x64\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.csproj.SuggestedBindingRedirects.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.Localization.strings.resources\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.csproj.GenerateResource.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.csproj.CopyComplete\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\linux-x64\\TS3AudioBot.genruntimeconfig.cache\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.csproj.SuggestedBindingRedirects.cache",
    "content": "ef24e4af7229c939c818abac044d4f1b112c94d6\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.deps.json",
    "content": "{\n  \"runtimeTarget\": {\n    \"name\": \".NETCoreApp,Version=v3.1/linux-x64\",\n    \"signature\": \"\"\n  },\n  \"compilationOptions\": {},\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {},\n    \".NETCoreApp,Version=v3.1/linux-x64\": {\n      \"TS3AudioBot/1.0.0\": {\n        \"dependencies\": {\n          \"CliWrap\": \"3.1.0\",\n          \"CommandLineParser\": \"2.8.0\",\n          \"LiteDB\": \"4.1.4\",\n          \"Microsoft.AspNetCore.Cors\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel\": \"2.2.0\",\n          \"Microsoft.AspNetCore.StaticFiles\": \"2.2.0\",\n          \"Microsoft.CodeAnalysis.CSharp\": \"3.7.0\",\n          \"NLog\": \"4.7.3\",\n          \"Nett\": \"0.15.0\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"PlaylistsNET\": \"1.1.2\",\n          \"SixLabors.ImageSharp\": \"1.0.0\",\n          \"Splamy.TSLib\": \"1.1.0\",\n          \"TSLib\": \"1.1.0.0\",\n          \"runtimepack.Microsoft.NETCore.App.Runtime.linux-x64\": \"3.1.32\"\n        },\n        \"runtime\": {\n          \"TS3AudioBot.dll\": {}\n        }\n      },\n      \"runtimepack.Microsoft.NETCore.App.Runtime.linux-x64/3.1.32\": {\n        \"runtime\": {\n          \"Microsoft.CSharp.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"Microsoft.VisualBasic.Core.dll\": {\n            \"assemblyVersion\": \"10.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"Microsoft.VisualBasic.dll\": {\n            \"assemblyVersion\": \"10.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"Microsoft.Win32.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"Microsoft.Win32.Registry.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.AppContext.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Buffers.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.Concurrent.dll\": {\n            \"assemblyVersion\": \"4.0.15.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.Immutable.dll\": {\n            \"assemblyVersion\": \"1.2.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.NonGeneric.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.Specialized.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.Annotations.dll\": {\n            \"assemblyVersion\": \"4.3.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.DataAnnotations.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.EventBasedAsync.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.Primitives.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.TypeConverter.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Configuration.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Console.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Core.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Data.Common.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Data.DataSetExtensions.dll\": {\n            \"assemblyVersion\": \"4.0.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Data.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Contracts.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Debug.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.DiagnosticSource.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.FileVersionInfo.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Process.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.StackTrace.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.TextWriterTraceListener.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Tools.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.TraceSource.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Tracing.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Drawing.Primitives.dll\": {\n            \"assemblyVersion\": \"4.2.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Drawing.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Dynamic.Runtime.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Globalization.Calendars.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Globalization.Extensions.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Globalization.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Compression.Brotli.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Compression.FileSystem.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Compression.ZipFile.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Compression.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.AccessControl.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.DriveInfo.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.Watcher.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.IsolatedStorage.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.MemoryMappedFiles.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Pipes.AccessControl.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Pipes.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.UnmanagedMemoryStream.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Linq.Expressions.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Linq.Parallel.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Linq.Queryable.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Linq.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Memory.dll\": {\n            \"assemblyVersion\": \"4.2.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Http.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.HttpListener.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Mail.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.NameResolution.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.NetworkInformation.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Ping.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Requests.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Security.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.ServicePoint.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Sockets.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebClient.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebHeaderCollection.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebProxy.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebSockets.Client.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebSockets.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Numerics.Vectors.dll\": {\n            \"assemblyVersion\": \"4.1.6.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Numerics.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ObjectModel.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Private.DataContractSerialization.dll\": {\n            \"assemblyVersion\": \"4.1.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Private.Uri.dll\": {\n            \"assemblyVersion\": \"4.0.6.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Private.Xml.Linq.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Private.Xml.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.DispatchProxy.dll\": {\n            \"assemblyVersion\": \"4.0.6.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Emit.ILGeneration.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Emit.Lightweight.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Emit.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Extensions.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Metadata.dll\": {\n            \"assemblyVersion\": \"1.4.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.TypeExtensions.dll\": {\n            \"assemblyVersion\": \"4.1.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Resources.Reader.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Resources.ResourceManager.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Resources.Writer.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.CompilerServices.VisualC.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Extensions.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Handles.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.InteropServices.RuntimeInformation.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.InteropServices.WindowsRuntime.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.InteropServices.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Intrinsics.dll\": {\n            \"assemblyVersion\": \"4.0.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Loader.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Numerics.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.Formatters.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.Json.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.Primitives.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.Xml.dll\": {\n            \"assemblyVersion\": \"4.1.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.WindowsRuntime.UI.Xaml.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.WindowsRuntime.dll\": {\n            \"assemblyVersion\": \"4.0.15.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.AccessControl.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Claims.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Algorithms.dll\": {\n            \"assemblyVersion\": \"4.3.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Cng.dll\": {\n            \"assemblyVersion\": \"4.3.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Csp.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Encoding.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.OpenSsl.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.X509Certificates.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Principal.Windows.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Principal.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.SecureString.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ServiceModel.Web.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ServiceProcess.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Encoding.CodePages.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Encoding.Extensions.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Encoding.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Encodings.Web.dll\": {\n            \"assemblyVersion\": \"4.0.5.1\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Json.dll\": {\n            \"assemblyVersion\": \"4.0.1.2\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.RegularExpressions.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Channels.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Overlapped.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Tasks.Dataflow.dll\": {\n            \"assemblyVersion\": \"4.6.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Tasks.Extensions.dll\": {\n            \"assemblyVersion\": \"4.3.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Tasks.Parallel.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Tasks.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Thread.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.ThreadPool.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Timer.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Transactions.Local.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Transactions.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ValueTuple.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Web.HttpUtility.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Web.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Windows.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.Linq.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.ReaderWriter.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.Serialization.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XDocument.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XPath.XDocument.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XPath.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XmlDocument.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XmlSerializer.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"WindowsBase.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"mscorlib.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"netstandard.dll\": {\n            \"assemblyVersion\": \"2.1.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          }\n        },\n        \"native\": {\n          \"SOS_README.md\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Globalization.Native.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.IO.Compression.Native.a\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.IO.Compression.Native.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Native.a\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Native.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Net.Http.Native.a\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Net.Http.Native.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Net.Security.Native.a\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Net.Security.Native.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Private.CoreLib.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"System.Security.Cryptography.Native.OpenSsl.a\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Security.Cryptography.Native.OpenSsl.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"createdump\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"libclrjit.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"libcoreclr.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"libcoreclrtraceptprovider.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"libdbgshim.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"libhostfxr.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"libhostpolicy.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"libmscordaccore.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"libmscordbi.so\": {\n            \"fileVersion\": \"0.0.0.0\"\n          }\n        }\n      },\n      \"CliWrap/3.1.0\": {\n        \"runtime\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"assemblyVersion\": \"3.1.0.0\",\n            \"fileVersion\": \"3.1.0.0\"\n          }\n        }\n      },\n      \"CommandLineParser/2.8.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"assemblyVersion\": \"2.8.0.0\",\n            \"fileVersion\": \"2.8.0.0\"\n          }\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {\n            \"assemblyVersion\": \"2.0.19.0\",\n            \"fileVersion\": \"2.0.19.0\"\n          }\n        }\n      },\n      \"LiteDB/4.1.4\": {\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.TypeExtensions\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"assemblyVersion\": \"4.1.4.0\",\n            \"fileVersion\": \"4.1.4.0\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Cors/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.EnvironmentVariables\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.FileExtensions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Diagnostics.DiagnosticSource\": \"4.5.0\",\n          \"System.Reflection.Metadata\": \"1.6.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Server.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.ObjectPool\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Https\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Numerics.Vectors\": \"4.5.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Security.Cryptography.Cng\": \"4.5.0\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Connections.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.WebEncoders\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {},\n      \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Analyzers\": \"3.0.0\",\n          \"System.Collections.Immutable\": \"1.5.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Reflection.Metadata\": \"1.6.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Text.Encoding.CodePages\": \"4.5.1\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"assemblyVersion\": \"3.7.0.0\",\n            \"fileVersion\": \"3.700.20.37502\"\n          }\n        },\n        \"resources\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Common\": \"3.7.0\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"assemblyVersion\": \"3.7.0.0\",\n            \"fileVersion\": \"3.700.20.37502\"\n          }\n        },\n        \"resources\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileSystemGlobbing\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Options/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.ComponentModel.Annotations\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Primitives/2.2.0\": {\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.4\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.Net.Http.Headers/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/2.1.2\": {},\n      \"Microsoft.NETCore.Targets/1.1.0\": {},\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.unix.Microsoft.Win32.Primitives\": \"4.3.0\"\n        }\n      },\n      \"Nett/0.15.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"assemblyVersion\": \"0.15.0.0\",\n            \"fileVersion\": \"0.15.0.0\"\n          }\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"assemblyVersion\": \"12.0.0.0\",\n            \"fileVersion\": \"12.0.3.23909\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.7.3.11982\"\n          }\n        }\n      },\n      \"PlaylistsNET/1.1.2\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {\n            \"assemblyVersion\": \"1.0.6.0\",\n            \"fileVersion\": \"1.0.6.0\"\n          }\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"assemblyVersion\": \"1.8.6.0\",\n            \"fileVersion\": \"1.8.6.7\"\n          }\n        }\n      },\n      \"runtime.any.System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"runtime.any.System.Diagnostics.Tracing/4.3.0\": {},\n      \"runtime.any.System.Globalization/4.3.0\": {},\n      \"runtime.any.System.IO/4.3.0\": {},\n      \"runtime.any.System.Reflection/4.3.0\": {},\n      \"runtime.any.System.Reflection.Primitives/4.3.0\": {},\n      \"runtime.any.System.Resources.ResourceManager/4.3.0\": {},\n      \"runtime.any.System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"System.Private.Uri\": \"4.3.0\"\n        }\n      },\n      \"runtime.any.System.Runtime.Handles/4.3.0\": {},\n      \"runtime.any.System.Runtime.InteropServices/4.3.0\": {},\n      \"runtime.any.System.Text.Encoding/4.3.0\": {},\n      \"runtime.any.System.Text.Encoding.Extensions/4.3.0\": {},\n      \"runtime.any.System.Threading.Tasks/4.3.0\": {},\n      \"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.native.System/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"dependencies\": {\n          \"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\"\n        }\n      },\n      \"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {},\n      \"runtime.unix.Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"runtime.unix.System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"runtime.unix.System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Text.Encoding.Extensions\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"runtime.unix.System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"runtime.unix.System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.Net.NameResolution\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"runtime.unix.System.Private.Uri/4.3.0\": {\n        \"dependencies\": {\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"runtime.unix.System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"System.Private.Uri\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\",\n          \"runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\"\n        }\n      },\n      \"SixLabors.ImageSharp/1.0.0\": {\n        \"runtime\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"assemblyVersion\": \"1.0.0.0\",\n            \"fileVersion\": \"1.0.0.0\"\n          }\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {\n            \"assemblyVersion\": \"1.0.3.0\",\n            \"fileVersion\": \"1.0.3.0\"\n          }\n        }\n      },\n      \"System.Buffers/4.5.0\": {},\n      \"System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Collections\": \"4.3.0\"\n        }\n      },\n      \"System.Collections.Immutable/1.5.0\": {},\n      \"System.ComponentModel.Annotations/4.5.0\": {},\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.unix.System.Diagnostics.Debug\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.DiagnosticSource/4.5.0\": {},\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Diagnostics.Tracing\": \"4.3.0\"\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Globalization\": \"4.3.0\"\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.any.System.IO\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.unix.System.IO.FileSystem\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {\n            \"assemblyVersion\": \"4.0.2.1\",\n            \"fileVersion\": \"4.700.20.21406\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        }\n      },\n      \"System.Memory/4.5.4\": {},\n      \"System.Net.NameResolution/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"runtime.unix.System.Net.Primitives\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.unix.System.Net.Sockets\": \"4.3.0\"\n        }\n      },\n      \"System.Numerics.Vectors/4.5.0\": {},\n      \"System.Private.Uri/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"runtime.unix.System.Private.Uri\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Reflection\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.Metadata/1.6.0\": {},\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Reflection.Primitives\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.TypeExtensions/4.3.0\": {\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Resources.ResourceManager\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"runtime.any.System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n        \"runtime\": {\n          \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"assemblyVersion\": \"4.0.6.0\",\n            \"fileVersion\": \"4.700.19.56404\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.unix.System.Runtime.Extensions\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"runtime.any.System.Runtime.InteropServices\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Cryptography.Cng/4.5.0\": {},\n      \"System.Security.Principal/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Text.Encoding\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding.CodePages/4.5.1\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\"\n        }\n      },\n      \"System.Text.Encoding.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"runtime.any.System.Text.Encoding.Extensions\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encodings.Web/4.5.0\": {},\n      \"System.Threading/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.3\": {},\n      \"System.Threading.Thread/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"Splamy.TSLib/1.1.0\": {\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"runtime\": {\n          \"TSLib.dll\": {}\n        }\n      },\n      \"TSLib/1.1.0.0\": {\n        \"runtime\": {\n          \"TSLib.dll\": {\n            \"assemblyVersion\": \"1.1.0.0\",\n            \"fileVersion\": \"1.1.0.0\"\n          }\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"TS3AudioBot/1.0.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"runtimepack.Microsoft.NETCore.App.Runtime.linux-x64/3.1.32\": {\n      \"type\": \"runtimepack\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"CliWrap/3.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==\",\n      \"path\": \"cliwrap/3.1.0\",\n      \"hashPath\": \"cliwrap.3.1.0.nupkg.sha512\"\n    },\n    \"CommandLineParser/2.8.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==\",\n      \"path\": \"commandlineparser/2.8.0\",\n      \"hashPath\": \"commandlineparser.2.8.0.nupkg.sha512\"\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"hashPath\": \"heijden.dns.portable.2.0.19.nupkg.sha512\"\n    },\n    \"LiteDB/4.1.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==\",\n      \"path\": \"litedb/4.1.4\",\n      \"hashPath\": \"litedb.4.1.4.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==\",\n      \"path\": \"microsoft.aspnetcore.connections.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Cors/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==\",\n      \"path\": \"microsoft.aspnetcore.cors/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==\",\n      \"path\": \"microsoft.aspnetcore.hosting/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==\",\n      \"path\": \"microsoft.aspnetcore.hosting.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==\",\n      \"path\": \"microsoft.aspnetcore.hosting.server.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Http/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==\",\n      \"path\": \"microsoft.aspnetcore.http/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.http.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==\",\n      \"path\": \"microsoft.aspnetcore.http.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==\",\n      \"path\": \"microsoft.aspnetcore.http.extensions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==\",\n      \"path\": \"microsoft.aspnetcore.http.features/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.core/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.https/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==\",\n      \"path\": \"microsoft.aspnetcore.staticfiles/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==\",\n      \"path\": \"microsoft.aspnetcore.webutilities/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==\",\n      \"path\": \"microsoft.codeanalysis.analyzers/3.0.0\",\n      \"hashPath\": \"microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\"\n    },\n    \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==\",\n      \"path\": \"microsoft.codeanalysis.common/3.7.0\",\n      \"hashPath\": \"microsoft.codeanalysis.common.3.7.0.nupkg.sha512\"\n    },\n    \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==\",\n      \"path\": \"microsoft.codeanalysis.csharp/3.7.0\",\n      \"hashPath\": \"microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==\",\n      \"path\": \"microsoft.extensions.configuration/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==\",\n      \"path\": \"microsoft.extensions.configuration.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==\",\n      \"path\": \"microsoft.extensions.configuration.binder/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==\",\n      \"path\": \"microsoft.extensions.configuration.environmentvariables/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==\",\n      \"path\": \"microsoft.extensions.configuration.fileextensions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==\",\n      \"path\": \"microsoft.extensions.dependencyinjection/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==\",\n      \"path\": \"microsoft.extensions.dependencyinjection.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==\",\n      \"path\": \"microsoft.extensions.fileproviders.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==\",\n      \"path\": \"microsoft.extensions.fileproviders.physical/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==\",\n      \"path\": \"microsoft.extensions.filesystemglobbing/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==\",\n      \"path\": \"microsoft.extensions.hosting.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Logging/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==\",\n      \"path\": \"microsoft.extensions.logging/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.logging.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==\",\n      \"path\": \"microsoft.extensions.logging.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==\",\n      \"path\": \"microsoft.extensions.objectpool/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.objectpool.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Options/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==\",\n      \"path\": \"microsoft.extensions.options/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.options.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Primitives/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==\",\n      \"path\": \"microsoft.extensions.primitives/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.primitives.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==\",\n      \"path\": \"microsoft.extensions.webencoders/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.webencoders.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Net.Http.Headers/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==\",\n      \"path\": \"microsoft.net.http.headers/2.2.0\",\n      \"hashPath\": \"microsoft.net.http.headers.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Platforms/2.1.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==\",\n      \"path\": \"microsoft.netcore.platforms/2.1.2\",\n      \"hashPath\": \"microsoft.netcore.platforms.2.1.2.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.targets.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"Nett/0.15.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==\",\n      \"path\": \"nett/0.15.0\",\n      \"hashPath\": \"nett.0.15.0.nupkg.sha512\"\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"hashPath\": \"newtonsoft.json.12.0.3.nupkg.sha512\"\n    },\n    \"NLog/4.7.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"path\": \"nlog/4.7.3\",\n      \"hashPath\": \"nlog.4.7.3.nupkg.sha512\"\n    },\n    \"PlaylistsNET/1.1.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==\",\n      \"path\": \"playlistsnet/1.1.2\",\n      \"hashPath\": \"playlistsnet.1.1.2.nupkg.sha512\"\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"hashPath\": \"portable.bouncycastle.1.8.6.7.nupkg.sha512\"\n    },\n    \"runtime.any.System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==\",\n      \"path\": \"runtime.any.system.collections/4.3.0\",\n      \"hashPath\": \"runtime.any.system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==\",\n      \"path\": \"runtime.any.system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==\",\n      \"path\": \"runtime.any.system.globalization/4.3.0\",\n      \"hashPath\": \"runtime.any.system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==\",\n      \"path\": \"runtime.any.system.io/4.3.0\",\n      \"hashPath\": \"runtime.any.system.io.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==\",\n      \"path\": \"runtime.any.system.reflection/4.3.0\",\n      \"hashPath\": \"runtime.any.system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==\",\n      \"path\": \"runtime.any.system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==\",\n      \"path\": \"runtime.any.system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==\",\n      \"path\": \"runtime.any.system.runtime/4.3.0\",\n      \"hashPath\": \"runtime.any.system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==\",\n      \"path\": \"runtime.any.system.runtime.handles/4.3.0\",\n      \"hashPath\": \"runtime.any.system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==\",\n      \"path\": \"runtime.any.system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==\",\n      \"path\": \"runtime.any.system.text.encoding/4.3.0\",\n      \"hashPath\": \"runtime.any.system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Text.Encoding.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==\",\n      \"path\": \"runtime.any.system.text.encoding.extensions/4.3.0\",\n      \"hashPath\": \"runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==\",\n      \"path\": \"runtime.any.system.threading.tasks/4.3.0\",\n      \"hashPath\": \"runtime.any.system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==\",\n      \"path\": \"runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==\",\n      \"path\": \"runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==\",\n      \"path\": \"runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"hashPath\": \"runtime.native.system.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==\",\n      \"path\": \"runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==\",\n      \"path\": \"runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==\",\n      \"path\": \"runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==\",\n      \"path\": \"runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==\",\n      \"path\": \"runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==\",\n      \"path\": \"runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==\",\n      \"path\": \"runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==\",\n      \"path\": \"runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"hashPath\": \"runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.unix.Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-2mI2Mfq+CVatgr4RWGvAWBjoCfUafy6VNFU7G9OA52DjO8x/okfIbsEq2UPgeGfdpO7X5gmPXKT8slx0tn0Mhw==\",\n      \"path\": \"runtime.unix.microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"runtime.unix.microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.unix.System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-WV8KLRHWVUVUDduFnvGMHt0FsEt2wK6xPl1EgDKlaMx2KnZ43A/O0GzP8wIuvAC7mq4T9V1mm90r+PXkL9FPdQ==\",\n      \"path\": \"runtime.unix.system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"runtime.unix.system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.unix.System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ajmTcjrqc3vgV1TH54DRioshbEniaFbOAJ0kReGuNsp9uIcqYle0RmUo6+Qlwqe3JIs4TDxgnqs3UzX3gRJ1rA==\",\n      \"path\": \"runtime.unix.system.io.filesystem/4.3.0\",\n      \"hashPath\": \"runtime.unix.system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.unix.System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-AZcRXhH7Gamr+bckUfX3iHefPIrujJTt9XWQWo0elNiP1SNasX0KBWINZkDKY0GsOrsyJ7cB4MgIRTZzLlsTKg==\",\n      \"path\": \"runtime.unix.system.net.primitives/4.3.0\",\n      \"hashPath\": \"runtime.unix.system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.unix.System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-4NcLbqajFaD3PvhOdmbieeBlKY4d8/kBfgJ5g28n6k1jWEICabvLM62gvmUS/CvyfvcZxVanKPl+E9LhPzfXZw==\",\n      \"path\": \"runtime.unix.system.net.sockets/4.3.0\",\n      \"hashPath\": \"runtime.unix.system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.unix.System.Private.Uri/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ooWzobr5RAq34r9uan1r/WPXJYG1XWy9KanrxNvEnBzbFdQbMG7Y3bVi4QxR7xZMNLOxLLTAyXvnSkfj5boZSg==\",\n      \"path\": \"runtime.unix.system.private.uri/4.3.0\",\n      \"hashPath\": \"runtime.unix.system.private.uri.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.unix.System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zQiTBVpiLftTQZW8GFsV0gjYikB1WMkEPIxF5O6RkUrSV/OgvRRTYgeFQha/0keBpuS0HYweraGRwhfhJ7dj7w==\",\n      \"path\": \"runtime.unix.system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"runtime.unix.system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"SixLabors.ImageSharp/1.0.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==\",\n      \"path\": \"sixlabors.imagesharp/1.0.0\",\n      \"hashPath\": \"sixlabors.imagesharp.1.0.0.nupkg.sha512\"\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"hashPath\": \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\"\n    },\n    \"System.Buffers/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==\",\n      \"path\": \"system.buffers/4.5.0\",\n      \"hashPath\": \"system.buffers.4.5.0.nupkg.sha512\"\n    },\n    \"System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"path\": \"system.collections/4.3.0\",\n      \"hashPath\": \"system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"System.Collections.Immutable/1.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==\",\n      \"path\": \"system.collections.immutable/1.5.0\",\n      \"hashPath\": \"system.collections.immutable.1.5.0.nupkg.sha512\"\n    },\n    \"System.ComponentModel.Annotations/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==\",\n      \"path\": \"system.componentmodel.annotations/4.5.0\",\n      \"hashPath\": \"system.componentmodel.annotations.4.5.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==\",\n      \"path\": \"system.diagnostics.diagnosticsource/4.5.0\",\n      \"hashPath\": \"system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"hashPath\": \"system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"path\": \"system.io/4.3.0\",\n      \"hashPath\": \"system.io.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"hashPath\": \"system.io.pipelines.4.7.2.nupkg.sha512\"\n    },\n    \"System.Linq/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"path\": \"system.linq/4.3.0\",\n      \"hashPath\": \"system.linq.4.3.0.nupkg.sha512\"\n    },\n    \"System.Memory/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"path\": \"system.memory/4.5.4\",\n      \"hashPath\": \"system.memory.4.5.4.nupkg.sha512\"\n    },\n    \"System.Net.NameResolution/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==\",\n      \"path\": \"system.net.nameresolution/4.3.0\",\n      \"hashPath\": \"system.net.nameresolution.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"hashPath\": \"system.net.networkinformation.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"hashPath\": \"system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"hashPath\": \"system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"System.Numerics.Vectors/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==\",\n      \"path\": \"system.numerics.vectors/4.5.0\",\n      \"hashPath\": \"system.numerics.vectors.4.5.0.nupkg.sha512\"\n    },\n    \"System.Private.Uri/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==\",\n      \"path\": \"system.private.uri/4.3.0\",\n      \"hashPath\": \"system.private.uri.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"hashPath\": \"system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Metadata/1.6.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==\",\n      \"path\": \"system.reflection.metadata/1.6.0\",\n      \"hashPath\": \"system.reflection.metadata.1.6.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.TypeExtensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==\",\n      \"path\": \"system.reflection.typeextensions/4.3.0\",\n      \"hashPath\": \"system.reflection.typeextensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"hashPath\": \"system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.7.0\",\n      \"hashPath\": \"system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"hashPath\": \"system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"hashPath\": \"system.security.claims.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Cryptography.Cng/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==\",\n      \"path\": \"system.security.cryptography.cng/4.5.0\",\n      \"hashPath\": \"system.security.cryptography.cng.4.5.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"hashPath\": \"system.security.principal.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"hashPath\": \"system.security.principal.windows.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"hashPath\": \"system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding.CodePages/4.5.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==\",\n      \"path\": \"system.text.encoding.codepages/4.5.1\",\n      \"hashPath\": \"system.text.encoding.codepages.4.5.1.nupkg.sha512\"\n    },\n    \"System.Text.Encoding.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==\",\n      \"path\": \"system.text.encoding.extensions/4.3.0\",\n      \"hashPath\": \"system.text.encoding.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encodings.Web/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==\",\n      \"path\": \"system.text.encodings.web/4.5.0\",\n      \"hashPath\": \"system.text.encodings.web.4.5.0.nupkg.sha512\"\n    },\n    \"System.Threading/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"path\": \"system.threading/4.3.0\",\n      \"hashPath\": \"system.threading.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"hashPath\": \"system.threading.overlapped.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"hashPath\": \"system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks.Extensions/4.5.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==\",\n      \"path\": \"system.threading.tasks.extensions/4.5.3\",\n      \"hashPath\": \"system.threading.tasks.extensions.4.5.3.nupkg.sha512\"\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"hashPath\": \"system.threading.thread.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"hashPath\": \"system.threading.threadpool.4.3.0.nupkg.sha512\"\n    },\n    \"Splamy.TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"TSLib/1.1.0.0\": {\n      \"type\": \"reference\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    }\n  },\n  \"runtimes\": {\n    \"alpine-x64\": [\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.10-x64\": [\n      \"alpine.3.10\",\n      \"alpine.3.9-x64\",\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.11-x64\": [\n      \"alpine.3.11\",\n      \"alpine.3.10-x64\",\n      \"alpine.3.10\",\n      \"alpine.3.9-x64\",\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.12-x64\": [\n      \"alpine.3.12\",\n      \"alpine.3.11-x64\",\n      \"alpine.3.11\",\n      \"alpine.3.10-x64\",\n      \"alpine.3.10\",\n      \"alpine.3.9-x64\",\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.13-x64\": [\n      \"alpine.3.13\",\n      \"alpine.3.12-x64\",\n      \"alpine.3.12\",\n      \"alpine.3.11-x64\",\n      \"alpine.3.11\",\n      \"alpine.3.10-x64\",\n      \"alpine.3.10\",\n      \"alpine.3.9-x64\",\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.14-x64\": [\n      \"alpine.3.14\",\n      \"alpine.3.13-x64\",\n      \"alpine.3.13\",\n      \"alpine.3.12-x64\",\n      \"alpine.3.12\",\n      \"alpine.3.11-x64\",\n      \"alpine.3.11\",\n      \"alpine.3.10-x64\",\n      \"alpine.3.10\",\n      \"alpine.3.9-x64\",\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.15-x64\": [\n      \"alpine.3.15\",\n      \"alpine.3.14-x64\",\n      \"alpine.3.14\",\n      \"alpine.3.13-x64\",\n      \"alpine.3.13\",\n      \"alpine.3.12-x64\",\n      \"alpine.3.12\",\n      \"alpine.3.11-x64\",\n      \"alpine.3.11\",\n      \"alpine.3.10-x64\",\n      \"alpine.3.10\",\n      \"alpine.3.9-x64\",\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.16-x64\": [\n      \"alpine.3.16\",\n      \"alpine.3.15-x64\",\n      \"alpine.3.15\",\n      \"alpine.3.14-x64\",\n      \"alpine.3.14\",\n      \"alpine.3.13-x64\",\n      \"alpine.3.13\",\n      \"alpine.3.12-x64\",\n      \"alpine.3.12\",\n      \"alpine.3.11-x64\",\n      \"alpine.3.11\",\n      \"alpine.3.10-x64\",\n      \"alpine.3.10\",\n      \"alpine.3.9-x64\",\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.17-x64\": [\n      \"alpine.3.17\",\n      \"alpine.3.16-x64\",\n      \"alpine.3.16\",\n      \"alpine.3.15-x64\",\n      \"alpine.3.15\",\n      \"alpine.3.14-x64\",\n      \"alpine.3.14\",\n      \"alpine.3.13-x64\",\n      \"alpine.3.13\",\n      \"alpine.3.12-x64\",\n      \"alpine.3.12\",\n      \"alpine.3.11-x64\",\n      \"alpine.3.11\",\n      \"alpine.3.10-x64\",\n      \"alpine.3.10\",\n      \"alpine.3.9-x64\",\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.6-x64\": [\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.7-x64\": [\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.8-x64\": [\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"alpine.3.9-x64\": [\n      \"alpine.3.9\",\n      \"alpine.3.8-x64\",\n      \"alpine.3.8\",\n      \"alpine.3.7-x64\",\n      \"alpine.3.7\",\n      \"alpine.3.6-x64\",\n      \"alpine.3.6\",\n      \"alpine-x64\",\n      \"alpine\",\n      \"linux-musl-x64\",\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android-x64\": [\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.21-x64\": [\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.22-x64\": [\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.23-x64\": [\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.24-x64\": [\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.25-x64\": [\n      \"android.25\",\n      \"android.24-x64\",\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.26-x64\": [\n      \"android.26\",\n      \"android.25-x64\",\n      \"android.25\",\n      \"android.24-x64\",\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.27-x64\": [\n      \"android.27\",\n      \"android.26-x64\",\n      \"android.26\",\n      \"android.25-x64\",\n      \"android.25\",\n      \"android.24-x64\",\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.28-x64\": [\n      \"android.28\",\n      \"android.27-x64\",\n      \"android.27\",\n      \"android.26-x64\",\n      \"android.26\",\n      \"android.25-x64\",\n      \"android.25\",\n      \"android.24-x64\",\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.29-x64\": [\n      \"android.29\",\n      \"android.28-x64\",\n      \"android.28\",\n      \"android.27-x64\",\n      \"android.27\",\n      \"android.26-x64\",\n      \"android.26\",\n      \"android.25-x64\",\n      \"android.25\",\n      \"android.24-x64\",\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.30-x64\": [\n      \"android.30\",\n      \"android.29-x64\",\n      \"android.29\",\n      \"android.28-x64\",\n      \"android.28\",\n      \"android.27-x64\",\n      \"android.27\",\n      \"android.26-x64\",\n      \"android.26\",\n      \"android.25-x64\",\n      \"android.25\",\n      \"android.24-x64\",\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.31-x64\": [\n      \"android.31\",\n      \"android.30-x64\",\n      \"android.30\",\n      \"android.29-x64\",\n      \"android.29\",\n      \"android.28-x64\",\n      \"android.28\",\n      \"android.27-x64\",\n      \"android.27\",\n      \"android.26-x64\",\n      \"android.26\",\n      \"android.25-x64\",\n      \"android.25\",\n      \"android.24-x64\",\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"android.32-x64\": [\n      \"android.32\",\n      \"android.31-x64\",\n      \"android.31\",\n      \"android.30-x64\",\n      \"android.30\",\n      \"android.29-x64\",\n      \"android.29\",\n      \"android.28-x64\",\n      \"android.28\",\n      \"android.27-x64\",\n      \"android.27\",\n      \"android.26-x64\",\n      \"android.26\",\n      \"android.25-x64\",\n      \"android.25\",\n      \"android.24-x64\",\n      \"android.24\",\n      \"android.23-x64\",\n      \"android.23\",\n      \"android.22-x64\",\n      \"android.22\",\n      \"android.21-x64\",\n      \"android.21\",\n      \"android-x64\",\n      \"android\",\n      \"linux-bionic-x64\",\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"arch-x64\": [\n      \"arch\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"centos-x64\": [\n      \"centos\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"centos.7-x64\": [\n      \"centos.7\",\n      \"centos-x64\",\n      \"rhel.7-x64\",\n      \"centos\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"centos.8-x64\": [\n      \"centos.8\",\n      \"centos-x64\",\n      \"rhel.8-x64\",\n      \"centos\",\n      \"rhel.8\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"centos.9-x64\": [\n      \"centos.9\",\n      \"centos-x64\",\n      \"rhel.9-x64\",\n      \"centos\",\n      \"rhel.9\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"debian-x64\": [\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"debian.10-x64\": [\n      \"debian.10\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"debian.11-x64\": [\n      \"debian.11\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"debian.8-x64\": [\n      \"debian.8\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"debian.9-x64\": [\n      \"debian.9\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"exherbo-x64\": [\n      \"exherbo\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora-x64\": [\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.23-x64\": [\n      \"fedora.23\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.24-x64\": [\n      \"fedora.24\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.25-x64\": [\n      \"fedora.25\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.26-x64\": [\n      \"fedora.26\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.27-x64\": [\n      \"fedora.27\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.28-x64\": [\n      \"fedora.28\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.29-x64\": [\n      \"fedora.29\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.30-x64\": [\n      \"fedora.30\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.31-x64\": [\n      \"fedora.31\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.32-x64\": [\n      \"fedora.32\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.33-x64\": [\n      \"fedora.33\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.34-x64\": [\n      \"fedora.34\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.35-x64\": [\n      \"fedora.35\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.36-x64\": [\n      \"fedora.36\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.37-x64\": [\n      \"fedora.37\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"fedora.38-x64\": [\n      \"fedora.38\",\n      \"fedora-x64\",\n      \"fedora\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"gentoo-x64\": [\n      \"gentoo\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linux-bionic-x64\": [\n      \"linux-bionic\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linux-musl-x64\": [\n      \"linux-musl\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linux-x64\": [\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.17-x64\": [\n      \"linuxmint.17\",\n      \"ubuntu.14.04-x64\",\n      \"ubuntu.14.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.17.1-x64\": [\n      \"linuxmint.17.1\",\n      \"linuxmint.17-x64\",\n      \"linuxmint.17\",\n      \"ubuntu.14.04-x64\",\n      \"ubuntu.14.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.17.2-x64\": [\n      \"linuxmint.17.2\",\n      \"linuxmint.17.1-x64\",\n      \"linuxmint.17.1\",\n      \"linuxmint.17-x64\",\n      \"linuxmint.17\",\n      \"ubuntu.14.04-x64\",\n      \"ubuntu.14.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.17.3-x64\": [\n      \"linuxmint.17.3\",\n      \"linuxmint.17.2-x64\",\n      \"linuxmint.17.2\",\n      \"linuxmint.17.1-x64\",\n      \"linuxmint.17.1\",\n      \"linuxmint.17-x64\",\n      \"linuxmint.17\",\n      \"ubuntu.14.04-x64\",\n      \"ubuntu.14.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.18-x64\": [\n      \"linuxmint.18\",\n      \"ubuntu.16.04-x64\",\n      \"ubuntu.16.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.18.1-x64\": [\n      \"linuxmint.18.1\",\n      \"linuxmint.18-x64\",\n      \"linuxmint.18\",\n      \"ubuntu.16.04-x64\",\n      \"ubuntu.16.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.18.2-x64\": [\n      \"linuxmint.18.2\",\n      \"linuxmint.18.1-x64\",\n      \"linuxmint.18.1\",\n      \"linuxmint.18-x64\",\n      \"linuxmint.18\",\n      \"ubuntu.16.04-x64\",\n      \"ubuntu.16.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.18.3-x64\": [\n      \"linuxmint.18.3\",\n      \"linuxmint.18.2-x64\",\n      \"linuxmint.18.2\",\n      \"linuxmint.18.1-x64\",\n      \"linuxmint.18.1\",\n      \"linuxmint.18-x64\",\n      \"linuxmint.18\",\n      \"ubuntu.16.04-x64\",\n      \"ubuntu.16.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.19-x64\": [\n      \"linuxmint.19\",\n      \"ubuntu.18.04-x64\",\n      \"ubuntu.18.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.19.1-x64\": [\n      \"linuxmint.19.1\",\n      \"linuxmint.19-x64\",\n      \"linuxmint.19\",\n      \"ubuntu.18.04-x64\",\n      \"ubuntu.18.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"linuxmint.19.2-x64\": [\n      \"linuxmint.19.2\",\n      \"linuxmint.19.1-x64\",\n      \"linuxmint.19.1\",\n      \"linuxmint.19-x64\",\n      \"linuxmint.19\",\n      \"ubuntu.18.04-x64\",\n      \"ubuntu.18.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"manjaro-x64\": [\n      \"manjaro\",\n      \"arch-x64\",\n      \"arch\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"miraclelinux-x64\": [\n      \"miraclelinux\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"miraclelinux.8-x64\": [\n      \"miraclelinux.8\",\n      \"miraclelinux-x64\",\n      \"rhel.8-x64\",\n      \"miraclelinux\",\n      \"rhel.8\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"miraclelinux.9-x64\": [\n      \"miraclelinux.9\",\n      \"miraclelinux-x64\",\n      \"rhel.9-x64\",\n      \"miraclelinux\",\n      \"rhel.9\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol-x64\": [\n      \"ol\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.7-x64\": [\n      \"ol.7\",\n      \"ol-x64\",\n      \"rhel.7-x64\",\n      \"ol\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.7.0-x64\": [\n      \"ol.7.0\",\n      \"ol.7-x64\",\n      \"rhel.7.0-x64\",\n      \"ol.7\",\n      \"rhel.7.0\",\n      \"ol-x64\",\n      \"rhel.7-x64\",\n      \"ol\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.7.1-x64\": [\n      \"ol.7.1\",\n      \"ol.7.0-x64\",\n      \"rhel.7.1-x64\",\n      \"ol.7.0\",\n      \"rhel.7.1\",\n      \"ol.7-x64\",\n      \"rhel.7.0-x64\",\n      \"ol.7\",\n      \"rhel.7.0\",\n      \"ol-x64\",\n      \"rhel.7-x64\",\n      \"ol\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.7.2-x64\": [\n      \"ol.7.2\",\n      \"ol.7.1-x64\",\n      \"rhel.7.2-x64\",\n      \"ol.7.1\",\n      \"rhel.7.2\",\n      \"ol.7.0-x64\",\n      \"rhel.7.1-x64\",\n      \"ol.7.0\",\n      \"rhel.7.1\",\n      \"ol.7-x64\",\n      \"rhel.7.0-x64\",\n      \"ol.7\",\n      \"rhel.7.0\",\n      \"ol-x64\",\n      \"rhel.7-x64\",\n      \"ol\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.7.3-x64\": [\n      \"ol.7.3\",\n      \"ol.7.2-x64\",\n      \"rhel.7.3-x64\",\n      \"ol.7.2\",\n      \"rhel.7.3\",\n      \"ol.7.1-x64\",\n      \"rhel.7.2-x64\",\n      \"ol.7.1\",\n      \"rhel.7.2\",\n      \"ol.7.0-x64\",\n      \"rhel.7.1-x64\",\n      \"ol.7.0\",\n      \"rhel.7.1\",\n      \"ol.7-x64\",\n      \"rhel.7.0-x64\",\n      \"ol.7\",\n      \"rhel.7.0\",\n      \"ol-x64\",\n      \"rhel.7-x64\",\n      \"ol\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.7.4-x64\": [\n      \"ol.7.4\",\n      \"ol.7.3-x64\",\n      \"rhel.7.4-x64\",\n      \"ol.7.3\",\n      \"rhel.7.4\",\n      \"ol.7.2-x64\",\n      \"rhel.7.3-x64\",\n      \"ol.7.2\",\n      \"rhel.7.3\",\n      \"ol.7.1-x64\",\n      \"rhel.7.2-x64\",\n      \"ol.7.1\",\n      \"rhel.7.2\",\n      \"ol.7.0-x64\",\n      \"rhel.7.1-x64\",\n      \"ol.7.0\",\n      \"rhel.7.1\",\n      \"ol.7-x64\",\n      \"rhel.7.0-x64\",\n      \"ol.7\",\n      \"rhel.7.0\",\n      \"ol-x64\",\n      \"rhel.7-x64\",\n      \"ol\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.7.5-x64\": [\n      \"ol.7.5\",\n      \"ol.7.4-x64\",\n      \"rhel.7.5-x64\",\n      \"ol.7.4\",\n      \"rhel.7.5\",\n      \"ol.7.3-x64\",\n      \"rhel.7.4-x64\",\n      \"ol.7.3\",\n      \"rhel.7.4\",\n      \"ol.7.2-x64\",\n      \"rhel.7.3-x64\",\n      \"ol.7.2\",\n      \"rhel.7.3\",\n      \"ol.7.1-x64\",\n      \"rhel.7.2-x64\",\n      \"ol.7.1\",\n      \"rhel.7.2\",\n      \"ol.7.0-x64\",\n      \"rhel.7.1-x64\",\n      \"ol.7.0\",\n      \"rhel.7.1\",\n      \"ol.7-x64\",\n      \"rhel.7.0-x64\",\n      \"ol.7\",\n      \"rhel.7.0\",\n      \"ol-x64\",\n      \"rhel.7-x64\",\n      \"ol\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.7.6-x64\": [\n      \"ol.7.6\",\n      \"ol.7.5-x64\",\n      \"rhel.7.6-x64\",\n      \"ol.7.5\",\n      \"rhel.7.6\",\n      \"ol.7.4-x64\",\n      \"rhel.7.5-x64\",\n      \"ol.7.4\",\n      \"rhel.7.5\",\n      \"ol.7.3-x64\",\n      \"rhel.7.4-x64\",\n      \"ol.7.3\",\n      \"rhel.7.4\",\n      \"ol.7.2-x64\",\n      \"rhel.7.3-x64\",\n      \"ol.7.2\",\n      \"rhel.7.3\",\n      \"ol.7.1-x64\",\n      \"rhel.7.2-x64\",\n      \"ol.7.1\",\n      \"rhel.7.2\",\n      \"ol.7.0-x64\",\n      \"rhel.7.1-x64\",\n      \"ol.7.0\",\n      \"rhel.7.1\",\n      \"ol.7-x64\",\n      \"rhel.7.0-x64\",\n      \"ol.7\",\n      \"rhel.7.0\",\n      \"ol-x64\",\n      \"rhel.7-x64\",\n      \"ol\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.8-x64\": [\n      \"ol.8\",\n      \"ol-x64\",\n      \"rhel.8-x64\",\n      \"ol\",\n      \"rhel.8\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ol.8.0-x64\": [\n      \"ol.8.0\",\n      \"ol.8-x64\",\n      \"rhel.8.0-x64\",\n      \"ol.8\",\n      \"rhel.8.0\",\n      \"ol-x64\",\n      \"rhel.8-x64\",\n      \"ol\",\n      \"rhel.8\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"opensuse-x64\": [\n      \"opensuse\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"opensuse.13.2-x64\": [\n      \"opensuse.13.2\",\n      \"opensuse-x64\",\n      \"opensuse\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"opensuse.15.0-x64\": [\n      \"opensuse.15.0\",\n      \"opensuse-x64\",\n      \"opensuse\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"opensuse.15.1-x64\": [\n      \"opensuse.15.1\",\n      \"opensuse-x64\",\n      \"opensuse\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"opensuse.42.1-x64\": [\n      \"opensuse.42.1\",\n      \"opensuse-x64\",\n      \"opensuse\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"opensuse.42.2-x64\": [\n      \"opensuse.42.2\",\n      \"opensuse-x64\",\n      \"opensuse\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"opensuse.42.3-x64\": [\n      \"opensuse.42.3\",\n      \"opensuse-x64\",\n      \"opensuse\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel-x64\": [\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.6-x64\": [\n      \"rhel.6\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.7-x64\": [\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.7.0-x64\": [\n      \"rhel.7.0\",\n      \"rhel.7-x64\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.7.1-x64\": [\n      \"rhel.7.1\",\n      \"rhel.7.0-x64\",\n      \"rhel.7.0\",\n      \"rhel.7-x64\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.7.2-x64\": [\n      \"rhel.7.2\",\n      \"rhel.7.1-x64\",\n      \"rhel.7.1\",\n      \"rhel.7.0-x64\",\n      \"rhel.7.0\",\n      \"rhel.7-x64\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.7.3-x64\": [\n      \"rhel.7.3\",\n      \"rhel.7.2-x64\",\n      \"rhel.7.2\",\n      \"rhel.7.1-x64\",\n      \"rhel.7.1\",\n      \"rhel.7.0-x64\",\n      \"rhel.7.0\",\n      \"rhel.7-x64\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.7.4-x64\": [\n      \"rhel.7.4\",\n      \"rhel.7.3-x64\",\n      \"rhel.7.3\",\n      \"rhel.7.2-x64\",\n      \"rhel.7.2\",\n      \"rhel.7.1-x64\",\n      \"rhel.7.1\",\n      \"rhel.7.0-x64\",\n      \"rhel.7.0\",\n      \"rhel.7-x64\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.7.5-x64\": [\n      \"rhel.7.5\",\n      \"rhel.7.4-x64\",\n      \"rhel.7.4\",\n      \"rhel.7.3-x64\",\n      \"rhel.7.3\",\n      \"rhel.7.2-x64\",\n      \"rhel.7.2\",\n      \"rhel.7.1-x64\",\n      \"rhel.7.1\",\n      \"rhel.7.0-x64\",\n      \"rhel.7.0\",\n      \"rhel.7-x64\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.7.6-x64\": [\n      \"rhel.7.6\",\n      \"rhel.7.5-x64\",\n      \"rhel.7.5\",\n      \"rhel.7.4-x64\",\n      \"rhel.7.4\",\n      \"rhel.7.3-x64\",\n      \"rhel.7.3\",\n      \"rhel.7.2-x64\",\n      \"rhel.7.2\",\n      \"rhel.7.1-x64\",\n      \"rhel.7.1\",\n      \"rhel.7.0-x64\",\n      \"rhel.7.0\",\n      \"rhel.7-x64\",\n      \"rhel.7\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.8-x64\": [\n      \"rhel.8\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.8.0-x64\": [\n      \"rhel.8.0\",\n      \"rhel.8-x64\",\n      \"rhel.8\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.8.1-x64\": [\n      \"rhel.8.1\",\n      \"rhel.8.0-x64\",\n      \"rhel.8.0\",\n      \"rhel.8-x64\",\n      \"rhel.8\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rhel.9-x64\": [\n      \"rhel.9\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rocky-x64\": [\n      \"rocky\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rocky.8-x64\": [\n      \"rocky.8\",\n      \"rocky-x64\",\n      \"rhel.8-x64\",\n      \"rocky\",\n      \"rhel.8\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"rocky.9-x64\": [\n      \"rocky.9\",\n      \"rocky-x64\",\n      \"rhel.9-x64\",\n      \"rocky\",\n      \"rhel.9\",\n      \"rhel-x64\",\n      \"rhel\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"sles-x64\": [\n      \"sles\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"sles.12-x64\": [\n      \"sles.12\",\n      \"sles-x64\",\n      \"sles\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"sles.12.1-x64\": [\n      \"sles.12.1\",\n      \"sles.12-x64\",\n      \"sles.12\",\n      \"sles-x64\",\n      \"sles\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"sles.12.2-x64\": [\n      \"sles.12.2\",\n      \"sles.12.1-x64\",\n      \"sles.12.1\",\n      \"sles.12-x64\",\n      \"sles.12\",\n      \"sles-x64\",\n      \"sles\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"sles.12.3-x64\": [\n      \"sles.12.3\",\n      \"sles.12.2-x64\",\n      \"sles.12.2\",\n      \"sles.12.1-x64\",\n      \"sles.12.1\",\n      \"sles.12-x64\",\n      \"sles.12\",\n      \"sles-x64\",\n      \"sles\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"sles.12.4-x64\": [\n      \"sles.12.4\",\n      \"sles.12.3-x64\",\n      \"sles.12.3\",\n      \"sles.12.2-x64\",\n      \"sles.12.2\",\n      \"sles.12.1-x64\",\n      \"sles.12.1\",\n      \"sles.12-x64\",\n      \"sles.12\",\n      \"sles-x64\",\n      \"sles\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"sles.15-x64\": [\n      \"sles.15\",\n      \"sles.12.4-x64\",\n      \"sles.12.4\",\n      \"sles.12.3-x64\",\n      \"sles.12.3\",\n      \"sles.12.2-x64\",\n      \"sles.12.2\",\n      \"sles.12.1-x64\",\n      \"sles.12.1\",\n      \"sles.12-x64\",\n      \"sles.12\",\n      \"sles-x64\",\n      \"sles\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"sles.15.1-x64\": [\n      \"sles.15.1\",\n      \"sles.15-x64\",\n      \"sles.15\",\n      \"sles.12.4-x64\",\n      \"sles.12.4\",\n      \"sles.12.3-x64\",\n      \"sles.12.3\",\n      \"sles.12.2-x64\",\n      \"sles.12.2\",\n      \"sles.12.1-x64\",\n      \"sles.12.1\",\n      \"sles.12-x64\",\n      \"sles.12\",\n      \"sles-x64\",\n      \"sles\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu-x64\": [\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.14.04-x64\": [\n      \"ubuntu.14.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.14.10-x64\": [\n      \"ubuntu.14.10\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.15.04-x64\": [\n      \"ubuntu.15.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.15.10-x64\": [\n      \"ubuntu.15.10\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.16.04-x64\": [\n      \"ubuntu.16.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.16.10-x64\": [\n      \"ubuntu.16.10\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.17.04-x64\": [\n      \"ubuntu.17.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.17.10-x64\": [\n      \"ubuntu.17.10\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.18.04-x64\": [\n      \"ubuntu.18.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.18.10-x64\": [\n      \"ubuntu.18.10\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.19.04-x64\": [\n      \"ubuntu.19.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.19.10-x64\": [\n      \"ubuntu.19.10\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.20.04-x64\": [\n      \"ubuntu.20.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.20.10-x64\": [\n      \"ubuntu.20.10\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.21.04-x64\": [\n      \"ubuntu.21.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.21.10-x64\": [\n      \"ubuntu.21.10\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ],\n    \"ubuntu.22.04-x64\": [\n      \"ubuntu.22.04\",\n      \"ubuntu-x64\",\n      \"ubuntu\",\n      \"debian-x64\",\n      \"debian\",\n      \"linux-x64\",\n      \"linux\",\n      \"unix-x64\",\n      \"unix\",\n      \"any\",\n      \"base\"\n    ]\n  }\n}"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.dll.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Pipelines\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.2.1\" newVersion=\"4.0.2.1\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Concurrent\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.15.0\" newVersion=\"4.0.15.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Immutable\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.2.5.0\" newVersion=\"1.2.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.NonGeneric\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Console\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Debug\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.DiagnosticSource\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Process\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tools\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tracing\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.FileSystem\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq.Expressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Memory\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.1.0\" newVersion=\"4.2.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NameResolution\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NetworkInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Security\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Sockets\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.6.0\" newVersion=\"4.1.6.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.ILGeneration\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.Lightweight\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Metadata\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.4.5.0\" newVersion=\"1.4.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Resources.ResourceManager\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.6.0\" newVersion=\"4.0.6.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.InteropServices.RuntimeInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Algorithms\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.3.2.0\" newVersion=\"4.3.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Csp\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.X509Certificates\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encodings.Web\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.RegularExpressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks.Extensions\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.3.1.0\" newVersion=\"4.3.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.ThreadPool\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Timer\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"netstandard\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.0.0\" newVersion=\"2.1.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/linux-x64/TS3AudioBot.genruntimeconfig.cache",
    "content": "0b982f5efa26349aa5c8a55d48178e55c2e0b507\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v3.1\", FrameworkDisplayName = \".NET Core 3.1\")]\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/PublishOutputs.cf05aea114.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\win-x64\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\win-x64\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\publish\\win-x64\\TS3AudioBot.exe\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Release\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TS3AudioBot\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n[assembly: System.Resources.NeutralResourcesLanguageAttribute(\"en\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.AssemblyInfoInputs.cache",
    "content": "50117c7602ecaf17a93e18fb5ca5b06974bd2274\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TS3AudioBot\nbuild_property.ProjectDir = C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.csproj.CopyComplete",
    "content": ""
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.csproj.CoreCompileInputs.cache",
    "content": "2b42ad7e4c680046f6843d674cdaa482ee7159e0\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.exe\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\lib\\x64\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\lib\\x86\\libopus.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.runtimeconfig.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.runtimeconfig.dev.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\CliWrap.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\CommandLine.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Heijden.Dns.Portable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\LiteDB.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Connections.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Cors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Hosting.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Http.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Http.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Http.Features.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Server.Kestrel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Server.Kestrel.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Server.Kestrel.Https.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.StaticFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.AspNetCore.WebUtilities.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.CodeAnalysis.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.CodeAnalysis.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Configuration.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Configuration.Binder.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Configuration.EnvironmentVariables.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Configuration.FileExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.DependencyInjection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.DependencyInjection.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.FileProviders.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.FileProviders.Physical.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.FileSystemGlobbing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Hosting.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Logging.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Logging.Abstractions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.ObjectPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Options.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Extensions.WebEncoders.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Net.Http.Headers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Nett.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Newtonsoft.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\NLog.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\PlaylistsNET.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\BouncyCastle.Crypto.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\SixLabors.ImageSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Chaos.NaCl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.Pipelines.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\cs\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\de\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\es\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\fr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\it\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\ja\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\ko\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\pl\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\pt-BR\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\ru\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\tr\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\zh-Hans\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\zh-Hant\\Microsoft.CodeAnalysis.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\cs\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\de\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\es\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\fr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\it\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\ja\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\ko\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\pl\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\pt-BR\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\ru\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\tr\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\zh-Hans\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\zh-Hant\\Microsoft.CodeAnalysis.CSharp.resources.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.csproj.SuggestedBindingRedirects.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.dll.config\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.Localization.strings.resources\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.csproj.GenerateResource.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.csproj.CopyComplete\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\obj\\Release\\netcoreapp3.1\\win-x64\\TS3AudioBot.genruntimeconfig.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.CSharp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.VisualBasic.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.VisualBasic.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Win32.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.Win32.Registry.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.AppContext.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Buffers.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Collections.Concurrent.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Collections.Immutable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Collections.NonGeneric.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Collections.Specialized.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Collections.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ComponentModel.Annotations.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ComponentModel.DataAnnotations.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ComponentModel.EventBasedAsync.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ComponentModel.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ComponentModel.TypeConverter.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ComponentModel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Configuration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Console.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Core.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Data.Common.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Data.DataSetExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Data.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.Contracts.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.Debug.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.DiagnosticSource.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.FileVersionInfo.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.Process.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.StackTrace.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.TextWriterTraceListener.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.Tools.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.TraceSource.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Diagnostics.Tracing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Drawing.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Drawing.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Dynamic.Runtime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Globalization.Calendars.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Globalization.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Globalization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.Compression.Brotli.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.Compression.FileSystem.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.Compression.ZipFile.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.Compression.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.FileSystem.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.FileSystem.DriveInfo.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.FileSystem.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.FileSystem.Watcher.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.FileSystem.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.IsolatedStorage.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.MemoryMappedFiles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.Pipes.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.Pipes.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.UnmanagedMemoryStream.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.IO.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Linq.Expressions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Linq.Parallel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Linq.Queryable.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Memory.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.Http.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.HttpListener.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.Mail.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.NameResolution.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.NetworkInformation.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.Ping.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.Requests.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.Security.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.ServicePoint.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.Sockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.WebClient.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.WebHeaderCollection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.WebProxy.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.WebSockets.Client.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.WebSockets.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Net.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Numerics.Vectors.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Numerics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ObjectModel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Private.DataContractSerialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Private.Uri.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Private.Xml.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Private.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.DispatchProxy.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.Emit.ILGeneration.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.Emit.Lightweight.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.Emit.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.Metadata.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.TypeExtensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Reflection.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Resources.Reader.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Resources.ResourceManager.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Resources.Writer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.CompilerServices.Unsafe.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.CompilerServices.VisualC.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Handles.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.InteropServices.RuntimeInformation.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.InteropServices.WindowsRuntime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.InteropServices.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Intrinsics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Loader.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Numerics.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Serialization.Formatters.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Serialization.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Serialization.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Serialization.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.Serialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.WindowsRuntime.UI.Xaml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.WindowsRuntime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Runtime.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.AccessControl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Claims.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Cryptography.Algorithms.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Cryptography.Cng.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Cryptography.Csp.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Cryptography.Encoding.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Cryptography.OpenSsl.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Cryptography.Primitives.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Cryptography.X509Certificates.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Principal.Windows.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.Principal.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.SecureString.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Security.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ServiceModel.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ServiceProcess.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Text.Encoding.CodePages.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Text.Encoding.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Text.Encoding.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Text.Encodings.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Text.Json.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Text.RegularExpressions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.Channels.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.Overlapped.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.Tasks.Dataflow.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.Tasks.Extensions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.Tasks.Parallel.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.Tasks.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.Thread.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.ThreadPool.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.Timer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Threading.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Transactions.Local.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Transactions.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.ValueTuple.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Web.HttpUtility.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Web.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Windows.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.Linq.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.ReaderWriter.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.Serialization.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.XDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.XPath.XDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.XPath.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.XmlDocument.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.XmlSerializer.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Xml.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\WindowsBase.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\mscorlib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\netstandard.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\Microsoft.DiaSymReader.Native.amd64.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\SOS_README.md\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\System.Private.CoreLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-console-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-datetime-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-debug-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-errorhandling-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-file-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-file-l1-2-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-file-l2-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-handle-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-heap-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-interlocked-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-libraryloader-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-localization-l1-2-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-memory-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-namedpipe-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-processenvironment-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-processthreads-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-processthreads-l1-1-1.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-profile-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-rtlsupport-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-string-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-synch-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-synch-l1-2-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-sysinfo-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-timezone-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-core-util-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-conio-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-convert-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-environment-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-filesystem-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-heap-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-locale-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-math-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-multibyte-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-private-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-process-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-runtime-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-stdio-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-string-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-time-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\api-ms-win-crt-utility-l1-1-0.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\clrcompression.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\clretwrc.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\clrjit.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\coreclr.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\dbgshim.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\hostfxr.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\hostpolicy.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\mscordaccore.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\mscordaccore_amd64_amd64_4.700.22.55902.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\mscordbi.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\mscorrc.debug.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\mscorrc.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TS3AudioBot\\bin\\Release\\netcoreapp3.1\\win-x64\\ucrtbase.dll\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.csproj.SuggestedBindingRedirects.cache",
    "content": "ef24e4af7229c939c818abac044d4f1b112c94d6\n"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.deps.json",
    "content": "{\n  \"runtimeTarget\": {\n    \"name\": \".NETCoreApp,Version=v3.1/win-x64\",\n    \"signature\": \"\"\n  },\n  \"compilationOptions\": {},\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {},\n    \".NETCoreApp,Version=v3.1/win-x64\": {\n      \"TS3AudioBot/1.0.0\": {\n        \"dependencies\": {\n          \"CliWrap\": \"3.1.0\",\n          \"CommandLineParser\": \"2.8.0\",\n          \"LiteDB\": \"4.1.4\",\n          \"Microsoft.AspNetCore.Cors\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel\": \"2.2.0\",\n          \"Microsoft.AspNetCore.StaticFiles\": \"2.2.0\",\n          \"Microsoft.CodeAnalysis.CSharp\": \"3.7.0\",\n          \"NLog\": \"4.7.3\",\n          \"Nett\": \"0.15.0\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"PlaylistsNET\": \"1.1.2\",\n          \"SixLabors.ImageSharp\": \"1.0.0\",\n          \"Splamy.TSLib\": \"1.1.0\",\n          \"TSLib\": \"1.1.0.0\",\n          \"runtimepack.Microsoft.NETCore.App.Runtime.win-x64\": \"3.1.32\"\n        },\n        \"runtime\": {\n          \"TS3AudioBot.dll\": {}\n        }\n      },\n      \"runtimepack.Microsoft.NETCore.App.Runtime.win-x64/3.1.32\": {\n        \"runtime\": {\n          \"Microsoft.CSharp.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"Microsoft.VisualBasic.Core.dll\": {\n            \"assemblyVersion\": \"10.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"Microsoft.VisualBasic.dll\": {\n            \"assemblyVersion\": \"10.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"Microsoft.Win32.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"Microsoft.Win32.Registry.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.AppContext.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Buffers.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.Concurrent.dll\": {\n            \"assemblyVersion\": \"4.0.15.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.Immutable.dll\": {\n            \"assemblyVersion\": \"1.2.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.NonGeneric.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.Specialized.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Collections.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.Annotations.dll\": {\n            \"assemblyVersion\": \"4.3.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.DataAnnotations.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.EventBasedAsync.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.Primitives.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.TypeConverter.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ComponentModel.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Configuration.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Console.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Core.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Data.Common.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Data.DataSetExtensions.dll\": {\n            \"assemblyVersion\": \"4.0.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Data.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Contracts.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Debug.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.DiagnosticSource.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.FileVersionInfo.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Process.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.StackTrace.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.TextWriterTraceListener.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Tools.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.TraceSource.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Diagnostics.Tracing.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Drawing.Primitives.dll\": {\n            \"assemblyVersion\": \"4.2.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Drawing.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Dynamic.Runtime.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Globalization.Calendars.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Globalization.Extensions.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Globalization.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Compression.Brotli.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Compression.FileSystem.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Compression.ZipFile.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Compression.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.AccessControl.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.DriveInfo.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.Watcher.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.FileSystem.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.IsolatedStorage.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.MemoryMappedFiles.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Pipes.AccessControl.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.Pipes.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.UnmanagedMemoryStream.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.IO.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Linq.Expressions.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Linq.Parallel.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Linq.Queryable.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Linq.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Memory.dll\": {\n            \"assemblyVersion\": \"4.2.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Http.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.HttpListener.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Mail.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.NameResolution.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.NetworkInformation.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Ping.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Requests.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Security.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.ServicePoint.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.Sockets.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebClient.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebHeaderCollection.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebProxy.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebSockets.Client.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.WebSockets.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Net.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Numerics.Vectors.dll\": {\n            \"assemblyVersion\": \"4.1.6.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Numerics.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ObjectModel.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Private.DataContractSerialization.dll\": {\n            \"assemblyVersion\": \"4.1.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Private.Uri.dll\": {\n            \"assemblyVersion\": \"4.0.6.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Private.Xml.Linq.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Private.Xml.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.DispatchProxy.dll\": {\n            \"assemblyVersion\": \"4.0.6.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Emit.ILGeneration.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Emit.Lightweight.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Emit.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Extensions.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Metadata.dll\": {\n            \"assemblyVersion\": \"1.4.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.TypeExtensions.dll\": {\n            \"assemblyVersion\": \"4.1.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Reflection.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Resources.Reader.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Resources.ResourceManager.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Resources.Writer.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"assemblyVersion\": \"4.0.6.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.CompilerServices.VisualC.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Extensions.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Handles.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.InteropServices.RuntimeInformation.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.InteropServices.WindowsRuntime.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.InteropServices.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Intrinsics.dll\": {\n            \"assemblyVersion\": \"4.0.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Loader.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Numerics.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.Formatters.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.Json.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.Primitives.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.Xml.dll\": {\n            \"assemblyVersion\": \"4.1.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.Serialization.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.WindowsRuntime.UI.Xaml.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.WindowsRuntime.dll\": {\n            \"assemblyVersion\": \"4.0.15.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Runtime.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.AccessControl.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Claims.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Algorithms.dll\": {\n            \"assemblyVersion\": \"4.3.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Cng.dll\": {\n            \"assemblyVersion\": \"4.3.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Csp.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Encoding.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.OpenSsl.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.Primitives.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Cryptography.X509Certificates.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Principal.Windows.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.Principal.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.SecureString.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Security.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ServiceModel.Web.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ServiceProcess.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Encoding.CodePages.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Encoding.Extensions.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Encoding.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Encodings.Web.dll\": {\n            \"assemblyVersion\": \"4.0.5.1\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.Json.dll\": {\n            \"assemblyVersion\": \"4.0.1.2\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Text.RegularExpressions.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Channels.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Overlapped.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Tasks.Dataflow.dll\": {\n            \"assemblyVersion\": \"4.6.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Tasks.Extensions.dll\": {\n            \"assemblyVersion\": \"4.3.1.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Tasks.Parallel.dll\": {\n            \"assemblyVersion\": \"4.0.4.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Tasks.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Thread.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.ThreadPool.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.Timer.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Threading.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Transactions.Local.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Transactions.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.ValueTuple.dll\": {\n            \"assemblyVersion\": \"4.0.5.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Web.HttpUtility.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Web.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Windows.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.Linq.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.ReaderWriter.dll\": {\n            \"assemblyVersion\": \"4.2.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.Serialization.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XDocument.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XPath.XDocument.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XPath.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XmlDocument.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.XmlSerializer.dll\": {\n            \"assemblyVersion\": \"4.1.2.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.Xml.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"System.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"WindowsBase.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"mscorlib.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"netstandard.dll\": {\n            \"assemblyVersion\": \"2.1.0.0\",\n            \"fileVersion\": \"4.700.22.56512\"\n          }\n        },\n        \"native\": {\n          \"Microsoft.DiaSymReader.Native.amd64.dll\": {\n            \"fileVersion\": \"14.12.25830.2\"\n          },\n          \"SOS_README.md\": {\n            \"fileVersion\": \"0.0.0.0\"\n          },\n          \"System.Private.CoreLib.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"api-ms-win-core-console-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-datetime-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-debug-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-errorhandling-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-file-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-file-l1-2-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-file-l2-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-handle-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-heap-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-interlocked-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-libraryloader-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-localization-l1-2-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-memory-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-namedpipe-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-processenvironment-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-processthreads-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-processthreads-l1-1-1.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-profile-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-rtlsupport-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-string-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-synch-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-synch-l1-2-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-sysinfo-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-timezone-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-core-util-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-conio-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-convert-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-environment-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-filesystem-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-heap-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-locale-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-math-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-multibyte-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-private-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-process-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-runtime-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-stdio-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-string-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-time-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"api-ms-win-crt-utility-l1-1-0.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          },\n          \"clrcompression.dll\": {\n            \"fileVersion\": \"4.700.22.56512\"\n          },\n          \"clretwrc.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"clrjit.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"coreclr.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"dbgshim.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"hostfxr.dll\": {\n            \"fileVersion\": \"3.100.3222.56520\"\n          },\n          \"hostpolicy.dll\": {\n            \"fileVersion\": \"3.100.3222.56520\"\n          },\n          \"mscordaccore.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"mscordaccore_amd64_amd64_4.700.22.55902.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"mscordbi.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"mscorrc.debug.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"mscorrc.dll\": {\n            \"fileVersion\": \"4.700.22.55902\"\n          },\n          \"ucrtbase.dll\": {\n            \"fileVersion\": \"10.0.17134.12\"\n          }\n        }\n      },\n      \"CliWrap/3.1.0\": {\n        \"runtime\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"assemblyVersion\": \"3.1.0.0\",\n            \"fileVersion\": \"3.1.0.0\"\n          }\n        }\n      },\n      \"CommandLineParser/2.8.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"assemblyVersion\": \"2.8.0.0\",\n            \"fileVersion\": \"2.8.0.0\"\n          }\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {\n            \"assemblyVersion\": \"2.0.19.0\",\n            \"fileVersion\": \"2.0.19.0\"\n          }\n        }\n      },\n      \"LiteDB/4.1.4\": {\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.TypeExtensions\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"assemblyVersion\": \"4.1.4.0\",\n            \"fileVersion\": \"4.1.4.0\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Cors/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.EnvironmentVariables\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.FileExtensions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Diagnostics.DiagnosticSource\": \"4.5.0\",\n          \"System.Reflection.Metadata\": \"1.6.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Server.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.ObjectPool\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Https\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Numerics.Vectors\": \"4.5.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Security.Cryptography.Cng\": \"4.5.0\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Connections.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.WebEncoders\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {},\n      \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Analyzers\": \"3.0.0\",\n          \"System.Collections.Immutable\": \"1.5.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Reflection.Metadata\": \"1.6.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Text.Encoding.CodePages\": \"4.5.1\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"assemblyVersion\": \"3.7.0.0\",\n            \"fileVersion\": \"3.700.20.37502\"\n          }\n        },\n        \"resources\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Common\": \"3.7.0\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"assemblyVersion\": \"3.7.0.0\",\n            \"fileVersion\": \"3.700.20.37502\"\n          }\n        },\n        \"resources\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileSystemGlobbing\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Options/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.ComponentModel.Annotations\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Primitives/2.2.0\": {\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.4\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18315\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.Net.Http.Headers/2.2.0\": {\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"assemblyVersion\": \"2.2.0.0\",\n            \"fileVersion\": \"2.2.0.18316\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/2.1.2\": {},\n      \"Microsoft.NETCore.Targets/1.1.0\": {},\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.win.Microsoft.Win32.Primitives\": \"4.3.0\"\n        }\n      },\n      \"Nett/0.15.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"assemblyVersion\": \"0.15.0.0\",\n            \"fileVersion\": \"0.15.0.0\"\n          }\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"assemblyVersion\": \"12.0.0.0\",\n            \"fileVersion\": \"12.0.3.23909\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.7.3.11982\"\n          }\n        }\n      },\n      \"PlaylistsNET/1.1.2\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {\n            \"assemblyVersion\": \"1.0.6.0\",\n            \"fileVersion\": \"1.0.6.0\"\n          }\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"assemblyVersion\": \"1.8.6.0\",\n            \"fileVersion\": \"1.8.6.7\"\n          }\n        }\n      },\n      \"runtime.any.System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"runtime.any.System.Diagnostics.Tracing/4.3.0\": {},\n      \"runtime.any.System.Globalization/4.3.0\": {},\n      \"runtime.any.System.IO/4.3.0\": {},\n      \"runtime.any.System.Reflection/4.3.0\": {},\n      \"runtime.any.System.Reflection.Primitives/4.3.0\": {},\n      \"runtime.any.System.Resources.ResourceManager/4.3.0\": {},\n      \"runtime.any.System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"System.Private.Uri\": \"4.3.0\"\n        }\n      },\n      \"runtime.any.System.Runtime.Handles/4.3.0\": {},\n      \"runtime.any.System.Runtime.InteropServices/4.3.0\": {},\n      \"runtime.any.System.Text.Encoding/4.3.0\": {},\n      \"runtime.any.System.Text.Encoding.Extensions/4.3.0\": {},\n      \"runtime.any.System.Threading.Tasks/4.3.0\": {},\n      \"runtime.native.System/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"runtime.win.Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\"\n        }\n      },\n      \"runtime.win.System.Diagnostics.Debug/4.3.0\": {},\n      \"runtime.win.System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Text.Encoding.Extensions\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"runtime.win.System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"runtime.win.System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Net.NameResolution\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"runtime.win.System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"System.Private.Uri\": \"4.3.0\"\n        }\n      },\n      \"SixLabors.ImageSharp/1.0.0\": {\n        \"runtime\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"assemblyVersion\": \"1.0.0.0\",\n            \"fileVersion\": \"1.0.0.0\"\n          }\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {\n            \"assemblyVersion\": \"1.0.3.0\",\n            \"fileVersion\": \"1.0.3.0\"\n          }\n        }\n      },\n      \"System.Buffers/4.5.0\": {},\n      \"System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Collections\": \"4.3.0\"\n        }\n      },\n      \"System.Collections.Immutable/1.5.0\": {},\n      \"System.ComponentModel.Annotations/4.5.0\": {},\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.win.System.Diagnostics.Debug\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.DiagnosticSource/4.5.0\": {},\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Diagnostics.Tracing\": \"4.3.0\"\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Globalization\": \"4.3.0\"\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.any.System.IO\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.win.System.IO.FileSystem\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {\n            \"assemblyVersion\": \"4.0.2.1\",\n            \"fileVersion\": \"4.700.20.21406\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        }\n      },\n      \"System.Memory/4.5.4\": {},\n      \"System.Net.NameResolution/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"runtime.win.System.Net.Primitives\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.win.System.Net.Sockets\": \"4.3.0\"\n        }\n      },\n      \"System.Numerics.Vectors/4.5.0\": {},\n      \"System.Private.Uri/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Reflection\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.Metadata/1.6.0\": {},\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Reflection.Primitives\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.TypeExtensions/4.3.0\": {\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Resources.ResourceManager\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"runtime.any.System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {},\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.win.System.Runtime.Extensions\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"runtime.any.System.Runtime.InteropServices\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Cryptography.Cng/4.5.0\": {},\n      \"System.Security.Principal/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Text.Encoding\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding.CodePages/4.5.1\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\"\n        }\n      },\n      \"System.Text.Encoding.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"runtime.any.System.Text.Encoding.Extensions\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encodings.Web/4.5.0\": {},\n      \"System.Threading/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.3\": {},\n      \"System.Threading.Thread/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"Splamy.TSLib/1.1.0\": {\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"runtime\": {\n          \"TSLib.dll\": {}\n        }\n      },\n      \"TSLib/1.1.0.0\": {\n        \"runtime\": {\n          \"TSLib.dll\": {\n            \"assemblyVersion\": \"1.1.0.0\",\n            \"fileVersion\": \"1.1.0.0\"\n          }\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"TS3AudioBot/1.0.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"runtimepack.Microsoft.NETCore.App.Runtime.win-x64/3.1.32\": {\n      \"type\": \"runtimepack\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"CliWrap/3.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==\",\n      \"path\": \"cliwrap/3.1.0\",\n      \"hashPath\": \"cliwrap.3.1.0.nupkg.sha512\"\n    },\n    \"CommandLineParser/2.8.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==\",\n      \"path\": \"commandlineparser/2.8.0\",\n      \"hashPath\": \"commandlineparser.2.8.0.nupkg.sha512\"\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"hashPath\": \"heijden.dns.portable.2.0.19.nupkg.sha512\"\n    },\n    \"LiteDB/4.1.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==\",\n      \"path\": \"litedb/4.1.4\",\n      \"hashPath\": \"litedb.4.1.4.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==\",\n      \"path\": \"microsoft.aspnetcore.connections.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Cors/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==\",\n      \"path\": \"microsoft.aspnetcore.cors/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==\",\n      \"path\": \"microsoft.aspnetcore.hosting/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==\",\n      \"path\": \"microsoft.aspnetcore.hosting.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==\",\n      \"path\": \"microsoft.aspnetcore.hosting.server.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Http/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==\",\n      \"path\": \"microsoft.aspnetcore.http/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.http.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==\",\n      \"path\": \"microsoft.aspnetcore.http.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==\",\n      \"path\": \"microsoft.aspnetcore.http.extensions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==\",\n      \"path\": \"microsoft.aspnetcore.http.features/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.core/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.https/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==\",\n      \"path\": \"microsoft.aspnetcore.staticfiles/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==\",\n      \"path\": \"microsoft.aspnetcore.webutilities/2.2.0\",\n      \"hashPath\": \"microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==\",\n      \"path\": \"microsoft.codeanalysis.analyzers/3.0.0\",\n      \"hashPath\": \"microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\"\n    },\n    \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==\",\n      \"path\": \"microsoft.codeanalysis.common/3.7.0\",\n      \"hashPath\": \"microsoft.codeanalysis.common.3.7.0.nupkg.sha512\"\n    },\n    \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==\",\n      \"path\": \"microsoft.codeanalysis.csharp/3.7.0\",\n      \"hashPath\": \"microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==\",\n      \"path\": \"microsoft.extensions.configuration/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==\",\n      \"path\": \"microsoft.extensions.configuration.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==\",\n      \"path\": \"microsoft.extensions.configuration.binder/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==\",\n      \"path\": \"microsoft.extensions.configuration.environmentvariables/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==\",\n      \"path\": \"microsoft.extensions.configuration.fileextensions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==\",\n      \"path\": \"microsoft.extensions.dependencyinjection/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==\",\n      \"path\": \"microsoft.extensions.dependencyinjection.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==\",\n      \"path\": \"microsoft.extensions.fileproviders.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==\",\n      \"path\": \"microsoft.extensions.fileproviders.physical/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==\",\n      \"path\": \"microsoft.extensions.filesystemglobbing/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==\",\n      \"path\": \"microsoft.extensions.hosting.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Logging/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==\",\n      \"path\": \"microsoft.extensions.logging/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.logging.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==\",\n      \"path\": \"microsoft.extensions.logging.abstractions/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==\",\n      \"path\": \"microsoft.extensions.objectpool/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.objectpool.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Options/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==\",\n      \"path\": \"microsoft.extensions.options/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.options.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.Primitives/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==\",\n      \"path\": \"microsoft.extensions.primitives/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.primitives.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==\",\n      \"path\": \"microsoft.extensions.webencoders/2.2.0\",\n      \"hashPath\": \"microsoft.extensions.webencoders.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.Net.Http.Headers/2.2.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==\",\n      \"path\": \"microsoft.net.http.headers/2.2.0\",\n      \"hashPath\": \"microsoft.net.http.headers.2.2.0.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Platforms/2.1.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==\",\n      \"path\": \"microsoft.netcore.platforms/2.1.2\",\n      \"hashPath\": \"microsoft.netcore.platforms.2.1.2.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.targets.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"Nett/0.15.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==\",\n      \"path\": \"nett/0.15.0\",\n      \"hashPath\": \"nett.0.15.0.nupkg.sha512\"\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"hashPath\": \"newtonsoft.json.12.0.3.nupkg.sha512\"\n    },\n    \"NLog/4.7.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"path\": \"nlog/4.7.3\",\n      \"hashPath\": \"nlog.4.7.3.nupkg.sha512\"\n    },\n    \"PlaylistsNET/1.1.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==\",\n      \"path\": \"playlistsnet/1.1.2\",\n      \"hashPath\": \"playlistsnet.1.1.2.nupkg.sha512\"\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"hashPath\": \"portable.bouncycastle.1.8.6.7.nupkg.sha512\"\n    },\n    \"runtime.any.System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==\",\n      \"path\": \"runtime.any.system.collections/4.3.0\",\n      \"hashPath\": \"runtime.any.system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==\",\n      \"path\": \"runtime.any.system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==\",\n      \"path\": \"runtime.any.system.globalization/4.3.0\",\n      \"hashPath\": \"runtime.any.system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==\",\n      \"path\": \"runtime.any.system.io/4.3.0\",\n      \"hashPath\": \"runtime.any.system.io.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==\",\n      \"path\": \"runtime.any.system.reflection/4.3.0\",\n      \"hashPath\": \"runtime.any.system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==\",\n      \"path\": \"runtime.any.system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==\",\n      \"path\": \"runtime.any.system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==\",\n      \"path\": \"runtime.any.system.runtime/4.3.0\",\n      \"hashPath\": \"runtime.any.system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==\",\n      \"path\": \"runtime.any.system.runtime.handles/4.3.0\",\n      \"hashPath\": \"runtime.any.system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==\",\n      \"path\": \"runtime.any.system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==\",\n      \"path\": \"runtime.any.system.text.encoding/4.3.0\",\n      \"hashPath\": \"runtime.any.system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Text.Encoding.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==\",\n      \"path\": \"runtime.any.system.text.encoding.extensions/4.3.0\",\n      \"hashPath\": \"runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.any.System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==\",\n      \"path\": \"runtime.any.system.threading.tasks/4.3.0\",\n      \"hashPath\": \"runtime.any.system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"hashPath\": \"runtime.native.system.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.win.Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==\",\n      \"path\": \"runtime.win.microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"runtime.win.microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.win.System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==\",\n      \"path\": \"runtime.win.system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"runtime.win.system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.win.System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==\",\n      \"path\": \"runtime.win.system.io.filesystem/4.3.0\",\n      \"hashPath\": \"runtime.win.system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.win.System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==\",\n      \"path\": \"runtime.win.system.net.primitives/4.3.0\",\n      \"hashPath\": \"runtime.win.system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.win.System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==\",\n      \"path\": \"runtime.win.system.net.sockets/4.3.0\",\n      \"hashPath\": \"runtime.win.system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"runtime.win.System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==\",\n      \"path\": \"runtime.win.system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"runtime.win.system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"SixLabors.ImageSharp/1.0.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==\",\n      \"path\": \"sixlabors.imagesharp/1.0.0\",\n      \"hashPath\": \"sixlabors.imagesharp.1.0.0.nupkg.sha512\"\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"hashPath\": \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\"\n    },\n    \"System.Buffers/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==\",\n      \"path\": \"system.buffers/4.5.0\",\n      \"hashPath\": \"system.buffers.4.5.0.nupkg.sha512\"\n    },\n    \"System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"path\": \"system.collections/4.3.0\",\n      \"hashPath\": \"system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"System.Collections.Immutable/1.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==\",\n      \"path\": \"system.collections.immutable/1.5.0\",\n      \"hashPath\": \"system.collections.immutable.1.5.0.nupkg.sha512\"\n    },\n    \"System.ComponentModel.Annotations/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==\",\n      \"path\": \"system.componentmodel.annotations/4.5.0\",\n      \"hashPath\": \"system.componentmodel.annotations.4.5.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==\",\n      \"path\": \"system.diagnostics.diagnosticsource/4.5.0\",\n      \"hashPath\": \"system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"hashPath\": \"system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"path\": \"system.io/4.3.0\",\n      \"hashPath\": \"system.io.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"hashPath\": \"system.io.pipelines.4.7.2.nupkg.sha512\"\n    },\n    \"System.Linq/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"path\": \"system.linq/4.3.0\",\n      \"hashPath\": \"system.linq.4.3.0.nupkg.sha512\"\n    },\n    \"System.Memory/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"path\": \"system.memory/4.5.4\",\n      \"hashPath\": \"system.memory.4.5.4.nupkg.sha512\"\n    },\n    \"System.Net.NameResolution/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==\",\n      \"path\": \"system.net.nameresolution/4.3.0\",\n      \"hashPath\": \"system.net.nameresolution.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"hashPath\": \"system.net.networkinformation.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"hashPath\": \"system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"hashPath\": \"system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"System.Numerics.Vectors/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==\",\n      \"path\": \"system.numerics.vectors/4.5.0\",\n      \"hashPath\": \"system.numerics.vectors.4.5.0.nupkg.sha512\"\n    },\n    \"System.Private.Uri/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==\",\n      \"path\": \"system.private.uri/4.3.0\",\n      \"hashPath\": \"system.private.uri.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"hashPath\": \"system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Metadata/1.6.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==\",\n      \"path\": \"system.reflection.metadata/1.6.0\",\n      \"hashPath\": \"system.reflection.metadata.1.6.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.TypeExtensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==\",\n      \"path\": \"system.reflection.typeextensions/4.3.0\",\n      \"hashPath\": \"system.reflection.typeextensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"hashPath\": \"system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.7.0\",\n      \"hashPath\": \"system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"hashPath\": \"system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"hashPath\": \"system.security.claims.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Cryptography.Cng/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==\",\n      \"path\": \"system.security.cryptography.cng/4.5.0\",\n      \"hashPath\": \"system.security.cryptography.cng.4.5.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"hashPath\": \"system.security.principal.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"hashPath\": \"system.security.principal.windows.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"hashPath\": \"system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding.CodePages/4.5.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==\",\n      \"path\": \"system.text.encoding.codepages/4.5.1\",\n      \"hashPath\": \"system.text.encoding.codepages.4.5.1.nupkg.sha512\"\n    },\n    \"System.Text.Encoding.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==\",\n      \"path\": \"system.text.encoding.extensions/4.3.0\",\n      \"hashPath\": \"system.text.encoding.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encodings.Web/4.5.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==\",\n      \"path\": \"system.text.encodings.web/4.5.0\",\n      \"hashPath\": \"system.text.encodings.web.4.5.0.nupkg.sha512\"\n    },\n    \"System.Threading/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"path\": \"system.threading/4.3.0\",\n      \"hashPath\": \"system.threading.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"hashPath\": \"system.threading.overlapped.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"hashPath\": \"system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks.Extensions/4.5.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==\",\n      \"path\": \"system.threading.tasks.extensions/4.5.3\",\n      \"hashPath\": \"system.threading.tasks.extensions.4.5.3.nupkg.sha512\"\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"hashPath\": \"system.threading.thread.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"hashPath\": \"system.threading.threadpool.4.3.0.nupkg.sha512\"\n    },\n    \"Splamy.TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"TSLib/1.1.0.0\": {\n      \"type\": \"reference\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    }\n  },\n  \"runtimes\": {\n    \"win-x64\": [\n      \"win\",\n      \"any\",\n      \"base\"\n    ],\n    \"win-x64-aot\": [\n      \"win-aot\",\n      \"win-x64\",\n      \"win\",\n      \"aot\",\n      \"any\",\n      \"base\"\n    ],\n    \"win10-x64\": [\n      \"win10\",\n      \"win81-x64\",\n      \"win81\",\n      \"win8-x64\",\n      \"win8\",\n      \"win7-x64\",\n      \"win7\",\n      \"win-x64\",\n      \"win\",\n      \"any\",\n      \"base\"\n    ],\n    \"win10-x64-aot\": [\n      \"win10-aot\",\n      \"win10-x64\",\n      \"win10\",\n      \"win81-x64-aot\",\n      \"win81-aot\",\n      \"win81-x64\",\n      \"win81\",\n      \"win8-x64-aot\",\n      \"win8-aot\",\n      \"win8-x64\",\n      \"win8\",\n      \"win7-x64-aot\",\n      \"win7-aot\",\n      \"win7-x64\",\n      \"win7\",\n      \"win-x64-aot\",\n      \"win-aot\",\n      \"win-x64\",\n      \"win\",\n      \"aot\",\n      \"any\",\n      \"base\"\n    ],\n    \"win7-x64\": [\n      \"win7\",\n      \"win-x64\",\n      \"win\",\n      \"any\",\n      \"base\"\n    ],\n    \"win7-x64-aot\": [\n      \"win7-aot\",\n      \"win7-x64\",\n      \"win7\",\n      \"win-x64-aot\",\n      \"win-aot\",\n      \"win-x64\",\n      \"win\",\n      \"aot\",\n      \"any\",\n      \"base\"\n    ],\n    \"win8-x64\": [\n      \"win8\",\n      \"win7-x64\",\n      \"win7\",\n      \"win-x64\",\n      \"win\",\n      \"any\",\n      \"base\"\n    ],\n    \"win8-x64-aot\": [\n      \"win8-aot\",\n      \"win8-x64\",\n      \"win8\",\n      \"win7-x64-aot\",\n      \"win7-aot\",\n      \"win7-x64\",\n      \"win7\",\n      \"win-x64-aot\",\n      \"win-aot\",\n      \"win-x64\",\n      \"win\",\n      \"aot\",\n      \"any\",\n      \"base\"\n    ],\n    \"win81-x64\": [\n      \"win81\",\n      \"win8-x64\",\n      \"win8\",\n      \"win7-x64\",\n      \"win7\",\n      \"win-x64\",\n      \"win\",\n      \"any\",\n      \"base\"\n    ],\n    \"win81-x64-aot\": [\n      \"win81-aot\",\n      \"win81-x64\",\n      \"win81\",\n      \"win8-x64-aot\",\n      \"win8-aot\",\n      \"win8-x64\",\n      \"win8\",\n      \"win7-x64-aot\",\n      \"win7-aot\",\n      \"win7-x64\",\n      \"win7\",\n      \"win-x64-aot\",\n      \"win-aot\",\n      \"win-x64\",\n      \"win\",\n      \"aot\",\n      \"any\",\n      \"base\"\n    ]\n  }\n}"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.dll.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.Pipelines\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.2.1\" newVersion=\"4.0.2.1\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Concurrent\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.15.0\" newVersion=\"4.0.15.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Immutable\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.2.5.0\" newVersion=\"1.2.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.NonGeneric\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.ComponentModel\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Console\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Debug\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.DiagnosticSource\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Process\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tools\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Diagnostics.Tracing\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO.FileSystem\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IO\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq.Expressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Linq\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Memory\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.1.0\" newVersion=\"4.2.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NameResolution\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.NetworkInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Security\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Sockets\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.6.0\" newVersion=\"4.1.6.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.ILGeneration\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Emit.Lightweight\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Metadata\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.4.5.0\" newVersion=\"1.4.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Reflection\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Resources.ResourceManager\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.6.0\" newVersion=\"4.0.6.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.InteropServices.RuntimeInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Algorithms\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.3.2.0\" newVersion=\"4.3.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Csp\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Security.Cryptography.X509Certificates\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding.Extensions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encoding\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.Encodings.Web\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Text.RegularExpressions\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.2.0\" newVersion=\"4.2.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks.Extensions\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.3.1.0\" newVersion=\"4.3.1.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Tasks\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.ThreadPool\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading.Timer\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Threading\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.2.0\" newVersion=\"4.1.2.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"netstandard\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.0.0\" newVersion=\"2.1.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "TS3AudioBot/obj/Release/netcoreapp3.1/win-x64/TS3AudioBot.genruntimeconfig.cache",
    "content": "749191dc128713cd4907aa06d5f79988d8caaf6a\n"
  },
  {
    "path": "TS3AudioBot/obj/TS3AudioBot.csproj.nuget.dgspec.json",
    "content": "{\n  \"format\": 1,\n  \"restore\": {\n    \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {}\n  },\n  \"projects\": {\n    \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {\n      \"version\": \"1.0.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n        \"projectName\": \"TS3AudioBot\",\n        \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\obj\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {\n              \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n                \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n              }\n            }\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"CliWrap\": {\n              \"target\": \"Package\",\n              \"version\": \"[3.1.0, )\"\n            },\n            \"CommandLineParser\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.8.0, )\"\n            },\n            \"LiteDB\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.1.4, )\"\n            },\n            \"Microsoft.AspNetCore.Cors\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.AspNetCore.Server.Kestrel\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.AspNetCore.StaticFiles\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.CodeAnalysis.CSharp\": {\n              \"include\": \"Runtime, Compile, Build, Native, ContentFiles, BuildTransitive\",\n              \"target\": \"Package\",\n              \"version\": \"[3.7.0, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Nett\": {\n              \"target\": \"Package\",\n              \"version\": \"[0.15.0, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"PlaylistsNET\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.1.2, )\"\n            },\n            \"SixLabors.ImageSharp\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.0, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        }\n      }\n    },\n    \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n      \"version\": \"1.1.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"projectName\": \"Splamy.TSLib\",\n        \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\obj\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"crossTargeting\": true,\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\",\n          \"netstandard2.0\",\n          \"netstandard2.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.0\": {\n            \"targetAlias\": \"netstandard2.0\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.1\": {\n            \"targetAlias\": \"netstandard2.1\",\n            \"projectReferences\": {}\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.0\": {\n          \"targetAlias\": \"netstandard2.0\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NETStandard.Library\": {\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[2.0.3, )\",\n              \"autoReferenced\": true\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            },\n            \"System.Memory\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.5.4, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.1\": {\n          \"targetAlias\": \"netstandard2.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"NETStandard.Library\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "TS3AudioBot/obj/TS3AudioBot.csproj.nuget.g.props",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <RestoreSuccess Condition=\" '$(RestoreSuccess)' == '' \">True</RestoreSuccess>\n    <RestoreTool Condition=\" '$(RestoreTool)' == '' \">NuGet</RestoreTool>\n    <ProjectAssetsFile Condition=\" '$(ProjectAssetsFile)' == '' \">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>\n    <NuGetPackageRoot Condition=\" '$(NuGetPackageRoot)' == '' \">$(UserProfile)\\.nuget\\packages\\</NuGetPackageRoot>\n    <NuGetPackageFolders Condition=\" '$(NuGetPackageFolders)' == '' \">C:\\Users\\Saopig\\.nuget\\packages\\</NuGetPackageFolders>\n    <NuGetProjectStyle Condition=\" '$(NuGetProjectStyle)' == '' \">PackageReference</NuGetProjectStyle>\n    <NuGetToolVersion Condition=\" '$(NuGetToolVersion)' == '' \">5.11.4</NuGetToolVersion>\n  </PropertyGroup>\n  <ItemGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <SourceRoot Include=\"C:\\Users\\Saopig\\.nuget\\packages\\\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <PkgMicrosoft_CodeAnalysis_Analyzers Condition=\" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' \">C:\\Users\\Saopig\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.0.0</PkgMicrosoft_CodeAnalysis_Analyzers>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "TS3AudioBot/obj/TS3AudioBot.csproj.nuget.g.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "TS3AudioBot/obj/project.assets.json",
    "content": "{\n  \"version\": 3,\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {\n      \"CliWrap/3.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {}\n        }\n      },\n      \"CommandLineParser/2.8.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {}\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"LiteDB/4.1.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.TypeExtensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.IO.Pipelines\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Cors/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.EnvironmentVariables\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.FileExtensions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Diagnostics.DiagnosticSource\": \"4.5.0\",\n          \"System.Reflection.Metadata\": \"1.6.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Server.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Http/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.ObjectPool\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Https\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Memory\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.5.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\",\n          \"System.Security.Cryptography.Cng\": \"4.5.0\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Connections.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.WebEncoders\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {}\n        }\n      },\n      \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n        \"type\": \"package\",\n        \"build\": {\n          \"build/_._\": {}\n        }\n      },\n      \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Analyzers\": \"3.0.0\",\n          \"System.Collections.Immutable\": \"1.5.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Reflection.Metadata\": \"1.6.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Text.Encoding.CodePages\": \"4.5.1\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {}\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Common\": \"[3.7.0]\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {}\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileSystemGlobbing\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Logging/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Options/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.ComponentModel.Annotations\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Primitives/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.1\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {}\n        }\n      },\n      \"Microsoft.Net.Http.Headers/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {}\n        }\n      },\n      \"Microsoft.NETCore.Platforms/2.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"Nett/0.15.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Nett.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Nett.dll\": {}\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        }\n      },\n      \"PlaylistsNET/1.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"SixLabors.ImageSharp/1.0.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {}\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Buffers/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Collections.Immutable/1.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {}\n        }\n      },\n      \"System.ComponentModel.Annotations/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {}\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {}\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/System.IO.Pipelines.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {}\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"linux\"\n          },\n          \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"osx\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {}\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {}\n        }\n      },\n      \"System.Numerics.Vectors/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.dll\": {}\n        }\n      },\n      \"System.Reflection.Metadata/1.6.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {}\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Reflection.Primitives.dll\": {}\n        }\n      },\n      \"System.Reflection.TypeExtensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {}\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\": {}\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {}\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netcoreapp1.1/_._\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Cryptography.Cng/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {}\n        }\n      },\n      \"System.Text.Encoding.CodePages/4.5.1\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encodings.Web/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {}\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {}\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      },\n      \"Splamy.TSLib/1.1.0\": {\n        \"type\": \"project\",\n        \"framework\": \".NETCoreApp,Version=v3.1\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"compile\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        },\n        \"runtime\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"CliWrap/3.1.0\": {\n      \"sha512\": \"vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==\",\n      \"type\": \"package\",\n      \"path\": \"cliwrap/3.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"cliwrap.3.1.0.nupkg.sha512\",\n        \"cliwrap.nuspec\",\n        \"favicon.png\",\n        \"lib/net461/CliWrap.dll\",\n        \"lib/net461/CliWrap.xml\",\n        \"lib/netcoreapp3.0/CliWrap.dll\",\n        \"lib/netcoreapp3.0/CliWrap.xml\",\n        \"lib/netstandard2.0/CliWrap.dll\",\n        \"lib/netstandard2.0/CliWrap.xml\",\n        \"lib/netstandard2.1/CliWrap.dll\",\n        \"lib/netstandard2.1/CliWrap.xml\"\n      ]\n    },\n    \"CommandLineParser/2.8.0\": {\n      \"sha512\": \"eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==\",\n      \"type\": \"package\",\n      \"path\": \"commandlineparser/2.8.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"CommandLine20.png\",\n        \"License.md\",\n        \"README.md\",\n        \"commandlineparser.2.8.0.nupkg.sha512\",\n        \"commandlineparser.nuspec\",\n        \"lib/net40/CommandLine.dll\",\n        \"lib/net40/CommandLine.xml\",\n        \"lib/net45/CommandLine.dll\",\n        \"lib/net45/CommandLine.xml\",\n        \"lib/net461/CommandLine.dll\",\n        \"lib/net461/CommandLine.xml\",\n        \"lib/netstandard2.0/CommandLine.dll\",\n        \"lib/netstandard2.0/CommandLine.xml\"\n      ]\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"sha512\": \"i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"type\": \"package\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"heijden.dns.portable.2.0.19.nupkg.sha512\",\n        \"heijden.dns.portable.nuspec\",\n        \"lib/netstandard1.3/Heijden.Dns.Portable.dll\"\n      ]\n    },\n    \"LiteDB/4.1.4\": {\n      \"sha512\": \"g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==\",\n      \"type\": \"package\",\n      \"path\": \"litedb/4.1.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net35/LiteDB.dll\",\n        \"lib/net35/LiteDB.xml\",\n        \"lib/net40/LiteDB.dll\",\n        \"lib/net40/LiteDB.xml\",\n        \"lib/netstandard1.3/LiteDB.dll\",\n        \"lib/netstandard1.3/LiteDB.xml\",\n        \"lib/netstandard2.0/LiteDB.dll\",\n        \"lib/netstandard2.0/LiteDB.xml\",\n        \"litedb.4.1.4.nupkg.sha512\",\n        \"litedb.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n      \"sha512\": \"Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.connections.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.xml\",\n        \"microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.connections.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Cors/2.2.0\": {\n      \"sha512\": \"LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.cors/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.xml\",\n        \"microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.cors.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n      \"sha512\": \"7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.xml\",\n        \"microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n      \"sha512\": \"ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.xml\",\n        \"microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n      \"sha512\": \"1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting.server.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml\",\n        \"microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.server.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http/2.2.0\": {\n      \"sha512\": \"YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.xml\",\n        \"microsoft.aspnetcore.http.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n      \"sha512\": \"Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.xml\",\n        \"microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n      \"sha512\": \"2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.extensions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.xml\",\n        \"microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.extensions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n      \"sha512\": \"ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.features/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.xml\",\n        \"microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.features.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n      \"sha512\": \"D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.xml\",\n        \"microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n      \"sha512\": \"F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.core/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.xml\",\n        \"microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.core.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n      \"sha512\": \"nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.https/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.xml\",\n        \"microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.https.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n      \"sha512\": \"j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.xml\",\n        \"microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.transport.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n      \"sha512\": \"qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml\",\n        \"microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.transport.sockets.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n      \"sha512\": \"byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.staticfiles/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.xml\",\n        \"microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.staticfiles.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n      \"sha512\": \"9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.webutilities/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.xml\",\n        \"microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.webutilities.nuspec\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n      \"sha512\": \"ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.analyzers/3.0.0\",\n      \"hasTools\": true,\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"EULA.rtf\",\n        \"ThirdPartyNotices.rtf\",\n        \"analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll\",\n        \"analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll\",\n        \"analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll\",\n        \"analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll\",\n        \"analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"build/Microsoft.CodeAnalysis.Analyzers.props\",\n        \"build/Microsoft.CodeAnalysis.Analyzers.targets\",\n        \"documentation/Analyzer Configuration.md\",\n        \"documentation/Microsoft.CodeAnalysis.Analyzers.md\",\n        \"documentation/Microsoft.CodeAnalysis.Analyzers.sarif\",\n        \"editorconfig/AllRulesDefault/.editorconfig\",\n        \"editorconfig/AllRulesDisabled/.editorconfig\",\n        \"editorconfig/AllRulesEnabled/.editorconfig\",\n        \"editorconfig/CorrectnessRulesDefault/.editorconfig\",\n        \"editorconfig/CorrectnessRulesEnabled/.editorconfig\",\n        \"editorconfig/DataflowRulesDefault/.editorconfig\",\n        \"editorconfig/DataflowRulesEnabled/.editorconfig\",\n        \"editorconfig/LibraryRulesDefault/.editorconfig\",\n        \"editorconfig/LibraryRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig\",\n        \"editorconfig/PortedFromFxCopRulesDefault/.editorconfig\",\n        \"editorconfig/PortedFromFxCopRulesEnabled/.editorconfig\",\n        \"microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.analyzers.nuspec\",\n        \"rulesets/AllRulesDefault.ruleset\",\n        \"rulesets/AllRulesDisabled.ruleset\",\n        \"rulesets/AllRulesEnabled.ruleset\",\n        \"rulesets/CorrectnessRulesDefault.ruleset\",\n        \"rulesets/CorrectnessRulesEnabled.ruleset\",\n        \"rulesets/DataflowRulesDefault.ruleset\",\n        \"rulesets/DataflowRulesEnabled.ruleset\",\n        \"rulesets/LibraryRulesDefault.ruleset\",\n        \"rulesets/LibraryRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset\",\n        \"rulesets/PortedFromFxCopRulesDefault.ruleset\",\n        \"rulesets/PortedFromFxCopRulesEnabled.ruleset\",\n        \"tools/install.ps1\",\n        \"tools/uninstall.ps1\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n      \"sha512\": \"SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.common/3.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"ThirdPartyNotices.rtf\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.pdb\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.xml\",\n        \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.pdb\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.xml\",\n        \"lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll\",\n        \"microsoft.codeanalysis.common.3.7.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.common.nuspec\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n      \"sha512\": \"sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.csharp/3.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"ThirdPartyNotices.rtf\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.pdb\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.xml\",\n        \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml\",\n        \"lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.csharp.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration/2.2.0\": {\n      \"sha512\": \"nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.xml\",\n        \"microsoft.extensions.configuration.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n      \"sha512\": \"65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml\",\n        \"microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n      \"sha512\": \"vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.binder/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml\",\n        \"microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.binder.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n      \"sha512\": \"gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.environmentvariables/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.xml\",\n        \"microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.environmentvariables.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n      \"sha512\": \"H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.fileextensions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.xml\",\n        \"microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.fileextensions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n      \"sha512\": \"MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.dependencyinjection/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net461/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/net461/Microsoft.Extensions.DependencyInjection.xml\",\n        \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.xml\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml\",\n        \"microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.dependencyinjection.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n      \"sha512\": \"f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.dependencyinjection.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml\",\n        \"microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.dependencyinjection.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n      \"sha512\": \"EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.fileproviders.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml\",\n        \"microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.fileproviders.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n      \"sha512\": \"tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.fileproviders.physical/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.xml\",\n        \"microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.fileproviders.physical.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n      \"sha512\": \"ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.filesystemglobbing/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.xml\",\n        \"microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.filesystemglobbing.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n      \"sha512\": \"+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.hosting.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml\",\n        \"microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.hosting.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Logging/2.2.0\": {\n      \"sha512\": \"Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.logging/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.xml\",\n        \"microsoft.extensions.logging.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.logging.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n      \"sha512\": \"B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.logging.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml\",\n        \"microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.logging.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n      \"sha512\": \"gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.objectpool/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml\",\n        \"microsoft.extensions.objectpool.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.objectpool.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Options/2.2.0\": {\n      \"sha512\": \"UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.options/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Options.xml\",\n        \"microsoft.extensions.options.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.options.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Primitives/2.2.0\": {\n      \"sha512\": \"azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.primitives/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Primitives.xml\",\n        \"microsoft.extensions.primitives.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.primitives.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n      \"sha512\": \"V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.webencoders/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.xml\",\n        \"microsoft.extensions.webencoders.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.webencoders.nuspec\"\n      ]\n    },\n    \"Microsoft.Net.Http.Headers/2.2.0\": {\n      \"sha512\": \"iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.net.http.headers/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\",\n        \"lib/netstandard2.0/Microsoft.Net.Http.Headers.xml\",\n        \"microsoft.net.http.headers.2.2.0.nupkg.sha512\",\n        \"microsoft.net.http.headers.nuspec\"\n      ]\n    },\n    \"Microsoft.NETCore.Platforms/2.1.2\": {\n      \"sha512\": \"mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.platforms/2.1.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.platforms.2.1.2.nupkg.sha512\",\n        \"microsoft.netcore.platforms.nuspec\",\n        \"runtime.json\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"sha512\": \"aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n        \"microsoft.netcore.targets.nuspec\",\n        \"runtime.json\"\n      ]\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"sha512\": \"9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/Microsoft.Win32.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n        \"microsoft.win32.primitives.nuspec\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\"\n      ]\n    },\n    \"Nett/0.15.0\": {\n      \"sha512\": \"/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==\",\n      \"type\": \"package\",\n      \"path\": \"nett/0.15.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/Nett.dll\",\n        \"lib/net40/Nett.xml\",\n        \"lib/netstandard2.0/Nett.dll\",\n        \"lib/netstandard2.0/Nett.xml\",\n        \"nett.0.15.0.nupkg.sha512\",\n        \"nett.nuspec\"\n      ]\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"sha512\": \"6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"type\": \"package\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.md\",\n        \"lib/net20/Newtonsoft.Json.dll\",\n        \"lib/net20/Newtonsoft.Json.xml\",\n        \"lib/net35/Newtonsoft.Json.dll\",\n        \"lib/net35/Newtonsoft.Json.xml\",\n        \"lib/net40/Newtonsoft.Json.dll\",\n        \"lib/net40/Newtonsoft.Json.xml\",\n        \"lib/net45/Newtonsoft.Json.dll\",\n        \"lib/net45/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.0/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.3/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.3/Newtonsoft.Json.xml\",\n        \"lib/netstandard2.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard2.0/Newtonsoft.Json.xml\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"newtonsoft.json.12.0.3.nupkg.sha512\",\n        \"newtonsoft.json.nuspec\",\n        \"packageIcon.png\"\n      ]\n    },\n    \"NLog/4.7.3\": {\n      \"sha512\": \"3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"type\": \"package\",\n      \"path\": \"nlog/4.7.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/monoandroid44/NLog.dll\",\n        \"lib/monoandroid44/NLog.xml\",\n        \"lib/net35/NLog.dll\",\n        \"lib/net35/NLog.xml\",\n        \"lib/net40-client/NLog.dll\",\n        \"lib/net40-client/NLog.xml\",\n        \"lib/net45/NLog.dll\",\n        \"lib/net45/NLog.xml\",\n        \"lib/netstandard1.3/NLog.dll\",\n        \"lib/netstandard1.3/NLog.xml\",\n        \"lib/netstandard1.5/NLog.dll\",\n        \"lib/netstandard1.5/NLog.xml\",\n        \"lib/netstandard2.0/NLog.dll\",\n        \"lib/netstandard2.0/NLog.xml\",\n        \"lib/sl4/NLog.dll\",\n        \"lib/sl4/NLog.xml\",\n        \"lib/sl5/NLog.dll\",\n        \"lib/sl5/NLog.xml\",\n        \"lib/wp8/NLog.dll\",\n        \"lib/wp8/NLog.xml\",\n        \"lib/xamarinios10/NLog.dll\",\n        \"lib/xamarinios10/NLog.xml\",\n        \"nlog.4.7.3.nupkg.sha512\",\n        \"nlog.nuspec\"\n      ]\n    },\n    \"PlaylistsNET/1.1.2\": {\n      \"sha512\": \"IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==\",\n      \"type\": \"package\",\n      \"path\": \"playlistsnet/1.1.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net45/PlaylistsNET.dll\",\n        \"lib/netstandard1.4/PlaylistsNET.dll\",\n        \"lib/netstandard2.0/PlaylistsNET.dll\",\n        \"playlistsnet.1.1.2.nupkg.sha512\",\n        \"playlistsnet.nuspec\"\n      ]\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"sha512\": \"RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"type\": \"package\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/BouncyCastle.Crypto.dll\",\n        \"lib/net40/BouncyCastle.Crypto.xml\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.dll\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.xml\",\n        \"portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n        \"portable.bouncycastle.nuspec\"\n      ]\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"sha512\": \"c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"runtime.native.system.4.3.0.nupkg.sha512\",\n        \"runtime.native.system.nuspec\"\n      ]\n    },\n    \"SixLabors.ImageSharp/1.0.0\": {\n      \"sha512\": \"8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==\",\n      \"type\": \"package\",\n      \"path\": \"sixlabors.imagesharp/1.0.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net472/SixLabors.ImageSharp.dll\",\n        \"lib/net472/SixLabors.ImageSharp.xml\",\n        \"lib/netcoreapp2.1/SixLabors.ImageSharp.dll\",\n        \"lib/netcoreapp2.1/SixLabors.ImageSharp.xml\",\n        \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\",\n        \"lib/netcoreapp3.1/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard1.3/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard1.3/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard2.0/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard2.0/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard2.1/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard2.1/SixLabors.ImageSharp.xml\",\n        \"sixlabors.imagesharp.1.0.0.nupkg.sha512\",\n        \"sixlabors.imagesharp.128.png\",\n        \"sixlabors.imagesharp.nuspec\"\n      ]\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"sha512\": \"Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"type\": \"package\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net46/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.0/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.1/Chaos.NaCl.dll\",\n        \"lib/netstandard1.1/Chaos.NaCl.dll\",\n        \"lib/netstandard2.0/Chaos.NaCl.dll\",\n        \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n        \"splamy.ed25519.toolkit.nuspec\"\n      ]\n    },\n    \"System.Buffers/4.5.0\": {\n      \"sha512\": \"pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==\",\n      \"type\": \"package\",\n      \"path\": \"system.buffers/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.1/System.Buffers.dll\",\n        \"lib/netstandard1.1/System.Buffers.xml\",\n        \"lib/netstandard2.0/System.Buffers.dll\",\n        \"lib/netstandard2.0/System.Buffers.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"ref/net45/System.Buffers.dll\",\n        \"ref/net45/System.Buffers.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.Buffers.dll\",\n        \"ref/netstandard1.1/System.Buffers.xml\",\n        \"ref/netstandard2.0/System.Buffers.dll\",\n        \"ref/netstandard2.0/System.Buffers.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"system.buffers.4.5.0.nupkg.sha512\",\n        \"system.buffers.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Collections/4.3.0\": {\n      \"sha512\": \"3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Collections.dll\",\n        \"ref/netcore50/System.Collections.xml\",\n        \"ref/netcore50/de/System.Collections.xml\",\n        \"ref/netcore50/es/System.Collections.xml\",\n        \"ref/netcore50/fr/System.Collections.xml\",\n        \"ref/netcore50/it/System.Collections.xml\",\n        \"ref/netcore50/ja/System.Collections.xml\",\n        \"ref/netcore50/ko/System.Collections.xml\",\n        \"ref/netcore50/ru/System.Collections.xml\",\n        \"ref/netcore50/zh-hans/System.Collections.xml\",\n        \"ref/netcore50/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.0/System.Collections.dll\",\n        \"ref/netstandard1.0/System.Collections.xml\",\n        \"ref/netstandard1.0/de/System.Collections.xml\",\n        \"ref/netstandard1.0/es/System.Collections.xml\",\n        \"ref/netstandard1.0/fr/System.Collections.xml\",\n        \"ref/netstandard1.0/it/System.Collections.xml\",\n        \"ref/netstandard1.0/ja/System.Collections.xml\",\n        \"ref/netstandard1.0/ko/System.Collections.xml\",\n        \"ref/netstandard1.0/ru/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.3/System.Collections.dll\",\n        \"ref/netstandard1.3/System.Collections.xml\",\n        \"ref/netstandard1.3/de/System.Collections.xml\",\n        \"ref/netstandard1.3/es/System.Collections.xml\",\n        \"ref/netstandard1.3/fr/System.Collections.xml\",\n        \"ref/netstandard1.3/it/System.Collections.xml\",\n        \"ref/netstandard1.3/ja/System.Collections.xml\",\n        \"ref/netstandard1.3/ko/System.Collections.xml\",\n        \"ref/netstandard1.3/ru/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Collections.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.collections.4.3.0.nupkg.sha512\",\n        \"system.collections.nuspec\"\n      ]\n    },\n    \"System.Collections.Immutable/1.5.0\": {\n      \"sha512\": \"EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections.immutable/1.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/System.Collections.Immutable.dll\",\n        \"lib/netstandard1.0/System.Collections.Immutable.xml\",\n        \"lib/netstandard1.3/System.Collections.Immutable.dll\",\n        \"lib/netstandard1.3/System.Collections.Immutable.xml\",\n        \"lib/netstandard2.0/System.Collections.Immutable.dll\",\n        \"lib/netstandard2.0/System.Collections.Immutable.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml\",\n        \"system.collections.immutable.1.5.0.nupkg.sha512\",\n        \"system.collections.immutable.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.ComponentModel.Annotations/4.5.0\": {\n      \"sha512\": \"UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==\",\n      \"type\": \"package\",\n      \"path\": \"system.componentmodel.annotations/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net461/System.ComponentModel.Annotations.dll\",\n        \"lib/netcore50/System.ComponentModel.Annotations.dll\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.4/System.ComponentModel.Annotations.dll\",\n        \"lib/netstandard2.0/System.ComponentModel.Annotations.dll\",\n        \"lib/portable-net45+win8/_._\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/win8/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net461/System.ComponentModel.Annotations.dll\",\n        \"ref/net461/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/System.ComponentModel.Annotations.dll\",\n        \"ref/netcore50/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.1/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.3/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.4/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard2.0/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard2.0/System.ComponentModel.Annotations.xml\",\n        \"ref/portable-net45+win8/_._\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/win8/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.componentmodel.annotations.4.5.0.nupkg.sha512\",\n        \"system.componentmodel.annotations.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"sha512\": \"ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Diagnostics.Debug.dll\",\n        \"ref/netcore50/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.debug.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.debug.nuspec\"\n      ]\n    },\n    \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n      \"sha512\": \"eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.diagnosticsource/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net45/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/net45/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/net46/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/net46/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml\",\n        \"system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\",\n        \"system.diagnostics.diagnosticsource.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"sha512\": \"rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Diagnostics.Tracing.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.tracing.nuspec\"\n      ]\n    },\n    \"System.Globalization/4.3.0\": {\n      \"sha512\": \"kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"type\": \"package\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Globalization.dll\",\n        \"ref/netcore50/System.Globalization.xml\",\n        \"ref/netcore50/de/System.Globalization.xml\",\n        \"ref/netcore50/es/System.Globalization.xml\",\n        \"ref/netcore50/fr/System.Globalization.xml\",\n        \"ref/netcore50/it/System.Globalization.xml\",\n        \"ref/netcore50/ja/System.Globalization.xml\",\n        \"ref/netcore50/ko/System.Globalization.xml\",\n        \"ref/netcore50/ru/System.Globalization.xml\",\n        \"ref/netcore50/zh-hans/System.Globalization.xml\",\n        \"ref/netcore50/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.0/System.Globalization.dll\",\n        \"ref/netstandard1.0/System.Globalization.xml\",\n        \"ref/netstandard1.0/de/System.Globalization.xml\",\n        \"ref/netstandard1.0/es/System.Globalization.xml\",\n        \"ref/netstandard1.0/fr/System.Globalization.xml\",\n        \"ref/netstandard1.0/it/System.Globalization.xml\",\n        \"ref/netstandard1.0/ja/System.Globalization.xml\",\n        \"ref/netstandard1.0/ko/System.Globalization.xml\",\n        \"ref/netstandard1.0/ru/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.3/System.Globalization.dll\",\n        \"ref/netstandard1.3/System.Globalization.xml\",\n        \"ref/netstandard1.3/de/System.Globalization.xml\",\n        \"ref/netstandard1.3/es/System.Globalization.xml\",\n        \"ref/netstandard1.3/fr/System.Globalization.xml\",\n        \"ref/netstandard1.3/it/System.Globalization.xml\",\n        \"ref/netstandard1.3/ja/System.Globalization.xml\",\n        \"ref/netstandard1.3/ko/System.Globalization.xml\",\n        \"ref/netstandard1.3/ru/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Globalization.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.globalization.4.3.0.nupkg.sha512\",\n        \"system.globalization.nuspec\"\n      ]\n    },\n    \"System.IO/4.3.0\": {\n      \"sha512\": \"3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"type\": \"package\",\n      \"path\": \"system.io/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.IO.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.IO.dll\",\n        \"ref/netcore50/System.IO.dll\",\n        \"ref/netcore50/System.IO.xml\",\n        \"ref/netcore50/de/System.IO.xml\",\n        \"ref/netcore50/es/System.IO.xml\",\n        \"ref/netcore50/fr/System.IO.xml\",\n        \"ref/netcore50/it/System.IO.xml\",\n        \"ref/netcore50/ja/System.IO.xml\",\n        \"ref/netcore50/ko/System.IO.xml\",\n        \"ref/netcore50/ru/System.IO.xml\",\n        \"ref/netcore50/zh-hans/System.IO.xml\",\n        \"ref/netcore50/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.0/System.IO.dll\",\n        \"ref/netstandard1.0/System.IO.xml\",\n        \"ref/netstandard1.0/de/System.IO.xml\",\n        \"ref/netstandard1.0/es/System.IO.xml\",\n        \"ref/netstandard1.0/fr/System.IO.xml\",\n        \"ref/netstandard1.0/it/System.IO.xml\",\n        \"ref/netstandard1.0/ja/System.IO.xml\",\n        \"ref/netstandard1.0/ko/System.IO.xml\",\n        \"ref/netstandard1.0/ru/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.3/System.IO.dll\",\n        \"ref/netstandard1.3/System.IO.xml\",\n        \"ref/netstandard1.3/de/System.IO.xml\",\n        \"ref/netstandard1.3/es/System.IO.xml\",\n        \"ref/netstandard1.3/fr/System.IO.xml\",\n        \"ref/netstandard1.3/it/System.IO.xml\",\n        \"ref/netstandard1.3/ja/System.IO.xml\",\n        \"ref/netstandard1.3/ko/System.IO.xml\",\n        \"ref/netstandard1.3/ru/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.5/System.IO.dll\",\n        \"ref/netstandard1.5/System.IO.xml\",\n        \"ref/netstandard1.5/de/System.IO.xml\",\n        \"ref/netstandard1.5/es/System.IO.xml\",\n        \"ref/netstandard1.5/fr/System.IO.xml\",\n        \"ref/netstandard1.5/it/System.IO.xml\",\n        \"ref/netstandard1.5/ja/System.IO.xml\",\n        \"ref/netstandard1.5/ko/System.IO.xml\",\n        \"ref/netstandard1.5/ru/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hant/System.IO.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.4.3.0.nupkg.sha512\",\n        \"system.io.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"sha512\": \"3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"sha512\": \"6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.Primitives.dll\",\n        \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.primitives.nuspec\"\n      ]\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"sha512\": \"rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.IO.Pipelines.dll\",\n        \"lib/net461/System.IO.Pipelines.xml\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.dll\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.xml\",\n        \"lib/netstandard1.3/System.IO.Pipelines.dll\",\n        \"lib/netstandard1.3/System.IO.Pipelines.xml\",\n        \"lib/netstandard2.0/System.IO.Pipelines.dll\",\n        \"lib/netstandard2.0/System.IO.Pipelines.xml\",\n        \"ref/net461/System.IO.Pipelines.dll\",\n        \"ref/net461/System.IO.Pipelines.xml\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.dll\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.xml\",\n        \"system.io.pipelines.4.7.2.nupkg.sha512\",\n        \"system.io.pipelines.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Linq/4.3.0\": {\n      \"sha512\": \"5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"type\": \"package\",\n      \"path\": \"system.linq/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net463/System.Linq.dll\",\n        \"lib/netcore50/System.Linq.dll\",\n        \"lib/netstandard1.6/System.Linq.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net463/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.xml\",\n        \"ref/netcore50/de/System.Linq.xml\",\n        \"ref/netcore50/es/System.Linq.xml\",\n        \"ref/netcore50/fr/System.Linq.xml\",\n        \"ref/netcore50/it/System.Linq.xml\",\n        \"ref/netcore50/ja/System.Linq.xml\",\n        \"ref/netcore50/ko/System.Linq.xml\",\n        \"ref/netcore50/ru/System.Linq.xml\",\n        \"ref/netcore50/zh-hans/System.Linq.xml\",\n        \"ref/netcore50/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.0/System.Linq.dll\",\n        \"ref/netstandard1.0/System.Linq.xml\",\n        \"ref/netstandard1.0/de/System.Linq.xml\",\n        \"ref/netstandard1.0/es/System.Linq.xml\",\n        \"ref/netstandard1.0/fr/System.Linq.xml\",\n        \"ref/netstandard1.0/it/System.Linq.xml\",\n        \"ref/netstandard1.0/ja/System.Linq.xml\",\n        \"ref/netstandard1.0/ko/System.Linq.xml\",\n        \"ref/netstandard1.0/ru/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.6/System.Linq.dll\",\n        \"ref/netstandard1.6/System.Linq.xml\",\n        \"ref/netstandard1.6/de/System.Linq.xml\",\n        \"ref/netstandard1.6/es/System.Linq.xml\",\n        \"ref/netstandard1.6/fr/System.Linq.xml\",\n        \"ref/netstandard1.6/it/System.Linq.xml\",\n        \"ref/netstandard1.6/ja/System.Linq.xml\",\n        \"ref/netstandard1.6/ko/System.Linq.xml\",\n        \"ref/netstandard1.6/ru/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hant/System.Linq.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.linq.4.3.0.nupkg.sha512\",\n        \"system.linq.nuspec\"\n      ]\n    },\n    \"System.Memory/4.5.4\": {\n      \"sha512\": \"1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"type\": \"package\",\n      \"path\": \"system.memory/4.5.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.Memory.dll\",\n        \"lib/net461/System.Memory.xml\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.1/System.Memory.dll\",\n        \"lib/netstandard1.1/System.Memory.xml\",\n        \"lib/netstandard2.0/System.Memory.dll\",\n        \"lib/netstandard2.0/System.Memory.xml\",\n        \"ref/netcoreapp2.1/_._\",\n        \"system.memory.4.5.4.nupkg.sha512\",\n        \"system.memory.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"sha512\": \"zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net46/System.Net.NetworkInformation.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net46/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/de/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/es/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/it/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/net46/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"system.net.networkinformation.4.3.0.nupkg.sha512\",\n        \"system.net.networkinformation.nuspec\"\n      ]\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"sha512\": \"qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Net.Primitives.dll\",\n        \"ref/netcore50/System.Net.Primitives.xml\",\n        \"ref/netcore50/de/System.Net.Primitives.xml\",\n        \"ref/netcore50/es/System.Net.Primitives.xml\",\n        \"ref/netcore50/fr/System.Net.Primitives.xml\",\n        \"ref/netcore50/it/System.Net.Primitives.xml\",\n        \"ref/netcore50/ja/System.Net.Primitives.xml\",\n        \"ref/netcore50/ko/System.Net.Primitives.xml\",\n        \"ref/netcore50/ru/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/System.Net.Primitives.dll\",\n        \"ref/netstandard1.0/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/System.Net.Primitives.dll\",\n        \"ref/netstandard1.1/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/System.Net.Primitives.dll\",\n        \"ref/netstandard1.3/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.primitives.4.3.0.nupkg.sha512\",\n        \"system.net.primitives.nuspec\"\n      ]\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"sha512\": \"m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Net.Sockets.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/de/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/es/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/it/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Sockets.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.sockets.4.3.0.nupkg.sha512\",\n        \"system.net.sockets.nuspec\"\n      ]\n    },\n    \"System.Numerics.Vectors/4.5.0\": {\n      \"sha512\": \"QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.numerics.vectors/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Numerics.Vectors.dll\",\n        \"lib/net46/System.Numerics.Vectors.xml\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/System.Numerics.Vectors.dll\",\n        \"ref/net45/System.Numerics.Vectors.xml\",\n        \"ref/net46/System.Numerics.Vectors.dll\",\n        \"ref/net46/System.Numerics.Vectors.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.numerics.vectors.4.5.0.nupkg.sha512\",\n        \"system.numerics.vectors.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Reflection/4.3.0\": {\n      \"sha512\": \"KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Reflection.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.xml\",\n        \"ref/netcore50/de/System.Reflection.xml\",\n        \"ref/netcore50/es/System.Reflection.xml\",\n        \"ref/netcore50/fr/System.Reflection.xml\",\n        \"ref/netcore50/it/System.Reflection.xml\",\n        \"ref/netcore50/ja/System.Reflection.xml\",\n        \"ref/netcore50/ko/System.Reflection.xml\",\n        \"ref/netcore50/ru/System.Reflection.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.0/System.Reflection.dll\",\n        \"ref/netstandard1.0/System.Reflection.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.3/System.Reflection.dll\",\n        \"ref/netstandard1.3/System.Reflection.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.5/System.Reflection.dll\",\n        \"ref/netstandard1.5/System.Reflection.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.4.3.0.nupkg.sha512\",\n        \"system.reflection.nuspec\"\n      ]\n    },\n    \"System.Reflection.Metadata/1.6.0\": {\n      \"sha512\": \"COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.metadata/1.6.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.1/System.Reflection.Metadata.dll\",\n        \"lib/netstandard1.1/System.Reflection.Metadata.xml\",\n        \"lib/netstandard2.0/System.Reflection.Metadata.dll\",\n        \"lib/netstandard2.0/System.Reflection.Metadata.xml\",\n        \"lib/portable-net45+win8/System.Reflection.Metadata.dll\",\n        \"lib/portable-net45+win8/System.Reflection.Metadata.xml\",\n        \"system.reflection.metadata.1.6.0.nupkg.sha512\",\n        \"system.reflection.metadata.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"sha512\": \"5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Reflection.Primitives.dll\",\n        \"ref/netcore50/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/de/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/es/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/fr/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/it/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ja/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ko/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ru/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.dll\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.primitives.4.3.0.nupkg.sha512\",\n        \"system.reflection.primitives.nuspec\"\n      ]\n    },\n    \"System.Reflection.TypeExtensions/4.3.0\": {\n      \"sha512\": \"7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.typeextensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Reflection.TypeExtensions.dll\",\n        \"lib/net462/System.Reflection.TypeExtensions.dll\",\n        \"lib/netcore50/System.Reflection.TypeExtensions.dll\",\n        \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Reflection.TypeExtensions.dll\",\n        \"ref/net462/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.3/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.3/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.5/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll\",\n        \"system.reflection.typeextensions.4.3.0.nupkg.sha512\",\n        \"system.reflection.typeextensions.nuspec\"\n      ]\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"sha512\": \"/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"type\": \"package\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Resources.ResourceManager.dll\",\n        \"ref/netcore50/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/de/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/es/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/it/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.dll\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/de/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/es/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/it/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n        \"system.resources.resourcemanager.nuspec\"\n      ]\n    },\n    \"System.Runtime/4.3.0\": {\n      \"sha512\": \"JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.dll\",\n        \"lib/portable-net45+win8+wp80+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.xml\",\n        \"ref/netcore50/de/System.Runtime.xml\",\n        \"ref/netcore50/es/System.Runtime.xml\",\n        \"ref/netcore50/fr/System.Runtime.xml\",\n        \"ref/netcore50/it/System.Runtime.xml\",\n        \"ref/netcore50/ja/System.Runtime.xml\",\n        \"ref/netcore50/ko/System.Runtime.xml\",\n        \"ref/netcore50/ru/System.Runtime.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.0/System.Runtime.dll\",\n        \"ref/netstandard1.0/System.Runtime.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.2/System.Runtime.dll\",\n        \"ref/netstandard1.2/System.Runtime.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.3/System.Runtime.dll\",\n        \"ref/netstandard1.3/System.Runtime.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.5/System.Runtime.dll\",\n        \"ref/netstandard1.5/System.Runtime.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.xml\",\n        \"ref/portable-net45+win8+wp80+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.4.3.0.nupkg.sha512\",\n        \"system.runtime.nuspec\"\n      ]\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n      \"sha512\": \"IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\",\n        \"system.runtime.compilerservices.unsafe.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"sha512\": \"guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/de/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/es/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/fr/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/it/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ja/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ko/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ru/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.extensions.4.3.0.nupkg.sha512\",\n        \"system.runtime.extensions.nuspec\"\n      ]\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"sha512\": \"OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/_._\",\n        \"ref/netstandard1.3/System.Runtime.Handles.dll\",\n        \"ref/netstandard1.3/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.handles.4.3.0.nupkg.sha512\",\n        \"system.runtime.handles.nuspec\"\n      ]\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"sha512\": \"uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.InteropServices.dll\",\n        \"lib/net463/System.Runtime.InteropServices.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.InteropServices.dll\",\n        \"ref/net463/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/de/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/es/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/it/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netcoreapp1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.interopservices.4.3.0.nupkg.sha512\",\n        \"system.runtime.interopservices.nuspec\"\n      ]\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"sha512\": \"P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Claims.dll\",\n        \"lib/netstandard1.3/System.Security.Claims.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/de/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/es/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/it/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Claims.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.claims.4.3.0.nupkg.sha512\",\n        \"system.security.claims.nuspec\"\n      ]\n    },\n    \"System.Security.Cryptography.Cng/4.5.0\": {\n      \"sha512\": \"WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.cryptography.cng/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Cryptography.Cng.dll\",\n        \"lib/net461/System.Security.Cryptography.Cng.dll\",\n        \"lib/net462/System.Security.Cryptography.Cng.dll\",\n        \"lib/net47/System.Security.Cryptography.Cng.dll\",\n        \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.3/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard2.0/System.Security.Cryptography.Cng.dll\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Cryptography.Cng.dll\",\n        \"ref/net461/System.Security.Cryptography.Cng.dll\",\n        \"ref/net461/System.Security.Cryptography.Cng.xml\",\n        \"ref/net462/System.Security.Cryptography.Cng.dll\",\n        \"ref/net462/System.Security.Cryptography.Cng.xml\",\n        \"ref/net47/System.Security.Cryptography.Cng.dll\",\n        \"ref/net47/System.Security.Cryptography.Cng.xml\",\n        \"ref/netcoreapp2.0/System.Security.Cryptography.Cng.dll\",\n        \"ref/netcoreapp2.0/System.Security.Cryptography.Cng.xml\",\n        \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.xml\",\n        \"ref/netstandard1.3/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard2.0/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard2.0/System.Security.Cryptography.Cng.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net47/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netcoreapp2.0/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/uap10.0.16299/_._\",\n        \"system.security.cryptography.cng.4.5.0.nupkg.sha512\",\n        \"system.security.cryptography.cng.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"sha512\": \"I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Security.Principal.dll\",\n        \"lib/netstandard1.0/System.Security.Principal.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Security.Principal.dll\",\n        \"ref/netcore50/System.Security.Principal.xml\",\n        \"ref/netcore50/de/System.Security.Principal.xml\",\n        \"ref/netcore50/es/System.Security.Principal.xml\",\n        \"ref/netcore50/fr/System.Security.Principal.xml\",\n        \"ref/netcore50/it/System.Security.Principal.xml\",\n        \"ref/netcore50/ja/System.Security.Principal.xml\",\n        \"ref/netcore50/ko/System.Security.Principal.xml\",\n        \"ref/netcore50/ru/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hans/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hant/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/System.Security.Principal.dll\",\n        \"ref/netstandard1.0/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/de/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/es/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/fr/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/it/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ja/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ko/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ru/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Security.Principal.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.principal.4.3.0.nupkg.sha512\",\n        \"system.security.principal.nuspec\"\n      ]\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"sha512\": \"HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Security.Principal.Windows.dll\",\n        \"ref/net46/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/de/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/es/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/it/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/net46/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"system.security.principal.windows.4.3.0.nupkg.sha512\",\n        \"system.security.principal.windows.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"sha512\": \"BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Text.Encoding.dll\",\n        \"ref/netcore50/System.Text.Encoding.xml\",\n        \"ref/netcore50/de/System.Text.Encoding.xml\",\n        \"ref/netcore50/es/System.Text.Encoding.xml\",\n        \"ref/netcore50/fr/System.Text.Encoding.xml\",\n        \"ref/netcore50/it/System.Text.Encoding.xml\",\n        \"ref/netcore50/ja/System.Text.Encoding.xml\",\n        \"ref/netcore50/ko/System.Text.Encoding.xml\",\n        \"ref/netcore50/ru/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/System.Text.Encoding.dll\",\n        \"ref/netstandard1.0/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/System.Text.Encoding.dll\",\n        \"ref/netstandard1.3/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Text.Encoding.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.text.encoding.4.3.0.nupkg.sha512\",\n        \"system.text.encoding.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding.CodePages/4.5.1\": {\n      \"sha512\": \"4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding.codepages/4.5.1\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Text.Encoding.CodePages.dll\",\n        \"lib/net461/System.Text.Encoding.CodePages.dll\",\n        \"lib/netstandard1.3/System.Text.Encoding.CodePages.dll\",\n        \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/win/lib/net461/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netstandard2.0/System.Text.Encoding.CodePages.dll\",\n        \"system.text.encoding.codepages.4.5.1.nupkg.sha512\",\n        \"system.text.encoding.codepages.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Text.Encodings.Web/4.5.0\": {\n      \"sha512\": \"Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encodings.web/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/System.Text.Encodings.Web.dll\",\n        \"lib/netstandard1.0/System.Text.Encodings.Web.xml\",\n        \"lib/netstandard2.0/System.Text.Encodings.Web.dll\",\n        \"lib/netstandard2.0/System.Text.Encodings.Web.xml\",\n        \"system.text.encodings.web.4.5.0.nupkg.sha512\",\n        \"system.text.encodings.web.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading/4.3.0\": {\n      \"sha512\": \"VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Threading.dll\",\n        \"lib/netstandard1.3/System.Threading.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.dll\",\n        \"ref/netcore50/System.Threading.xml\",\n        \"ref/netcore50/de/System.Threading.xml\",\n        \"ref/netcore50/es/System.Threading.xml\",\n        \"ref/netcore50/fr/System.Threading.xml\",\n        \"ref/netcore50/it/System.Threading.xml\",\n        \"ref/netcore50/ja/System.Threading.xml\",\n        \"ref/netcore50/ko/System.Threading.xml\",\n        \"ref/netcore50/ru/System.Threading.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.0/System.Threading.dll\",\n        \"ref/netstandard1.0/System.Threading.xml\",\n        \"ref/netstandard1.0/de/System.Threading.xml\",\n        \"ref/netstandard1.0/es/System.Threading.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.xml\",\n        \"ref/netstandard1.0/it/System.Threading.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.3/System.Threading.dll\",\n        \"ref/netstandard1.3/System.Threading.xml\",\n        \"ref/netstandard1.3/de/System.Threading.xml\",\n        \"ref/netstandard1.3/es/System.Threading.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.xml\",\n        \"ref/netstandard1.3/it/System.Threading.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Threading.dll\",\n        \"system.threading.4.3.0.nupkg.sha512\",\n        \"system.threading.nuspec\"\n      ]\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"sha512\": \"m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Threading.Overlapped.dll\",\n        \"ref/net46/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/net46/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netcore50/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"system.threading.overlapped.4.3.0.nupkg.sha512\",\n        \"system.threading.overlapped.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"sha512\": \"LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.Tasks.dll\",\n        \"ref/netcore50/System.Threading.Tasks.xml\",\n        \"ref/netcore50/de/System.Threading.Tasks.xml\",\n        \"ref/netcore50/es/System.Threading.Tasks.xml\",\n        \"ref/netcore50/fr/System.Threading.Tasks.xml\",\n        \"ref/netcore50/it/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ja/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ko/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ru/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.0/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.3/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.4.3.0.nupkg.sha512\",\n        \"system.threading.tasks.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks.Extensions/4.5.3\": {\n      \"sha512\": \"+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks.extensions/4.5.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/netcoreapp2.1/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.extensions.4.5.3.nupkg.sha512\",\n        \"system.threading.tasks.extensions.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"sha512\": \"OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.Thread.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.Thread.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Thread.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.thread.4.3.0.nupkg.sha512\",\n        \"system.threading.thread.nuspec\"\n      ]\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"sha512\": \"k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.ThreadPool.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/de/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/es/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/it/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.threadpool.4.3.0.nupkg.sha512\",\n        \"system.threading.threadpool.nuspec\"\n      ]\n    },\n    \"Splamy.TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"path\": \"../TSLib/TSLib.csproj\",\n      \"msbuildProject\": \"../TSLib/TSLib.csproj\"\n    }\n  },\n  \"projectFileDependencyGroups\": {\n    \".NETCoreApp,Version=v3.1\": [\n      \"CliWrap >= 3.1.0\",\n      \"CommandLineParser >= 2.8.0\",\n      \"LiteDB >= 4.1.4\",\n      \"Microsoft.AspNetCore.Cors >= 2.2.0\",\n      \"Microsoft.AspNetCore.Server.Kestrel >= 2.2.0\",\n      \"Microsoft.AspNetCore.StaticFiles >= 2.2.0\",\n      \"Microsoft.CodeAnalysis.CSharp >= 3.7.0\",\n      \"NLog >= 4.7.3\",\n      \"Nett >= 0.15.0\",\n      \"Newtonsoft.Json >= 12.0.3\",\n      \"PlaylistsNET >= 1.1.2\",\n      \"SixLabors.ImageSharp >= 1.0.0\",\n      \"Splamy.TSLib >= 1.1.0\"\n    ]\n  },\n  \"packageFolders\": {\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\": {}\n  },\n  \"project\": {\n    \"version\": \"1.0.0\",\n    \"restore\": {\n      \"projectUniqueName\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n      \"projectName\": \"TS3AudioBot\",\n      \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n      \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n      \"outputPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\obj\\\\\",\n      \"projectStyle\": \"PackageReference\",\n      \"configFilePaths\": [\n        \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n        \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n      ],\n      \"originalTargetFrameworks\": [\n        \"netcoreapp3.1\"\n      ],\n      \"sources\": {\n        \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n        \"https://api.nuget.org/v3/index.json\": {}\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"projectReferences\": {\n            \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n              \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n            }\n          }\n        }\n      },\n      \"warningProperties\": {\n        \"warnAsError\": [\n          \"NU1605\"\n        ]\n      }\n    },\n    \"frameworks\": {\n      \"netcoreapp3.1\": {\n        \"targetAlias\": \"netcoreapp3.1\",\n        \"dependencies\": {\n          \"CliWrap\": {\n            \"target\": \"Package\",\n            \"version\": \"[3.1.0, )\"\n          },\n          \"CommandLineParser\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.8.0, )\"\n          },\n          \"LiteDB\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.1.4, )\"\n          },\n          \"Microsoft.AspNetCore.Cors\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.AspNetCore.Server.Kestrel\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.AspNetCore.StaticFiles\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.CodeAnalysis.CSharp\": {\n            \"include\": \"Runtime, Compile, Build, Native, ContentFiles, BuildTransitive\",\n            \"target\": \"Package\",\n            \"version\": \"[3.7.0, )\"\n          },\n          \"NLog\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.3, )\"\n          },\n          \"Nett\": {\n            \"target\": \"Package\",\n            \"version\": \"[0.15.0, )\"\n          },\n          \"Newtonsoft.Json\": {\n            \"target\": \"Package\",\n            \"version\": \"[12.0.3, )\"\n          },\n          \"PlaylistsNET\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.1.2, )\"\n          },\n          \"SixLabors.ImageSharp\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.0.0, )\"\n          }\n        },\n        \"imports\": [\n          \"net461\",\n          \"net462\",\n          \"net47\",\n          \"net471\",\n          \"net472\",\n          \"net48\"\n        ],\n        \"assetTargetFallback\": true,\n        \"warn\": true,\n        \"frameworkReferences\": {\n          \"Microsoft.NETCore.App\": {\n            \"privateAssets\": \"all\"\n          }\n        },\n        \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "TS3AudioBot/obj/project.nuget.cache",
    "content": "{\n  \"version\": 2,\n  \"dgSpecHash\": \"J7tJv0YcqG0d5IPgJ7rAW9fFKKYWX4NBPsJzRILeX1f7yDLsMjNlu7iA1N86hVe2cWtIkdeEqMGh58SREh4uhw==\",\n  \"success\": true,\n  \"projectFilePath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n  \"expectedPackageFiles\": [\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\cliwrap\\\\3.1.0\\\\cliwrap.3.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\commandlineparser\\\\2.8.0\\\\commandlineparser.2.8.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\heijden.dns.portable\\\\2.0.19\\\\heijden.dns.portable.2.0.19.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\litedb\\\\4.1.4\\\\litedb.4.1.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.connections.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.cors\\\\2.2.0\\\\microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting\\\\2.2.0\\\\microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting.server.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http\\\\2.2.0\\\\microsoft.aspnetcore.http.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.extensions\\\\2.2.0\\\\microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.features\\\\2.2.0\\\\microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.core\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.https\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.transport.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.transport.sockets\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.staticfiles\\\\2.2.0\\\\microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.webutilities\\\\2.2.0\\\\microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.analyzers\\\\3.0.0\\\\microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.common\\\\3.7.0\\\\microsoft.codeanalysis.common.3.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.csharp\\\\3.7.0\\\\microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration\\\\2.2.0\\\\microsoft.extensions.configuration.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.abstractions\\\\2.2.0\\\\microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.binder\\\\2.2.0\\\\microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.environmentvariables\\\\2.2.0\\\\microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.fileextensions\\\\2.2.0\\\\microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.dependencyinjection\\\\2.2.0\\\\microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.dependencyinjection.abstractions\\\\2.2.0\\\\microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.fileproviders.abstractions\\\\2.2.0\\\\microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.fileproviders.physical\\\\2.2.0\\\\microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.filesystemglobbing\\\\2.2.0\\\\microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.hosting.abstractions\\\\2.2.0\\\\microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.logging\\\\2.2.0\\\\microsoft.extensions.logging.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.logging.abstractions\\\\2.2.0\\\\microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.objectpool\\\\2.2.0\\\\microsoft.extensions.objectpool.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.options\\\\2.2.0\\\\microsoft.extensions.options.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.primitives\\\\2.2.0\\\\microsoft.extensions.primitives.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.webencoders\\\\2.2.0\\\\microsoft.extensions.webencoders.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.net.http.headers\\\\2.2.0\\\\microsoft.net.http.headers.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.netcore.platforms\\\\2.1.2\\\\microsoft.netcore.platforms.2.1.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.netcore.targets\\\\1.1.0\\\\microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.win32.primitives\\\\4.3.0\\\\microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\nett\\\\0.15.0\\\\nett.0.15.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\newtonsoft.json\\\\12.0.3\\\\newtonsoft.json.12.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\nlog\\\\4.7.3\\\\nlog.4.7.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\playlistsnet\\\\1.1.2\\\\playlistsnet.1.1.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\portable.bouncycastle\\\\1.8.6.7\\\\portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\runtime.native.system\\\\4.3.0\\\\runtime.native.system.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\sixlabors.imagesharp\\\\1.0.0\\\\sixlabors.imagesharp.1.0.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\splamy.ed25519.toolkit\\\\1.0.3\\\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.buffers\\\\4.5.0\\\\system.buffers.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.collections\\\\4.3.0\\\\system.collections.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.collections.immutable\\\\1.5.0\\\\system.collections.immutable.1.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.componentmodel.annotations\\\\4.5.0\\\\system.componentmodel.annotations.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.diagnostics.debug\\\\4.3.0\\\\system.diagnostics.debug.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.diagnostics.diagnosticsource\\\\4.5.0\\\\system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.diagnostics.tracing\\\\4.3.0\\\\system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.globalization\\\\4.3.0\\\\system.globalization.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io\\\\4.3.0\\\\system.io.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.filesystem\\\\4.3.0\\\\system.io.filesystem.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.filesystem.primitives\\\\4.3.0\\\\system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.pipelines\\\\4.7.2\\\\system.io.pipelines.4.7.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.linq\\\\4.3.0\\\\system.linq.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.memory\\\\4.5.4\\\\system.memory.4.5.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.networkinformation\\\\4.3.0\\\\system.net.networkinformation.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.primitives\\\\4.3.0\\\\system.net.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.sockets\\\\4.3.0\\\\system.net.sockets.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.numerics.vectors\\\\4.5.0\\\\system.numerics.vectors.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection\\\\4.3.0\\\\system.reflection.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection.metadata\\\\1.6.0\\\\system.reflection.metadata.1.6.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection.primitives\\\\4.3.0\\\\system.reflection.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection.typeextensions\\\\4.3.0\\\\system.reflection.typeextensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.resources.resourcemanager\\\\4.3.0\\\\system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime\\\\4.3.0\\\\system.runtime.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.compilerservices.unsafe\\\\4.7.0\\\\system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.extensions\\\\4.3.0\\\\system.runtime.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.handles\\\\4.3.0\\\\system.runtime.handles.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.interopservices\\\\4.3.0\\\\system.runtime.interopservices.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.claims\\\\4.3.0\\\\system.security.claims.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.cryptography.cng\\\\4.5.0\\\\system.security.cryptography.cng.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.principal\\\\4.3.0\\\\system.security.principal.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.principal.windows\\\\4.3.0\\\\system.security.principal.windows.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.text.encoding\\\\4.3.0\\\\system.text.encoding.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.text.encoding.codepages\\\\4.5.1\\\\system.text.encoding.codepages.4.5.1.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.text.encodings.web\\\\4.5.0\\\\system.text.encodings.web.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading\\\\4.3.0\\\\system.threading.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.overlapped\\\\4.3.0\\\\system.threading.overlapped.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.tasks\\\\4.3.0\\\\system.threading.tasks.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.tasks.extensions\\\\4.5.3\\\\system.threading.tasks.extensions.4.5.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.thread\\\\4.3.0\\\\system.threading.thread.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.threadpool\\\\4.3.0\\\\system.threading.threadpool.4.3.0.nupkg.sha512\"\n  ],\n  \"logs\": []\n}"
  },
  {
    "path": "TS3AudioBot/obj/publish/linux-x64/TS3AudioBot.csproj.nuget.dgspec.json",
    "content": "{\n  \"format\": 1,\n  \"restore\": {\n    \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {}\n  },\n  \"projects\": {\n    \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {\n      \"version\": \"1.0.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n        \"projectName\": \"TS3AudioBot\",\n        \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\obj\\\\publish\\\\linux-x64\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"fallbackFolders\": [\n          \"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\Shared\\\\NuGetPackages\"\n        ],\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\13336\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.FallbackLocation.config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {\n              \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n                \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n              }\n            }\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"CliWrap\": {\n              \"target\": \"Package\",\n              \"version\": \"[3.1.0, )\"\n            },\n            \"CommandLineParser\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.8.0, )\"\n            },\n            \"LiteDB\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.1.4, )\"\n            },\n            \"Microsoft.AspNetCore.Cors\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.AspNetCore.Server.Kestrel\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.AspNetCore.StaticFiles\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.CodeAnalysis.CSharp\": {\n              \"include\": \"Runtime, Compile, Build, Native, ContentFiles, BuildTransitive\",\n              \"target\": \"Package\",\n              \"version\": \"[3.7.0, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Nett\": {\n              \"target\": \"Package\",\n              \"version\": \"[0.15.0, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"PlaylistsNET\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.1.2, )\"\n            },\n            \"SixLabors.ImageSharp\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.0, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\",\n            \"net481\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"downloadDependencies\": [\n            {\n              \"name\": \"Microsoft.AspNetCore.App.Ref\",\n              \"version\": \"[3.1.10, 3.1.10]\"\n            },\n            {\n              \"name\": \"Microsoft.AspNetCore.App.Runtime.linux-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Host.linux-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Ref\",\n              \"version\": \"[3.1.0, 3.1.0]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Runtime.linux-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.WindowsDesktop.App.Ref\",\n              \"version\": \"[3.1.0, 3.1.0]\"\n            }\n          ],\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n        }\n      },\n      \"runtimes\": {\n        \"linux-x64\": {\n          \"#import\": []\n        }\n      }\n    },\n    \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n      \"version\": \"1.1.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"projectName\": \"Splamy.TSLib\",\n        \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\obj\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"crossTargeting\": true,\n        \"fallbackFolders\": [\n          \"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\Shared\\\\NuGetPackages\"\n        ],\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\13336\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.FallbackLocation.config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\",\n          \"netstandard2.0\",\n          \"netstandard2.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.0\": {\n            \"targetAlias\": \"netstandard2.0\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.1\": {\n            \"targetAlias\": \"netstandard2.1\",\n            \"projectReferences\": {}\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\",\n            \"net481\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"downloadDependencies\": [\n            {\n              \"name\": \"Microsoft.AspNetCore.App.Ref\",\n              \"version\": \"[3.1.10, 3.1.10]\"\n            },\n            {\n              \"name\": \"Microsoft.AspNetCore.App.Runtime.linux-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Ref\",\n              \"version\": \"[3.1.0, 3.1.0]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Runtime.linux-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.WindowsDesktop.App.Ref\",\n              \"version\": \"[3.1.0, 3.1.0]\"\n            }\n          ],\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.0\": {\n          \"targetAlias\": \"netstandard2.0\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NETStandard.Library\": {\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[2.0.3, )\",\n              \"autoReferenced\": true\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            },\n            \"System.Memory\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.5.4, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\",\n            \"net481\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.1\": {\n          \"targetAlias\": \"netstandard2.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\",\n            \"net481\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"NETStandard.Library\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n        }\n      },\n      \"runtimes\": {\n        \"linux-x64\": {\n          \"#import\": []\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "TS3AudioBot/obj/publish/linux-x64/TS3AudioBot.csproj.nuget.g.props",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <RestoreSuccess Condition=\" '$(RestoreSuccess)' == '' \">True</RestoreSuccess>\n    <RestoreTool Condition=\" '$(RestoreTool)' == '' \">NuGet</RestoreTool>\n    <ProjectAssetsFile Condition=\" '$(ProjectAssetsFile)' == '' \">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>\n    <NuGetPackageRoot Condition=\" '$(NuGetPackageRoot)' == '' \">$(UserProfile)\\.nuget\\packages\\</NuGetPackageRoot>\n    <NuGetPackageFolders Condition=\" '$(NuGetPackageFolders)' == '' \">C:\\Users\\13336\\.nuget\\packages\\;C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages</NuGetPackageFolders>\n    <NuGetProjectStyle Condition=\" '$(NuGetProjectStyle)' == '' \">PackageReference</NuGetProjectStyle>\n    <NuGetToolVersion Condition=\" '$(NuGetToolVersion)' == '' \">6.5.0</NuGetToolVersion>\n  </PropertyGroup>\n  <ItemGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <SourceRoot Include=\"C:\\Users\\13336\\.nuget\\packages\\\" />\n    <SourceRoot Include=\"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages\\\" />\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <PkgMicrosoft_CodeAnalysis_Analyzers Condition=\" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' \">C:\\Users\\13336\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.0.0</PkgMicrosoft_CodeAnalysis_Analyzers>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "TS3AudioBot/obj/publish/linux-x64/TS3AudioBot.csproj.nuget.g.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" />"
  },
  {
    "path": "TS3AudioBot/obj/publish/linux-x64/project.assets.json",
    "content": "{\n  \"version\": 3,\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {\n      \"CliWrap/3.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"CommandLineParser/2.8.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"LiteDB/4.1.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.TypeExtensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.IO.Pipelines\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Cors/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.EnvironmentVariables\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.FileExtensions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Diagnostics.DiagnosticSource\": \"4.5.0\",\n          \"System.Reflection.Metadata\": \"1.6.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Server.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.ObjectPool\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Https\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Memory\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.5.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\",\n          \"System.Security.Cryptography.Cng\": \"4.5.0\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Connections.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.WebEncoders\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n        \"type\": \"package\",\n        \"build\": {\n          \"build/_._\": {}\n        }\n      },\n      \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Analyzers\": \"3.0.0\",\n          \"System.Collections.Immutable\": \"1.5.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Reflection.Metadata\": \"1.6.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Text.Encoding.CodePages\": \"4.5.1\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Common\": \"[3.7.0]\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileSystemGlobbing\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Options/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.ComponentModel.Annotations\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Primitives/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.1\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Net.Http.Headers/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/2.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Nett/0.15.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"PlaylistsNET/1.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"SixLabors.ImageSharp/1.0.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Buffers/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Collections.Immutable/1.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.ComponentModel.Annotations/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/System.IO.Pipelines.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtimeTargets\": {\n          \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"linux\"\n          },\n          \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"osx\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Numerics.Vectors/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.Metadata/1.6.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Reflection.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.TypeExtensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netcoreapp1.1/_._\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Cryptography.Cng/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Text.Encoding.CodePages/4.5.1\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encodings.Web/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      },\n      \"Splamy.TSLib/1.1.0\": {\n        \"type\": \"project\",\n        \"framework\": \".NETCoreApp,Version=v3.1\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"compile\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        },\n        \"runtime\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        }\n      }\n    },\n    \".NETCoreApp,Version=v3.1/linux-x64\": {\n      \"CliWrap/3.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"CommandLineParser/2.8.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"LiteDB/4.1.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.TypeExtensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.IO.Pipelines\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Cors/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.EnvironmentVariables\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.FileExtensions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Diagnostics.DiagnosticSource\": \"4.5.0\",\n          \"System.Reflection.Metadata\": \"1.6.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Server.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.ObjectPool\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Https\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Memory\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.5.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\",\n          \"System.Security.Cryptography.Cng\": \"4.5.0\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Connections.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.WebEncoders\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n        \"type\": \"package\",\n        \"build\": {\n          \"build/_._\": {}\n        }\n      },\n      \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Analyzers\": \"3.0.0\",\n          \"System.Collections.Immutable\": \"1.5.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Reflection.Metadata\": \"1.6.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Text.Encoding.CodePages\": \"4.5.1\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Common\": \"[3.7.0]\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileSystemGlobbing\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Options/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.ComponentModel.Annotations\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Primitives/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.1\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Net.Http.Headers/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/2.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.unix.Microsoft.Win32.Primitives\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/Microsoft.Win32.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Nett/0.15.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"PlaylistsNET/1.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"runtime.any.System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Collections.dll\": {}\n        }\n      },\n      \"runtime.any.System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Diagnostics.Tracing.dll\": {}\n        }\n      },\n      \"runtime.any.System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Globalization.dll\": {}\n        }\n      },\n      \"runtime.any.System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.IO.dll\": {}\n        }\n      },\n      \"runtime.any.System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Reflection.dll\": {}\n        }\n      },\n      \"runtime.any.System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Reflection.Primitives.dll\": {}\n        }\n      },\n      \"runtime.any.System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Resources.ResourceManager.dll\": {}\n        }\n      },\n      \"runtime.any.System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Private.Uri\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Runtime.dll\": {}\n        }\n      },\n      \"runtime.any.System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Runtime.Handles.dll\": {}\n        }\n      },\n      \"runtime.any.System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Runtime.InteropServices.dll\": {}\n        }\n      },\n      \"runtime.any.System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Text.Encoding.dll\": {}\n        }\n      },\n      \"runtime.any.System.Text.Encoding.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Text.Encoding.Extensions.dll\": {}\n        }\n      },\n      \"runtime.any.System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Tasks.dll\": {}\n        }\n      },\n      \"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\",\n          \"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n        \"type\": \"package\"\n      },\n      \"runtime.unix.Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.3/Microsoft.Win32.Primitives.dll\": {}\n        }\n      },\n      \"runtime.unix.System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Diagnostics.Debug.dll\": {}\n        }\n      },\n      \"runtime.unix.System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Buffers\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Text.Encoding.Extensions\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.3/System.IO.FileSystem.dll\": {}\n        }\n      },\n      \"runtime.unix.System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Net.Primitives.dll\": {}\n        }\n      },\n      \"runtime.unix.System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.Net.NameResolution\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Net.Sockets.dll\": {}\n        }\n      },\n      \"runtime.unix.System.Private.Uri/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.0/System.Private.Uri.dll\": {}\n        }\n      },\n      \"runtime.unix.System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Private.Uri\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\",\n          \"runtime.native.System.Security.Cryptography.OpenSsl\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.5/System.Runtime.Extensions.dll\": {}\n        }\n      },\n      \"SixLabors.ImageSharp/1.0.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Buffers/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Collections\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Collections.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Collections.Immutable/1.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.ComponentModel.Annotations/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.unix.System.Diagnostics.Debug\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Diagnostics.Debug.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Diagnostics.Tracing\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Diagnostics.Tracing.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Globalization\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Globalization.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.any.System.IO\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.unix.System.IO.FileSystem\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.IO.FileSystem.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/System.IO.Pipelines.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Net.NameResolution/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NameResolution.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Net.NameResolution.dll\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {}\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"runtime.unix.System.Net.Primitives\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.unix.System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Numerics.Vectors/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Private.Uri/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"runtime.unix.System.Private.Uri\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Reflection\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.Metadata/1.6.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Reflection.Primitives\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Reflection.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.TypeExtensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Resources.ResourceManager\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Resources.ResourceManager.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"runtime.any.System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.unix.System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"runtime.any.System.Runtime.InteropServices\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netcoreapp1.1/System.Runtime.InteropServices.dll\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Cryptography.Cng/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {}\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {}\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Text.Encoding\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Text.Encoding.CodePages/4.5.1\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        }\n      },\n      \"System.Text.Encoding.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"runtime.any.System.Text.Encoding.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Text.Encodings.Web/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\": {}\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.ThreadPool.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      },\n      \"Splamy.TSLib/1.1.0\": {\n        \"type\": \"project\",\n        \"framework\": \".NETCoreApp,Version=v3.1\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"compile\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        },\n        \"runtime\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"CliWrap/3.1.0\": {\n      \"sha512\": \"vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==\",\n      \"type\": \"package\",\n      \"path\": \"cliwrap/3.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"cliwrap.3.1.0.nupkg.sha512\",\n        \"cliwrap.nuspec\",\n        \"favicon.png\",\n        \"lib/net461/CliWrap.dll\",\n        \"lib/net461/CliWrap.xml\",\n        \"lib/netcoreapp3.0/CliWrap.dll\",\n        \"lib/netcoreapp3.0/CliWrap.xml\",\n        \"lib/netstandard2.0/CliWrap.dll\",\n        \"lib/netstandard2.0/CliWrap.xml\",\n        \"lib/netstandard2.1/CliWrap.dll\",\n        \"lib/netstandard2.1/CliWrap.xml\"\n      ]\n    },\n    \"CommandLineParser/2.8.0\": {\n      \"sha512\": \"eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==\",\n      \"type\": \"package\",\n      \"path\": \"commandlineparser/2.8.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"CommandLine20.png\",\n        \"License.md\",\n        \"README.md\",\n        \"commandlineparser.2.8.0.nupkg.sha512\",\n        \"commandlineparser.nuspec\",\n        \"lib/net40/CommandLine.dll\",\n        \"lib/net40/CommandLine.xml\",\n        \"lib/net45/CommandLine.dll\",\n        \"lib/net45/CommandLine.xml\",\n        \"lib/net461/CommandLine.dll\",\n        \"lib/net461/CommandLine.xml\",\n        \"lib/netstandard2.0/CommandLine.dll\",\n        \"lib/netstandard2.0/CommandLine.xml\"\n      ]\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"sha512\": \"i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"type\": \"package\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"heijden.dns.portable.2.0.19.nupkg.sha512\",\n        \"heijden.dns.portable.nuspec\",\n        \"lib/netstandard1.3/Heijden.Dns.Portable.dll\"\n      ]\n    },\n    \"LiteDB/4.1.4\": {\n      \"sha512\": \"g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==\",\n      \"type\": \"package\",\n      \"path\": \"litedb/4.1.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net35/LiteDB.dll\",\n        \"lib/net35/LiteDB.xml\",\n        \"lib/net40/LiteDB.dll\",\n        \"lib/net40/LiteDB.xml\",\n        \"lib/netstandard1.3/LiteDB.dll\",\n        \"lib/netstandard1.3/LiteDB.xml\",\n        \"lib/netstandard2.0/LiteDB.dll\",\n        \"lib/netstandard2.0/LiteDB.xml\",\n        \"litedb.4.1.4.nupkg.sha512\",\n        \"litedb.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n      \"sha512\": \"Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.connections.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.xml\",\n        \"microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.connections.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Cors/2.2.0\": {\n      \"sha512\": \"LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.cors/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.xml\",\n        \"microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.cors.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n      \"sha512\": \"7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.xml\",\n        \"microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n      \"sha512\": \"ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.xml\",\n        \"microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n      \"sha512\": \"1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting.server.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml\",\n        \"microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.server.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http/2.2.0\": {\n      \"sha512\": \"YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.xml\",\n        \"microsoft.aspnetcore.http.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n      \"sha512\": \"Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.xml\",\n        \"microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n      \"sha512\": \"2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.extensions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.xml\",\n        \"microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.extensions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n      \"sha512\": \"ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.features/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.xml\",\n        \"microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.features.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n      \"sha512\": \"D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.xml\",\n        \"microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n      \"sha512\": \"F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.core/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.xml\",\n        \"microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.core.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n      \"sha512\": \"nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.https/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.xml\",\n        \"microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.https.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n      \"sha512\": \"j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.xml\",\n        \"microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.transport.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n      \"sha512\": \"qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml\",\n        \"microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.transport.sockets.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n      \"sha512\": \"byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.staticfiles/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.xml\",\n        \"microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.staticfiles.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n      \"sha512\": \"9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.webutilities/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.xml\",\n        \"microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.webutilities.nuspec\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n      \"sha512\": \"ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.analyzers/3.0.0\",\n      \"hasTools\": true,\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"EULA.rtf\",\n        \"ThirdPartyNotices.rtf\",\n        \"analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll\",\n        \"analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll\",\n        \"analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll\",\n        \"analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll\",\n        \"analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"build/Microsoft.CodeAnalysis.Analyzers.props\",\n        \"build/Microsoft.CodeAnalysis.Analyzers.targets\",\n        \"documentation/Analyzer Configuration.md\",\n        \"documentation/Microsoft.CodeAnalysis.Analyzers.md\",\n        \"documentation/Microsoft.CodeAnalysis.Analyzers.sarif\",\n        \"editorconfig/AllRulesDefault/.editorconfig\",\n        \"editorconfig/AllRulesDisabled/.editorconfig\",\n        \"editorconfig/AllRulesEnabled/.editorconfig\",\n        \"editorconfig/CorrectnessRulesDefault/.editorconfig\",\n        \"editorconfig/CorrectnessRulesEnabled/.editorconfig\",\n        \"editorconfig/DataflowRulesDefault/.editorconfig\",\n        \"editorconfig/DataflowRulesEnabled/.editorconfig\",\n        \"editorconfig/LibraryRulesDefault/.editorconfig\",\n        \"editorconfig/LibraryRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig\",\n        \"editorconfig/PortedFromFxCopRulesDefault/.editorconfig\",\n        \"editorconfig/PortedFromFxCopRulesEnabled/.editorconfig\",\n        \"microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.analyzers.nuspec\",\n        \"rulesets/AllRulesDefault.ruleset\",\n        \"rulesets/AllRulesDisabled.ruleset\",\n        \"rulesets/AllRulesEnabled.ruleset\",\n        \"rulesets/CorrectnessRulesDefault.ruleset\",\n        \"rulesets/CorrectnessRulesEnabled.ruleset\",\n        \"rulesets/DataflowRulesDefault.ruleset\",\n        \"rulesets/DataflowRulesEnabled.ruleset\",\n        \"rulesets/LibraryRulesDefault.ruleset\",\n        \"rulesets/LibraryRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset\",\n        \"rulesets/PortedFromFxCopRulesDefault.ruleset\",\n        \"rulesets/PortedFromFxCopRulesEnabled.ruleset\",\n        \"tools/install.ps1\",\n        \"tools/uninstall.ps1\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n      \"sha512\": \"SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.common/3.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"ThirdPartyNotices.rtf\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.pdb\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.xml\",\n        \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.pdb\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.xml\",\n        \"lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll\",\n        \"microsoft.codeanalysis.common.3.7.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.common.nuspec\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n      \"sha512\": \"sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.csharp/3.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"ThirdPartyNotices.rtf\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.pdb\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.xml\",\n        \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml\",\n        \"lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.csharp.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration/2.2.0\": {\n      \"sha512\": \"nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.xml\",\n        \"microsoft.extensions.configuration.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n      \"sha512\": \"65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml\",\n        \"microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n      \"sha512\": \"vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.binder/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml\",\n        \"microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.binder.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n      \"sha512\": \"gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.environmentvariables/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.xml\",\n        \"microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.environmentvariables.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n      \"sha512\": \"H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.fileextensions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.xml\",\n        \"microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.fileextensions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n      \"sha512\": \"MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.dependencyinjection/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net461/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/net461/Microsoft.Extensions.DependencyInjection.xml\",\n        \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.xml\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml\",\n        \"microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.dependencyinjection.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n      \"sha512\": \"f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.dependencyinjection.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml\",\n        \"microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.dependencyinjection.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n      \"sha512\": \"EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.fileproviders.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml\",\n        \"microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.fileproviders.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n      \"sha512\": \"tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.fileproviders.physical/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.xml\",\n        \"microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.fileproviders.physical.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n      \"sha512\": \"ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.filesystemglobbing/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.xml\",\n        \"microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.filesystemglobbing.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n      \"sha512\": \"+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.hosting.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml\",\n        \"microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.hosting.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Logging/2.2.0\": {\n      \"sha512\": \"Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.logging/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.xml\",\n        \"microsoft.extensions.logging.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.logging.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n      \"sha512\": \"B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.logging.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml\",\n        \"microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.logging.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n      \"sha512\": \"gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.objectpool/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml\",\n        \"microsoft.extensions.objectpool.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.objectpool.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Options/2.2.0\": {\n      \"sha512\": \"UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.options/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Options.xml\",\n        \"microsoft.extensions.options.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.options.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Primitives/2.2.0\": {\n      \"sha512\": \"azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.primitives/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Primitives.xml\",\n        \"microsoft.extensions.primitives.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.primitives.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n      \"sha512\": \"V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.webencoders/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.xml\",\n        \"microsoft.extensions.webencoders.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.webencoders.nuspec\"\n      ]\n    },\n    \"Microsoft.Net.Http.Headers/2.2.0\": {\n      \"sha512\": \"iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.net.http.headers/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\",\n        \"lib/netstandard2.0/Microsoft.Net.Http.Headers.xml\",\n        \"microsoft.net.http.headers.2.2.0.nupkg.sha512\",\n        \"microsoft.net.http.headers.nuspec\"\n      ]\n    },\n    \"Microsoft.NETCore.Platforms/2.1.2\": {\n      \"sha512\": \"mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.platforms/2.1.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.platforms.2.1.2.nupkg.sha512\",\n        \"microsoft.netcore.platforms.nuspec\",\n        \"runtime.json\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"sha512\": \"aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n        \"microsoft.netcore.targets.nuspec\",\n        \"runtime.json\"\n      ]\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"sha512\": \"9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/Microsoft.Win32.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n        \"microsoft.win32.primitives.nuspec\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\"\n      ]\n    },\n    \"Nett/0.15.0\": {\n      \"sha512\": \"/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==\",\n      \"type\": \"package\",\n      \"path\": \"nett/0.15.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/Nett.dll\",\n        \"lib/net40/Nett.xml\",\n        \"lib/netstandard2.0/Nett.dll\",\n        \"lib/netstandard2.0/Nett.xml\",\n        \"nett.0.15.0.nupkg.sha512\",\n        \"nett.nuspec\"\n      ]\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"sha512\": \"6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"type\": \"package\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.md\",\n        \"lib/net20/Newtonsoft.Json.dll\",\n        \"lib/net20/Newtonsoft.Json.xml\",\n        \"lib/net35/Newtonsoft.Json.dll\",\n        \"lib/net35/Newtonsoft.Json.xml\",\n        \"lib/net40/Newtonsoft.Json.dll\",\n        \"lib/net40/Newtonsoft.Json.xml\",\n        \"lib/net45/Newtonsoft.Json.dll\",\n        \"lib/net45/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.0/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.3/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.3/Newtonsoft.Json.xml\",\n        \"lib/netstandard2.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard2.0/Newtonsoft.Json.xml\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"newtonsoft.json.12.0.3.nupkg.sha512\",\n        \"newtonsoft.json.nuspec\",\n        \"packageIcon.png\"\n      ]\n    },\n    \"NLog/4.7.3\": {\n      \"sha512\": \"3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"type\": \"package\",\n      \"path\": \"nlog/4.7.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/monoandroid44/NLog.dll\",\n        \"lib/monoandroid44/NLog.xml\",\n        \"lib/net35/NLog.dll\",\n        \"lib/net35/NLog.xml\",\n        \"lib/net40-client/NLog.dll\",\n        \"lib/net40-client/NLog.xml\",\n        \"lib/net45/NLog.dll\",\n        \"lib/net45/NLog.xml\",\n        \"lib/netstandard1.3/NLog.dll\",\n        \"lib/netstandard1.3/NLog.xml\",\n        \"lib/netstandard1.5/NLog.dll\",\n        \"lib/netstandard1.5/NLog.xml\",\n        \"lib/netstandard2.0/NLog.dll\",\n        \"lib/netstandard2.0/NLog.xml\",\n        \"lib/sl4/NLog.dll\",\n        \"lib/sl4/NLog.xml\",\n        \"lib/sl5/NLog.dll\",\n        \"lib/sl5/NLog.xml\",\n        \"lib/wp8/NLog.dll\",\n        \"lib/wp8/NLog.xml\",\n        \"lib/xamarinios10/NLog.dll\",\n        \"lib/xamarinios10/NLog.xml\",\n        \"nlog.4.7.3.nupkg.sha512\",\n        \"nlog.nuspec\"\n      ]\n    },\n    \"PlaylistsNET/1.1.2\": {\n      \"sha512\": \"IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==\",\n      \"type\": \"package\",\n      \"path\": \"playlistsnet/1.1.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net45/PlaylistsNET.dll\",\n        \"lib/netstandard1.4/PlaylistsNET.dll\",\n        \"lib/netstandard2.0/PlaylistsNET.dll\",\n        \"playlistsnet.1.1.2.nupkg.sha512\",\n        \"playlistsnet.nuspec\"\n      ]\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"sha512\": \"RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"type\": \"package\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/BouncyCastle.Crypto.dll\",\n        \"lib/net40/BouncyCastle.Crypto.xml\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.dll\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.xml\",\n        \"portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n        \"portable.bouncycastle.nuspec\"\n      ]\n    },\n    \"runtime.any.System.Collections/4.3.0\": {\n      \"sha512\": \"23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.collections/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Collections.dll\",\n        \"lib/netstandard1.3/System.Collections.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.collections.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.collections.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Diagnostics.Tracing/4.3.0\": {\n      \"sha512\": \"1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.diagnostics.tracing/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Diagnostics.Tracing.dll\",\n        \"lib/netstandard1.5/System.Diagnostics.Tracing.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.diagnostics.tracing.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Globalization/4.3.0\": {\n      \"sha512\": \"sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.globalization/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Globalization.dll\",\n        \"lib/netstandard1.3/System.Globalization.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.globalization.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.globalization.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.IO/4.3.0\": {\n      \"sha512\": \"SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.io/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.IO.dll\",\n        \"lib/netstandard1.5/System.IO.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.io.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.io.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Reflection/4.3.0\": {\n      \"sha512\": \"hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.reflection/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Reflection.dll\",\n        \"lib/netstandard1.5/System.Reflection.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.reflection.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.reflection.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Reflection.Primitives/4.3.0\": {\n      \"sha512\": \"Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.reflection.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Reflection.Primitives.dll\",\n        \"lib/netstandard1.3/System.Reflection.Primitives.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.reflection.primitives.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Resources.ResourceManager/4.3.0\": {\n      \"sha512\": \"Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.resources.resourcemanager/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Resources.ResourceManager.dll\",\n        \"lib/netstandard1.3/System.Resources.ResourceManager.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.resources.resourcemanager.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Runtime/4.3.0\": {\n      \"sha512\": \"fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.runtime/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Runtime.dll\",\n        \"lib/netstandard1.5/System.Runtime.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.runtime.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.runtime.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Runtime.Handles/4.3.0\": {\n      \"sha512\": \"GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.runtime.handles/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/_._\",\n        \"lib/netstandard1.3/System.Runtime.Handles.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.runtime.handles.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.runtime.handles.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Runtime.InteropServices/4.3.0\": {\n      \"sha512\": \"lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.runtime.interopservices/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Runtime.InteropServices.dll\",\n        \"lib/netstandard1.5/System.Runtime.InteropServices.dll\",\n        \"lib/netstandard1.6/System.Runtime.InteropServices.dll\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.runtime.interopservices.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Text.Encoding/4.3.0\": {\n      \"sha512\": \"+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.text.encoding/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Text.Encoding.dll\",\n        \"lib/netstandard1.3/System.Text.Encoding.dll\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.text.encoding.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.text.encoding.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Text.Encoding.Extensions/4.3.0\": {\n      \"sha512\": \"NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.text.encoding.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Text.Encoding.Extensions.dll\",\n        \"lib/netstandard1.3/System.Text.Encoding.Extensions.dll\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.text.encoding.extensions.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Threading.Tasks/4.3.0\": {\n      \"sha512\": \"OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.threading.tasks/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Threading.Tasks.dll\",\n        \"lib/netstandard1.3/System.Threading.Tasks.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.threading.tasks.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.threading.tasks.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/debian.8-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/fedora.23-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/fedora.24-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"sha512\": \"c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"runtime.native.system.4.3.0.nupkg.sha512\",\n        \"runtime.native.system.nuspec\"\n      ]\n    },\n    \"runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.native.system.security.cryptography.openssl.nuspec\"\n      ]\n    },\n    \"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/opensuse.13.2-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/opensuse.42.1-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/osx.10.10-x64/native/System.Security.Cryptography.Native.OpenSsl.dylib\"\n      ]\n    },\n    \"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/rhel.7-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/ubuntu.14.04-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/ubuntu.16.04-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0\": {\n      \"sha512\": \"VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n        \"runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.nuspec\",\n        \"runtimes/ubuntu.16.10-x64/native/System.Security.Cryptography.Native.OpenSsl.so\"\n      ]\n    },\n    \"runtime.unix.Microsoft.Win32.Primitives/4.3.0\": {\n      \"sha512\": \"2mI2Mfq+CVatgr4RWGvAWBjoCfUafy6VNFU7G9OA52DjO8x/okfIbsEq2UPgeGfdpO7X5gmPXKT8slx0tn0Mhw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.unix.microsoft.win32.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.unix.microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n        \"runtime.unix.microsoft.win32.primitives.nuspec\",\n        \"runtimes/unix/lib/netstandard1.3/Microsoft.Win32.Primitives.dll\"\n      ]\n    },\n    \"runtime.unix.System.Diagnostics.Debug/4.3.0\": {\n      \"sha512\": \"WV8KLRHWVUVUDduFnvGMHt0FsEt2wK6xPl1EgDKlaMx2KnZ43A/O0GzP8wIuvAC7mq4T9V1mm90r+PXkL9FPdQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.unix.system.diagnostics.debug/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.unix.system.diagnostics.debug.4.3.0.nupkg.sha512\",\n        \"runtime.unix.system.diagnostics.debug.nuspec\",\n        \"runtimes/unix/lib/netstandard1.3/System.Diagnostics.Debug.dll\"\n      ]\n    },\n    \"runtime.unix.System.IO.FileSystem/4.3.0\": {\n      \"sha512\": \"ajmTcjrqc3vgV1TH54DRioshbEniaFbOAJ0kReGuNsp9uIcqYle0RmUo6+Qlwqe3JIs4TDxgnqs3UzX3gRJ1rA==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.unix.system.io.filesystem/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.unix.system.io.filesystem.4.3.0.nupkg.sha512\",\n        \"runtime.unix.system.io.filesystem.nuspec\",\n        \"runtimes/unix/lib/netstandard1.3/System.IO.FileSystem.dll\"\n      ]\n    },\n    \"runtime.unix.System.Net.Primitives/4.3.0\": {\n      \"sha512\": \"AZcRXhH7Gamr+bckUfX3iHefPIrujJTt9XWQWo0elNiP1SNasX0KBWINZkDKY0GsOrsyJ7cB4MgIRTZzLlsTKg==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.unix.system.net.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.unix.system.net.primitives.4.3.0.nupkg.sha512\",\n        \"runtime.unix.system.net.primitives.nuspec\",\n        \"runtimes/unix/lib/netstandard1.3/System.Net.Primitives.dll\"\n      ]\n    },\n    \"runtime.unix.System.Net.Sockets/4.3.0\": {\n      \"sha512\": \"4NcLbqajFaD3PvhOdmbieeBlKY4d8/kBfgJ5g28n6k1jWEICabvLM62gvmUS/CvyfvcZxVanKPl+E9LhPzfXZw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.unix.system.net.sockets/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.unix.system.net.sockets.4.3.0.nupkg.sha512\",\n        \"runtime.unix.system.net.sockets.nuspec\",\n        \"runtimes/unix/lib/netstandard1.3/System.Net.Sockets.dll\"\n      ]\n    },\n    \"runtime.unix.System.Private.Uri/4.3.0\": {\n      \"sha512\": \"ooWzobr5RAq34r9uan1r/WPXJYG1XWy9KanrxNvEnBzbFdQbMG7Y3bVi4QxR7xZMNLOxLLTAyXvnSkfj5boZSg==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.unix.system.private.uri/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.unix.system.private.uri.4.3.0.nupkg.sha512\",\n        \"runtime.unix.system.private.uri.nuspec\",\n        \"runtimes/unix/lib/netstandard1.0/System.Private.Uri.dll\"\n      ]\n    },\n    \"runtime.unix.System.Runtime.Extensions/4.3.0\": {\n      \"sha512\": \"zQiTBVpiLftTQZW8GFsV0gjYikB1WMkEPIxF5O6RkUrSV/OgvRRTYgeFQha/0keBpuS0HYweraGRwhfhJ7dj7w==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.unix.system.runtime.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.unix.system.runtime.extensions.4.3.0.nupkg.sha512\",\n        \"runtime.unix.system.runtime.extensions.nuspec\",\n        \"runtimes/unix/lib/netstandard1.5/System.Runtime.Extensions.dll\"\n      ]\n    },\n    \"SixLabors.ImageSharp/1.0.0\": {\n      \"sha512\": \"8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==\",\n      \"type\": \"package\",\n      \"path\": \"sixlabors.imagesharp/1.0.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net472/SixLabors.ImageSharp.dll\",\n        \"lib/net472/SixLabors.ImageSharp.xml\",\n        \"lib/netcoreapp2.1/SixLabors.ImageSharp.dll\",\n        \"lib/netcoreapp2.1/SixLabors.ImageSharp.xml\",\n        \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\",\n        \"lib/netcoreapp3.1/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard1.3/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard1.3/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard2.0/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard2.0/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard2.1/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard2.1/SixLabors.ImageSharp.xml\",\n        \"sixlabors.imagesharp.1.0.0.nupkg.sha512\",\n        \"sixlabors.imagesharp.128.png\",\n        \"sixlabors.imagesharp.nuspec\"\n      ]\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"sha512\": \"Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"type\": \"package\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net46/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.0/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.1/Chaos.NaCl.dll\",\n        \"lib/netstandard1.1/Chaos.NaCl.dll\",\n        \"lib/netstandard2.0/Chaos.NaCl.dll\",\n        \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n        \"splamy.ed25519.toolkit.nuspec\"\n      ]\n    },\n    \"System.Buffers/4.5.0\": {\n      \"sha512\": \"pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==\",\n      \"type\": \"package\",\n      \"path\": \"system.buffers/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.1/System.Buffers.dll\",\n        \"lib/netstandard1.1/System.Buffers.xml\",\n        \"lib/netstandard2.0/System.Buffers.dll\",\n        \"lib/netstandard2.0/System.Buffers.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"ref/net45/System.Buffers.dll\",\n        \"ref/net45/System.Buffers.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.Buffers.dll\",\n        \"ref/netstandard1.1/System.Buffers.xml\",\n        \"ref/netstandard2.0/System.Buffers.dll\",\n        \"ref/netstandard2.0/System.Buffers.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"system.buffers.4.5.0.nupkg.sha512\",\n        \"system.buffers.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Collections/4.3.0\": {\n      \"sha512\": \"3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Collections.dll\",\n        \"ref/netcore50/System.Collections.xml\",\n        \"ref/netcore50/de/System.Collections.xml\",\n        \"ref/netcore50/es/System.Collections.xml\",\n        \"ref/netcore50/fr/System.Collections.xml\",\n        \"ref/netcore50/it/System.Collections.xml\",\n        \"ref/netcore50/ja/System.Collections.xml\",\n        \"ref/netcore50/ko/System.Collections.xml\",\n        \"ref/netcore50/ru/System.Collections.xml\",\n        \"ref/netcore50/zh-hans/System.Collections.xml\",\n        \"ref/netcore50/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.0/System.Collections.dll\",\n        \"ref/netstandard1.0/System.Collections.xml\",\n        \"ref/netstandard1.0/de/System.Collections.xml\",\n        \"ref/netstandard1.0/es/System.Collections.xml\",\n        \"ref/netstandard1.0/fr/System.Collections.xml\",\n        \"ref/netstandard1.0/it/System.Collections.xml\",\n        \"ref/netstandard1.0/ja/System.Collections.xml\",\n        \"ref/netstandard1.0/ko/System.Collections.xml\",\n        \"ref/netstandard1.0/ru/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.3/System.Collections.dll\",\n        \"ref/netstandard1.3/System.Collections.xml\",\n        \"ref/netstandard1.3/de/System.Collections.xml\",\n        \"ref/netstandard1.3/es/System.Collections.xml\",\n        \"ref/netstandard1.3/fr/System.Collections.xml\",\n        \"ref/netstandard1.3/it/System.Collections.xml\",\n        \"ref/netstandard1.3/ja/System.Collections.xml\",\n        \"ref/netstandard1.3/ko/System.Collections.xml\",\n        \"ref/netstandard1.3/ru/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Collections.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.collections.4.3.0.nupkg.sha512\",\n        \"system.collections.nuspec\"\n      ]\n    },\n    \"System.Collections.Immutable/1.5.0\": {\n      \"sha512\": \"EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections.immutable/1.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/System.Collections.Immutable.dll\",\n        \"lib/netstandard1.0/System.Collections.Immutable.xml\",\n        \"lib/netstandard1.3/System.Collections.Immutable.dll\",\n        \"lib/netstandard1.3/System.Collections.Immutable.xml\",\n        \"lib/netstandard2.0/System.Collections.Immutable.dll\",\n        \"lib/netstandard2.0/System.Collections.Immutable.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml\",\n        \"system.collections.immutable.1.5.0.nupkg.sha512\",\n        \"system.collections.immutable.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.ComponentModel.Annotations/4.5.0\": {\n      \"sha512\": \"UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==\",\n      \"type\": \"package\",\n      \"path\": \"system.componentmodel.annotations/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net461/System.ComponentModel.Annotations.dll\",\n        \"lib/netcore50/System.ComponentModel.Annotations.dll\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.4/System.ComponentModel.Annotations.dll\",\n        \"lib/netstandard2.0/System.ComponentModel.Annotations.dll\",\n        \"lib/portable-net45+win8/_._\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/win8/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net461/System.ComponentModel.Annotations.dll\",\n        \"ref/net461/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/System.ComponentModel.Annotations.dll\",\n        \"ref/netcore50/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.1/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.3/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.4/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard2.0/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard2.0/System.ComponentModel.Annotations.xml\",\n        \"ref/portable-net45+win8/_._\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/win8/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.componentmodel.annotations.4.5.0.nupkg.sha512\",\n        \"system.componentmodel.annotations.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"sha512\": \"ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Diagnostics.Debug.dll\",\n        \"ref/netcore50/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.debug.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.debug.nuspec\"\n      ]\n    },\n    \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n      \"sha512\": \"eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.diagnosticsource/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net45/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/net45/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/net46/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/net46/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml\",\n        \"system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\",\n        \"system.diagnostics.diagnosticsource.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"sha512\": \"rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Diagnostics.Tracing.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.tracing.nuspec\"\n      ]\n    },\n    \"System.Globalization/4.3.0\": {\n      \"sha512\": \"kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"type\": \"package\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Globalization.dll\",\n        \"ref/netcore50/System.Globalization.xml\",\n        \"ref/netcore50/de/System.Globalization.xml\",\n        \"ref/netcore50/es/System.Globalization.xml\",\n        \"ref/netcore50/fr/System.Globalization.xml\",\n        \"ref/netcore50/it/System.Globalization.xml\",\n        \"ref/netcore50/ja/System.Globalization.xml\",\n        \"ref/netcore50/ko/System.Globalization.xml\",\n        \"ref/netcore50/ru/System.Globalization.xml\",\n        \"ref/netcore50/zh-hans/System.Globalization.xml\",\n        \"ref/netcore50/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.0/System.Globalization.dll\",\n        \"ref/netstandard1.0/System.Globalization.xml\",\n        \"ref/netstandard1.0/de/System.Globalization.xml\",\n        \"ref/netstandard1.0/es/System.Globalization.xml\",\n        \"ref/netstandard1.0/fr/System.Globalization.xml\",\n        \"ref/netstandard1.0/it/System.Globalization.xml\",\n        \"ref/netstandard1.0/ja/System.Globalization.xml\",\n        \"ref/netstandard1.0/ko/System.Globalization.xml\",\n        \"ref/netstandard1.0/ru/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.3/System.Globalization.dll\",\n        \"ref/netstandard1.3/System.Globalization.xml\",\n        \"ref/netstandard1.3/de/System.Globalization.xml\",\n        \"ref/netstandard1.3/es/System.Globalization.xml\",\n        \"ref/netstandard1.3/fr/System.Globalization.xml\",\n        \"ref/netstandard1.3/it/System.Globalization.xml\",\n        \"ref/netstandard1.3/ja/System.Globalization.xml\",\n        \"ref/netstandard1.3/ko/System.Globalization.xml\",\n        \"ref/netstandard1.3/ru/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Globalization.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.globalization.4.3.0.nupkg.sha512\",\n        \"system.globalization.nuspec\"\n      ]\n    },\n    \"System.IO/4.3.0\": {\n      \"sha512\": \"3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"type\": \"package\",\n      \"path\": \"system.io/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.IO.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.IO.dll\",\n        \"ref/netcore50/System.IO.dll\",\n        \"ref/netcore50/System.IO.xml\",\n        \"ref/netcore50/de/System.IO.xml\",\n        \"ref/netcore50/es/System.IO.xml\",\n        \"ref/netcore50/fr/System.IO.xml\",\n        \"ref/netcore50/it/System.IO.xml\",\n        \"ref/netcore50/ja/System.IO.xml\",\n        \"ref/netcore50/ko/System.IO.xml\",\n        \"ref/netcore50/ru/System.IO.xml\",\n        \"ref/netcore50/zh-hans/System.IO.xml\",\n        \"ref/netcore50/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.0/System.IO.dll\",\n        \"ref/netstandard1.0/System.IO.xml\",\n        \"ref/netstandard1.0/de/System.IO.xml\",\n        \"ref/netstandard1.0/es/System.IO.xml\",\n        \"ref/netstandard1.0/fr/System.IO.xml\",\n        \"ref/netstandard1.0/it/System.IO.xml\",\n        \"ref/netstandard1.0/ja/System.IO.xml\",\n        \"ref/netstandard1.0/ko/System.IO.xml\",\n        \"ref/netstandard1.0/ru/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.3/System.IO.dll\",\n        \"ref/netstandard1.3/System.IO.xml\",\n        \"ref/netstandard1.3/de/System.IO.xml\",\n        \"ref/netstandard1.3/es/System.IO.xml\",\n        \"ref/netstandard1.3/fr/System.IO.xml\",\n        \"ref/netstandard1.3/it/System.IO.xml\",\n        \"ref/netstandard1.3/ja/System.IO.xml\",\n        \"ref/netstandard1.3/ko/System.IO.xml\",\n        \"ref/netstandard1.3/ru/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.5/System.IO.dll\",\n        \"ref/netstandard1.5/System.IO.xml\",\n        \"ref/netstandard1.5/de/System.IO.xml\",\n        \"ref/netstandard1.5/es/System.IO.xml\",\n        \"ref/netstandard1.5/fr/System.IO.xml\",\n        \"ref/netstandard1.5/it/System.IO.xml\",\n        \"ref/netstandard1.5/ja/System.IO.xml\",\n        \"ref/netstandard1.5/ko/System.IO.xml\",\n        \"ref/netstandard1.5/ru/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hant/System.IO.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.4.3.0.nupkg.sha512\",\n        \"system.io.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"sha512\": \"3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"sha512\": \"6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.Primitives.dll\",\n        \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.primitives.nuspec\"\n      ]\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"sha512\": \"rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.IO.Pipelines.dll\",\n        \"lib/net461/System.IO.Pipelines.xml\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.dll\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.xml\",\n        \"lib/netstandard1.3/System.IO.Pipelines.dll\",\n        \"lib/netstandard1.3/System.IO.Pipelines.xml\",\n        \"lib/netstandard2.0/System.IO.Pipelines.dll\",\n        \"lib/netstandard2.0/System.IO.Pipelines.xml\",\n        \"ref/net461/System.IO.Pipelines.dll\",\n        \"ref/net461/System.IO.Pipelines.xml\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.dll\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.xml\",\n        \"system.io.pipelines.4.7.2.nupkg.sha512\",\n        \"system.io.pipelines.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Linq/4.3.0\": {\n      \"sha512\": \"5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"type\": \"package\",\n      \"path\": \"system.linq/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net463/System.Linq.dll\",\n        \"lib/netcore50/System.Linq.dll\",\n        \"lib/netstandard1.6/System.Linq.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net463/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.xml\",\n        \"ref/netcore50/de/System.Linq.xml\",\n        \"ref/netcore50/es/System.Linq.xml\",\n        \"ref/netcore50/fr/System.Linq.xml\",\n        \"ref/netcore50/it/System.Linq.xml\",\n        \"ref/netcore50/ja/System.Linq.xml\",\n        \"ref/netcore50/ko/System.Linq.xml\",\n        \"ref/netcore50/ru/System.Linq.xml\",\n        \"ref/netcore50/zh-hans/System.Linq.xml\",\n        \"ref/netcore50/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.0/System.Linq.dll\",\n        \"ref/netstandard1.0/System.Linq.xml\",\n        \"ref/netstandard1.0/de/System.Linq.xml\",\n        \"ref/netstandard1.0/es/System.Linq.xml\",\n        \"ref/netstandard1.0/fr/System.Linq.xml\",\n        \"ref/netstandard1.0/it/System.Linq.xml\",\n        \"ref/netstandard1.0/ja/System.Linq.xml\",\n        \"ref/netstandard1.0/ko/System.Linq.xml\",\n        \"ref/netstandard1.0/ru/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.6/System.Linq.dll\",\n        \"ref/netstandard1.6/System.Linq.xml\",\n        \"ref/netstandard1.6/de/System.Linq.xml\",\n        \"ref/netstandard1.6/es/System.Linq.xml\",\n        \"ref/netstandard1.6/fr/System.Linq.xml\",\n        \"ref/netstandard1.6/it/System.Linq.xml\",\n        \"ref/netstandard1.6/ja/System.Linq.xml\",\n        \"ref/netstandard1.6/ko/System.Linq.xml\",\n        \"ref/netstandard1.6/ru/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hant/System.Linq.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.linq.4.3.0.nupkg.sha512\",\n        \"system.linq.nuspec\"\n      ]\n    },\n    \"System.Memory/4.5.4\": {\n      \"sha512\": \"1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"type\": \"package\",\n      \"path\": \"system.memory/4.5.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.Memory.dll\",\n        \"lib/net461/System.Memory.xml\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.1/System.Memory.dll\",\n        \"lib/netstandard1.1/System.Memory.xml\",\n        \"lib/netstandard2.0/System.Memory.dll\",\n        \"lib/netstandard2.0/System.Memory.xml\",\n        \"ref/netcoreapp2.1/_._\",\n        \"system.memory.4.5.4.nupkg.sha512\",\n        \"system.memory.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Net.NameResolution/4.3.0\": {\n      \"sha512\": \"AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.nameresolution/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Net.NameResolution.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Net.NameResolution.dll\",\n        \"ref/netstandard1.3/System.Net.NameResolution.dll\",\n        \"ref/netstandard1.3/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/de/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/es/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/fr/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/it/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/ja/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/ko/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/ru/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.NameResolution.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/unix/lib/netstandard1.3/System.Net.NameResolution.dll\",\n        \"runtimes/win/lib/net46/System.Net.NameResolution.dll\",\n        \"runtimes/win/lib/netcore50/System.Net.NameResolution.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.NameResolution.dll\",\n        \"system.net.nameresolution.4.3.0.nupkg.sha512\",\n        \"system.net.nameresolution.nuspec\"\n      ]\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"sha512\": \"zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net46/System.Net.NetworkInformation.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net46/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/de/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/es/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/it/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/net46/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"system.net.networkinformation.4.3.0.nupkg.sha512\",\n        \"system.net.networkinformation.nuspec\"\n      ]\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"sha512\": \"qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Net.Primitives.dll\",\n        \"ref/netcore50/System.Net.Primitives.xml\",\n        \"ref/netcore50/de/System.Net.Primitives.xml\",\n        \"ref/netcore50/es/System.Net.Primitives.xml\",\n        \"ref/netcore50/fr/System.Net.Primitives.xml\",\n        \"ref/netcore50/it/System.Net.Primitives.xml\",\n        \"ref/netcore50/ja/System.Net.Primitives.xml\",\n        \"ref/netcore50/ko/System.Net.Primitives.xml\",\n        \"ref/netcore50/ru/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/System.Net.Primitives.dll\",\n        \"ref/netstandard1.0/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/System.Net.Primitives.dll\",\n        \"ref/netstandard1.1/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/System.Net.Primitives.dll\",\n        \"ref/netstandard1.3/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.primitives.4.3.0.nupkg.sha512\",\n        \"system.net.primitives.nuspec\"\n      ]\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"sha512\": \"m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Net.Sockets.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/de/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/es/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/it/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Sockets.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.sockets.4.3.0.nupkg.sha512\",\n        \"system.net.sockets.nuspec\"\n      ]\n    },\n    \"System.Numerics.Vectors/4.5.0\": {\n      \"sha512\": \"QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.numerics.vectors/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Numerics.Vectors.dll\",\n        \"lib/net46/System.Numerics.Vectors.xml\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/System.Numerics.Vectors.dll\",\n        \"ref/net45/System.Numerics.Vectors.xml\",\n        \"ref/net46/System.Numerics.Vectors.dll\",\n        \"ref/net46/System.Numerics.Vectors.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.numerics.vectors.4.5.0.nupkg.sha512\",\n        \"system.numerics.vectors.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Private.Uri/4.3.0\": {\n      \"sha512\": \"I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==\",\n      \"type\": \"package\",\n      \"path\": \"system.private.uri/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"system.private.uri.4.3.0.nupkg.sha512\",\n        \"system.private.uri.nuspec\"\n      ]\n    },\n    \"System.Reflection/4.3.0\": {\n      \"sha512\": \"KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Reflection.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.xml\",\n        \"ref/netcore50/de/System.Reflection.xml\",\n        \"ref/netcore50/es/System.Reflection.xml\",\n        \"ref/netcore50/fr/System.Reflection.xml\",\n        \"ref/netcore50/it/System.Reflection.xml\",\n        \"ref/netcore50/ja/System.Reflection.xml\",\n        \"ref/netcore50/ko/System.Reflection.xml\",\n        \"ref/netcore50/ru/System.Reflection.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.0/System.Reflection.dll\",\n        \"ref/netstandard1.0/System.Reflection.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.3/System.Reflection.dll\",\n        \"ref/netstandard1.3/System.Reflection.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.5/System.Reflection.dll\",\n        \"ref/netstandard1.5/System.Reflection.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.4.3.0.nupkg.sha512\",\n        \"system.reflection.nuspec\"\n      ]\n    },\n    \"System.Reflection.Metadata/1.6.0\": {\n      \"sha512\": \"COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.metadata/1.6.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.1/System.Reflection.Metadata.dll\",\n        \"lib/netstandard1.1/System.Reflection.Metadata.xml\",\n        \"lib/netstandard2.0/System.Reflection.Metadata.dll\",\n        \"lib/netstandard2.0/System.Reflection.Metadata.xml\",\n        \"lib/portable-net45+win8/System.Reflection.Metadata.dll\",\n        \"lib/portable-net45+win8/System.Reflection.Metadata.xml\",\n        \"system.reflection.metadata.1.6.0.nupkg.sha512\",\n        \"system.reflection.metadata.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"sha512\": \"5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Reflection.Primitives.dll\",\n        \"ref/netcore50/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/de/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/es/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/fr/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/it/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ja/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ko/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ru/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.dll\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.primitives.4.3.0.nupkg.sha512\",\n        \"system.reflection.primitives.nuspec\"\n      ]\n    },\n    \"System.Reflection.TypeExtensions/4.3.0\": {\n      \"sha512\": \"7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.typeextensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Reflection.TypeExtensions.dll\",\n        \"lib/net462/System.Reflection.TypeExtensions.dll\",\n        \"lib/netcore50/System.Reflection.TypeExtensions.dll\",\n        \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Reflection.TypeExtensions.dll\",\n        \"ref/net462/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.3/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.3/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.5/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll\",\n        \"system.reflection.typeextensions.4.3.0.nupkg.sha512\",\n        \"system.reflection.typeextensions.nuspec\"\n      ]\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"sha512\": \"/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"type\": \"package\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Resources.ResourceManager.dll\",\n        \"ref/netcore50/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/de/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/es/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/it/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.dll\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/de/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/es/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/it/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n        \"system.resources.resourcemanager.nuspec\"\n      ]\n    },\n    \"System.Runtime/4.3.0\": {\n      \"sha512\": \"JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.dll\",\n        \"lib/portable-net45+win8+wp80+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.xml\",\n        \"ref/netcore50/de/System.Runtime.xml\",\n        \"ref/netcore50/es/System.Runtime.xml\",\n        \"ref/netcore50/fr/System.Runtime.xml\",\n        \"ref/netcore50/it/System.Runtime.xml\",\n        \"ref/netcore50/ja/System.Runtime.xml\",\n        \"ref/netcore50/ko/System.Runtime.xml\",\n        \"ref/netcore50/ru/System.Runtime.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.0/System.Runtime.dll\",\n        \"ref/netstandard1.0/System.Runtime.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.2/System.Runtime.dll\",\n        \"ref/netstandard1.2/System.Runtime.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.3/System.Runtime.dll\",\n        \"ref/netstandard1.3/System.Runtime.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.5/System.Runtime.dll\",\n        \"ref/netstandard1.5/System.Runtime.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.xml\",\n        \"ref/portable-net45+win8+wp80+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.4.3.0.nupkg.sha512\",\n        \"system.runtime.nuspec\"\n      ]\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n      \"sha512\": \"IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\",\n        \"system.runtime.compilerservices.unsafe.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"sha512\": \"guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/de/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/es/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/fr/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/it/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ja/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ko/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ru/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.extensions.4.3.0.nupkg.sha512\",\n        \"system.runtime.extensions.nuspec\"\n      ]\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"sha512\": \"OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/_._\",\n        \"ref/netstandard1.3/System.Runtime.Handles.dll\",\n        \"ref/netstandard1.3/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.handles.4.3.0.nupkg.sha512\",\n        \"system.runtime.handles.nuspec\"\n      ]\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"sha512\": \"uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.InteropServices.dll\",\n        \"lib/net463/System.Runtime.InteropServices.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.InteropServices.dll\",\n        \"ref/net463/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/de/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/es/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/it/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netcoreapp1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.interopservices.4.3.0.nupkg.sha512\",\n        \"system.runtime.interopservices.nuspec\"\n      ]\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"sha512\": \"P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Claims.dll\",\n        \"lib/netstandard1.3/System.Security.Claims.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/de/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/es/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/it/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Claims.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.claims.4.3.0.nupkg.sha512\",\n        \"system.security.claims.nuspec\"\n      ]\n    },\n    \"System.Security.Cryptography.Cng/4.5.0\": {\n      \"sha512\": \"WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.cryptography.cng/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Cryptography.Cng.dll\",\n        \"lib/net461/System.Security.Cryptography.Cng.dll\",\n        \"lib/net462/System.Security.Cryptography.Cng.dll\",\n        \"lib/net47/System.Security.Cryptography.Cng.dll\",\n        \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.3/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard2.0/System.Security.Cryptography.Cng.dll\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Cryptography.Cng.dll\",\n        \"ref/net461/System.Security.Cryptography.Cng.dll\",\n        \"ref/net461/System.Security.Cryptography.Cng.xml\",\n        \"ref/net462/System.Security.Cryptography.Cng.dll\",\n        \"ref/net462/System.Security.Cryptography.Cng.xml\",\n        \"ref/net47/System.Security.Cryptography.Cng.dll\",\n        \"ref/net47/System.Security.Cryptography.Cng.xml\",\n        \"ref/netcoreapp2.0/System.Security.Cryptography.Cng.dll\",\n        \"ref/netcoreapp2.0/System.Security.Cryptography.Cng.xml\",\n        \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.xml\",\n        \"ref/netstandard1.3/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard2.0/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard2.0/System.Security.Cryptography.Cng.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net47/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netcoreapp2.0/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/uap10.0.16299/_._\",\n        \"system.security.cryptography.cng.4.5.0.nupkg.sha512\",\n        \"system.security.cryptography.cng.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"sha512\": \"I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Security.Principal.dll\",\n        \"lib/netstandard1.0/System.Security.Principal.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Security.Principal.dll\",\n        \"ref/netcore50/System.Security.Principal.xml\",\n        \"ref/netcore50/de/System.Security.Principal.xml\",\n        \"ref/netcore50/es/System.Security.Principal.xml\",\n        \"ref/netcore50/fr/System.Security.Principal.xml\",\n        \"ref/netcore50/it/System.Security.Principal.xml\",\n        \"ref/netcore50/ja/System.Security.Principal.xml\",\n        \"ref/netcore50/ko/System.Security.Principal.xml\",\n        \"ref/netcore50/ru/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hans/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hant/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/System.Security.Principal.dll\",\n        \"ref/netstandard1.0/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/de/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/es/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/fr/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/it/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ja/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ko/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ru/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Security.Principal.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.principal.4.3.0.nupkg.sha512\",\n        \"system.security.principal.nuspec\"\n      ]\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"sha512\": \"HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Security.Principal.Windows.dll\",\n        \"ref/net46/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/de/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/es/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/it/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/net46/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"system.security.principal.windows.4.3.0.nupkg.sha512\",\n        \"system.security.principal.windows.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"sha512\": \"BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Text.Encoding.dll\",\n        \"ref/netcore50/System.Text.Encoding.xml\",\n        \"ref/netcore50/de/System.Text.Encoding.xml\",\n        \"ref/netcore50/es/System.Text.Encoding.xml\",\n        \"ref/netcore50/fr/System.Text.Encoding.xml\",\n        \"ref/netcore50/it/System.Text.Encoding.xml\",\n        \"ref/netcore50/ja/System.Text.Encoding.xml\",\n        \"ref/netcore50/ko/System.Text.Encoding.xml\",\n        \"ref/netcore50/ru/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/System.Text.Encoding.dll\",\n        \"ref/netstandard1.0/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/System.Text.Encoding.dll\",\n        \"ref/netstandard1.3/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Text.Encoding.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.text.encoding.4.3.0.nupkg.sha512\",\n        \"system.text.encoding.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding.CodePages/4.5.1\": {\n      \"sha512\": \"4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding.codepages/4.5.1\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Text.Encoding.CodePages.dll\",\n        \"lib/net461/System.Text.Encoding.CodePages.dll\",\n        \"lib/netstandard1.3/System.Text.Encoding.CodePages.dll\",\n        \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/win/lib/net461/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netstandard2.0/System.Text.Encoding.CodePages.dll\",\n        \"system.text.encoding.codepages.4.5.1.nupkg.sha512\",\n        \"system.text.encoding.codepages.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Text.Encoding.Extensions/4.3.0\": {\n      \"sha512\": \"YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Text.Encoding.Extensions.dll\",\n        \"ref/netcore50/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/de/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/es/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/fr/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/it/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/ja/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/ko/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/ru/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/System.Text.Encoding.Extensions.dll\",\n        \"ref/netstandard1.0/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/System.Text.Encoding.Extensions.dll\",\n        \"ref/netstandard1.3/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.text.encoding.extensions.4.3.0.nupkg.sha512\",\n        \"system.text.encoding.extensions.nuspec\"\n      ]\n    },\n    \"System.Text.Encodings.Web/4.5.0\": {\n      \"sha512\": \"Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encodings.web/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/System.Text.Encodings.Web.dll\",\n        \"lib/netstandard1.0/System.Text.Encodings.Web.xml\",\n        \"lib/netstandard2.0/System.Text.Encodings.Web.dll\",\n        \"lib/netstandard2.0/System.Text.Encodings.Web.xml\",\n        \"system.text.encodings.web.4.5.0.nupkg.sha512\",\n        \"system.text.encodings.web.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading/4.3.0\": {\n      \"sha512\": \"VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Threading.dll\",\n        \"lib/netstandard1.3/System.Threading.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.dll\",\n        \"ref/netcore50/System.Threading.xml\",\n        \"ref/netcore50/de/System.Threading.xml\",\n        \"ref/netcore50/es/System.Threading.xml\",\n        \"ref/netcore50/fr/System.Threading.xml\",\n        \"ref/netcore50/it/System.Threading.xml\",\n        \"ref/netcore50/ja/System.Threading.xml\",\n        \"ref/netcore50/ko/System.Threading.xml\",\n        \"ref/netcore50/ru/System.Threading.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.0/System.Threading.dll\",\n        \"ref/netstandard1.0/System.Threading.xml\",\n        \"ref/netstandard1.0/de/System.Threading.xml\",\n        \"ref/netstandard1.0/es/System.Threading.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.xml\",\n        \"ref/netstandard1.0/it/System.Threading.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.3/System.Threading.dll\",\n        \"ref/netstandard1.3/System.Threading.xml\",\n        \"ref/netstandard1.3/de/System.Threading.xml\",\n        \"ref/netstandard1.3/es/System.Threading.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.xml\",\n        \"ref/netstandard1.3/it/System.Threading.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Threading.dll\",\n        \"system.threading.4.3.0.nupkg.sha512\",\n        \"system.threading.nuspec\"\n      ]\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"sha512\": \"m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Threading.Overlapped.dll\",\n        \"ref/net46/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/net46/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netcore50/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"system.threading.overlapped.4.3.0.nupkg.sha512\",\n        \"system.threading.overlapped.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"sha512\": \"LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.Tasks.dll\",\n        \"ref/netcore50/System.Threading.Tasks.xml\",\n        \"ref/netcore50/de/System.Threading.Tasks.xml\",\n        \"ref/netcore50/es/System.Threading.Tasks.xml\",\n        \"ref/netcore50/fr/System.Threading.Tasks.xml\",\n        \"ref/netcore50/it/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ja/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ko/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ru/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.0/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.3/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.4.3.0.nupkg.sha512\",\n        \"system.threading.tasks.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks.Extensions/4.5.3\": {\n      \"sha512\": \"+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks.extensions/4.5.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/netcoreapp2.1/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.extensions.4.5.3.nupkg.sha512\",\n        \"system.threading.tasks.extensions.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"sha512\": \"OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.Thread.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.Thread.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Thread.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.thread.4.3.0.nupkg.sha512\",\n        \"system.threading.thread.nuspec\"\n      ]\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"sha512\": \"k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.ThreadPool.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/de/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/es/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/it/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.threadpool.4.3.0.nupkg.sha512\",\n        \"system.threading.threadpool.nuspec\"\n      ]\n    },\n    \"Splamy.TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"path\": \"../TSLib/TSLib.csproj\",\n      \"msbuildProject\": \"../TSLib/TSLib.csproj\"\n    }\n  },\n  \"projectFileDependencyGroups\": {\n    \".NETCoreApp,Version=v3.1\": [\n      \"CliWrap >= 3.1.0\",\n      \"CommandLineParser >= 2.8.0\",\n      \"LiteDB >= 4.1.4\",\n      \"Microsoft.AspNetCore.Cors >= 2.2.0\",\n      \"Microsoft.AspNetCore.Server.Kestrel >= 2.2.0\",\n      \"Microsoft.AspNetCore.StaticFiles >= 2.2.0\",\n      \"Microsoft.CodeAnalysis.CSharp >= 3.7.0\",\n      \"NLog >= 4.7.3\",\n      \"Nett >= 0.15.0\",\n      \"Newtonsoft.Json >= 12.0.3\",\n      \"PlaylistsNET >= 1.1.2\",\n      \"SixLabors.ImageSharp >= 1.0.0\",\n      \"Splamy.TSLib >= 1.1.0\"\n    ]\n  },\n  \"packageFolders\": {\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\\": {},\n    \"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\Shared\\\\NuGetPackages\": {}\n  },\n  \"project\": {\n    \"version\": \"1.0.0\",\n    \"restore\": {\n      \"projectUniqueName\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n      \"projectName\": \"TS3AudioBot\",\n      \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n      \"packagesPath\": \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\\",\n      \"outputPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\obj\\\\publish\\\\linux-x64\\\\\",\n      \"projectStyle\": \"PackageReference\",\n      \"fallbackFolders\": [\n        \"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\Shared\\\\NuGetPackages\"\n      ],\n      \"configFilePaths\": [\n        \"C:\\\\Users\\\\13336\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n        \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.FallbackLocation.config\",\n        \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n      ],\n      \"originalTargetFrameworks\": [\n        \"netcoreapp3.1\"\n      ],\n      \"sources\": {\n        \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n        \"https://api.nuget.org/v3/index.json\": {}\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"projectReferences\": {\n            \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n              \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n            }\n          }\n        }\n      },\n      \"warningProperties\": {\n        \"warnAsError\": [\n          \"NU1605\"\n        ]\n      }\n    },\n    \"frameworks\": {\n      \"netcoreapp3.1\": {\n        \"targetAlias\": \"netcoreapp3.1\",\n        \"dependencies\": {\n          \"CliWrap\": {\n            \"target\": \"Package\",\n            \"version\": \"[3.1.0, )\"\n          },\n          \"CommandLineParser\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.8.0, )\"\n          },\n          \"LiteDB\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.1.4, )\"\n          },\n          \"Microsoft.AspNetCore.Cors\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.AspNetCore.Server.Kestrel\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.AspNetCore.StaticFiles\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.CodeAnalysis.CSharp\": {\n            \"include\": \"Runtime, Compile, Build, Native, ContentFiles, BuildTransitive\",\n            \"target\": \"Package\",\n            \"version\": \"[3.7.0, )\"\n          },\n          \"NLog\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.3, )\"\n          },\n          \"Nett\": {\n            \"target\": \"Package\",\n            \"version\": \"[0.15.0, )\"\n          },\n          \"Newtonsoft.Json\": {\n            \"target\": \"Package\",\n            \"version\": \"[12.0.3, )\"\n          },\n          \"PlaylistsNET\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.1.2, )\"\n          },\n          \"SixLabors.ImageSharp\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.0.0, )\"\n          }\n        },\n        \"imports\": [\n          \"net461\",\n          \"net462\",\n          \"net47\",\n          \"net471\",\n          \"net472\",\n          \"net48\",\n          \"net481\"\n        ],\n        \"assetTargetFallback\": true,\n        \"warn\": true,\n        \"downloadDependencies\": [\n          {\n            \"name\": \"Microsoft.AspNetCore.App.Ref\",\n            \"version\": \"[3.1.10, 3.1.10]\"\n          },\n          {\n            \"name\": \"Microsoft.AspNetCore.App.Runtime.linux-x64\",\n            \"version\": \"[3.1.32, 3.1.32]\"\n          },\n          {\n            \"name\": \"Microsoft.NETCore.App.Host.linux-x64\",\n            \"version\": \"[3.1.32, 3.1.32]\"\n          },\n          {\n            \"name\": \"Microsoft.NETCore.App.Ref\",\n            \"version\": \"[3.1.0, 3.1.0]\"\n          },\n          {\n            \"name\": \"Microsoft.NETCore.App.Runtime.linux-x64\",\n            \"version\": \"[3.1.32, 3.1.32]\"\n          },\n          {\n            \"name\": \"Microsoft.WindowsDesktop.App.Ref\",\n            \"version\": \"[3.1.0, 3.1.0]\"\n          }\n        ],\n        \"frameworkReferences\": {\n          \"Microsoft.NETCore.App\": {\n            \"privateAssets\": \"all\"\n          }\n        },\n        \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n      }\n    },\n    \"runtimes\": {\n      \"linux-x64\": {\n        \"#import\": []\n      }\n    }\n  }\n}"
  },
  {
    "path": "TS3AudioBot/obj/publish/linux-x64/project.nuget.cache",
    "content": "{\n  \"version\": 2,\n  \"dgSpecHash\": \"feDkyr6+p4BNPXLHgdp0NSpZnATQp0QhkuyK6wp9pLOhaMzgeOkgcKblcwInM4z3gjlwrMHRQGd1OQ8iAFDEwg==\",\n  \"success\": true,\n  \"projectFilePath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n  \"expectedPackageFiles\": [\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\cliwrap\\\\3.1.0\\\\cliwrap.3.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\commandlineparser\\\\2.8.0\\\\commandlineparser.2.8.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\heijden.dns.portable\\\\2.0.19\\\\heijden.dns.portable.2.0.19.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\litedb\\\\4.1.4\\\\litedb.4.1.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.connections.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.cors\\\\2.2.0\\\\microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting\\\\2.2.0\\\\microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting.server.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http\\\\2.2.0\\\\microsoft.aspnetcore.http.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.extensions\\\\2.2.0\\\\microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.features\\\\2.2.0\\\\microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.core\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.https\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.transport.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.transport.sockets\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.staticfiles\\\\2.2.0\\\\microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.webutilities\\\\2.2.0\\\\microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.analyzers\\\\3.0.0\\\\microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.common\\\\3.7.0\\\\microsoft.codeanalysis.common.3.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.csharp\\\\3.7.0\\\\microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration\\\\2.2.0\\\\microsoft.extensions.configuration.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.abstractions\\\\2.2.0\\\\microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.binder\\\\2.2.0\\\\microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.environmentvariables\\\\2.2.0\\\\microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.fileextensions\\\\2.2.0\\\\microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.dependencyinjection\\\\2.2.0\\\\microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.dependencyinjection.abstractions\\\\2.2.0\\\\microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.fileproviders.abstractions\\\\2.2.0\\\\microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.fileproviders.physical\\\\2.2.0\\\\microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.filesystemglobbing\\\\2.2.0\\\\microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.hosting.abstractions\\\\2.2.0\\\\microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.logging\\\\2.2.0\\\\microsoft.extensions.logging.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.logging.abstractions\\\\2.2.0\\\\microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.objectpool\\\\2.2.0\\\\microsoft.extensions.objectpool.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.options\\\\2.2.0\\\\microsoft.extensions.options.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.primitives\\\\2.2.0\\\\microsoft.extensions.primitives.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.webencoders\\\\2.2.0\\\\microsoft.extensions.webencoders.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.net.http.headers\\\\2.2.0\\\\microsoft.net.http.headers.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.platforms\\\\2.1.2\\\\microsoft.netcore.platforms.2.1.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.targets\\\\1.1.0\\\\microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.win32.primitives\\\\4.3.0\\\\microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\nett\\\\0.15.0\\\\nett.0.15.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\newtonsoft.json\\\\12.0.3\\\\newtonsoft.json.12.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\nlog\\\\4.7.3\\\\nlog.4.7.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\playlistsnet\\\\1.1.2\\\\playlistsnet.1.1.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\portable.bouncycastle\\\\1.8.6.7\\\\portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.collections\\\\4.3.0\\\\runtime.any.system.collections.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.diagnostics.tracing\\\\4.3.0\\\\runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.globalization\\\\4.3.0\\\\runtime.any.system.globalization.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.io\\\\4.3.0\\\\runtime.any.system.io.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.reflection\\\\4.3.0\\\\runtime.any.system.reflection.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.reflection.primitives\\\\4.3.0\\\\runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.resources.resourcemanager\\\\4.3.0\\\\runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.runtime\\\\4.3.0\\\\runtime.any.system.runtime.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.runtime.handles\\\\4.3.0\\\\runtime.any.system.runtime.handles.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.runtime.interopservices\\\\4.3.0\\\\runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.text.encoding\\\\4.3.0\\\\runtime.any.system.text.encoding.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.text.encoding.extensions\\\\4.3.0\\\\runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.threading.tasks\\\\4.3.0\\\\runtime.any.system.threading.tasks.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.native.system\\\\4.3.0\\\\runtime.native.system.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl\\\\4.3.0\\\\runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.unix.microsoft.win32.primitives\\\\4.3.0\\\\runtime.unix.microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.unix.system.diagnostics.debug\\\\4.3.0\\\\runtime.unix.system.diagnostics.debug.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.unix.system.io.filesystem\\\\4.3.0\\\\runtime.unix.system.io.filesystem.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.unix.system.net.primitives\\\\4.3.0\\\\runtime.unix.system.net.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.unix.system.net.sockets\\\\4.3.0\\\\runtime.unix.system.net.sockets.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.unix.system.private.uri\\\\4.3.0\\\\runtime.unix.system.private.uri.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.unix.system.runtime.extensions\\\\4.3.0\\\\runtime.unix.system.runtime.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\sixlabors.imagesharp\\\\1.0.0\\\\sixlabors.imagesharp.1.0.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\splamy.ed25519.toolkit\\\\1.0.3\\\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.buffers\\\\4.5.0\\\\system.buffers.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.collections\\\\4.3.0\\\\system.collections.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.collections.immutable\\\\1.5.0\\\\system.collections.immutable.1.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.componentmodel.annotations\\\\4.5.0\\\\system.componentmodel.annotations.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.diagnostics.debug\\\\4.3.0\\\\system.diagnostics.debug.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.diagnostics.diagnosticsource\\\\4.5.0\\\\system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.diagnostics.tracing\\\\4.3.0\\\\system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.globalization\\\\4.3.0\\\\system.globalization.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.io\\\\4.3.0\\\\system.io.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.io.filesystem\\\\4.3.0\\\\system.io.filesystem.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.io.filesystem.primitives\\\\4.3.0\\\\system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.io.pipelines\\\\4.7.2\\\\system.io.pipelines.4.7.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.linq\\\\4.3.0\\\\system.linq.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.memory\\\\4.5.4\\\\system.memory.4.5.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.net.nameresolution\\\\4.3.0\\\\system.net.nameresolution.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.net.networkinformation\\\\4.3.0\\\\system.net.networkinformation.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.net.primitives\\\\4.3.0\\\\system.net.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.net.sockets\\\\4.3.0\\\\system.net.sockets.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.numerics.vectors\\\\4.5.0\\\\system.numerics.vectors.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.private.uri\\\\4.3.0\\\\system.private.uri.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.reflection\\\\4.3.0\\\\system.reflection.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.reflection.metadata\\\\1.6.0\\\\system.reflection.metadata.1.6.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.reflection.primitives\\\\4.3.0\\\\system.reflection.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.reflection.typeextensions\\\\4.3.0\\\\system.reflection.typeextensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.resources.resourcemanager\\\\4.3.0\\\\system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime\\\\4.3.0\\\\system.runtime.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime.compilerservices.unsafe\\\\4.7.0\\\\system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime.extensions\\\\4.3.0\\\\system.runtime.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime.handles\\\\4.3.0\\\\system.runtime.handles.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime.interopservices\\\\4.3.0\\\\system.runtime.interopservices.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.security.claims\\\\4.3.0\\\\system.security.claims.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.security.cryptography.cng\\\\4.5.0\\\\system.security.cryptography.cng.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.security.principal\\\\4.3.0\\\\system.security.principal.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.security.principal.windows\\\\4.3.0\\\\system.security.principal.windows.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.text.encoding\\\\4.3.0\\\\system.text.encoding.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.text.encoding.codepages\\\\4.5.1\\\\system.text.encoding.codepages.4.5.1.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.text.encoding.extensions\\\\4.3.0\\\\system.text.encoding.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.text.encodings.web\\\\4.5.0\\\\system.text.encodings.web.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading\\\\4.3.0\\\\system.threading.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.overlapped\\\\4.3.0\\\\system.threading.overlapped.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.tasks\\\\4.3.0\\\\system.threading.tasks.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.tasks.extensions\\\\4.5.3\\\\system.threading.tasks.extensions.4.5.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.thread\\\\4.3.0\\\\system.threading.thread.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.threadpool\\\\4.3.0\\\\system.threading.threadpool.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.app.ref\\\\3.1.0\\\\microsoft.netcore.app.ref.3.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.windowsdesktop.app.ref\\\\3.1.0\\\\microsoft.windowsdesktop.app.ref.3.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.app.runtime.linux-x64\\\\3.1.32\\\\microsoft.netcore.app.runtime.linux-x64.3.1.32.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.app.runtime.linux-x64\\\\3.1.32\\\\microsoft.aspnetcore.app.runtime.linux-x64.3.1.32.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.app.host.linux-x64\\\\3.1.32\\\\microsoft.netcore.app.host.linux-x64.3.1.32.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.app.ref\\\\3.1.10\\\\microsoft.aspnetcore.app.ref.3.1.10.nupkg.sha512\"\n  ],\n  \"logs\": []\n}"
  },
  {
    "path": "TS3AudioBot/obj/publish/win-x64/TS3AudioBot.csproj.nuget.dgspec.json",
    "content": "{\n  \"format\": 1,\n  \"restore\": {\n    \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {}\n  },\n  \"projects\": {\n    \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {\n      \"version\": \"1.0.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n        \"projectName\": \"TS3AudioBot\",\n        \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\obj\\\\publish\\\\win-x64\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"fallbackFolders\": [\n          \"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\Shared\\\\NuGetPackages\"\n        ],\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\13336\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.FallbackLocation.config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {\n              \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n                \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n              }\n            }\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"CliWrap\": {\n              \"target\": \"Package\",\n              \"version\": \"[3.1.0, )\"\n            },\n            \"CommandLineParser\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.8.0, )\"\n            },\n            \"LiteDB\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.1.4, )\"\n            },\n            \"Microsoft.AspNetCore.Cors\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.AspNetCore.Server.Kestrel\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.AspNetCore.StaticFiles\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.CodeAnalysis.CSharp\": {\n              \"include\": \"Runtime, Compile, Build, Native, ContentFiles, BuildTransitive\",\n              \"target\": \"Package\",\n              \"version\": \"[3.7.0, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Nett\": {\n              \"target\": \"Package\",\n              \"version\": \"[0.15.0, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"PlaylistsNET\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.1.2, )\"\n            },\n            \"SixLabors.ImageSharp\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.0, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\",\n            \"net481\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"downloadDependencies\": [\n            {\n              \"name\": \"Microsoft.AspNetCore.App.Ref\",\n              \"version\": \"[3.1.10, 3.1.10]\"\n            },\n            {\n              \"name\": \"Microsoft.AspNetCore.App.Runtime.win-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Host.win-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Ref\",\n              \"version\": \"[3.1.0, 3.1.0]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Runtime.win-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.WindowsDesktop.App.Ref\",\n              \"version\": \"[3.1.0, 3.1.0]\"\n            },\n            {\n              \"name\": \"Microsoft.WindowsDesktop.App.Runtime.win-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            }\n          ],\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n        }\n      },\n      \"runtimes\": {\n        \"win-x64\": {\n          \"#import\": []\n        }\n      }\n    },\n    \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n      \"version\": \"1.1.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"projectName\": \"Splamy.TSLib\",\n        \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\obj\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"crossTargeting\": true,\n        \"fallbackFolders\": [\n          \"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\Shared\\\\NuGetPackages\"\n        ],\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\13336\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.FallbackLocation.config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\",\n          \"netstandard2.0\",\n          \"netstandard2.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.0\": {\n            \"targetAlias\": \"netstandard2.0\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.1\": {\n            \"targetAlias\": \"netstandard2.1\",\n            \"projectReferences\": {}\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\",\n            \"net481\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"downloadDependencies\": [\n            {\n              \"name\": \"Microsoft.AspNetCore.App.Ref\",\n              \"version\": \"[3.1.10, 3.1.10]\"\n            },\n            {\n              \"name\": \"Microsoft.AspNetCore.App.Runtime.win-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Ref\",\n              \"version\": \"[3.1.0, 3.1.0]\"\n            },\n            {\n              \"name\": \"Microsoft.NETCore.App.Runtime.win-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            },\n            {\n              \"name\": \"Microsoft.WindowsDesktop.App.Ref\",\n              \"version\": \"[3.1.0, 3.1.0]\"\n            },\n            {\n              \"name\": \"Microsoft.WindowsDesktop.App.Runtime.win-x64\",\n              \"version\": \"[3.1.32, 3.1.32]\"\n            }\n          ],\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.0\": {\n          \"targetAlias\": \"netstandard2.0\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NETStandard.Library\": {\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[2.0.3, )\",\n              \"autoReferenced\": true\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            },\n            \"System.Memory\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.5.4, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\",\n            \"net481\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.1\": {\n          \"targetAlias\": \"netstandard2.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\",\n            \"net481\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"NETStandard.Library\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n        }\n      },\n      \"runtimes\": {\n        \"win-x64\": {\n          \"#import\": []\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "TS3AudioBot/obj/publish/win-x64/TS3AudioBot.csproj.nuget.g.props",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <RestoreSuccess Condition=\" '$(RestoreSuccess)' == '' \">True</RestoreSuccess>\n    <RestoreTool Condition=\" '$(RestoreTool)' == '' \">NuGet</RestoreTool>\n    <ProjectAssetsFile Condition=\" '$(ProjectAssetsFile)' == '' \">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>\n    <NuGetPackageRoot Condition=\" '$(NuGetPackageRoot)' == '' \">$(UserProfile)\\.nuget\\packages\\</NuGetPackageRoot>\n    <NuGetPackageFolders Condition=\" '$(NuGetPackageFolders)' == '' \">C:\\Users\\13336\\.nuget\\packages\\;C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages</NuGetPackageFolders>\n    <NuGetProjectStyle Condition=\" '$(NuGetProjectStyle)' == '' \">PackageReference</NuGetProjectStyle>\n    <NuGetToolVersion Condition=\" '$(NuGetToolVersion)' == '' \">6.5.0</NuGetToolVersion>\n  </PropertyGroup>\n  <ItemGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <SourceRoot Include=\"C:\\Users\\13336\\.nuget\\packages\\\" />\n    <SourceRoot Include=\"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages\\\" />\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <PkgMicrosoft_CodeAnalysis_Analyzers Condition=\" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' \">C:\\Users\\13336\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.0.0</PkgMicrosoft_CodeAnalysis_Analyzers>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "TS3AudioBot/obj/publish/win-x64/TS3AudioBot.csproj.nuget.g.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" />"
  },
  {
    "path": "TS3AudioBot/obj/publish/win-x64/project.assets.json",
    "content": "{\n  \"version\": 3,\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {\n      \"CliWrap/3.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"CommandLineParser/2.8.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"LiteDB/4.1.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.TypeExtensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.IO.Pipelines\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Cors/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.EnvironmentVariables\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.FileExtensions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Diagnostics.DiagnosticSource\": \"4.5.0\",\n          \"System.Reflection.Metadata\": \"1.6.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Server.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.ObjectPool\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Https\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Memory\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.5.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\",\n          \"System.Security.Cryptography.Cng\": \"4.5.0\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Connections.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.WebEncoders\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n        \"type\": \"package\",\n        \"build\": {\n          \"build/_._\": {}\n        }\n      },\n      \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Analyzers\": \"3.0.0\",\n          \"System.Collections.Immutable\": \"1.5.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Reflection.Metadata\": \"1.6.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Text.Encoding.CodePages\": \"4.5.1\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Common\": \"[3.7.0]\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileSystemGlobbing\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Options/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.ComponentModel.Annotations\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Primitives/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.1\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Net.Http.Headers/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/2.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Nett/0.15.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"PlaylistsNET/1.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"SixLabors.ImageSharp/1.0.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Buffers/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Collections.Immutable/1.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.ComponentModel.Annotations/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/System.IO.Pipelines.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtimeTargets\": {\n          \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"linux\"\n          },\n          \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"osx\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Numerics.Vectors/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.Metadata/1.6.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Reflection.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.TypeExtensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netcoreapp1.1/_._\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Cryptography.Cng/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Text.Encoding.CodePages/4.5.1\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encodings.Web/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      },\n      \"Splamy.TSLib/1.1.0\": {\n        \"type\": \"project\",\n        \"framework\": \".NETCoreApp,Version=v3.1\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"compile\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        },\n        \"runtime\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        }\n      }\n    },\n    \".NETCoreApp,Version=v3.1/win-x64\": {\n      \"CliWrap/3.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"CommandLineParser/2.8.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"LiteDB/4.1.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.TypeExtensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.IO.Pipelines\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Cors/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.EnvironmentVariables\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.FileExtensions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Diagnostics.DiagnosticSource\": \"4.5.0\",\n          \"System.Reflection.Metadata\": \"1.6.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Server.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.ObjectPool\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Https\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Memory\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.5.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\",\n          \"System.Security.Cryptography.Cng\": \"4.5.0\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Connections.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.WebEncoders\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n        \"type\": \"package\",\n        \"build\": {\n          \"build/_._\": {}\n        }\n      },\n      \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Analyzers\": \"3.0.0\",\n          \"System.Collections.Immutable\": \"1.5.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Reflection.Metadata\": \"1.6.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Text.Encoding.CodePages\": \"4.5.1\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Common\": \"[3.7.0]\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {\n            \"related\": \".pdb;.xml\"\n          }\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileSystemGlobbing\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Options/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.ComponentModel.Annotations\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Primitives/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.1\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.Net.Http.Headers/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/2.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.win.Microsoft.Win32.Primitives\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/Microsoft.Win32.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Nett/0.15.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Nett.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"PlaylistsNET/1.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"runtime.any.System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Collections.dll\": {}\n        }\n      },\n      \"runtime.any.System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Diagnostics.Tracing.dll\": {}\n        }\n      },\n      \"runtime.any.System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Globalization.dll\": {}\n        }\n      },\n      \"runtime.any.System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.IO.dll\": {}\n        }\n      },\n      \"runtime.any.System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Reflection.dll\": {}\n        }\n      },\n      \"runtime.any.System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Reflection.Primitives.dll\": {}\n        }\n      },\n      \"runtime.any.System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Resources.ResourceManager.dll\": {}\n        }\n      },\n      \"runtime.any.System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Private.Uri\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Runtime.dll\": {}\n        }\n      },\n      \"runtime.any.System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Runtime.Handles.dll\": {}\n        }\n      },\n      \"runtime.any.System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Runtime.InteropServices.dll\": {}\n        }\n      },\n      \"runtime.any.System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Text.Encoding.dll\": {}\n        }\n      },\n      \"runtime.any.System.Text.Encoding.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Text.Encoding.Extensions.dll\": {}\n        }\n      },\n      \"runtime.any.System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Tasks.dll\": {}\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"runtime.win.Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/Microsoft.Win32.Primitives.dll\": {}\n        }\n      },\n      \"runtime.win.System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/System.Diagnostics.Debug.dll\": {}\n        }\n      },\n      \"runtime.win.System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Buffers\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Text.Encoding.Extensions\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/System.IO.FileSystem.dll\": {}\n        }\n      },\n      \"runtime.win.System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/System.Net.Primitives.dll\": {}\n        }\n      },\n      \"runtime.win.System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Net.NameResolution\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/System.Net.Sockets.dll\": {}\n        }\n      },\n      \"runtime.win.System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Private.Uri\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.5/System.Runtime.Extensions.dll\": {}\n        }\n      },\n      \"SixLabors.ImageSharp/1.0.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Buffers/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Collections\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Collections.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Collections.Immutable/1.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.ComponentModel.Annotations/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.win.System.Diagnostics.Debug\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Diagnostics.Debug.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Diagnostics.Tracing\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Diagnostics.Tracing.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Globalization\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Globalization.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.any.System.IO\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.win.System.IO.FileSystem\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.IO.FileSystem.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/System.IO.Pipelines.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Net.NameResolution/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NameResolution.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/System.Net.NameResolution.dll\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {}\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"runtime.win.System.Net.Primitives\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"runtime.win.System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Numerics.Vectors/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Private.Uri/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard/_._\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Reflection\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.Metadata/1.6.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Reflection.Primitives\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Reflection.Primitives.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Reflection.TypeExtensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Resources.ResourceManager\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Resources.ResourceManager.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"runtime.any.System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.win.System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"runtime.any.System.Runtime.InteropServices\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netcoreapp1.1/System.Runtime.InteropServices.dll\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Security.Claims.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Cryptography.Cng/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {}\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Security.Principal.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {}\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Text.Encoding\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Text.Encoding.CodePages/4.5.1\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\": {}\n        }\n      },\n      \"System.Text.Encoding.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"runtime.any.System.Text.Encoding.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.Extensions.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Text.Encodings.Web/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\": {}\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"runtime.any.System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {\n            \"related\": \".xml\"\n          }\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {\n            \"related\": \".xml\"\n          }\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      },\n      \"Splamy.TSLib/1.1.0\": {\n        \"type\": \"project\",\n        \"framework\": \".NETCoreApp,Version=v3.1\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"compile\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        },\n        \"runtime\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"CliWrap/3.1.0\": {\n      \"sha512\": \"vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==\",\n      \"type\": \"package\",\n      \"path\": \"cliwrap/3.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"cliwrap.3.1.0.nupkg.sha512\",\n        \"cliwrap.nuspec\",\n        \"favicon.png\",\n        \"lib/net461/CliWrap.dll\",\n        \"lib/net461/CliWrap.xml\",\n        \"lib/netcoreapp3.0/CliWrap.dll\",\n        \"lib/netcoreapp3.0/CliWrap.xml\",\n        \"lib/netstandard2.0/CliWrap.dll\",\n        \"lib/netstandard2.0/CliWrap.xml\",\n        \"lib/netstandard2.1/CliWrap.dll\",\n        \"lib/netstandard2.1/CliWrap.xml\"\n      ]\n    },\n    \"CommandLineParser/2.8.0\": {\n      \"sha512\": \"eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==\",\n      \"type\": \"package\",\n      \"path\": \"commandlineparser/2.8.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"CommandLine20.png\",\n        \"License.md\",\n        \"README.md\",\n        \"commandlineparser.2.8.0.nupkg.sha512\",\n        \"commandlineparser.nuspec\",\n        \"lib/net40/CommandLine.dll\",\n        \"lib/net40/CommandLine.xml\",\n        \"lib/net45/CommandLine.dll\",\n        \"lib/net45/CommandLine.xml\",\n        \"lib/net461/CommandLine.dll\",\n        \"lib/net461/CommandLine.xml\",\n        \"lib/netstandard2.0/CommandLine.dll\",\n        \"lib/netstandard2.0/CommandLine.xml\"\n      ]\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"sha512\": \"i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"type\": \"package\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"heijden.dns.portable.2.0.19.nupkg.sha512\",\n        \"heijden.dns.portable.nuspec\",\n        \"lib/netstandard1.3/Heijden.Dns.Portable.dll\"\n      ]\n    },\n    \"LiteDB/4.1.4\": {\n      \"sha512\": \"g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==\",\n      \"type\": \"package\",\n      \"path\": \"litedb/4.1.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net35/LiteDB.dll\",\n        \"lib/net35/LiteDB.xml\",\n        \"lib/net40/LiteDB.dll\",\n        \"lib/net40/LiteDB.xml\",\n        \"lib/netstandard1.3/LiteDB.dll\",\n        \"lib/netstandard1.3/LiteDB.xml\",\n        \"lib/netstandard2.0/LiteDB.dll\",\n        \"lib/netstandard2.0/LiteDB.xml\",\n        \"litedb.4.1.4.nupkg.sha512\",\n        \"litedb.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n      \"sha512\": \"Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.connections.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.xml\",\n        \"microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.connections.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Cors/2.2.0\": {\n      \"sha512\": \"LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.cors/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.xml\",\n        \"microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.cors.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n      \"sha512\": \"7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.xml\",\n        \"microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n      \"sha512\": \"ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.xml\",\n        \"microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n      \"sha512\": \"1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting.server.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml\",\n        \"microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.server.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http/2.2.0\": {\n      \"sha512\": \"YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.xml\",\n        \"microsoft.aspnetcore.http.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n      \"sha512\": \"Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.xml\",\n        \"microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n      \"sha512\": \"2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.extensions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.xml\",\n        \"microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.extensions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n      \"sha512\": \"ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.features/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.xml\",\n        \"microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.features.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n      \"sha512\": \"D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.xml\",\n        \"microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n      \"sha512\": \"F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.core/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.xml\",\n        \"microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.core.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n      \"sha512\": \"nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.https/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.xml\",\n        \"microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.https.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n      \"sha512\": \"j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.xml\",\n        \"microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.transport.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n      \"sha512\": \"qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml\",\n        \"microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.transport.sockets.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n      \"sha512\": \"byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.staticfiles/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.xml\",\n        \"microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.staticfiles.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n      \"sha512\": \"9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.webutilities/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.xml\",\n        \"microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.webutilities.nuspec\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n      \"sha512\": \"ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.analyzers/3.0.0\",\n      \"hasTools\": true,\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"EULA.rtf\",\n        \"ThirdPartyNotices.rtf\",\n        \"analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll\",\n        \"analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll\",\n        \"analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll\",\n        \"analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll\",\n        \"analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"build/Microsoft.CodeAnalysis.Analyzers.props\",\n        \"build/Microsoft.CodeAnalysis.Analyzers.targets\",\n        \"documentation/Analyzer Configuration.md\",\n        \"documentation/Microsoft.CodeAnalysis.Analyzers.md\",\n        \"documentation/Microsoft.CodeAnalysis.Analyzers.sarif\",\n        \"editorconfig/AllRulesDefault/.editorconfig\",\n        \"editorconfig/AllRulesDisabled/.editorconfig\",\n        \"editorconfig/AllRulesEnabled/.editorconfig\",\n        \"editorconfig/CorrectnessRulesDefault/.editorconfig\",\n        \"editorconfig/CorrectnessRulesEnabled/.editorconfig\",\n        \"editorconfig/DataflowRulesDefault/.editorconfig\",\n        \"editorconfig/DataflowRulesEnabled/.editorconfig\",\n        \"editorconfig/LibraryRulesDefault/.editorconfig\",\n        \"editorconfig/LibraryRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig\",\n        \"editorconfig/PortedFromFxCopRulesDefault/.editorconfig\",\n        \"editorconfig/PortedFromFxCopRulesEnabled/.editorconfig\",\n        \"microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.analyzers.nuspec\",\n        \"rulesets/AllRulesDefault.ruleset\",\n        \"rulesets/AllRulesDisabled.ruleset\",\n        \"rulesets/AllRulesEnabled.ruleset\",\n        \"rulesets/CorrectnessRulesDefault.ruleset\",\n        \"rulesets/CorrectnessRulesEnabled.ruleset\",\n        \"rulesets/DataflowRulesDefault.ruleset\",\n        \"rulesets/DataflowRulesEnabled.ruleset\",\n        \"rulesets/LibraryRulesDefault.ruleset\",\n        \"rulesets/LibraryRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset\",\n        \"rulesets/PortedFromFxCopRulesDefault.ruleset\",\n        \"rulesets/PortedFromFxCopRulesEnabled.ruleset\",\n        \"tools/install.ps1\",\n        \"tools/uninstall.ps1\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n      \"sha512\": \"SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.common/3.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"ThirdPartyNotices.rtf\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.pdb\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.xml\",\n        \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.pdb\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.xml\",\n        \"lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll\",\n        \"microsoft.codeanalysis.common.3.7.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.common.nuspec\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n      \"sha512\": \"sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.csharp/3.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"ThirdPartyNotices.rtf\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.pdb\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.xml\",\n        \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml\",\n        \"lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.csharp.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration/2.2.0\": {\n      \"sha512\": \"nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.xml\",\n        \"microsoft.extensions.configuration.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n      \"sha512\": \"65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml\",\n        \"microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n      \"sha512\": \"vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.binder/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml\",\n        \"microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.binder.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n      \"sha512\": \"gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.environmentvariables/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.xml\",\n        \"microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.environmentvariables.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n      \"sha512\": \"H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.fileextensions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.xml\",\n        \"microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.fileextensions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n      \"sha512\": \"MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.dependencyinjection/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net461/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/net461/Microsoft.Extensions.DependencyInjection.xml\",\n        \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.xml\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml\",\n        \"microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.dependencyinjection.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n      \"sha512\": \"f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.dependencyinjection.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml\",\n        \"microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.dependencyinjection.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n      \"sha512\": \"EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.fileproviders.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml\",\n        \"microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.fileproviders.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n      \"sha512\": \"tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.fileproviders.physical/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.xml\",\n        \"microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.fileproviders.physical.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n      \"sha512\": \"ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.filesystemglobbing/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.xml\",\n        \"microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.filesystemglobbing.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n      \"sha512\": \"+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.hosting.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml\",\n        \"microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.hosting.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Logging/2.2.0\": {\n      \"sha512\": \"Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.logging/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.xml\",\n        \"microsoft.extensions.logging.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.logging.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n      \"sha512\": \"B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.logging.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml\",\n        \"microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.logging.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n      \"sha512\": \"gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.objectpool/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml\",\n        \"microsoft.extensions.objectpool.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.objectpool.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Options/2.2.0\": {\n      \"sha512\": \"UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.options/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Options.xml\",\n        \"microsoft.extensions.options.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.options.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Primitives/2.2.0\": {\n      \"sha512\": \"azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.primitives/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Primitives.xml\",\n        \"microsoft.extensions.primitives.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.primitives.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n      \"sha512\": \"V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.webencoders/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.xml\",\n        \"microsoft.extensions.webencoders.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.webencoders.nuspec\"\n      ]\n    },\n    \"Microsoft.Net.Http.Headers/2.2.0\": {\n      \"sha512\": \"iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.net.http.headers/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\",\n        \"lib/netstandard2.0/Microsoft.Net.Http.Headers.xml\",\n        \"microsoft.net.http.headers.2.2.0.nupkg.sha512\",\n        \"microsoft.net.http.headers.nuspec\"\n      ]\n    },\n    \"Microsoft.NETCore.Platforms/2.1.2\": {\n      \"sha512\": \"mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.platforms/2.1.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.platforms.2.1.2.nupkg.sha512\",\n        \"microsoft.netcore.platforms.nuspec\",\n        \"runtime.json\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"sha512\": \"aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n        \"microsoft.netcore.targets.nuspec\",\n        \"runtime.json\"\n      ]\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"sha512\": \"9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/Microsoft.Win32.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n        \"microsoft.win32.primitives.nuspec\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\"\n      ]\n    },\n    \"Nett/0.15.0\": {\n      \"sha512\": \"/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==\",\n      \"type\": \"package\",\n      \"path\": \"nett/0.15.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/Nett.dll\",\n        \"lib/net40/Nett.xml\",\n        \"lib/netstandard2.0/Nett.dll\",\n        \"lib/netstandard2.0/Nett.xml\",\n        \"nett.0.15.0.nupkg.sha512\",\n        \"nett.nuspec\"\n      ]\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"sha512\": \"6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"type\": \"package\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.md\",\n        \"lib/net20/Newtonsoft.Json.dll\",\n        \"lib/net20/Newtonsoft.Json.xml\",\n        \"lib/net35/Newtonsoft.Json.dll\",\n        \"lib/net35/Newtonsoft.Json.xml\",\n        \"lib/net40/Newtonsoft.Json.dll\",\n        \"lib/net40/Newtonsoft.Json.xml\",\n        \"lib/net45/Newtonsoft.Json.dll\",\n        \"lib/net45/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.0/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.3/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.3/Newtonsoft.Json.xml\",\n        \"lib/netstandard2.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard2.0/Newtonsoft.Json.xml\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"newtonsoft.json.12.0.3.nupkg.sha512\",\n        \"newtonsoft.json.nuspec\",\n        \"packageIcon.png\"\n      ]\n    },\n    \"NLog/4.7.3\": {\n      \"sha512\": \"3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"type\": \"package\",\n      \"path\": \"nlog/4.7.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/monoandroid44/NLog.dll\",\n        \"lib/monoandroid44/NLog.xml\",\n        \"lib/net35/NLog.dll\",\n        \"lib/net35/NLog.xml\",\n        \"lib/net40-client/NLog.dll\",\n        \"lib/net40-client/NLog.xml\",\n        \"lib/net45/NLog.dll\",\n        \"lib/net45/NLog.xml\",\n        \"lib/netstandard1.3/NLog.dll\",\n        \"lib/netstandard1.3/NLog.xml\",\n        \"lib/netstandard1.5/NLog.dll\",\n        \"lib/netstandard1.5/NLog.xml\",\n        \"lib/netstandard2.0/NLog.dll\",\n        \"lib/netstandard2.0/NLog.xml\",\n        \"lib/sl4/NLog.dll\",\n        \"lib/sl4/NLog.xml\",\n        \"lib/sl5/NLog.dll\",\n        \"lib/sl5/NLog.xml\",\n        \"lib/wp8/NLog.dll\",\n        \"lib/wp8/NLog.xml\",\n        \"lib/xamarinios10/NLog.dll\",\n        \"lib/xamarinios10/NLog.xml\",\n        \"nlog.4.7.3.nupkg.sha512\",\n        \"nlog.nuspec\"\n      ]\n    },\n    \"PlaylistsNET/1.1.2\": {\n      \"sha512\": \"IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==\",\n      \"type\": \"package\",\n      \"path\": \"playlistsnet/1.1.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net45/PlaylistsNET.dll\",\n        \"lib/netstandard1.4/PlaylistsNET.dll\",\n        \"lib/netstandard2.0/PlaylistsNET.dll\",\n        \"playlistsnet.1.1.2.nupkg.sha512\",\n        \"playlistsnet.nuspec\"\n      ]\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"sha512\": \"RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"type\": \"package\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/BouncyCastle.Crypto.dll\",\n        \"lib/net40/BouncyCastle.Crypto.xml\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.dll\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.xml\",\n        \"portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n        \"portable.bouncycastle.nuspec\"\n      ]\n    },\n    \"runtime.any.System.Collections/4.3.0\": {\n      \"sha512\": \"23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.collections/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Collections.dll\",\n        \"lib/netstandard1.3/System.Collections.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.collections.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.collections.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Diagnostics.Tracing/4.3.0\": {\n      \"sha512\": \"1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.diagnostics.tracing/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Diagnostics.Tracing.dll\",\n        \"lib/netstandard1.5/System.Diagnostics.Tracing.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.diagnostics.tracing.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Globalization/4.3.0\": {\n      \"sha512\": \"sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.globalization/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Globalization.dll\",\n        \"lib/netstandard1.3/System.Globalization.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.globalization.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.globalization.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.IO/4.3.0\": {\n      \"sha512\": \"SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.io/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.IO.dll\",\n        \"lib/netstandard1.5/System.IO.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.io.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.io.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Reflection/4.3.0\": {\n      \"sha512\": \"hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.reflection/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Reflection.dll\",\n        \"lib/netstandard1.5/System.Reflection.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.reflection.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.reflection.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Reflection.Primitives/4.3.0\": {\n      \"sha512\": \"Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.reflection.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Reflection.Primitives.dll\",\n        \"lib/netstandard1.3/System.Reflection.Primitives.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.reflection.primitives.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Resources.ResourceManager/4.3.0\": {\n      \"sha512\": \"Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.resources.resourcemanager/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Resources.ResourceManager.dll\",\n        \"lib/netstandard1.3/System.Resources.ResourceManager.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.resources.resourcemanager.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Runtime/4.3.0\": {\n      \"sha512\": \"fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.runtime/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Runtime.dll\",\n        \"lib/netstandard1.5/System.Runtime.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.runtime.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.runtime.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Runtime.Handles/4.3.0\": {\n      \"sha512\": \"GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.runtime.handles/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/_._\",\n        \"lib/netstandard1.3/System.Runtime.Handles.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.runtime.handles.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.runtime.handles.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Runtime.InteropServices/4.3.0\": {\n      \"sha512\": \"lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.runtime.interopservices/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Runtime.InteropServices.dll\",\n        \"lib/netstandard1.5/System.Runtime.InteropServices.dll\",\n        \"lib/netstandard1.6/System.Runtime.InteropServices.dll\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.runtime.interopservices.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Text.Encoding/4.3.0\": {\n      \"sha512\": \"+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.text.encoding/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Text.Encoding.dll\",\n        \"lib/netstandard1.3/System.Text.Encoding.dll\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.text.encoding.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.text.encoding.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Text.Encoding.Extensions/4.3.0\": {\n      \"sha512\": \"NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.text.encoding.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Text.Encoding.Extensions.dll\",\n        \"lib/netstandard1.3/System.Text.Encoding.Extensions.dll\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.text.encoding.extensions.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.any.System.Threading.Tasks/4.3.0\": {\n      \"sha512\": \"OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.any.system.threading.tasks/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Threading.Tasks.dll\",\n        \"lib/netstandard1.3/System.Threading.Tasks.dll\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/netstandard/_._\",\n        \"runtime.any.system.threading.tasks.4.3.0.nupkg.sha512\",\n        \"runtime.any.system.threading.tasks.nuspec\",\n        \"runtimes/aot/lib/netcore50/_._\"\n      ]\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"sha512\": \"c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"runtime.native.system.4.3.0.nupkg.sha512\",\n        \"runtime.native.system.nuspec\"\n      ]\n    },\n    \"runtime.win.Microsoft.Win32.Primitives/4.3.0\": {\n      \"sha512\": \"NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.win.microsoft.win32.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.win.microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n        \"runtime.win.microsoft.win32.primitives.nuspec\",\n        \"runtimes/win/lib/net/_._\",\n        \"runtimes/win/lib/netstandard1.3/Microsoft.Win32.Primitives.dll\"\n      ]\n    },\n    \"runtime.win.System.Diagnostics.Debug/4.3.0\": {\n      \"sha512\": \"hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.win.system.diagnostics.debug/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.win.system.diagnostics.debug.4.3.0.nupkg.sha512\",\n        \"runtime.win.system.diagnostics.debug.nuspec\",\n        \"runtimes/aot/lib/netcore50/System.Diagnostics.Debug.dll\",\n        \"runtimes/win/lib/net45/_._\",\n        \"runtimes/win/lib/netcore50/System.Diagnostics.Debug.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Diagnostics.Debug.dll\",\n        \"runtimes/win/lib/win8/_._\",\n        \"runtimes/win/lib/wp80/_._\",\n        \"runtimes/win/lib/wpa81/_._\"\n      ]\n    },\n    \"runtime.win.System.IO.FileSystem/4.3.0\": {\n      \"sha512\": \"Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.win.system.io.filesystem/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.win.system.io.filesystem.4.3.0.nupkg.sha512\",\n        \"runtime.win.system.io.filesystem.nuspec\",\n        \"runtimes/win/lib/net/_._\",\n        \"runtimes/win/lib/netcore50/System.IO.FileSystem.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.IO.FileSystem.dll\",\n        \"runtimes/win/lib/win8/_._\",\n        \"runtimes/win/lib/wp8/_._\",\n        \"runtimes/win/lib/wpa81/_._\"\n      ]\n    },\n    \"runtime.win.System.Net.Primitives/4.3.0\": {\n      \"sha512\": \"lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.win.system.net.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.win.system.net.primitives.4.3.0.nupkg.sha512\",\n        \"runtime.win.system.net.primitives.nuspec\",\n        \"runtimes/win/lib/net/_._\",\n        \"runtimes/win/lib/netcore50/System.Net.Primitives.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.Primitives.dll\"\n      ]\n    },\n    \"runtime.win.System.Net.Sockets/4.3.0\": {\n      \"sha512\": \"FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.win.system.net.sockets/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.win.system.net.sockets.4.3.0.nupkg.sha512\",\n        \"runtime.win.system.net.sockets.nuspec\",\n        \"runtimes/win/lib/net/_._\",\n        \"runtimes/win/lib/netcore50/System.Net.Sockets.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.Sockets.dll\"\n      ]\n    },\n    \"runtime.win.System.Runtime.Extensions/4.3.0\": {\n      \"sha512\": \"RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.win.system.runtime.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"runtime.win.system.runtime.extensions.4.3.0.nupkg.sha512\",\n        \"runtime.win.system.runtime.extensions.nuspec\",\n        \"runtimes/aot/lib/netcore50/System.Runtime.Extensions.dll\",\n        \"runtimes/win/lib/net/_._\",\n        \"runtimes/win/lib/netcore50/System.Runtime.Extensions.dll\",\n        \"runtimes/win/lib/netstandard1.5/System.Runtime.Extensions.dll\"\n      ]\n    },\n    \"SixLabors.ImageSharp/1.0.0\": {\n      \"sha512\": \"8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==\",\n      \"type\": \"package\",\n      \"path\": \"sixlabors.imagesharp/1.0.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net472/SixLabors.ImageSharp.dll\",\n        \"lib/net472/SixLabors.ImageSharp.xml\",\n        \"lib/netcoreapp2.1/SixLabors.ImageSharp.dll\",\n        \"lib/netcoreapp2.1/SixLabors.ImageSharp.xml\",\n        \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\",\n        \"lib/netcoreapp3.1/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard1.3/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard1.3/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard2.0/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard2.0/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard2.1/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard2.1/SixLabors.ImageSharp.xml\",\n        \"sixlabors.imagesharp.1.0.0.nupkg.sha512\",\n        \"sixlabors.imagesharp.128.png\",\n        \"sixlabors.imagesharp.nuspec\"\n      ]\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"sha512\": \"Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"type\": \"package\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net46/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.0/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.1/Chaos.NaCl.dll\",\n        \"lib/netstandard1.1/Chaos.NaCl.dll\",\n        \"lib/netstandard2.0/Chaos.NaCl.dll\",\n        \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n        \"splamy.ed25519.toolkit.nuspec\"\n      ]\n    },\n    \"System.Buffers/4.5.0\": {\n      \"sha512\": \"pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==\",\n      \"type\": \"package\",\n      \"path\": \"system.buffers/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.1/System.Buffers.dll\",\n        \"lib/netstandard1.1/System.Buffers.xml\",\n        \"lib/netstandard2.0/System.Buffers.dll\",\n        \"lib/netstandard2.0/System.Buffers.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"ref/net45/System.Buffers.dll\",\n        \"ref/net45/System.Buffers.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.Buffers.dll\",\n        \"ref/netstandard1.1/System.Buffers.xml\",\n        \"ref/netstandard2.0/System.Buffers.dll\",\n        \"ref/netstandard2.0/System.Buffers.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"system.buffers.4.5.0.nupkg.sha512\",\n        \"system.buffers.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Collections/4.3.0\": {\n      \"sha512\": \"3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Collections.dll\",\n        \"ref/netcore50/System.Collections.xml\",\n        \"ref/netcore50/de/System.Collections.xml\",\n        \"ref/netcore50/es/System.Collections.xml\",\n        \"ref/netcore50/fr/System.Collections.xml\",\n        \"ref/netcore50/it/System.Collections.xml\",\n        \"ref/netcore50/ja/System.Collections.xml\",\n        \"ref/netcore50/ko/System.Collections.xml\",\n        \"ref/netcore50/ru/System.Collections.xml\",\n        \"ref/netcore50/zh-hans/System.Collections.xml\",\n        \"ref/netcore50/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.0/System.Collections.dll\",\n        \"ref/netstandard1.0/System.Collections.xml\",\n        \"ref/netstandard1.0/de/System.Collections.xml\",\n        \"ref/netstandard1.0/es/System.Collections.xml\",\n        \"ref/netstandard1.0/fr/System.Collections.xml\",\n        \"ref/netstandard1.0/it/System.Collections.xml\",\n        \"ref/netstandard1.0/ja/System.Collections.xml\",\n        \"ref/netstandard1.0/ko/System.Collections.xml\",\n        \"ref/netstandard1.0/ru/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.3/System.Collections.dll\",\n        \"ref/netstandard1.3/System.Collections.xml\",\n        \"ref/netstandard1.3/de/System.Collections.xml\",\n        \"ref/netstandard1.3/es/System.Collections.xml\",\n        \"ref/netstandard1.3/fr/System.Collections.xml\",\n        \"ref/netstandard1.3/it/System.Collections.xml\",\n        \"ref/netstandard1.3/ja/System.Collections.xml\",\n        \"ref/netstandard1.3/ko/System.Collections.xml\",\n        \"ref/netstandard1.3/ru/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Collections.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.collections.4.3.0.nupkg.sha512\",\n        \"system.collections.nuspec\"\n      ]\n    },\n    \"System.Collections.Immutable/1.5.0\": {\n      \"sha512\": \"EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections.immutable/1.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/System.Collections.Immutable.dll\",\n        \"lib/netstandard1.0/System.Collections.Immutable.xml\",\n        \"lib/netstandard1.3/System.Collections.Immutable.dll\",\n        \"lib/netstandard1.3/System.Collections.Immutable.xml\",\n        \"lib/netstandard2.0/System.Collections.Immutable.dll\",\n        \"lib/netstandard2.0/System.Collections.Immutable.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml\",\n        \"system.collections.immutable.1.5.0.nupkg.sha512\",\n        \"system.collections.immutable.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.ComponentModel.Annotations/4.5.0\": {\n      \"sha512\": \"UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==\",\n      \"type\": \"package\",\n      \"path\": \"system.componentmodel.annotations/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net461/System.ComponentModel.Annotations.dll\",\n        \"lib/netcore50/System.ComponentModel.Annotations.dll\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.4/System.ComponentModel.Annotations.dll\",\n        \"lib/netstandard2.0/System.ComponentModel.Annotations.dll\",\n        \"lib/portable-net45+win8/_._\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/win8/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net461/System.ComponentModel.Annotations.dll\",\n        \"ref/net461/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/System.ComponentModel.Annotations.dll\",\n        \"ref/netcore50/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.1/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.3/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.4/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard2.0/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard2.0/System.ComponentModel.Annotations.xml\",\n        \"ref/portable-net45+win8/_._\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/win8/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.componentmodel.annotations.4.5.0.nupkg.sha512\",\n        \"system.componentmodel.annotations.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"sha512\": \"ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Diagnostics.Debug.dll\",\n        \"ref/netcore50/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.debug.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.debug.nuspec\"\n      ]\n    },\n    \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n      \"sha512\": \"eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.diagnosticsource/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net45/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/net45/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/net46/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/net46/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml\",\n        \"system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\",\n        \"system.diagnostics.diagnosticsource.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"sha512\": \"rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Diagnostics.Tracing.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.tracing.nuspec\"\n      ]\n    },\n    \"System.Globalization/4.3.0\": {\n      \"sha512\": \"kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"type\": \"package\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Globalization.dll\",\n        \"ref/netcore50/System.Globalization.xml\",\n        \"ref/netcore50/de/System.Globalization.xml\",\n        \"ref/netcore50/es/System.Globalization.xml\",\n        \"ref/netcore50/fr/System.Globalization.xml\",\n        \"ref/netcore50/it/System.Globalization.xml\",\n        \"ref/netcore50/ja/System.Globalization.xml\",\n        \"ref/netcore50/ko/System.Globalization.xml\",\n        \"ref/netcore50/ru/System.Globalization.xml\",\n        \"ref/netcore50/zh-hans/System.Globalization.xml\",\n        \"ref/netcore50/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.0/System.Globalization.dll\",\n        \"ref/netstandard1.0/System.Globalization.xml\",\n        \"ref/netstandard1.0/de/System.Globalization.xml\",\n        \"ref/netstandard1.0/es/System.Globalization.xml\",\n        \"ref/netstandard1.0/fr/System.Globalization.xml\",\n        \"ref/netstandard1.0/it/System.Globalization.xml\",\n        \"ref/netstandard1.0/ja/System.Globalization.xml\",\n        \"ref/netstandard1.0/ko/System.Globalization.xml\",\n        \"ref/netstandard1.0/ru/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.3/System.Globalization.dll\",\n        \"ref/netstandard1.3/System.Globalization.xml\",\n        \"ref/netstandard1.3/de/System.Globalization.xml\",\n        \"ref/netstandard1.3/es/System.Globalization.xml\",\n        \"ref/netstandard1.3/fr/System.Globalization.xml\",\n        \"ref/netstandard1.3/it/System.Globalization.xml\",\n        \"ref/netstandard1.3/ja/System.Globalization.xml\",\n        \"ref/netstandard1.3/ko/System.Globalization.xml\",\n        \"ref/netstandard1.3/ru/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Globalization.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.globalization.4.3.0.nupkg.sha512\",\n        \"system.globalization.nuspec\"\n      ]\n    },\n    \"System.IO/4.3.0\": {\n      \"sha512\": \"3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"type\": \"package\",\n      \"path\": \"system.io/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.IO.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.IO.dll\",\n        \"ref/netcore50/System.IO.dll\",\n        \"ref/netcore50/System.IO.xml\",\n        \"ref/netcore50/de/System.IO.xml\",\n        \"ref/netcore50/es/System.IO.xml\",\n        \"ref/netcore50/fr/System.IO.xml\",\n        \"ref/netcore50/it/System.IO.xml\",\n        \"ref/netcore50/ja/System.IO.xml\",\n        \"ref/netcore50/ko/System.IO.xml\",\n        \"ref/netcore50/ru/System.IO.xml\",\n        \"ref/netcore50/zh-hans/System.IO.xml\",\n        \"ref/netcore50/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.0/System.IO.dll\",\n        \"ref/netstandard1.0/System.IO.xml\",\n        \"ref/netstandard1.0/de/System.IO.xml\",\n        \"ref/netstandard1.0/es/System.IO.xml\",\n        \"ref/netstandard1.0/fr/System.IO.xml\",\n        \"ref/netstandard1.0/it/System.IO.xml\",\n        \"ref/netstandard1.0/ja/System.IO.xml\",\n        \"ref/netstandard1.0/ko/System.IO.xml\",\n        \"ref/netstandard1.0/ru/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.3/System.IO.dll\",\n        \"ref/netstandard1.3/System.IO.xml\",\n        \"ref/netstandard1.3/de/System.IO.xml\",\n        \"ref/netstandard1.3/es/System.IO.xml\",\n        \"ref/netstandard1.3/fr/System.IO.xml\",\n        \"ref/netstandard1.3/it/System.IO.xml\",\n        \"ref/netstandard1.3/ja/System.IO.xml\",\n        \"ref/netstandard1.3/ko/System.IO.xml\",\n        \"ref/netstandard1.3/ru/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.5/System.IO.dll\",\n        \"ref/netstandard1.5/System.IO.xml\",\n        \"ref/netstandard1.5/de/System.IO.xml\",\n        \"ref/netstandard1.5/es/System.IO.xml\",\n        \"ref/netstandard1.5/fr/System.IO.xml\",\n        \"ref/netstandard1.5/it/System.IO.xml\",\n        \"ref/netstandard1.5/ja/System.IO.xml\",\n        \"ref/netstandard1.5/ko/System.IO.xml\",\n        \"ref/netstandard1.5/ru/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hant/System.IO.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.4.3.0.nupkg.sha512\",\n        \"system.io.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"sha512\": \"3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"sha512\": \"6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.Primitives.dll\",\n        \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.primitives.nuspec\"\n      ]\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"sha512\": \"rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.IO.Pipelines.dll\",\n        \"lib/net461/System.IO.Pipelines.xml\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.dll\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.xml\",\n        \"lib/netstandard1.3/System.IO.Pipelines.dll\",\n        \"lib/netstandard1.3/System.IO.Pipelines.xml\",\n        \"lib/netstandard2.0/System.IO.Pipelines.dll\",\n        \"lib/netstandard2.0/System.IO.Pipelines.xml\",\n        \"ref/net461/System.IO.Pipelines.dll\",\n        \"ref/net461/System.IO.Pipelines.xml\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.dll\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.xml\",\n        \"system.io.pipelines.4.7.2.nupkg.sha512\",\n        \"system.io.pipelines.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Linq/4.3.0\": {\n      \"sha512\": \"5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"type\": \"package\",\n      \"path\": \"system.linq/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net463/System.Linq.dll\",\n        \"lib/netcore50/System.Linq.dll\",\n        \"lib/netstandard1.6/System.Linq.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net463/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.xml\",\n        \"ref/netcore50/de/System.Linq.xml\",\n        \"ref/netcore50/es/System.Linq.xml\",\n        \"ref/netcore50/fr/System.Linq.xml\",\n        \"ref/netcore50/it/System.Linq.xml\",\n        \"ref/netcore50/ja/System.Linq.xml\",\n        \"ref/netcore50/ko/System.Linq.xml\",\n        \"ref/netcore50/ru/System.Linq.xml\",\n        \"ref/netcore50/zh-hans/System.Linq.xml\",\n        \"ref/netcore50/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.0/System.Linq.dll\",\n        \"ref/netstandard1.0/System.Linq.xml\",\n        \"ref/netstandard1.0/de/System.Linq.xml\",\n        \"ref/netstandard1.0/es/System.Linq.xml\",\n        \"ref/netstandard1.0/fr/System.Linq.xml\",\n        \"ref/netstandard1.0/it/System.Linq.xml\",\n        \"ref/netstandard1.0/ja/System.Linq.xml\",\n        \"ref/netstandard1.0/ko/System.Linq.xml\",\n        \"ref/netstandard1.0/ru/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.6/System.Linq.dll\",\n        \"ref/netstandard1.6/System.Linq.xml\",\n        \"ref/netstandard1.6/de/System.Linq.xml\",\n        \"ref/netstandard1.6/es/System.Linq.xml\",\n        \"ref/netstandard1.6/fr/System.Linq.xml\",\n        \"ref/netstandard1.6/it/System.Linq.xml\",\n        \"ref/netstandard1.6/ja/System.Linq.xml\",\n        \"ref/netstandard1.6/ko/System.Linq.xml\",\n        \"ref/netstandard1.6/ru/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hant/System.Linq.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.linq.4.3.0.nupkg.sha512\",\n        \"system.linq.nuspec\"\n      ]\n    },\n    \"System.Memory/4.5.4\": {\n      \"sha512\": \"1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"type\": \"package\",\n      \"path\": \"system.memory/4.5.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.Memory.dll\",\n        \"lib/net461/System.Memory.xml\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.1/System.Memory.dll\",\n        \"lib/netstandard1.1/System.Memory.xml\",\n        \"lib/netstandard2.0/System.Memory.dll\",\n        \"lib/netstandard2.0/System.Memory.xml\",\n        \"ref/netcoreapp2.1/_._\",\n        \"system.memory.4.5.4.nupkg.sha512\",\n        \"system.memory.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Net.NameResolution/4.3.0\": {\n      \"sha512\": \"AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.nameresolution/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Net.NameResolution.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Net.NameResolution.dll\",\n        \"ref/netstandard1.3/System.Net.NameResolution.dll\",\n        \"ref/netstandard1.3/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/de/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/es/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/fr/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/it/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/ja/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/ko/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/ru/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.NameResolution.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.NameResolution.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/unix/lib/netstandard1.3/System.Net.NameResolution.dll\",\n        \"runtimes/win/lib/net46/System.Net.NameResolution.dll\",\n        \"runtimes/win/lib/netcore50/System.Net.NameResolution.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.NameResolution.dll\",\n        \"system.net.nameresolution.4.3.0.nupkg.sha512\",\n        \"system.net.nameresolution.nuspec\"\n      ]\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"sha512\": \"zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net46/System.Net.NetworkInformation.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net46/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/de/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/es/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/it/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/net46/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"system.net.networkinformation.4.3.0.nupkg.sha512\",\n        \"system.net.networkinformation.nuspec\"\n      ]\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"sha512\": \"qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Net.Primitives.dll\",\n        \"ref/netcore50/System.Net.Primitives.xml\",\n        \"ref/netcore50/de/System.Net.Primitives.xml\",\n        \"ref/netcore50/es/System.Net.Primitives.xml\",\n        \"ref/netcore50/fr/System.Net.Primitives.xml\",\n        \"ref/netcore50/it/System.Net.Primitives.xml\",\n        \"ref/netcore50/ja/System.Net.Primitives.xml\",\n        \"ref/netcore50/ko/System.Net.Primitives.xml\",\n        \"ref/netcore50/ru/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/System.Net.Primitives.dll\",\n        \"ref/netstandard1.0/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/System.Net.Primitives.dll\",\n        \"ref/netstandard1.1/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/System.Net.Primitives.dll\",\n        \"ref/netstandard1.3/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.primitives.4.3.0.nupkg.sha512\",\n        \"system.net.primitives.nuspec\"\n      ]\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"sha512\": \"m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Net.Sockets.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/de/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/es/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/it/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Sockets.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.sockets.4.3.0.nupkg.sha512\",\n        \"system.net.sockets.nuspec\"\n      ]\n    },\n    \"System.Numerics.Vectors/4.5.0\": {\n      \"sha512\": \"QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.numerics.vectors/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Numerics.Vectors.dll\",\n        \"lib/net46/System.Numerics.Vectors.xml\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/System.Numerics.Vectors.dll\",\n        \"ref/net45/System.Numerics.Vectors.xml\",\n        \"ref/net46/System.Numerics.Vectors.dll\",\n        \"ref/net46/System.Numerics.Vectors.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.numerics.vectors.4.5.0.nupkg.sha512\",\n        \"system.numerics.vectors.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Private.Uri/4.3.0\": {\n      \"sha512\": \"I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==\",\n      \"type\": \"package\",\n      \"path\": \"system.private.uri/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"ref/netstandard/_._\",\n        \"system.private.uri.4.3.0.nupkg.sha512\",\n        \"system.private.uri.nuspec\"\n      ]\n    },\n    \"System.Reflection/4.3.0\": {\n      \"sha512\": \"KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Reflection.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.xml\",\n        \"ref/netcore50/de/System.Reflection.xml\",\n        \"ref/netcore50/es/System.Reflection.xml\",\n        \"ref/netcore50/fr/System.Reflection.xml\",\n        \"ref/netcore50/it/System.Reflection.xml\",\n        \"ref/netcore50/ja/System.Reflection.xml\",\n        \"ref/netcore50/ko/System.Reflection.xml\",\n        \"ref/netcore50/ru/System.Reflection.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.0/System.Reflection.dll\",\n        \"ref/netstandard1.0/System.Reflection.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.3/System.Reflection.dll\",\n        \"ref/netstandard1.3/System.Reflection.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.5/System.Reflection.dll\",\n        \"ref/netstandard1.5/System.Reflection.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.4.3.0.nupkg.sha512\",\n        \"system.reflection.nuspec\"\n      ]\n    },\n    \"System.Reflection.Metadata/1.6.0\": {\n      \"sha512\": \"COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.metadata/1.6.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.1/System.Reflection.Metadata.dll\",\n        \"lib/netstandard1.1/System.Reflection.Metadata.xml\",\n        \"lib/netstandard2.0/System.Reflection.Metadata.dll\",\n        \"lib/netstandard2.0/System.Reflection.Metadata.xml\",\n        \"lib/portable-net45+win8/System.Reflection.Metadata.dll\",\n        \"lib/portable-net45+win8/System.Reflection.Metadata.xml\",\n        \"system.reflection.metadata.1.6.0.nupkg.sha512\",\n        \"system.reflection.metadata.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"sha512\": \"5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Reflection.Primitives.dll\",\n        \"ref/netcore50/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/de/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/es/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/fr/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/it/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ja/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ko/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ru/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.dll\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.primitives.4.3.0.nupkg.sha512\",\n        \"system.reflection.primitives.nuspec\"\n      ]\n    },\n    \"System.Reflection.TypeExtensions/4.3.0\": {\n      \"sha512\": \"7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.typeextensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Reflection.TypeExtensions.dll\",\n        \"lib/net462/System.Reflection.TypeExtensions.dll\",\n        \"lib/netcore50/System.Reflection.TypeExtensions.dll\",\n        \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Reflection.TypeExtensions.dll\",\n        \"ref/net462/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.3/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.3/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.5/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll\",\n        \"system.reflection.typeextensions.4.3.0.nupkg.sha512\",\n        \"system.reflection.typeextensions.nuspec\"\n      ]\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"sha512\": \"/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"type\": \"package\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Resources.ResourceManager.dll\",\n        \"ref/netcore50/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/de/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/es/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/it/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.dll\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/de/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/es/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/it/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n        \"system.resources.resourcemanager.nuspec\"\n      ]\n    },\n    \"System.Runtime/4.3.0\": {\n      \"sha512\": \"JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.dll\",\n        \"lib/portable-net45+win8+wp80+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.xml\",\n        \"ref/netcore50/de/System.Runtime.xml\",\n        \"ref/netcore50/es/System.Runtime.xml\",\n        \"ref/netcore50/fr/System.Runtime.xml\",\n        \"ref/netcore50/it/System.Runtime.xml\",\n        \"ref/netcore50/ja/System.Runtime.xml\",\n        \"ref/netcore50/ko/System.Runtime.xml\",\n        \"ref/netcore50/ru/System.Runtime.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.0/System.Runtime.dll\",\n        \"ref/netstandard1.0/System.Runtime.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.2/System.Runtime.dll\",\n        \"ref/netstandard1.2/System.Runtime.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.3/System.Runtime.dll\",\n        \"ref/netstandard1.3/System.Runtime.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.5/System.Runtime.dll\",\n        \"ref/netstandard1.5/System.Runtime.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.xml\",\n        \"ref/portable-net45+win8+wp80+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.4.3.0.nupkg.sha512\",\n        \"system.runtime.nuspec\"\n      ]\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n      \"sha512\": \"IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\",\n        \"system.runtime.compilerservices.unsafe.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"sha512\": \"guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/de/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/es/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/fr/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/it/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ja/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ko/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ru/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.extensions.4.3.0.nupkg.sha512\",\n        \"system.runtime.extensions.nuspec\"\n      ]\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"sha512\": \"OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/_._\",\n        \"ref/netstandard1.3/System.Runtime.Handles.dll\",\n        \"ref/netstandard1.3/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.handles.4.3.0.nupkg.sha512\",\n        \"system.runtime.handles.nuspec\"\n      ]\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"sha512\": \"uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.InteropServices.dll\",\n        \"lib/net463/System.Runtime.InteropServices.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.InteropServices.dll\",\n        \"ref/net463/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/de/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/es/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/it/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netcoreapp1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.interopservices.4.3.0.nupkg.sha512\",\n        \"system.runtime.interopservices.nuspec\"\n      ]\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"sha512\": \"P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Claims.dll\",\n        \"lib/netstandard1.3/System.Security.Claims.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/de/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/es/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/it/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Claims.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.claims.4.3.0.nupkg.sha512\",\n        \"system.security.claims.nuspec\"\n      ]\n    },\n    \"System.Security.Cryptography.Cng/4.5.0\": {\n      \"sha512\": \"WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.cryptography.cng/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Cryptography.Cng.dll\",\n        \"lib/net461/System.Security.Cryptography.Cng.dll\",\n        \"lib/net462/System.Security.Cryptography.Cng.dll\",\n        \"lib/net47/System.Security.Cryptography.Cng.dll\",\n        \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.3/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard2.0/System.Security.Cryptography.Cng.dll\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Cryptography.Cng.dll\",\n        \"ref/net461/System.Security.Cryptography.Cng.dll\",\n        \"ref/net461/System.Security.Cryptography.Cng.xml\",\n        \"ref/net462/System.Security.Cryptography.Cng.dll\",\n        \"ref/net462/System.Security.Cryptography.Cng.xml\",\n        \"ref/net47/System.Security.Cryptography.Cng.dll\",\n        \"ref/net47/System.Security.Cryptography.Cng.xml\",\n        \"ref/netcoreapp2.0/System.Security.Cryptography.Cng.dll\",\n        \"ref/netcoreapp2.0/System.Security.Cryptography.Cng.xml\",\n        \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.xml\",\n        \"ref/netstandard1.3/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard2.0/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard2.0/System.Security.Cryptography.Cng.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net47/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netcoreapp2.0/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/uap10.0.16299/_._\",\n        \"system.security.cryptography.cng.4.5.0.nupkg.sha512\",\n        \"system.security.cryptography.cng.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"sha512\": \"I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Security.Principal.dll\",\n        \"lib/netstandard1.0/System.Security.Principal.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Security.Principal.dll\",\n        \"ref/netcore50/System.Security.Principal.xml\",\n        \"ref/netcore50/de/System.Security.Principal.xml\",\n        \"ref/netcore50/es/System.Security.Principal.xml\",\n        \"ref/netcore50/fr/System.Security.Principal.xml\",\n        \"ref/netcore50/it/System.Security.Principal.xml\",\n        \"ref/netcore50/ja/System.Security.Principal.xml\",\n        \"ref/netcore50/ko/System.Security.Principal.xml\",\n        \"ref/netcore50/ru/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hans/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hant/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/System.Security.Principal.dll\",\n        \"ref/netstandard1.0/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/de/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/es/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/fr/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/it/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ja/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ko/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ru/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Security.Principal.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.principal.4.3.0.nupkg.sha512\",\n        \"system.security.principal.nuspec\"\n      ]\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"sha512\": \"HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Security.Principal.Windows.dll\",\n        \"ref/net46/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/de/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/es/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/it/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/net46/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"system.security.principal.windows.4.3.0.nupkg.sha512\",\n        \"system.security.principal.windows.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"sha512\": \"BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Text.Encoding.dll\",\n        \"ref/netcore50/System.Text.Encoding.xml\",\n        \"ref/netcore50/de/System.Text.Encoding.xml\",\n        \"ref/netcore50/es/System.Text.Encoding.xml\",\n        \"ref/netcore50/fr/System.Text.Encoding.xml\",\n        \"ref/netcore50/it/System.Text.Encoding.xml\",\n        \"ref/netcore50/ja/System.Text.Encoding.xml\",\n        \"ref/netcore50/ko/System.Text.Encoding.xml\",\n        \"ref/netcore50/ru/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/System.Text.Encoding.dll\",\n        \"ref/netstandard1.0/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/System.Text.Encoding.dll\",\n        \"ref/netstandard1.3/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Text.Encoding.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.text.encoding.4.3.0.nupkg.sha512\",\n        \"system.text.encoding.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding.CodePages/4.5.1\": {\n      \"sha512\": \"4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding.codepages/4.5.1\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Text.Encoding.CodePages.dll\",\n        \"lib/net461/System.Text.Encoding.CodePages.dll\",\n        \"lib/netstandard1.3/System.Text.Encoding.CodePages.dll\",\n        \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/win/lib/net461/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netstandard2.0/System.Text.Encoding.CodePages.dll\",\n        \"system.text.encoding.codepages.4.5.1.nupkg.sha512\",\n        \"system.text.encoding.codepages.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Text.Encoding.Extensions/4.3.0\": {\n      \"sha512\": \"YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Text.Encoding.Extensions.dll\",\n        \"ref/netcore50/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/de/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/es/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/fr/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/it/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/ja/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/ko/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/ru/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml\",\n        \"ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/System.Text.Encoding.Extensions.dll\",\n        \"ref/netstandard1.0/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/System.Text.Encoding.Extensions.dll\",\n        \"ref/netstandard1.3/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.text.encoding.extensions.4.3.0.nupkg.sha512\",\n        \"system.text.encoding.extensions.nuspec\"\n      ]\n    },\n    \"System.Text.Encodings.Web/4.5.0\": {\n      \"sha512\": \"Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encodings.web/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/System.Text.Encodings.Web.dll\",\n        \"lib/netstandard1.0/System.Text.Encodings.Web.xml\",\n        \"lib/netstandard2.0/System.Text.Encodings.Web.dll\",\n        \"lib/netstandard2.0/System.Text.Encodings.Web.xml\",\n        \"system.text.encodings.web.4.5.0.nupkg.sha512\",\n        \"system.text.encodings.web.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading/4.3.0\": {\n      \"sha512\": \"VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Threading.dll\",\n        \"lib/netstandard1.3/System.Threading.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.dll\",\n        \"ref/netcore50/System.Threading.xml\",\n        \"ref/netcore50/de/System.Threading.xml\",\n        \"ref/netcore50/es/System.Threading.xml\",\n        \"ref/netcore50/fr/System.Threading.xml\",\n        \"ref/netcore50/it/System.Threading.xml\",\n        \"ref/netcore50/ja/System.Threading.xml\",\n        \"ref/netcore50/ko/System.Threading.xml\",\n        \"ref/netcore50/ru/System.Threading.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.0/System.Threading.dll\",\n        \"ref/netstandard1.0/System.Threading.xml\",\n        \"ref/netstandard1.0/de/System.Threading.xml\",\n        \"ref/netstandard1.0/es/System.Threading.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.xml\",\n        \"ref/netstandard1.0/it/System.Threading.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.3/System.Threading.dll\",\n        \"ref/netstandard1.3/System.Threading.xml\",\n        \"ref/netstandard1.3/de/System.Threading.xml\",\n        \"ref/netstandard1.3/es/System.Threading.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.xml\",\n        \"ref/netstandard1.3/it/System.Threading.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Threading.dll\",\n        \"system.threading.4.3.0.nupkg.sha512\",\n        \"system.threading.nuspec\"\n      ]\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"sha512\": \"m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Threading.Overlapped.dll\",\n        \"ref/net46/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/net46/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netcore50/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"system.threading.overlapped.4.3.0.nupkg.sha512\",\n        \"system.threading.overlapped.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"sha512\": \"LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.Tasks.dll\",\n        \"ref/netcore50/System.Threading.Tasks.xml\",\n        \"ref/netcore50/de/System.Threading.Tasks.xml\",\n        \"ref/netcore50/es/System.Threading.Tasks.xml\",\n        \"ref/netcore50/fr/System.Threading.Tasks.xml\",\n        \"ref/netcore50/it/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ja/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ko/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ru/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.0/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.3/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.4.3.0.nupkg.sha512\",\n        \"system.threading.tasks.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks.Extensions/4.5.3\": {\n      \"sha512\": \"+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks.extensions/4.5.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/netcoreapp2.1/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.extensions.4.5.3.nupkg.sha512\",\n        \"system.threading.tasks.extensions.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"sha512\": \"OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.Thread.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.Thread.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Thread.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.thread.4.3.0.nupkg.sha512\",\n        \"system.threading.thread.nuspec\"\n      ]\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"sha512\": \"k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.ThreadPool.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/de/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/es/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/it/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.threadpool.4.3.0.nupkg.sha512\",\n        \"system.threading.threadpool.nuspec\"\n      ]\n    },\n    \"Splamy.TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"path\": \"../TSLib/TSLib.csproj\",\n      \"msbuildProject\": \"../TSLib/TSLib.csproj\"\n    }\n  },\n  \"projectFileDependencyGroups\": {\n    \".NETCoreApp,Version=v3.1\": [\n      \"CliWrap >= 3.1.0\",\n      \"CommandLineParser >= 2.8.0\",\n      \"LiteDB >= 4.1.4\",\n      \"Microsoft.AspNetCore.Cors >= 2.2.0\",\n      \"Microsoft.AspNetCore.Server.Kestrel >= 2.2.0\",\n      \"Microsoft.AspNetCore.StaticFiles >= 2.2.0\",\n      \"Microsoft.CodeAnalysis.CSharp >= 3.7.0\",\n      \"NLog >= 4.7.3\",\n      \"Nett >= 0.15.0\",\n      \"Newtonsoft.Json >= 12.0.3\",\n      \"PlaylistsNET >= 1.1.2\",\n      \"SixLabors.ImageSharp >= 1.0.0\",\n      \"Splamy.TSLib >= 1.1.0\"\n    ]\n  },\n  \"packageFolders\": {\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\\": {},\n    \"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\Shared\\\\NuGetPackages\": {}\n  },\n  \"project\": {\n    \"version\": \"1.0.0\",\n    \"restore\": {\n      \"projectUniqueName\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n      \"projectName\": \"TS3AudioBot\",\n      \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n      \"packagesPath\": \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\\",\n      \"outputPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\obj\\\\publish\\\\win-x64\\\\\",\n      \"projectStyle\": \"PackageReference\",\n      \"fallbackFolders\": [\n        \"C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\Shared\\\\NuGetPackages\"\n      ],\n      \"configFilePaths\": [\n        \"C:\\\\Users\\\\13336\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n        \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.FallbackLocation.config\",\n        \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n      ],\n      \"originalTargetFrameworks\": [\n        \"netcoreapp3.1\"\n      ],\n      \"sources\": {\n        \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n        \"https://api.nuget.org/v3/index.json\": {}\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"projectReferences\": {\n            \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n              \"projectPath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n            }\n          }\n        }\n      },\n      \"warningProperties\": {\n        \"warnAsError\": [\n          \"NU1605\"\n        ]\n      }\n    },\n    \"frameworks\": {\n      \"netcoreapp3.1\": {\n        \"targetAlias\": \"netcoreapp3.1\",\n        \"dependencies\": {\n          \"CliWrap\": {\n            \"target\": \"Package\",\n            \"version\": \"[3.1.0, )\"\n          },\n          \"CommandLineParser\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.8.0, )\"\n          },\n          \"LiteDB\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.1.4, )\"\n          },\n          \"Microsoft.AspNetCore.Cors\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.AspNetCore.Server.Kestrel\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.AspNetCore.StaticFiles\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.2.0, )\"\n          },\n          \"Microsoft.CodeAnalysis.CSharp\": {\n            \"include\": \"Runtime, Compile, Build, Native, ContentFiles, BuildTransitive\",\n            \"target\": \"Package\",\n            \"version\": \"[3.7.0, )\"\n          },\n          \"NLog\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.3, )\"\n          },\n          \"Nett\": {\n            \"target\": \"Package\",\n            \"version\": \"[0.15.0, )\"\n          },\n          \"Newtonsoft.Json\": {\n            \"target\": \"Package\",\n            \"version\": \"[12.0.3, )\"\n          },\n          \"PlaylistsNET\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.1.2, )\"\n          },\n          \"SixLabors.ImageSharp\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.0.0, )\"\n          }\n        },\n        \"imports\": [\n          \"net461\",\n          \"net462\",\n          \"net47\",\n          \"net471\",\n          \"net472\",\n          \"net48\",\n          \"net481\"\n        ],\n        \"assetTargetFallback\": true,\n        \"warn\": true,\n        \"downloadDependencies\": [\n          {\n            \"name\": \"Microsoft.AspNetCore.App.Ref\",\n            \"version\": \"[3.1.10, 3.1.10]\"\n          },\n          {\n            \"name\": \"Microsoft.AspNetCore.App.Runtime.win-x64\",\n            \"version\": \"[3.1.32, 3.1.32]\"\n          },\n          {\n            \"name\": \"Microsoft.NETCore.App.Host.win-x64\",\n            \"version\": \"[3.1.32, 3.1.32]\"\n          },\n          {\n            \"name\": \"Microsoft.NETCore.App.Ref\",\n            \"version\": \"[3.1.0, 3.1.0]\"\n          },\n          {\n            \"name\": \"Microsoft.NETCore.App.Runtime.win-x64\",\n            \"version\": \"[3.1.32, 3.1.32]\"\n          },\n          {\n            \"name\": \"Microsoft.WindowsDesktop.App.Ref\",\n            \"version\": \"[3.1.0, 3.1.0]\"\n          },\n          {\n            \"name\": \"Microsoft.WindowsDesktop.App.Runtime.win-x64\",\n            \"version\": \"[3.1.32, 3.1.32]\"\n          }\n        ],\n        \"frameworkReferences\": {\n          \"Microsoft.NETCore.App\": {\n            \"privateAssets\": \"all\"\n          }\n        },\n        \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\7.0.201\\\\RuntimeIdentifierGraph.json\"\n      }\n    },\n    \"runtimes\": {\n      \"win-x64\": {\n        \"#import\": []\n      }\n    }\n  }\n}"
  },
  {
    "path": "TS3AudioBot/obj/publish/win-x64/project.nuget.cache",
    "content": "{\n  \"version\": 2,\n  \"dgSpecHash\": \"GYIGf3if42QEtG/dcHmDuBdig+mg3nhFkeLTDebbx7VJHr13q1tpcgriOzm4tmyW5aaepnvm1Emtb9YMk9b7Dw==\",\n  \"success\": true,\n  \"projectFilePath\": \"C:\\\\Users\\\\13336\\\\OneDrive\\\\桌面\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n  \"expectedPackageFiles\": [\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\cliwrap\\\\3.1.0\\\\cliwrap.3.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\commandlineparser\\\\2.8.0\\\\commandlineparser.2.8.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\heijden.dns.portable\\\\2.0.19\\\\heijden.dns.portable.2.0.19.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\litedb\\\\4.1.4\\\\litedb.4.1.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.connections.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.cors\\\\2.2.0\\\\microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting\\\\2.2.0\\\\microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting.server.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http\\\\2.2.0\\\\microsoft.aspnetcore.http.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.extensions\\\\2.2.0\\\\microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.features\\\\2.2.0\\\\microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.core\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.https\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.transport.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.transport.sockets\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.staticfiles\\\\2.2.0\\\\microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.webutilities\\\\2.2.0\\\\microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.analyzers\\\\3.0.0\\\\microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.common\\\\3.7.0\\\\microsoft.codeanalysis.common.3.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.csharp\\\\3.7.0\\\\microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration\\\\2.2.0\\\\microsoft.extensions.configuration.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.abstractions\\\\2.2.0\\\\microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.binder\\\\2.2.0\\\\microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.environmentvariables\\\\2.2.0\\\\microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.fileextensions\\\\2.2.0\\\\microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.dependencyinjection\\\\2.2.0\\\\microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.dependencyinjection.abstractions\\\\2.2.0\\\\microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.fileproviders.abstractions\\\\2.2.0\\\\microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.fileproviders.physical\\\\2.2.0\\\\microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.filesystemglobbing\\\\2.2.0\\\\microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.hosting.abstractions\\\\2.2.0\\\\microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.logging\\\\2.2.0\\\\microsoft.extensions.logging.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.logging.abstractions\\\\2.2.0\\\\microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.objectpool\\\\2.2.0\\\\microsoft.extensions.objectpool.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.options\\\\2.2.0\\\\microsoft.extensions.options.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.primitives\\\\2.2.0\\\\microsoft.extensions.primitives.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.extensions.webencoders\\\\2.2.0\\\\microsoft.extensions.webencoders.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.net.http.headers\\\\2.2.0\\\\microsoft.net.http.headers.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.platforms\\\\2.1.2\\\\microsoft.netcore.platforms.2.1.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.targets\\\\1.1.0\\\\microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.win32.primitives\\\\4.3.0\\\\microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\nett\\\\0.15.0\\\\nett.0.15.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\newtonsoft.json\\\\12.0.3\\\\newtonsoft.json.12.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\nlog\\\\4.7.3\\\\nlog.4.7.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\playlistsnet\\\\1.1.2\\\\playlistsnet.1.1.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\portable.bouncycastle\\\\1.8.6.7\\\\portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.collections\\\\4.3.0\\\\runtime.any.system.collections.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.diagnostics.tracing\\\\4.3.0\\\\runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.globalization\\\\4.3.0\\\\runtime.any.system.globalization.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.io\\\\4.3.0\\\\runtime.any.system.io.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.reflection\\\\4.3.0\\\\runtime.any.system.reflection.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.reflection.primitives\\\\4.3.0\\\\runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.resources.resourcemanager\\\\4.3.0\\\\runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.runtime\\\\4.3.0\\\\runtime.any.system.runtime.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.runtime.handles\\\\4.3.0\\\\runtime.any.system.runtime.handles.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.runtime.interopservices\\\\4.3.0\\\\runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.text.encoding\\\\4.3.0\\\\runtime.any.system.text.encoding.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.text.encoding.extensions\\\\4.3.0\\\\runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.any.system.threading.tasks\\\\4.3.0\\\\runtime.any.system.threading.tasks.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.native.system\\\\4.3.0\\\\runtime.native.system.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.win.microsoft.win32.primitives\\\\4.3.0\\\\runtime.win.microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.win.system.diagnostics.debug\\\\4.3.0\\\\runtime.win.system.diagnostics.debug.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.win.system.io.filesystem\\\\4.3.0\\\\runtime.win.system.io.filesystem.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.win.system.net.primitives\\\\4.3.0\\\\runtime.win.system.net.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.win.system.net.sockets\\\\4.3.0\\\\runtime.win.system.net.sockets.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\runtime.win.system.runtime.extensions\\\\4.3.0\\\\runtime.win.system.runtime.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\sixlabors.imagesharp\\\\1.0.0\\\\sixlabors.imagesharp.1.0.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\splamy.ed25519.toolkit\\\\1.0.3\\\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.buffers\\\\4.5.0\\\\system.buffers.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.collections\\\\4.3.0\\\\system.collections.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.collections.immutable\\\\1.5.0\\\\system.collections.immutable.1.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.componentmodel.annotations\\\\4.5.0\\\\system.componentmodel.annotations.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.diagnostics.debug\\\\4.3.0\\\\system.diagnostics.debug.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.diagnostics.diagnosticsource\\\\4.5.0\\\\system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.diagnostics.tracing\\\\4.3.0\\\\system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.globalization\\\\4.3.0\\\\system.globalization.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.io\\\\4.3.0\\\\system.io.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.io.filesystem\\\\4.3.0\\\\system.io.filesystem.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.io.filesystem.primitives\\\\4.3.0\\\\system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.io.pipelines\\\\4.7.2\\\\system.io.pipelines.4.7.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.linq\\\\4.3.0\\\\system.linq.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.memory\\\\4.5.4\\\\system.memory.4.5.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.net.nameresolution\\\\4.3.0\\\\system.net.nameresolution.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.net.networkinformation\\\\4.3.0\\\\system.net.networkinformation.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.net.primitives\\\\4.3.0\\\\system.net.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.net.sockets\\\\4.3.0\\\\system.net.sockets.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.numerics.vectors\\\\4.5.0\\\\system.numerics.vectors.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.private.uri\\\\4.3.0\\\\system.private.uri.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.reflection\\\\4.3.0\\\\system.reflection.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.reflection.metadata\\\\1.6.0\\\\system.reflection.metadata.1.6.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.reflection.primitives\\\\4.3.0\\\\system.reflection.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.reflection.typeextensions\\\\4.3.0\\\\system.reflection.typeextensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.resources.resourcemanager\\\\4.3.0\\\\system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime\\\\4.3.0\\\\system.runtime.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime.compilerservices.unsafe\\\\4.7.0\\\\system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime.extensions\\\\4.3.0\\\\system.runtime.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime.handles\\\\4.3.0\\\\system.runtime.handles.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.runtime.interopservices\\\\4.3.0\\\\system.runtime.interopservices.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.security.claims\\\\4.3.0\\\\system.security.claims.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.security.cryptography.cng\\\\4.5.0\\\\system.security.cryptography.cng.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.security.principal\\\\4.3.0\\\\system.security.principal.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.security.principal.windows\\\\4.3.0\\\\system.security.principal.windows.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.text.encoding\\\\4.3.0\\\\system.text.encoding.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.text.encoding.codepages\\\\4.5.1\\\\system.text.encoding.codepages.4.5.1.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.text.encoding.extensions\\\\4.3.0\\\\system.text.encoding.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.text.encodings.web\\\\4.5.0\\\\system.text.encodings.web.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading\\\\4.3.0\\\\system.threading.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.overlapped\\\\4.3.0\\\\system.threading.overlapped.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.tasks\\\\4.3.0\\\\system.threading.tasks.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.tasks.extensions\\\\4.5.3\\\\system.threading.tasks.extensions.4.5.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.thread\\\\4.3.0\\\\system.threading.thread.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\system.threading.threadpool\\\\4.3.0\\\\system.threading.threadpool.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.app.ref\\\\3.1.0\\\\microsoft.netcore.app.ref.3.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.windowsdesktop.app.ref\\\\3.1.0\\\\microsoft.windowsdesktop.app.ref.3.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.app.runtime.win-x64\\\\3.1.32\\\\microsoft.netcore.app.runtime.win-x64.3.1.32.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.windowsdesktop.app.runtime.win-x64\\\\3.1.32\\\\microsoft.windowsdesktop.app.runtime.win-x64.3.1.32.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.app.runtime.win-x64\\\\3.1.32\\\\microsoft.aspnetcore.app.runtime.win-x64.3.1.32.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.netcore.app.host.win-x64\\\\3.1.32\\\\microsoft.netcore.app.host.win-x64.3.1.32.nupkg.sha512\",\n    \"C:\\\\Users\\\\13336\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.app.ref\\\\3.1.10\\\\microsoft.aspnetcore.app.ref.3.1.10.nupkg.sha512\"\n  ],\n  \"logs\": []\n}"
  },
  {
    "path": "TSLib/Audio/AudioInterfaces.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Audio\n{\n\tpublic interface IAudioStream { }\n\n\t/// <summary>Passive producer will serve audio data that must be read.</summary>\n\tpublic interface IAudioPassiveProducer : IAudioStream, IDisposable\n\t{\n\t\tint Read(byte[] buffer, int offset, int length, out Meta? meta);\n\t}\n\t/// <summary>Active producer will push audio to the out stream.</summary>\n\tpublic interface IAudioActiveProducer : IAudioStream\n\t{\n\t\tIAudioPassiveConsumer? OutStream { get; set; }\n\t}\n\t/// <summary>Passive consumer will wait for manually passed audio data.</summary>\n\tpublic interface IAudioPassiveConsumer : IAudioStream\n\t{\n\t\tbool Active { get; }\n\t\tvoid Write(Span<byte> data, Meta? meta);\n\t}\n\t/// <summary>Active consumer will pull audio data when required.</summary>\n\tpublic interface IAudioActiveConsumer : IAudioStream\n\t{\n\t\tIAudioPassiveProducer? InStream { get; set; }\n\t}\n\n\t// Best practices for pipes:\n\t// - Use Active-Propagiation: `Active => OutStream?.Active ?? false`\n\t// - Alway check `OutStream != null` at begin of Write(...)\n\tpublic interface IAudioPipe : IAudioPassiveConsumer, IAudioActiveProducer { }\n\n\tpublic interface ISampleInfo\n\t{\n\t\tint SampleRate { get; }\n\t\tint Channels { get; }\n\t\tint BitsPerSample { get; }\n\t}\n\n\tpublic sealed class SampleInfo : ISampleInfo\n\t{\n\t\tpublic int SampleRate { get; }\n\t\tpublic int Channels { get; }\n\t\tpublic int BitsPerSample { get; }\n\n\t\tpublic SampleInfo(int sampleRate, int channels, int bitsPerSample)\n\t\t{\n\t\t\tSampleRate = sampleRate;\n\t\t\tChannels = channels;\n\t\t\tBitsPerSample = bitsPerSample;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/AudioMeta.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\n\nnamespace TSLib.Audio\n{\n\tpublic class Meta\n\t{\n\t\tpublic Codec? Codec { get; set; }\n\t\tpublic MetaIn In;\n\t\tpublic MetaOut? Out { get; set; }\n\t\t//public PipeControl Control { get; set; }\n\t}\n\n\tpublic struct MetaIn\n\t{\n\t\tpublic ClientId Sender { get; set; }\n\t\tpublic bool Whisper { get; set; }\n\t}\n\n\tpublic class MetaOut\n\t{\n\t\tpublic TargetSendMode SendMode { get; set; }\n\t\tpublic ulong TargetId { get; set; }\n\t\tpublic GroupWhisperTarget GroupWhisperTarget { get; set; }\n\t\tpublic GroupWhisperType GroupWhisperType { get; set; }\n\t\tpublic IReadOnlyList<ChannelId>? ChannelIds { get; set; }\n\t\tpublic IReadOnlyList<ClientId>? ClientIds { get; set; }\n\t}\n\n\tpublic enum TargetSendMode\n\t{\n\t\tNone,\n\t\tVoice,\n\t\tWhisper,\n\t\tWhisperGroup,\n\t}\n\n\tpublic enum PipeControl\n\t{\n\t\tData,\n\t\tEmptyTick,\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/AudioPacketReader.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Buffers.Binary;\n\nnamespace TSLib.Audio\n{\n\tpublic class AudioPacketReader : IAudioPipe\n\t{\n\t\tpublic bool Active => OutStream?.Active ?? false;\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (OutStream is null || meta is null)\n\t\t\t\treturn;\n\n\t\t\t// End of stream is signalled with no data or a single byte.\n\t\t\t// The header has 5 bytes, so check for 6.\n\t\t\tif (data.Length < 6)\n\t\t\t\treturn;\n\n\t\t\t// Skip [0,2) Voice Packet Id for now\n\t\t\t// TODO add packet id order checking\n\t\t\t// TODO add defragment start\n\t\t\tmeta.In.Sender = (ClientId)BinaryPrimitives.ReadUInt16BigEndian(data.Slice(2, 2));\n\t\t\tmeta.Codec = (Codec)data[4];\n\t\t\tOutStream?.Write(data.Slice(5), meta);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/AudioPipeExtensions.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Audio\n{\n\tpublic static class AudioPipeExtensions\n\t{\n\t\tpublic static T Chain<T>(this IAudioActiveProducer producer, T addConsumer) where T : IAudioPassiveConsumer\n\t\t{\n\t\t\tif (producer.OutStream is null)\n\t\t\t{\n\t\t\t\tproducer.OutStream = addConsumer;\n\t\t\t}\n\t\t\telse if (producer.OutStream is PassiveSplitterPipe splitter)\n\t\t\t{\n\t\t\t\tsplitter.Add(addConsumer);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsplitter = new PassiveSplitterPipe();\n\t\t\t\tsplitter.Add(addConsumer);\n\t\t\t\tsplitter.Add(producer.OutStream);\n\t\t\t\tproducer.OutStream = splitter;\n\t\t\t}\n\t\t\treturn addConsumer;\n\t\t}\n\n\t\tpublic static T Chain<T>(this IAudioActiveProducer producer, Action<T>? init = null) where T : IAudioPassiveConsumer, new()\n\t\t{\n\t\t\tvar addConsumer = new T();\n\t\t\tinit?.Invoke(addConsumer);\n\t\t\treturn producer.Chain(addConsumer);\n\t\t}\n\n\t\tpublic static T Into<T>(this IAudioPassiveProducer producer, T reader) where T : IAudioActiveConsumer\n\t\t{\n\t\t\treader.InStream = producer;\n\t\t\treturn reader;\n\t\t}\n\n\t\tpublic static T Into<T>(this IAudioPassiveProducer producer, Action<T>? init = null) where T : IAudioActiveConsumer, new()\n\t\t{\n\t\t\tvar reader = new T();\n\t\t\tinit?.Invoke(reader);\n\t\t\treturn producer.Into(reader);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/AudioTools.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Runtime.InteropServices;\n\nnamespace TSLib.Audio\n{\n\tpublic static class AudioTools\n\t{\n\t\tpublic static bool TryMonoToStereo(byte[] pcm, ref int length)\n\t\t{\n\t\t\tif (length / 2 >= pcm.Length)\n\t\t\t\treturn false;\n\n\t\t\tvar shortArr = MemoryMarshal.Cast<byte, short>(pcm);\n\n\t\t\tfor (int i = (length / 2) - 1; i >= 0; i--)\n\t\t\t{\n\t\t\t\tshortArr[i * 2 + 0] = shortArr[i];\n\t\t\t\tshortArr[i * 2 + 1] = shortArr[i];\n\t\t\t}\n\n\t\t\tlength *= 2;\n\n\t\t\treturn true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/CheckActivePipe.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Audio\n{\n\tpublic class CheckActivePipe : IAudioPipe\n\t{\n\t\tpublic bool Active => OutStream?.Active ?? false;\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (OutStream is null || data.IsEmpty || !Active)\n\t\t\t\treturn;\n\n\t\t\tOutStream?.Write(data, meta);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/ClientMixdown.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace TSLib.Audio\n{\n\tpublic class ClientMixdown : PassiveMergePipe, IAudioPassiveConsumer\n\t{\n\t\tpublic bool Active => true;\n\n\t\tprivate const int BufferSize = 4096 * 8;\n\n\t\tprivate readonly Dictionary<ClientId, ClientMix> mixdownBuffer = new Dictionary<ClientId, ClientMix>();\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (data.IsEmpty || meta is null)\n\t\t\t\treturn;\n\n\t\t\tif (!mixdownBuffer.TryGetValue(meta.In.Sender, out var mix))\n\t\t\t{\n\t\t\t\tmix = new ClientMix(BufferSize);\n\t\t\t\tmixdownBuffer.Add(meta.In.Sender, mix);\n\t\t\t\tAdd(mix);\n\t\t\t}\n\n\t\t\tmix.Write(data, meta);\n\t\t\t/*\n\t\t\tList<KeyValuePair<ushort, ClientMix>> remove = null;\n\t\t\tforeach (var item in mixdownBuffer)\n\t\t\t{\n\t\t\t\tif (item.Value.Length == 0)\n\t\t\t\t{\n\t\t\t\t\tremove = remove ?? new List<KeyValuePair<ushort, ClientMix>>();\n\t\t\t\t\tremove.Add(item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (remove != null)\n\t\t\t{\n\t\t\t\tforeach (var item in remove)\n\t\t\t\t{\n\t\t\t\t\tmixdownBuffer.Remove(item.Key);\n\t\t\t\t\tRemove(item.Value);\n\t\t\t\t}\n\t\t\t}*/\n\t\t}\n\n\t\tpublic class ClientMix : IAudioPassiveProducer\n\t\t{\n\t\t\tpublic byte[] Buffer { get; }\n\t\t\tpublic int Length { get; set; } = 0;\n\t\t\tpublic Meta? LastMeta { get; set; }\n\n\t\t\tprivate readonly object rwLock = new object();\n\n\t\t\tpublic ClientMix(int bufferSize)\n\t\t\t{\n\t\t\t\tBuffer = new byte[bufferSize];\n\t\t\t}\n\n\t\t\tpublic void Write(Span<byte> data, Meta meta)\n\t\t\t{\n\t\t\t\tlock (rwLock)\n\t\t\t\t{\n\t\t\t\t\tint take = Math.Min(data.Length, Buffer.Length - Length);\n\t\t\t\t\tdata.Slice(0, take).CopyTo(Buffer.AsSpan(Length));\n\t\t\t\t\tLength += take;\n\t\t\t\t\tLastMeta = meta;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic int Read(byte[] buffer, int offset, int length, out Meta? meta)\n\t\t\t{\n\t\t\t\tlock (rwLock)\n\t\t\t\t{\n\t\t\t\t\tint take = Math.Min(Length, length);\n\n\t\t\t\t\tArray.Copy(Buffer, 0, buffer, offset, take);\n\t\t\t\t\tArray.Copy(Buffer, take, Buffer, 0, Buffer.Length - take);\n\t\t\t\t\tLength -= take;\n\n\t\t\t\t\tmeta = default;\n\t\t\t\t\treturn take;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void Dispose() { }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/DecoderPipe.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing TSLib.Audio.Opus;\n\nnamespace TSLib.Audio\n{\n\tpublic class DecoderPipe : IAudioPipe, IDisposable, ISampleInfo\n\t{\n\t\tpublic bool Active => OutStream?.Active ?? false;\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\n\t\tpublic int SampleRate { get; } = 48_000;\n\t\tpublic int Channels { get; } = 2;\n\t\tpublic int BitsPerSample { get; } = 16;\n\n\t\t// TOOO:\n\t\t// - Add some sort of decoder reuse to reduce concurrent amount of decoders (see ctl 'reset')\n\t\t// - Clean up decoders after some time (Control: Tick?)\n\t\t// - Make dispose threadsafe OR redefine thread safety requirements for pipes.\n\n\t\tprivate readonly Dictionary<ClientId, (OpusDecoder, Codec)> decoders = new Dictionary<ClientId, (OpusDecoder, Codec)>();\n\t\tprivate readonly byte[] decodedBuffer;\n\n\t\tpublic DecoderPipe()\n\t\t{\n\t\t\tdecodedBuffer = new byte[4096 * 2];\n\t\t}\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (OutStream is null || meta?.Codec is null)\n\t\t\t\treturn;\n\n\t\t\tswitch (meta.Codec.Value)\n\t\t\t{\n\t\t\tcase Codec.OpusVoice:\n\t\t\t\t{\n\t\t\t\t\tvar decoder = GetDecoder(meta.In.Sender, Codec.OpusVoice);\n\t\t\t\t\tvar decodedData = decoder.Decode(data, decodedBuffer.AsSpan(0, decodedBuffer.Length / 2));\n\t\t\t\t\tint dataLength = decodedData.Length;\n\t\t\t\t\tif (!AudioTools.TryMonoToStereo(decodedBuffer, ref dataLength))\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tOutStream?.Write(decodedBuffer.AsSpan(0, dataLength), meta);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase Codec.OpusMusic:\n\t\t\t\t{\n\t\t\t\t\tvar decoder = GetDecoder(meta.In.Sender, Codec.OpusMusic);\n\t\t\t\t\tvar decodedData = decoder.Decode(data, decodedBuffer);\n\t\t\t\t\tOutStream?.Write(decodedData, meta);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Cannot decode\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tprivate OpusDecoder GetDecoder(ClientId sender, Codec codec)\n\t\t{\n\t\t\tif (decoders.TryGetValue(sender, out var decoder))\n\t\t\t{\n\t\t\t\tif (decoder.Item2 == codec)\n\t\t\t\t\treturn decoder.Item1;\n\t\t\t\telse\n\t\t\t\t\tdecoder.Item1.Dispose();\n\t\t\t}\n\n\t\t\tvar newDecoder = CreateDecoder(codec);\n\t\t\tdecoders[sender] = (newDecoder, codec);\n\t\t\treturn newDecoder;\n\t\t}\n\n\t\tprivate OpusDecoder CreateDecoder(Codec codec)\n\t\t{\n\t\t\treturn codec switch\n\t\t\t{\n\t\t\t\tCodec.OpusVoice => OpusDecoder.Create(SampleRate, 1),\n\t\t\t\tCodec.OpusMusic => OpusDecoder.Create(SampleRate, 2),\n\t\t\t\t_ => throw new NotSupportedException(),\n\t\t\t};\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tforeach (var (decoder, _) in decoders.Values)\n\t\t\t{\n\t\t\t\tdecoder.Dispose();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/EncoderPipe.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TSLib.Audio.Opus;\n\nnamespace TSLib.Audio\n{\n\tpublic class EncoderPipe : IAudioPipe, IDisposable, ISampleInfo\n\t{\n\t\tpublic bool Active => OutStream?.Active ?? false;\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\n\t\tpublic Codec Codec { get; }\n\t\tpublic int SampleRate { get; }\n\t\tpublic int Channels { get; }\n\t\tpublic int BitsPerSample { get; }\n\n\t\tpublic int PacketSize { get; }\n\t\tpublic int Bitrate { get => opusEncoder.Bitrate; set => opusEncoder.Bitrate = value; }\n\n\t\t// opus\n\t\tprivate readonly OpusEncoder opusEncoder;\n\n\t\tprivate const int SegmentFrames = 960;\n\t\t// todo add upper limit to buffer size and drop everying over\n\t\tprivate byte[] notEncodedBuffer = Array.Empty<byte>();\n\t\tprivate int notEncodedLength;\n\t\t// https://tools.ietf.org/html/rfc6716#section-3.2.1\n\t\tprivate const int max_encoded_size = 255 * 4 + 255;\n\t\tprivate readonly byte[] encodedBuffer = new byte[max_encoded_size];\n\n\t\tpublic EncoderPipe(Codec codec)\n\t\t{\n\t\t\tCodec = codec;\n\n\t\t\tswitch (codec)\n\t\t\t{\n\t\t\tcase Codec.Raw:\n\t\t\t\tthrow new InvalidOperationException(\"Raw is not a valid encoding target\");\n\t\t\tcase Codec.SpeexNarrowband:\n\t\t\t\tthrow new NotSupportedException();\n\t\t\tcase Codec.SpeexWideband:\n\t\t\t\tthrow new NotSupportedException();\n\t\t\tcase Codec.SpeexUltraWideband:\n\t\t\t\tthrow new NotSupportedException();\n\t\t\tcase Codec.CeltMono:\n\t\t\t\tthrow new NotSupportedException();\n\n\t\t\tcase Codec.OpusVoice:\n\t\t\t\tSampleRate = 48000;\n\t\t\t\tChannels = 1;\n\t\t\t\topusEncoder = OpusEncoder.Create(SampleRate, Channels, Application.Voip);\n\t\t\t\tBitrate = 8192 * 2;\n\t\t\t\tbreak;\n\n\t\t\tcase Codec.OpusMusic:\n\t\t\t\tSampleRate = 48000;\n\t\t\t\tChannels = 2;\n\t\t\t\topusEncoder = OpusEncoder.Create(SampleRate, Channels, Application.Audio);\n\t\t\t\tBitrate = 8192 * 4;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(codec));\n\t\t\t}\n\n\t\t\tBitsPerSample = 16;\n\t\t\tPacketSize = opusEncoder.FrameByteCount(SegmentFrames);\n\t\t}\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (OutStream is null)\n\t\t\t\treturn;\n\n\t\t\tint newSoundBufferLength = data.Length + notEncodedLength;\n\t\t\tif (newSoundBufferLength > notEncodedBuffer.Length)\n\t\t\t{\n\t\t\t\tvar tmpSoundBuffer = new byte[newSoundBufferLength];\n\t\t\t\tArray.Copy(notEncodedBuffer, 0, tmpSoundBuffer, 0, notEncodedLength);\n\t\t\t\tnotEncodedBuffer = tmpSoundBuffer;\n\t\t\t}\n\n\t\t\tvar soundBuffer = notEncodedBuffer.AsSpan();\n\t\t\tdata.CopyTo(soundBuffer.Slice(notEncodedLength));\n\n\t\t\tint segmentCount = newSoundBufferLength / PacketSize;\n\t\t\tint segmentsEnd = segmentCount * PacketSize;\n\t\t\tnotEncodedLength = newSoundBufferLength - segmentsEnd;\n\n\t\t\tfor (int i = 0; i < segmentCount; i++)\n\t\t\t{\n\t\t\t\tvar encodedData = opusEncoder.Encode(soundBuffer.Slice(i * PacketSize, PacketSize), PacketSize, encodedBuffer);\n\t\t\t\tmeta ??= new Meta();\n\t\t\t\tmeta.Codec = Codec; // TODO copy ?\n\t\t\t\tOutStream?.Write(encodedData, meta);\n\t\t\t}\n\n\t\t\tsoundBuffer.Slice(segmentsEnd, notEncodedLength).CopyTo(soundBuffer);\n\t\t}\n\n\t\tpublic TimeSpan GetPlayLength(int bytes)\n\t\t{\n\t\t\treturn TimeSpan.FromSeconds(bytes / (double)(SampleRate * (BitsPerSample / 8) * Channels));\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\topusEncoder?.Dispose();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/Opus/LICENSE",
    "content": "Copyright 2012 John Carruthers\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "TSLib/Audio/Opus/NativeMethods.cs",
    "content": "// Copyright 2012 John Carruthers\n// \n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// \n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nusing System;\nusing System.Runtime.InteropServices;\nusing TSLib.Helper;\n\nnamespace TSLib.Audio.Opus\n{\n\t/// <summary>\n\t/// Wraps the Opus API.\n\t/// </summary>\n\tpublic static class NativeMethods\n\t{\n\t\tprivate static bool isPreloaded = false;\n\t\tprivate static bool wasPreloadSuccessful = false;\n\n\t\tstatic NativeMethods()\n\t\t{\n\t\t\tPreloadLibrary();\n\t\t}\n\n\t\tpublic static bool PreloadLibrary()\n\t\t{\n\t\t\tif (!isPreloaded)\n\t\t\t{\n\t\t\t\twasPreloadSuccessful = NativeLibraryLoader.DirectLoadLibrary(\"libopus\", () => opus_get_version_string());\n\t\t\t\tisPreloaded = true;\n\t\t\t}\n\t\t\treturn wasPreloadSuccessful;\n\t\t}\n\n\t\tpublic static string Info\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar verStrPtr = opus_get_version_string();\n\t\t\t\tvar verString = Marshal.PtrToStringAnsi(verStrPtr);\n\t\t\t\treturn $\"{verString} ({NativeLibraryLoader.ArchFolder})\";\n\t\t\t}\n\t\t}\n\n\t\t// ReSharper disable EnumUnderlyingTypeIsInt, InconsistentNaming\n#pragma warning disable IDE1006\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern IntPtr opus_encoder_create(int sampleRate, int channels, Application application, out IntPtr error);\n\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern void opus_encoder_destroy(IntPtr encoder);\n\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern int opus_encode(IntPtr st, in byte pcm, int frameSize, out byte data, int maxDataBytes);\n\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern IntPtr opus_decoder_create(int sampleRate, int channels, out IntPtr error);\n\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern void opus_decoder_destroy(IntPtr decoder);\n\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern int opus_decode(IntPtr st, in byte data, int len, out byte pcm, int frameSize, int decodeFec);\n\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern int opus_encoder_ctl(IntPtr st, Ctl request, int value);\n\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern int opus_encoder_ctl(IntPtr st, Ctl request, out int value);\n\n\t\t[DllImport(\"libopus\", CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern IntPtr opus_get_version_string();\n#pragma warning restore IDE1006\n\t}\n\n\tpublic enum Ctl : int\n\t{\n\t\tSetBitrateRequest = 4002,\n\t\tGetBitrateRequest = 4003,\n\t\tSetInbandFecRequest = 4012,\n\t\tGetInbandFecRequest = 4013\n\t}\n\n\t/// <summary>\n\t/// Supported coding modes.\n\t/// </summary>\n\tpublic enum Application : int\n\t{\n\t\t/// <summary>\n\t\t/// Best for most VoIP/videoconference applications where listening quality and intelligibility matter most.\n\t\t/// </summary>\n\t\tVoip = 2048,\n\t\t/// <summary>\n\t\t/// Best for broadcast/high-fidelity application where the decoded audio should be as close as possible to input.\n\t\t/// </summary>\n\t\tAudio = 2049,\n\t\t/// <summary>\n\t\t/// Only use when lowest-achievable latency is what matters most. Voice-optimized modes cannot be used.\n\t\t/// </summary>\n\t\tRestrictedLowLatency = 2051\n\t}\n\n\tpublic enum Errors : int\n\t{\n\t\t/// <summary>\n\t\t/// No error.\n\t\t/// </summary>\n\t\tOk = 0,\n\t\t/// <summary>\n\t\t/// One or more invalid/out of range arguments.\n\t\t/// </summary>\n\t\tBadArg = -1,\n\t\t/// <summary>\n\t\t/// The mode struct passed is invalid.\n\t\t/// </summary>\n\t\tBufferToSmall = -2,\n\t\t/// <summary>\n\t\t/// An internal error was detected.\n\t\t/// </summary>\n\t\tInternalError = -3,\n\t\t/// <summary>\n\t\t/// The compressed data passed is corrupted.\n\t\t/// </summary>\n\t\tInvalidPacket = -4,\n\t\t/// <summary>\n\t\t/// Invalid/unsupported request number.\n\t\t/// </summary>\n\t\tUnimplemented = -5,\n\t\t/// <summary>\n\t\t/// An encoder or decoder structure is invalid or already freed.\n\t\t/// </summary>\n\t\tInvalidState = -6,\n\t\t/// <summary>\n\t\t/// Memory allocation has failed.\n\t\t/// </summary>\n\t\tAllocFail = -7\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/Opus/OPUS_LICENSE",
    "content": "Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,\n                    Jean-Marc Valin, Timothy B. Terriberry,\n                    CSIRO, Gregory Maxwell, Mark Borgerding,\n                    Erik de Castro Lopo\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n- Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n- Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\n- Neither the name of Internet Society, IETF or IETF Trust, nor the \nnames of specific contributors, may be used to endorse or promote\nproducts derived from this software without specific prior written\npermission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nOpus is subject to the royalty-free patent licenses which are\nspecified at:\n\nXiph.Org Foundation:\nhttps://datatracker.ietf.org/ipr/1524/\n\nSkype Limited:\nhttps://datatracker.ietf.org/ipr/1602/\n\nBroadcom Corporation:\nhttps://datatracker.ietf.org/ipr/1526/"
  },
  {
    "path": "TSLib/Audio/Opus/OpusDecoder.cs",
    "content": "// Copyright 2012 John Carruthers\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nusing System;\nusing System.Runtime.InteropServices;\n\nnamespace TSLib.Audio.Opus\n{\n\t/// <summary>\n\t/// Opus audio decoder.\n\t/// </summary>\n\tpublic sealed class OpusDecoder : IDisposable\n\t{\n\t\t/// <summary>\n\t\t/// Creates a new Opus decoder.\n\t\t/// </summary>\n\t\t/// <param name=\"outputSampleRate\">Sample rate to decode at (Hz). This must be one of 8000, 12000, 16000, 24000, or 48000.</param>\n\t\t/// <param name=\"outputChannels\">Number of channels to decode.</param>\n\t\t/// <returns>A new <c>OpusDecoder</c>.</returns>\n\t\tpublic static OpusDecoder Create(int outputSampleRate, int outputChannels)\n\t\t{\n\t\t\tif (outputSampleRate != 8000 &&\n\t\t\t\toutputSampleRate != 12000 &&\n\t\t\t\toutputSampleRate != 16000 &&\n\t\t\t\toutputSampleRate != 24000 &&\n\t\t\t\toutputSampleRate != 48000)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(outputSampleRate));\n\t\t\tif (outputChannels != 1 && outputChannels != 2)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(outputChannels));\n\n\t\t\tvar decoderPtr = NativeMethods.opus_decoder_create(outputSampleRate, outputChannels, out IntPtr error);\n\t\t\tif ((Errors)error != Errors.Ok)\n\t\t\t{\n\t\t\t\tthrow new Exception(\"Exception occured while creating decoder\");\n\t\t\t}\n\t\t\treturn new OpusDecoder(decoderPtr, outputSampleRate, outputChannels);\n\t\t}\n\n\t\tprivate IntPtr decoder;\n\n\t\tprivate OpusDecoder(IntPtr decoder, int outputSamplingRate, int outputChannels)\n\t\t{\n\t\t\tthis.decoder = decoder;\n\t\t\tOutputSamplingRate = outputSamplingRate;\n\t\t\tOutputChannels = outputChannels;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Produces PCM samples from Opus encoded data.\n\t\t/// </summary>\n\t\t/// <param name=\"inputOpusData\">Opus encoded data to decode, null for dropped packet.</param>\n\t\t/// <param name=\"outputDecodedBuffer\">PCM audio samples buffer.</param>\n\t\t/// <returns>PCM audio samples.</returns>\n\t\tpublic Span<byte> Decode(Span<byte> inputOpusData, Span<byte> outputDecodedBuffer)\n\t\t{\n\t\t\tif (disposed)\n\t\t\t\tthrow new ObjectDisposedException(nameof(OpusDecoder));\n\n\t\t\tif (inputOpusData.Length == 0)\n\t\t\t\treturn Span<byte>.Empty;\n\n\t\t\tint frameSize = FrameCount(outputDecodedBuffer.Length);\n\n\t\t\tint length = NativeMethods.opus_decode(decoder, MemoryMarshal.GetReference(inputOpusData), inputOpusData.Length, out MemoryMarshal.GetReference(outputDecodedBuffer), frameSize, 0);\n\n\t\t\tif (length < 0)\n\t\t\t\tthrow new Exception(\"Decoding failed - \" + (Errors)length);\n\n\t\t\t// TODO implement forward error corrected packet\n\t\t\t//else\n\t\t\t//\tlength = NativeMethods.opus_decode(decoder, null, 0, decoded, frameCount, (ForwardErrorCorrection) ? 1 : 0);\n\n\t\t\tvar decodedLength = length * 2 * OutputChannels;\n\n\t\t\treturn outputDecodedBuffer.Slice(0, decodedLength);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Determines the number of frames that can fit into a buffer of the given size.\n\t\t/// </summary>\n\t\t/// <param name=\"bufferSize\"></param>\n\t\t/// <returns></returns>\n\t\tpublic int FrameCount(int bufferSize)\n\t\t{\n\t\t\t//  seems like bitrate should be required\n\t\t\tconst int bitrate = 16;\n\t\t\tint bytesPerSample = (bitrate / 8) * OutputChannels;\n\t\t\treturn bufferSize / bytesPerSample;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Gets the output sampling rate of the decoder.\n\t\t/// </summary>\n\t\tpublic int OutputSamplingRate { get; }\n\n\t\t/// <summary>\n\t\t/// Gets the number of channels of the decoder.\n\t\t/// </summary>\n\t\tpublic int OutputChannels { get; }\n\n\t\t/// <summary>\n\t\t/// Gets or sets whether forward error correction is enabled or not.\n\t\t/// </summary>\n\t\tpublic bool ForwardErrorCorrection { get; set; }\n\n\t\t~OpusDecoder()\n\t\t{\n\t\t\tDispose();\n\t\t}\n\n\t\tprivate bool disposed;\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tif (disposed)\n\t\t\t\treturn;\n\n\t\t\tGC.SuppressFinalize(this);\n\n\t\t\tif (decoder != IntPtr.Zero)\n\t\t\t{\n\t\t\t\tNativeMethods.opus_decoder_destroy(decoder);\n\t\t\t\tdecoder = IntPtr.Zero;\n\t\t\t}\n\n\t\t\tdisposed = true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/Opus/OpusEncoder.cs",
    "content": "// Copyright 2012 John Carruthers\n// \n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// \n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nusing System;\nusing System.Runtime.InteropServices;\n\nnamespace TSLib.Audio.Opus\n{\n\t/// <summary>\n\t/// Opus codec wrapper.\n\t/// </summary>\n\tpublic sealed class OpusEncoder : IDisposable\n\t{\n\t\t/// <summary>\n\t\t/// Creates a new Opus encoder.\n\t\t/// </summary>\n\t\t/// <param name=\"inputSamplingRate\">Sampling rate of the input signal (Hz). This must be one of 8000, 12000, 16000, 24000, or 48000.</param>\n\t\t/// <param name=\"inputChannels\">Number of channels (1 or 2) in input signal.</param>\n\t\t/// <param name=\"application\">Coding mode.</param>\n\t\t/// <returns>A new <c>OpusEncoder</c></returns>\n\t\tpublic static OpusEncoder Create(int inputSamplingRate, int inputChannels, Application application)\n\t\t{\n\t\t\tif (inputSamplingRate != 8000 &&\n\t\t\t\tinputSamplingRate != 12000 &&\n\t\t\t\tinputSamplingRate != 16000 &&\n\t\t\t\tinputSamplingRate != 24000 &&\n\t\t\t\tinputSamplingRate != 48000)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(inputSamplingRate));\n\t\t\tif (inputChannels != 1 && inputChannels != 2)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(inputChannels));\n\n\t\t\tvar encoderPtr = NativeMethods.opus_encoder_create(inputSamplingRate, inputChannels, application, out IntPtr error);\n\t\t\tif ((Errors)error != Errors.Ok)\n\t\t\t{\n\t\t\t\tthrow new Exception(\"Exception occured while creating encoder\");\n\t\t\t}\n\t\t\treturn new OpusEncoder(encoderPtr, inputSamplingRate, inputChannels, application);\n\t\t}\n\n\t\tprivate IntPtr encoder;\n\n\t\tprivate OpusEncoder(IntPtr encoder, int inputSamplingRate, int inputChannels, Application application)\n\t\t{\n\t\t\tthis.encoder = encoder;\n\t\t\tInputSamplingRate = inputSamplingRate;\n\t\t\tInputChannels = inputChannels;\n\t\t\tApplication = application;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Produces Opus encoded audio from PCM samples.\n\t\t/// </summary>\n\t\t/// <param name=\"inputPcmSamples\">PCM samples to encode.</param>\n\t\t/// <param name=\"sampleLength\">How many bytes to encode.</param>\n\t\t/// <param name=\"outputEncodedBuffer\">The encoded data is written to this buffer.</param>\n\t\t/// <returns>Opus encoded audio buffer.</returns>\n\t\tpublic Span<byte> Encode(ReadOnlySpan<byte> inputPcmSamples, int sampleLength, Span<byte> outputEncodedBuffer)\n\t\t{\n\t\t\tif (disposed)\n\t\t\t\tthrow new ObjectDisposedException(nameof(OpusEncoder));\n\n\t\t\tint frames = FrameCount(inputPcmSamples.Length);\n\t\t\tint encodedLength = NativeMethods.opus_encode(encoder, MemoryMarshal.GetReference(inputPcmSamples), frames, out MemoryMarshal.GetReference(outputEncodedBuffer), sampleLength);\n\n\t\t\tif (encodedLength < 0)\n\t\t\t\tthrow new Exception(\"Encoding failed - \" + (Errors)encodedLength);\n\n\t\t\treturn outputEncodedBuffer.Slice(0, encodedLength);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Determines the number of frames in the PCM samples.\n\t\t/// </summary>\n\t\t/// <param name=\"bufferSize\"></param>\n\t\t/// <returns></returns>\n\t\tpublic int FrameCount(int bufferSize)\n\t\t{\n\t\t\t//  seems like bitrate should be required\n\t\t\tconst int bitrate = 16;\n\t\t\tint bytesPerSample = (bitrate / 8) * InputChannels;\n\t\t\treturn bufferSize / bytesPerSample;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Helper method to determine how many bytes are required for encoding to work.\n\t\t/// </summary>\n\t\t/// <param name=\"frameCount\">Target frame size.</param>\n\t\t/// <returns></returns>\n\t\tpublic int FrameByteCount(int frameCount)\n\t\t{\n\t\t\tconst int bitrate = 16;\n\t\t\tint bytesPerSample = (bitrate / 8) * InputChannels;\n\t\t\treturn frameCount * bytesPerSample;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Gets the input sampling rate of the encoder.\n\t\t/// </summary>\n\t\tpublic int InputSamplingRate { get; }\n\n\t\t/// <summary>\n\t\t/// Gets the number of channels of the encoder.\n\t\t/// </summary>\n\t\tpublic int InputChannels { get; }\n\n\t\t/// <summary>\n\t\t/// Gets the coding mode of the encoder.\n\t\t/// </summary>\n\t\tpublic Application Application { get; }\n\n\t\t/// <summary>\n\t\t/// Gets or sets the bitrate setting of the encoding.\n\t\t/// </summary>\n\t\tpublic int Bitrate\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (disposed)\n\t\t\t\t\tthrow new ObjectDisposedException(nameof(OpusEncoder));\n\t\t\t\tvar ret = NativeMethods.opus_encoder_ctl(encoder, Ctl.GetBitrateRequest, out int bitrate);\n\t\t\t\tif (ret < 0)\n\t\t\t\t\tthrow new Exception(\"Encoder error - \" + ((Errors)ret).ToString());\n\t\t\t\treturn bitrate;\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (disposed)\n\t\t\t\t\tthrow new ObjectDisposedException(nameof(OpusEncoder));\n\t\t\t\tvar ret = NativeMethods.opus_encoder_ctl(encoder, Ctl.SetBitrateRequest, value);\n\t\t\t\tif (ret < 0)\n\t\t\t\t\tthrow new Exception(\"Encoder error - \" + ((Errors)ret).ToString());\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Gets or sets whether Forward Error Correction is enabled.\n\t\t/// </summary>\n\t\tpublic bool ForwardErrorCorrection\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (encoder == IntPtr.Zero)\n\t\t\t\t\tthrow new ObjectDisposedException(nameof(OpusEncoder));\n\n\t\t\t\tint ret = NativeMethods.opus_encoder_ctl(encoder, Ctl.GetInbandFecRequest, out int fec);\n\t\t\t\tif (ret < 0)\n\t\t\t\t\tthrow new Exception(\"Encoder error - \" + ((Errors)ret).ToString());\n\n\t\t\t\treturn fec > 0;\n\t\t\t}\n\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (encoder == IntPtr.Zero)\n\t\t\t\t\tthrow new ObjectDisposedException(nameof(OpusEncoder));\n\n\t\t\t\tvar ret = NativeMethods.opus_encoder_ctl(encoder, Ctl.SetInbandFecRequest, value ? 1 : 0);\n\t\t\t\tif (ret < 0)\n\t\t\t\t\tthrow new Exception(\"Encoder error - \" + ((Errors)ret).ToString());\n\t\t\t}\n\t\t}\n\n\t\t~OpusEncoder()\n\t\t{\n\t\t\tDispose();\n\t\t}\n\n\t\tprivate bool disposed;\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tif (disposed)\n\t\t\t\treturn;\n\n\t\t\tGC.SuppressFinalize(this);\n\n\t\t\tif (encoder != IntPtr.Zero)\n\t\t\t{\n\t\t\t\tNativeMethods.opus_encoder_destroy(encoder);\n\t\t\t\tencoder = IntPtr.Zero;\n\t\t\t}\n\n\t\t\tdisposed = true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/Opus/README",
    "content": "The Opus.NET library was cloned from:\nhttps://github.com/JohnACarruthers/Opus.NET\n\nThe LICENSE document in this folder applies to all files in this folder.\nAll other files and projects within this solution are unaffected by this.\n"
  },
  {
    "path": "TSLib/Audio/PassiveMergePipe.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\n\nnamespace TSLib.Audio\n{\n\tpublic class PassiveMergePipe : IAudioPassiveProducer, ICollection<IAudioPassiveProducer>\n\t{\n\t\tprivate IAudioPassiveProducer[] safeProducerList = Array.Empty<IAudioPassiveProducer>();\n\t\tprivate readonly List<IAudioPassiveProducer> producerList = new List<IAudioPassiveProducer>();\n\t\tprivate readonly object listLock = new object();\n\t\tprivate bool changed;\n\t\tprivate readonly int[] accBuffer = new int[4096];\n\n\t\tpublic int Count => safeProducerList.Length;\n\t\tpublic bool IsReadOnly => false;\n\n\t\tpublic void Add(IAudioPassiveProducer addProducer)\n\t\t{\n\t\t\tif (!producerList.Contains(addProducer) && addProducer != this)\n\t\t\t{\n\t\t\t\tlock (listLock)\n\t\t\t\t{\n\t\t\t\t\tif (!producerList.Contains(addProducer))\n\t\t\t\t\t{\n\t\t\t\t\t\tproducerList.Add(addProducer);\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic bool Remove(IAudioPassiveProducer removeProducer)\n\t\t{\n\t\t\tif (producerList.Contains(removeProducer) && removeProducer != this)\n\t\t\t{\n\t\t\t\tlock (listLock)\n\t\t\t\t{\n\t\t\t\t\tvar removed = producerList.Remove(removeProducer);\n\t\t\t\t\tchanged |= removed;\n\t\t\t\t\treturn removed;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tlock (listLock)\n\t\t\t{\n\t\t\t\tproducerList.Clear();\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\n\t\tpublic int Read(byte[] buffer, int offset, int length, out Meta? meta)\n\t\t{\n\t\t\tif (changed)\n\t\t\t{\n\t\t\t\tlock (listLock)\n\t\t\t\t{\n\t\t\t\t\tif (changed)\n\t\t\t\t\t{\n\t\t\t\t\t\tsafeProducerList = producerList.ToArray();\n\t\t\t\t\t\tchanged = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmeta = null;\n\n\t\t\tif (safeProducerList.Length == 0)\n\t\t\t\treturn 0;\n\n\t\t\tif (safeProducerList.Length == 1)\n\t\t\t\treturn safeProducerList[0].Read(buffer, offset, length, out meta);\n\n\t\t\tint maxReadLength = Math.Min(accBuffer.Length, length);\n\t\t\tArray.Clear(accBuffer, 0, maxReadLength);\n\n\t\t\tvar pcmBuffer = MemoryMarshal.Cast<byte, short>(buffer);\n\t\t\tint read = 0;\n\n\t\t\tforeach (var producer in safeProducerList)\n\t\t\t{\n\t\t\t\tint ppread = producer.Read(buffer, offset, maxReadLength, out meta);\n\t\t\t\tif (ppread == 0)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tread = Math.Max(read, ppread);\n\t\t\t\tfor (int i = 0; i < ppread / 2; i++)\n\t\t\t\t\taccBuffer[i] += pcmBuffer[i];\n\t\t\t}\n\n\t\t\tfor (int i = 0; i < read / 2; i++)\n\t\t\t\tpcmBuffer[i] = (short)Math.Max(Math.Min(accBuffer[i], short.MaxValue), short.MinValue);\n\n\t\t\treturn read;\n\t\t}\n\n\t\tIEnumerator<IAudioPassiveProducer> IEnumerable<IAudioPassiveProducer>.GetEnumerator() => ((IEnumerable<IAudioPassiveProducer>)safeProducerList).GetEnumerator();\n\n\t\tIEnumerator IEnumerable.GetEnumerator() => safeProducerList.GetEnumerator();\n\n\t\tpublic bool Contains(IAudioPassiveProducer item) => safeProducerList.Contains(item);\n\n\t\tpublic void CopyTo(IAudioPassiveProducer[] array, int arrayIndex) => Array.Copy(safeProducerList, 0, array, arrayIndex, array.Length);\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tvar list = safeProducerList;\n\t\t\tClear();\n\t\t\tforeach (var producer in list)\n\t\t\t\tproducer.Dispose();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/PassiveSplitterPipe.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace TSLib.Audio\n{\n\tpublic class PassiveSplitterPipe : IAudioPipe\n\t{\n\t\tpublic bool Active => consumerList.Count > 0 && consumerList.Any(x => x.Active);\n\t\tprivate readonly List<IAudioPassiveConsumer> safeConsumerList = new List<IAudioPassiveConsumer>();\n\t\tprivate readonly List<IAudioPassiveConsumer> consumerList = new List<IAudioPassiveConsumer>();\n\t\tprivate bool changed;\n\t\tprivate readonly object listLock = new object();\n\t\tprivate byte[] buffer = Array.Empty<byte>();\n\n\t\tpublic bool CloneMeta { get; set; } = false;\n\n\t\tpublic IAudioPassiveConsumer? OutStream\n\t\t{\n\t\t\tget => this;\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (value is null)\n\t\t\t\t\tClear();\n\t\t\t\telse\n\t\t\t\t\tAdd(value);\n\t\t\t}\n\t\t}\n\n\t\tpublic void Add(IAudioPassiveConsumer consumer)\n\t\t{\n\t\t\tlock (listLock)\n\t\t\t{\n\t\t\t\tif (!consumerList.Contains(consumer) && consumer != this)\n\t\t\t\t{\n\t\t\t\t\tconsumerList.Add(consumer);\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void Remove(IAudioPassiveConsumer consumer)\n\t\t{\n\t\t\tlock (listLock)\n\t\t\t{\n\t\t\t\tchanged |= consumerList.Remove(consumer);\n\t\t\t}\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tlock (listLock)\n\t\t\t{\n\t\t\t\tchanged |= consumerList.Count > 0;\n\t\t\t\tconsumerList.Clear();\n\t\t\t}\n\t\t}\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (changed)\n\t\t\t{\n\t\t\t\tlock (listLock)\n\t\t\t\t{\n\t\t\t\t\tif (changed)\n\t\t\t\t\t{\n\t\t\t\t\t\tsafeConsumerList.Clear();\n\t\t\t\t\t\tsafeConsumerList.AddRange(consumerList);\n\t\t\t\t\t\tchanged = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (safeConsumerList.Count == 0)\n\t\t\t\treturn;\n\n\t\t\tif (safeConsumerList.Count == 1)\n\t\t\t{\n\t\t\t\tsafeConsumerList[0].Write(data, meta);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (buffer.Length < data.Length)\n\t\t\t\tbuffer = new byte[data.Length];\n\n\t\t\tvar bufSpan = buffer.AsSpan(0, data.Length);\n\t\t\tfor (int i = 0; i < safeConsumerList.Count - 1; i++)\n\t\t\t{\n\t\t\t\tdata.CopyTo(bufSpan);\n\t\t\t\tsafeConsumerList[i].Write(bufSpan, meta);\n\t\t\t}\n\t\t\t// safe one memcopy call by passing the last one our original data\n\t\t\tsafeConsumerList[^1].Write(data, meta);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/PreciseAudioTimer.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Diagnostics;\n\nnamespace TSLib.Audio\n{\n\t/// <summary>Provides a precise way to measure a playbackbuffer by tracking\n\t/// sent bytes and elapsed time.</summary>\n\tpublic class PreciseAudioTimer : ISampleInfo\n\t{\n\t\tpublic int SampleRate { get; }\n\t\tpublic int Channels { get; }\n\t\tpublic int BitsPerSample { get; }\n\t\tpublic int BytesPerSecond { get; }\n\n\t\tprivate readonly Stopwatch stopwatch;\n\n\t\t/// <summary>How many bytes have added to the playback buffer.</summary>\n\t\tprivate long AbsoluteBufferLength { get; set; }\n\t\t/// <summary>The playback duration equivalent of the pushed buffer byte length.</summary>\n\t\tprivate TimeSpan AbsoluteBufferDuration => TimeSpan.FromSeconds(AbsoluteBufferLength / (double)BytesPerSecond);\n\t\t/// <summary>How many bytes (should) have been processed while playback was running.</summary>\n\t\tprivate long ElapsedBufferLength => (stopwatch.ElapsedMilliseconds * BytesPerSecond) / 1000;\n\t\t/// <summary>How many bytes are currently not processed in buffer for playback.</summary>\n\t\tprivate long RemainingBufferLength => AbsoluteBufferLength - ElapsedBufferLength;\n\t\t/// <summary>The playback duration equivalent of the currently not processed buffer byte length.</summary>\n\t\tpublic TimeSpan RemainingBufferDuration => TimeSpan.FromSeconds(RemainingBufferLength / (double)BytesPerSecond);\n\t\t/// <summary>Defines the song position base offset from which the SongPosition should be counted from.</summary>\n\t\tpublic TimeSpan SongPositionOffset { get; set; }\n\t\t/// <summary>The current playback position.</summary>\n\t\tpublic TimeSpan SongPosition => AbsoluteBufferDuration + SongPositionOffset;\n\n\t\tpublic PreciseAudioTimer(ISampleInfo sampleInfo)\n\t\t\t: this(sampleInfo.SampleRate, sampleInfo.BitsPerSample, sampleInfo.Channels) { }\n\n\t\tpublic PreciseAudioTimer(int sampleRate, int bits, int channel)\n\t\t{\n\t\t\tif (bits != 8 && bits != 16 && bits != 24 && bits != 32) throw new ArgumentException(nameof(bits));\n\t\t\tif (channel != 1 && channel != 2) throw new ArgumentException(nameof(channel));\n\t\t\tstopwatch = new Stopwatch();\n\n\t\t\tSampleRate = sampleRate;\n\t\t\tBitsPerSample = bits;\n\t\t\tChannels = channel;\n\t\t\tBytesPerSecond = SampleRate * (BitsPerSample / 8) * Channels;\n\t\t}\n\n\t\tpublic void Start()\n\t\t{\n\t\t\tAbsoluteBufferLength = 0;\n\t\t\tstopwatch.Restart();\n\t\t}\n\n\t\tpublic void Stop() => stopwatch.Stop();\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tSongPositionOffset = TimeSpan.Zero;\n\t\t\tAbsoluteBufferLength = 0;\n\t\t}\n\n\t\tpublic void PushBytes(int count) => AbsoluteBufferLength += count;\n\n\t\tpublic void ResetRemoteBuffer()\n\t\t{\n\t\t\tSongPositionOffset = SongPosition;\n\t\t\tStart();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/PreciseTimedPipe.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Threading;\nusing TSLib.Helper;\n\nnamespace TSLib.Audio\n{\n\tpublic class PreciseTimedPipe : IAudioActiveConsumer, IAudioActiveProducer, IDisposable\n\t{\n\t\tpublic PreciseAudioTimer AudioTimer { get; }\n\n\t\tpublic IAudioPassiveProducer? InStream { get; set; }\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\n\t\tpublic TimeSpan AudioBufferLength { get; set; } = TimeSpan.FromMilliseconds(20);\n\t\tpublic TimeSpan SendCheckInterval { get; set; } = TimeSpan.FromMilliseconds(5);\n\t\tpublic int ReadBufferSize { get; set; } = 960 * 4;\n\t\tprivate byte[] readBuffer = Array.Empty<byte>();\n\t\tprivate readonly Thread tickThread;\n\t\tprivate bool running;\n\n\t\tprivate bool paused;\n\t\tpublic bool Paused\n\t\t{\n\t\t\tget => paused;\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (paused != value)\n\t\t\t\t{\n\t\t\t\t\tpaused = value;\n\t\t\t\t\tif (value)\n\t\t\t\t\t{\n\t\t\t\t\t\tAudioTimer.SongPositionOffset = AudioTimer.SongPosition;\n\t\t\t\t\t\tAudioTimer.Stop();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tAudioTimer.Start();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic PreciseTimedPipe(ISampleInfo info, Id id)\n\t\t{\n\t\t\trunning = true;\n\t\t\tpaused = true;\n\n\t\t\tAudioTimer = new PreciseAudioTimer(info.SampleRate, info.BitsPerSample, info.Channels);\n\t\t\tAudioTimer.Start();\n\n\t\t\ttickThread = new Thread(() => { Tools.SetLogId(id); ReadLoop(); }) { Name = $\"AudioPipe[{id}]\" };\n\t\t\ttickThread.Start();\n\t\t}\n\n\t\tpublic PreciseTimedPipe(ISampleInfo info, Id id, IAudioPassiveProducer inStream) : this(info, id)\n\t\t{\n\t\t\tInStream = inStream;\n\t\t}\n\n\t\tpublic PreciseTimedPipe(ISampleInfo info, Id id, IAudioPassiveConsumer outStream) : this(info, id)\n\t\t{\n\t\t\tOutStream = outStream;\n\t\t}\n\n\t\tpublic PreciseTimedPipe(ISampleInfo info, Id id, IAudioPassiveProducer inStream, IAudioPassiveConsumer outStream) : this(info, id)\n\t\t{\n\t\t\tInStream = inStream;\n\t\t\tOutStream = outStream;\n\t\t}\n\n\t\tprivate void ReadLoop()\n\t\t{\n\t\t\twhile (running)\n\t\t\t{\n\t\t\t\tif (!Paused)\n\t\t\t\t\tReadTick();\n\t\t\t\tThread.Sleep(SendCheckInterval);\n\t\t\t}\n\t\t}\n\n\t\tprivate void ReadTick()\n\t\t{\n\t\t\tvar inStream = InStream;\n\t\t\tif (inStream is null)\n\t\t\t\treturn;\n\n\t\t\tif (readBuffer.Length < ReadBufferSize)\n\t\t\t\treadBuffer = new byte[ReadBufferSize];\n\n\t\t\twhile (AudioTimer.RemainingBufferDuration < AudioBufferLength)\n\t\t\t{\n\t\t\t\tint read = inStream.Read(readBuffer, 0, readBuffer.Length, out var meta);\n\t\t\t\tif (read == 0)\n\t\t\t\t\treturn;\n\n\t\t\t\tif (AudioTimer.RemainingBufferDuration < TimeSpan.Zero)\n\t\t\t\t\tAudioTimer.ResetRemoteBuffer();\n\n\t\t\t\tAudioTimer.PushBytes(read);\n\n\t\t\t\tOutStream?.Write(readBuffer.AsSpan(0, read), meta);\n\t\t\t}\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tif (!running)\n\t\t\t\treturn;\n\n\t\t\trunning = false;\n\t\t\ttickThread.Join();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/StaticMetaPipe.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing TSLib.Helper;\n\nnamespace TSLib.Audio\n{\n\tpublic class StaticMetaPipe : IAudioPipe\n\t{\n\t\tpublic bool Active => OutStream?.Active ?? false;\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\n\t\tprivate readonly MetaOut setMeta = new MetaOut();\n\t\tpublic TargetSendMode SendMode { get; private set; }\n\n\t\tprivate void ClearData()\n\t\t{\n\t\t\tsetMeta.ChannelIds = null;\n\t\t\tsetMeta.ClientIds = null;\n\t\t}\n\n\t\tpublic void SetNone()\n\t\t{\n\t\t\tClearData();\n\t\t\tSendMode = TargetSendMode.None;\n\t\t}\n\n\t\tpublic void SetVoice()\n\t\t{\n\t\t\tClearData();\n\t\t\tSendMode = TargetSendMode.Voice;\n\t\t}\n\n\t\tpublic void SetWhisper(IReadOnlyList<ChannelId> channelIds, IReadOnlyList<ClientId> clientIds)\n\t\t{\n\t\t\tClearData();\n\t\t\tSendMode = TargetSendMode.Whisper;\n\t\t\tsetMeta.ChannelIds = channelIds;\n\t\t\tsetMeta.ClientIds = clientIds;\n\t\t}\n\n\t\tpublic void SetWhisperGroup(GroupWhisperType type, GroupWhisperTarget target, ulong targetId = 0)\n\t\t{\n\t\t\tClearData();\n\t\t\tSendMode = TargetSendMode.WhisperGroup;\n\t\t\tsetMeta.GroupWhisperType = type;\n\t\t\tsetMeta.GroupWhisperTarget = target;\n\t\t\tsetMeta.TargetId = targetId;\n\t\t}\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (OutStream is null || SendMode == TargetSendMode.None)\n\t\t\t\treturn;\n\n\t\t\tmeta ??= new Meta();\n\t\t\tmeta.Out ??= new MetaOut();\n\t\t\tmeta.Out.SendMode = SendMode;\n\t\t\tswitch (SendMode)\n\t\t\t{\n\t\t\tcase TargetSendMode.None: break;\n\t\t\tcase TargetSendMode.Voice: break;\n\t\t\tcase TargetSendMode.Whisper:\n\t\t\t\tmeta.Out.ChannelIds = setMeta.ChannelIds;\n\t\t\t\tmeta.Out.ClientIds = setMeta.ClientIds;\n\t\t\t\tbreak;\n\t\t\tcase TargetSendMode.WhisperGroup:\n\t\t\t\tmeta.Out.GroupWhisperTarget = setMeta.GroupWhisperTarget;\n\t\t\t\tmeta.Out.GroupWhisperType = setMeta.GroupWhisperType;\n\t\t\t\tmeta.Out.TargetId = setMeta.TargetId;\n\t\t\t\tbreak;\n\t\t\tdefault: throw Tools.UnhandledDefault(SendMode);\n\t\t\t}\n\t\t\tOutStream?.Write(data, meta);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/StreamAudioProducer.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.IO;\n\nnamespace TSLib.Audio\n{\n\tpublic class StreamAudioProducer : IAudioPassiveProducer\n\t{\n\t\tprivate readonly Stream stream;\n\n\t\tpublic StreamAudioProducer(Stream stream) { this.stream = stream; }\n\n\t\tpublic int Read(byte[] buffer, int offset, int length, out Meta? meta)\n\t\t{\n\t\t\tmeta = default;\n\t\t\treturn stream.Read(buffer, offset, length);\n\t\t}\n\n\t\tpublic void Dispose() => stream.Dispose();\n\t}\n}\n"
  },
  {
    "path": "TSLib/Audio/VolumePipe.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Runtime.InteropServices;\n\nnamespace TSLib.Audio\n{\n\tpublic class VolumePipe : IAudioPipe\n\t{\n\t\tpublic bool Active => OutStream?.Active ?? false;\n\t\tprivate float volume;\n\t\t/// <summary>Values are between including 0 and 1.</summary>\n\t\tpublic float Volume\n\t\t{\n\t\t\tget => volume;\n\t\t\tset\n\t\t\t{\n\t\t\t\tvalue = Math.Abs(value);\n\t\t\t\tif (IsAbout(value, 1)) volume = 1;\n\t\t\t\telse if (IsAbout(value, 0)) volume = 0;\n\t\t\t\telse volume = value;\n\t\t\t}\n\t\t}\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\n\t\tpublic static void AdjustVolume(Span<byte> audioSamples, float volume)\n\t\t{\n\t\t\tif (volume == 1) { /* Do nothing */ }\n\t\t\telse if (volume == 0)\n\t\t\t{\n\t\t\t\taudioSamples.Fill(0);\n\t\t\t}\n\t\t\telse if (volume < 1) // Clipping cannot occour on mult <1\n\t\t\t{\n\t\t\t\tvar shortArr = MemoryMarshal.Cast<byte, short>(audioSamples);\n\t\t\t\tfor (int i = 0; i < shortArr.Length; i++)\n\t\t\t\t\tshortArr[i] = (short)(shortArr[i] * volume);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar shortArr = MemoryMarshal.Cast<byte, short>(audioSamples);\n\t\t\t\tfor (int i = 0; i < shortArr.Length; i++)\n\t\t\t\t\tshortArr[i] = (short)Math.Max(Math.Min(shortArr[i] * volume, short.MaxValue), short.MinValue);\n\t\t\t}\n\t\t}\n\n\t\tprivate static bool IsAbout(float value, float compare) => Math.Abs(value - compare) < 1E-04f;\n\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (OutStream is null) return;\n\n\t\t\tAdjustVolume(data, Volume);\n\n\t\t\tOutStream?.Write(data, meta);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Commands/CommandMultiParameter.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TSLib.Commands\n{\n\t/// <summary>Represents an array of data. Will be expanded to a pipe seperated list when sent.\n\t/// Multiple <see cref=\"CommandMultiParameter\"/> will be merged automatically but will need the same array length.</summary>\n\tpublic sealed partial class CommandMultiParameter : ICommandPart\n\t{\n\t\tpublic string Key { get; }\n\t\tpublic string[] Values { get; }\n\t\tpublic CommandPartType Type => CommandPartType.MultiParameter;\n\t}\n}\n"
  },
  {
    "path": "TSLib/Commands/CommandOption.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Linq;\nusing System.Text;\nusing TSLib.Helper;\n\nnamespace TSLib.Commands\n{\n\t/// <summary>Command options which will be added with \"-name\" at the and.</summary>\n\tpublic class CommandOption : ICommandPart\n\t{\n\t\tpublic string Value { get; }\n\t\tpublic CommandPartType Type => CommandPartType.Option;\n\n\t\tpublic CommandOption(string name) { Value = string.Concat(\" -\", name); }\n\t\t/// <summary>Creates one or many options from the enum.\n\t\t/// The enum must be a flag list which will be expanded.\n\t\t/// The name of each set enum flag will be used as the option name.</summary>\n\t\t/// <param name=\"values\"></param>\n\t\tpublic CommandOption(Enum values)\n\t\t{\n\t\t\tvar strb = new StringBuilder();\n\t\t\tforeach (var enu in values.GetFlags().Select(enu => enu.ToString()))\n\t\t\t\tstrb.Append(\" -\").Append(enu);\n\t\t\tValue = strb.ToString();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Commands/CommandParameter.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Diagnostics;\nusing System.Globalization;\nusing TSLib.Helper;\n\nnamespace TSLib.Commands\n{\n\t/// <summary>Simple parameter which will be expanded to \"Key=Value\" and automatically escaped.</summary>\n\tpublic sealed partial class CommandParameter : ICommandPart\n\t{\n\t\tpublic string Key { get; }\n\t\tpublic string Value { get; }\n\t\tpublic CommandPartType Type => CommandPartType.SingleParameter;\n\n\t\t[DebuggerStepThrough] public static string Serialize(bool value) => value ? \"1\" : \"0\";\n\t\t[DebuggerStepThrough] public static string Serialize(sbyte value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(byte value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(short value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(ushort value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(int value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(uint value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(long value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(ulong value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(float value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(double value) => value.ToString(CultureInfo.InvariantCulture);\n\t\t[DebuggerStepThrough] public static string Serialize(string value) => TsString.Escape(value);\n\t\t[DebuggerStepThrough] public static string Serialize(DateTime value) => value.ToUnix().ToString(CultureInfo.InvariantCulture);\n\t}\n}\n"
  },
  {
    "path": "TSLib/Commands/ICommandPart.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TSLib.Commands\n{\n\tpublic interface ICommandPart\n\t{\n\t\tCommandPartType Type { get; }\n\t}\n\n\tpublic enum CommandPartType\n\t{\n\t\tSingleParameter,\n\t\tMultiParameter,\n\t\tOption,\n\t}\n}\n"
  },
  {
    "path": "TSLib/Commands/TsCommand.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing TSLib.Helper;\n\nnamespace TSLib.Commands\n{\n\t/// <summary>Builds TeamSpeak (query) commands from parameters.</summary>\n\tpublic partial class TsCommand : IEnumerable<ICommandPart>\n\t{\n\t\tprivate static readonly Regex CommandMatch = new Regex(\"[a-z0-9_]+\", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ECMAScript);\n\n\t\tprotected string? raw = null;\n\t\tpublic bool ExpectResponse { get; set; }\n\t\tpublic string Command { get; }\n\t\tprivate ICollection<ICommandPart>? parameter = null;\n\n\t\t/// <summary>Creates a new command.</summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t[DebuggerStepThrough]\n\t\tpublic TsCommand(string command)\n\t\t{\n\t\t\tExpectResponse = true;\n\t\t\tCommand = command;\n\t\t}\n\n\t\t/// <summary>Creates a new command.</summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameters to be added to this command.\n\t\t/// See <see cref=\"CommandParameter\"/>, <see cref=\"CommandOption\"/> or <see cref=\"CommandMultiParameter\"/> for more information.</param>\n\t\t[DebuggerStepThrough]\n\t\tpublic TsCommand(string command, ICollection<ICommandPart> parameter) : this(command)\n\t\t{\n\t\t\tthis.parameter = parameter;\n\t\t}\n\n\t\t[DebuggerStepThrough]\n\t\tpublic virtual TsCommand Add(ICommandPart? addParameter)\n\t\t{\n\t\t\tif (addParameter is null)\n\t\t\t\treturn this;\n\t\t\traw = null;\n\t\t\tif (parameter is null)\n\t\t\t\tparameter = new List<ICommandPart>();\n\t\t\telse if (parameter.IsReadOnly)\n\t\t\t\tparameter = new List<ICommandPart>(parameter);\n\t\t\tparameter.Add(addParameter);\n\t\t\treturn this;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Can be set to false when a command does not receive a error-return-code\n\t\t/// from teamspeak.\n\t\t/// This makes this command effectively a notification, as a response can only\n\t\t/// be sent back as a new notification.\n\t\t/// </summary>\n\t\t/// <param name=\"expects\">Whether or not to wait for the error-return-code</param>\n\t\t/// <returns>Returns this command. Useful for fluent command building.</returns>\n\t\t[DebuggerStepThrough]\n\t\tpublic TsCommand ExpectsResponse(bool expects)\n\t\t{\n\t\t\tExpectResponse = expects;\n\t\t\treturn this;\n\t\t}\n\n\t\t/// <summary>Builds this command to the query-like command.</summary>\n\t\t/// <returns>The formatted query-like command.</returns>\n\t\tpublic override string ToString() => raw ??= BuildToString(Command, GetParameter());\n\n\t\t/// <summary>Builds the command from its parameters and returns the query-like command.</summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameter to be added to this command.</param>\n\t\t/// <returns>The formatted query-like command.</returns>\n\t\t/// <exception cref=\"ArgumentException\">When a command is null or not valid.</exception>\n\t\t/// <exception cref=\"ArgumentOutOfRangeException\">When multiple <see cref=\"CommandMultiParameter\"/> are added but have different array lengths.</exception>\n\t\tpublic static string BuildToString(string command, IEnumerable<ICommandPart> parameter)\n\t\t{\n\t\t\tif (string.IsNullOrWhiteSpace(command))\n\t\t\t\tthrow new ArgumentNullException(nameof(command));\n\t\t\tif (!CommandMatch.IsMatch(command))\n\t\t\t\tthrow new ArgumentException(\"Invalid command characters\", nameof(command));\n\n\t\t\tvar strb = new StringBuilder(TsString.Escape(command));\n\t\t\tList<CommandMultiParameter>? multiParamList = null;\n\t\t\tList<CommandOption>? optionList = null;\n\n\t\t\tforeach (var param in parameter)\n\t\t\t{\n\t\t\t\tswitch (param.Type)\n\t\t\t\t{\n\t\t\t\tcase CommandPartType.SingleParameter:\n\t\t\t\t\tvar singleParam = (CommandParameter)param;\n\t\t\t\t\tstrb.Append(' ').Append(singleParam.Key).Append('=').Append(singleParam.Value);\n\t\t\t\t\tbreak;\n\t\t\t\tcase CommandPartType.MultiParameter:\n\t\t\t\t\tmultiParamList ??= new List<CommandMultiParameter>();\n\t\t\t\t\tmultiParamList.Add((CommandMultiParameter)param);\n\t\t\t\t\tbreak;\n\t\t\t\tcase CommandPartType.Option:\n\t\t\t\t\toptionList ??= new List<CommandOption>();\n\t\t\t\t\toptionList.Add((CommandOption)param);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(param.Type);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (multiParamList != null)\n\t\t\t{\n\t\t\t\t// Safety check\n\t\t\t\tint matrixLength = multiParamList[0].Values.Length;\n\t\t\t\tforeach (var param in multiParamList)\n\t\t\t\t\tif (param.Values.Length != matrixLength)\n\t\t\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(parameter), \"All multiparam key-value pairs must have the same length\");\n\n\t\t\t\tfor (int i = 0; i < matrixLength; i++)\n\t\t\t\t{\n\t\t\t\t\tforeach (var param in multiParamList)\n\t\t\t\t\t{\n\t\t\t\t\t\tstrb.Append(' ').Append(param.Key).Append('=').Append(param.Values[i]);\n\t\t\t\t\t}\n\t\t\t\t\tstrb.Append('|');\n\t\t\t\t}\n\n\t\t\t\tstrb.Length--;\n\t\t\t}\n\n\t\t\tif (optionList != null)\n\t\t\t{\n\t\t\t\tforeach (var option in optionList)\n\t\t\t\t\tstrb.Append(option.Value);\n\t\t\t}\n\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tprivate IEnumerable<ICommandPart> GetParameter() => parameter ?? Enumerable.Empty<ICommandPart>();\n\n\t\tpublic IEnumerator GetEnumerator() => GetParameter().GetEnumerator();\n\t\tIEnumerator<ICommandPart> IEnumerable<ICommandPart>.GetEnumerator() => GetParameter().GetEnumerator();\n\t}\n\n\tpublic class TsRawCommand : TsCommand\n\t{\n\t\tpublic TsRawCommand(string raw) : base(null!)\n\t\t{\n\t\t\tthis.raw = raw;\n\t\t}\n\n\t\tpublic override TsCommand Add(ICommandPart? addParameter)\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"Raw commands cannot be extented\");\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn raw!;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Commands/TsCommand.gen.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\n\nnamespace TSLib.Commands\n{\n\tpartial class TsCommand\n\t{\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, bool? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, bool value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<bool> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, sbyte? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, sbyte value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<sbyte> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, byte? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, byte value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<byte> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, short? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, short value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<short> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ushort? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ushort value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<ushort> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, int? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, int value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<int> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, uint? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, uint value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<uint> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, long? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, long value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<long> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ulong? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ulong value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<ulong> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, float? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, float value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<float> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, double? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, double value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<double> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, string value) { if(value != null) Add(new CommandParameter(key, value)); return this; }\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<string> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, DateTime? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, DateTime value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<DateTime> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, Uid? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, Uid value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<Uid> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ClientDbId? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ClientDbId value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<ClientDbId> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ClientId? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ClientId value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<ClientId> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ChannelId? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ChannelId value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<ChannelId> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ServerGroupId? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ServerGroupId value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<ServerGroupId> value) => Add(new CommandMultiParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ChannelGroupId? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, ChannelGroupId value) => Add(new CommandParameter(key, value));\n\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<ChannelGroupId> value) => Add(new CommandMultiParameter(key, value));\n\n\t}\n\n\tpartial class CommandParameter\n\t{\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, bool value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, sbyte value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, byte value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, short value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, ushort value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, int value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, uint value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, long value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, ulong value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, float value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, double value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, string value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, DateTime value) { Key = key; Value = Serialize(value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, Uid value) { Key = key; Value = Serialize(value.Value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, ClientDbId value) { Key = key; Value = Serialize(value.Value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, ClientId value) { Key = key; Value = Serialize(value.Value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, ChannelId value) { Key = key; Value = Serialize(value.Value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, ServerGroupId value) { Key = key; Value = Serialize(value.Value); }\n\n\t\t[DebuggerStepThrough] public CommandParameter(string key, ChannelGroupId value) { Key = key; Value = Serialize(value.Value); }\n\n\t}\n\n\tpartial class CommandMultiParameter\n\t{\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<bool> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<sbyte> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<byte> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<short> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<ushort> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<int> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<uint> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<long> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<ulong> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<float> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<double> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<string> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<DateTime> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<Uid> value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<ClientDbId> value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<ClientId> value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<ChannelId> value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<ServerGroupId> value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); }\n\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<ChannelGroupId> value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); }\n\n\t}\n}"
  },
  {
    "path": "TSLib/Commands/TsCommand.gen.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n<#@ template debug=\"false\" hostspecific=\"true\" language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ output extension=\".cs\" #>\n\n<#\n// \"TimeSpan\" (Currently removed, as it is too ambiguous)\nvar types = new [] {\"bool\", \"sbyte\", \"byte\", \"short\", \"ushort\", \"int\", \"uint\", \"long\", \"ulong\", \"float\", \"double\", \"string\", \"DateTime\" };\nvar aliasTypes = new [] { \"Uid\",  \"ClientDbId\", \"ClientId\", \"ChannelId\", \"ServerGroupId\", \"ChannelGroupId\" };\nvar classTypes = new [] { \"string\" };\n#>\n\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\n\nnamespace TSLib.Commands\n{\n\tpartial class TsCommand\n\t{\n<#\nforeach (var type in types.Concat(aliasTypes)) { \n\tif (classTypes.Contains(type)) { #>\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, <#= type #> value) { if(value != null) Add(new CommandParameter(key, value)); return this; }\n<# } else { #>\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, <#= type #>? value) { if(value != null) return Add(key, value.Value); return this; }\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, <#= type #> value) => Add(new CommandParameter(key, value));\n<# } #>\n\t\t[DebuggerStepThrough] public TsCommand Add(string key, IEnumerable<<#= type #>> value) => Add(new CommandMultiParameter(key, value));\n<# } #>\n\t}\n\n\tpartial class CommandParameter\n\t{\n<# foreach (var type in types.Concat(aliasTypes)) {\n\tvar value = aliasTypes.Contains(type) ? \"value.Value\" : \"value\";\n\t#>\n\t\t[DebuggerStepThrough] public CommandParameter(string key, <#= type #> value) { Key = key; Value = Serialize(<#= value #>); }\n<# } #>\n\t}\n\n\tpartial class CommandMultiParameter\n\t{\n<#\nforeach (var type in types.Concat(aliasTypes)) { \n\tif (aliasTypes.Contains(type)) { #>\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<<#= type #>> value) { Key = key; Values = value.Select(v => CommandParameter.Serialize(v.Value)).ToArray(); }\n<# } else { #>\n\t\t[DebuggerStepThrough] public CommandMultiParameter(string key, IEnumerable<<#= type #>> value) { Key = key; Values = value.Select(CommandParameter.Serialize).ToArray(); }\n<#\n\t}\n}\n#>\n\t}\n}"
  },
  {
    "path": "TSLib/Commands/TsConst.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TSLib.Commands\n{\n\tpublic class TsConst\n\t{\n\t\tpublic static TsConst Default { get; } = new TsConst();\n\n\t\tpublic static TsConst Server_3_8_0 { get; } = new TsConst()\n\t\t{\n\t\t\tMaxSizeTextMessage = 8192\n\t\t};\n\n\t\tpublic static TsConst GetByServerBuildNum(ulong buildNum)\n\t\t{\n\t\t\tif (buildNum >= 1558938729UL) // 3.8.0 [Build: 1558938729]\n\t\t\t\treturn Server_3_8_0;\n\n\t\t\treturn Default;\n\t\t}\n\n\t\t// Common Definitions\n\n\t\t//limited length, measured in characters\n\t\tpublic int MaxSizeChannelName { get; private set; } = 40;\n\t\tpublic int MaxSizeVirtualserverName { get; private set; } = 64;\n\t\tpublic int MaxSizeClientNicknameSdk { get; private set; } = 64;\n\t\tpublic int MinSizeClientNicknameSdk { get; private set; } = 3;\n\t\tpublic int MaxSizeReasonMessage { get; private set; } = 80;\n\n\t\t//limited length, measured in bytes (utf8 encoded)\n\t\tpublic int MaxSizeTextMessage { get; private set; } = 1024;\n\t\tpublic int MaxSizeChannelTopic { get; private set; } = 255;\n\t\tpublic int MaxSizeChannelDescription { get; private set; } = 8192;\n\t\tpublic int MaxSizeVirtualserverWelcomeMessage { get; private set; } = 1024;\n\n\t\t// Rare Definitions\n\n\t\t//limited length, measured in characters\n\t\tpublic int MaxSizeClientNickname { get; private set; } = 30;\n\t\tpublic int MinSizeClientNickname { get; private set; } = 3;\n\t\tpublic int MaxSizeAwayMessage { get; private set; } = 80;\n\t\tpublic int MaxSizeGroupName { get; private set; } = 30;\n\t\tpublic int MaxSizeTalkRequestMessage { get; private set; } = 50;\n\t\tpublic int MaxSizeComplainMessage { get; private set; } = 200;\n\t\tpublic int MaxSizeClientDescription { get; private set; } = 200;\n\t\tpublic int MaxSizeHostMessage { get; private set; } = 200;\n\t\tpublic int MaxSizeHostbuttonTooltip { get; private set; } = 50;\n\t\tpublic int MaxSizepokeMessage { get; private set; } = 100;\n\t\tpublic int MaxSizeOfflineMessage { get; private set; } = 4096;\n\t\tpublic int MaxSizeOfflineMessageSubject { get; private set; } = 200;\n\n\t\t//limited length, measured in bytes (utf8 encoded)\n\t\tpublic int MaxSizePluginCommand { get; private set; } = 1024 * 8;\n\t\tpublic int MaxSizeVirtualserverHostbannerGfxUrl { get; private set; } = 2000;\n\n\t\tpublic TsConst() { }\n\t}\n}\n"
  },
  {
    "path": "TSLib/Commands/TsString.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Linq;\nusing System.Text;\nusing TSLib.Helper;\n#if NETCOREAPP3_1\nusing System.Runtime.Intrinsics;\nusing System.Runtime.Intrinsics.X86;\n#endif\n\nnamespace TSLib.Commands\n{\n\tpublic static class TsString\n\t{\n\t\tpublic static string Escape(string stringToEscape) => Escape(stringToEscape.AsSpan());\n\n\t\tpublic static string Escape(ReadOnlySpan<char> stringToEscape)\n\t\t{\n\t\t\tvar strb = new StringBuilder(stringToEscape.Length);\n\t\t\tfor (int i = 0; i < stringToEscape.Length; i++)\n\t\t\t{\n\t\t\t\tswitch (stringToEscape[i])\n\t\t\t\t{\n\t\t\t\tcase '\\\\': strb.Append(\"\\\\\\\\\"); break; // Backslash\n\t\t\t\tcase '/': strb.Append(\"\\\\/\"); break;   // Slash\n\t\t\t\tcase ' ': strb.Append(\"\\\\s\"); break;   // Whitespace\n\t\t\t\tcase '|': strb.Append(\"\\\\p\"); break;   // Pipe\n\t\t\t\tcase '\\f': strb.Append(\"\\\\f\"); break;  // Formfeed\n\t\t\t\tcase '\\n': strb.Append(\"\\\\n\"); break;  // Newline\n\t\t\t\tcase '\\r': strb.Append(\"\\\\r\"); break;  // Carriage Return\n\t\t\t\tcase '\\t': strb.Append(\"\\\\t\"); break;  // Horizontal Tab\n\t\t\t\tcase '\\v': strb.Append(\"\\\\v\"); break;  // Vertical Tab\n\t\t\t\tdefault: strb.Append(stringToEscape[i]); break;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tpublic static string Unescape(string stringToUnescape) => Unescape(stringToUnescape.AsSpan());\n\n\t\tpublic static string Unescape(ReadOnlySpan<char> stringToUnescape)\n\t\t{\n\t\t\tvar strb = new StringBuilder(stringToUnescape.Length);\n\t\t\tfor (int i = 0; i < stringToUnescape.Length; i++)\n\t\t\t{\n\t\t\t\tchar c = stringToUnescape[i];\n\t\t\t\tif (c == '\\\\')\n\t\t\t\t{\n\t\t\t\t\tif (++i >= stringToUnescape.Length) throw new FormatException();\n\t\t\t\t\tswitch (stringToUnescape[i])\n\t\t\t\t\t{\n\t\t\t\t\tcase 'v': strb.Append('\\v'); break;  // Vertical Tab\n\t\t\t\t\tcase 't': strb.Append('\\t'); break;  // Horizontal Tab\n\t\t\t\t\tcase 'r': strb.Append('\\r'); break;  // Carriage Return\n\t\t\t\t\tcase 'n': strb.Append('\\n'); break;  // Newline\n\t\t\t\t\tcase 'f': strb.Append('\\f'); break;  // Formfeed\n\t\t\t\t\tcase 'p': strb.Append('|'); break;   // Pipe\n\t\t\t\t\tcase 's': strb.Append(' '); break;   // Whitespace\n\t\t\t\t\tcase '/': strb.Append('/'); break;   // Slash\n\t\t\t\t\tcase '\\\\': strb.Append('\\\\'); break; // Backslash\n\t\t\t\t\tdefault: throw new FormatException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse strb.Append(c);\n\t\t\t}\n\t\t\treturn strb.ToString();\n\t\t}\n\n\t\tpublic static string Unescape(ReadOnlySpan<byte> stringToUnescape)\n\t\t{\n\t\t\t// The unescaped string is always equal or shorter than the original.\n\t\t\tvar strb = new byte[stringToUnescape.Length];\n\t\t\tint writepos = 0;\n\t\t\tfor (int i = 0; i < stringToUnescape.Length; i++)\n\t\t\t{\n\t\t\t\tbyte c = stringToUnescape[i];\n\t\t\t\tif (c == (byte)'\\\\')\n\t\t\t\t{\n\t\t\t\t\tif (++i >= stringToUnescape.Length) throw new FormatException();\n\t\t\t\t\tstrb[writepos++] = (stringToUnescape[i]) switch\n\t\t\t\t\t{\n\t\t\t\t\t\t(byte)'v' => (byte)'\\v', // Vertical Tab\n\t\t\t\t\t\t(byte)'t' => (byte)'\\t', // Horizontal Tab\n\t\t\t\t\t\t(byte)'r' => (byte)'\\r', // Carriage Return\n\t\t\t\t\t\t(byte)'n' => (byte)'\\n', // Newline\n\t\t\t\t\t\t(byte)'f' => (byte)'\\f', // Formfeed\n\t\t\t\t\t\t(byte)'p' => (byte)'|',  // Pipe\n\t\t\t\t\t\t(byte)'s' => (byte)' ',  // Whitespace\n\t\t\t\t\t\t(byte)'/' => (byte)'/',  // Slash\n\t\t\t\t\t\t(byte)'\\\\' => (byte)'\\\\',// Backslash\n\t\t\t\t\t\t_ => throw new FormatException(),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse strb[writepos++] = c;\n\t\t\t}\n\t\t\treturn Tools.Utf8Encoder.GetString(strb, 0, writepos);\n\t\t}\n\n\t\tpublic static int TokenLength(string str) => Tools.Utf8Encoder.GetByteCount(str) + str.Count(IsDoubleChar);\n\n\t\tpublic static bool IsDoubleChar(char c) => unchecked(c == (byte)c) && IsDoubleChar(unchecked((byte)c));\n\n#if NETCOREAPP3_1\n\t\tprivate static readonly Vector128<byte> doubleVec = Vector128.Create((byte)'\\\\', (byte)'/', (byte)' ', (byte)'|', (byte)'\\f', (byte)'\\n', (byte)'\\r', (byte)'\\t', (byte)'\\v', 0, 0, 0, 0, 0, 0, 0);\n#endif\n\n\t\tpublic static bool IsDoubleChar(byte c)\n\t\t{\n#if NETCOREAPP3_1\n\t\t\tif (Sse2.IsSupported)\n\t\t\t{\n\t\t\t\tvar inc = Vector128.Create(c);\n\t\t\t\tvar res = Sse2.CompareEqual(doubleVec, inc);\n\t\t\t\tvar mask = Sse2.MoveMask(res);\n\t\t\t\treturn mask != 0;\n\t\t\t}\n#endif\n\n\t\t\treturn c == ' ' ||\n\t\t\t\tc == '/' ||\n\t\t\t\tc == '|' ||\n\t\t\t\tc == '\\\\' ||\n\t\t\t\tc == '\\n' ||\n\t\t\t\tc == '\\r' ||\n\t\t\t\tc == '\\f' ||\n\t\t\t\tc == '\\t' ||\n\t\t\t\tc == '\\v';\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/ConnectionData.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TSLib.Full;\nusing TSLib.Helper;\n\nnamespace TSLib\n{\n\t/// <summary>Used to pass basic connecting information. (Usually for the query)</summary>\n\tpublic class ConnectionData\n\t{\n\t\t/// <summary>Hostname or Ip-Address including the port. This address can point to the\n\t\t/// server or the tsdns service.</summary>\n\t\tpublic string Address { get; }\n\t\t/// <summary>Attaches a name to log evets and threads. Useful for debugging.</summary>\n\t\tpublic Id LogId { get; }\n\n\t\tpublic ConnectionData(string address, Id? logId = null)\n\t\t{\n\t\t\tAddress = address;\n\t\t\tLogId = logId ?? Id.Null;\n\t\t}\n\t}\n\n\t/// <summary>Used to pass detailed connecting information to the full client.</summary>\n\tpublic class ConnectionDataFull : ConnectionData\n\t{\n\t\t/// <summary>\n\t\t/// Secret identity of the user.\n\t\t/// </summary>\n\t\tpublic IdentityData Identity { get; }\n\t\t/// <summary>\n\t\t/// Set this to the TeamSpeak 3 Version this client should appear as.\n\t\t/// You can find predefined version data in the <see cref=\"TsVersionSigned\"/>\n\t\t/// class. Please keep in mind that the version data has to have valid sign\n\t\t/// to be accepted by an official TeamSpeak 3 Server.\n\t\t/// </summary>\n\t\tpublic TsVersionSigned VersionSign { get; }\n\t\t/// <summary>The display username.</summary>\n\t\tpublic string Username { get; }\n\t\t/// <summary>The server password. Leave null if none.</summary>\n\t\tpublic Password ServerPassword { get; }\n\t\t/// <summary>\n\t\t/// <para>The default channel this client should try to join when connecting.</para>\n\t\t/// <para>The channel can be specified with either the channel name path, example: \"Lobby/Home\".\n\t\t/// Or with the channel id in the following format: /&lt;id&gt;, example: \"/5\"</para>\n\t\t/// </summary>\n\t\tpublic string DefaultChannel { get; }\n\t\t/// <summary>Password for the default channel. Leave null if none.</summary>\n\t\tpublic Password DefaultChannelPassword { get; }\n\n\t\tpublic ConnectionDataFull(\n\t\t\tstring address,\n\t\t\tIdentityData identity,\n\t\t\tTsVersionSigned? versionSign = null,\n\t\t\tstring? username = null,\n\t\t\tPassword? serverPassword = null,\n\t\t\tstring? defaultChannel = null,\n\t\t\tPassword? defaultChannelPassword = null,\n\t\t\tId? logId = null)\n\t\t\t\t: base(address, logId)\n\t\t{\n\t\t\tIdentity = identity;\n\t\t\tVersionSign = versionSign ?? (Tools.IsLinux ? TsVersionSigned.VER_LIN_3_X_X : TsVersionSigned.VER_WIN_3_X_X);\n\t\t\tUsername = username ?? \"TSLibUser\";\n\t\t\tServerPassword = serverPassword ?? Password.Empty;\n\t\t\tDefaultChannel = defaultChannel ?? string.Empty;\n\t\t\tDefaultChannelPassword = defaultChannelPassword ?? Password.Empty;\n\t\t}\n\t}\n\n\tpublic readonly struct Password\n\t{\n\t\tpublic static readonly Password Empty = FromHash(string.Empty);\n\n\t\tpublic string HashedPassword { get; }\n\n\t\tprivate Password(string hashed) { HashedPassword = hashed; }\n\t\tpublic static Password FromHash(string hash) => new Password(hash);\n\t\tpublic static Password FromPlain(string pass) => new Password(TsCrypt.HashPassword(pass));\n\n\t\tpublic static implicit operator Password(string pass) => FromPlain(pass);\n\t}\n}\n"
  },
  {
    "path": "TSLib/DisconnectEventArgs.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing TSLib.Messages;\n\nnamespace TSLib\n{\n\tpublic class DisconnectEventArgs : EventArgs\n\t{\n\t\tpublic Reason ExitReason { get; }\n\t\tpublic CommandError? Error { get; }\n\n\t\tpublic DisconnectEventArgs(Reason exitReason, CommandError? error = null)\n\t\t{\n\t\t\tExitReason = exitReason;\n\t\t\tError = error;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/EventDispatcher.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Concurrent;\nusing System.Threading;\nusing TSLib.Helper;\n\nnamespace TSLib\n{\n\tinternal static class EventDispatcherHelper\n\t{\n\t\tpublic const string DispatcherTitle = \"TS Dispatcher\";\n\t\tpublic const string EventLoopTitle = \"TS MessageLoop\";\n\n\t\tinternal static string CreateLogThreadName(string threadName, Id id) => threadName + (id == Id.Null ? \"\" : $\"[{id}]\");\n\n\t\tinternal static string CreateDispatcherTitle(Id id) => CreateLogThreadName(DispatcherTitle, id);\n\t}\n\n\t/// <summary> Provides a function to run a receiving loop and asynchronously\n\t/// dispatch notifications.\n\t/// </summary>\n\tinternal interface IEventDispatcher : IDisposable\n\t{\n\t\t/// <summary>Initializes the dispatcher.</summary>\n\t\t/// <param name=\"eventLoop\">The main loop which will be receiving packets.</param>\n\t\t/// <param name=\"dispatcher\">The method to call asynchronously when a new\n\t\t/// notification comes in.</param>\n\t\t/// <param name=\"ctx\">The current connection context.</param>\n\t\tvoid Init(Action<LazyNotification> dispatcher, Id id);\n\t\t/// <summary>Dispatches the notification.</summary>\n\t\t/// <param name=\"lazyNotification\"></param>\n\t\tvoid Invoke(LazyNotification lazyNotification);\n\t\tvoid DoWork();\n\t}\n\n\tinternal sealed class ExtraThreadEventDispatcher : IEventDispatcher\n\t{\n\t\tprivate Action<LazyNotification> dispatcher;\n\t\tprivate Thread dispatchThread;\n\t\tprivate readonly ConcurrentQueue<LazyNotification> eventQueue = new ConcurrentQueue<LazyNotification>();\n\t\tprivate readonly AutoResetEvent eventBlock = new AutoResetEvent(false);\n\t\tprivate volatile bool run;\n\n#pragma warning disable CS8618 // !NRT on Init\n\t\tpublic ExtraThreadEventDispatcher() { }\n#pragma warning restore CS8618\n\n\t\tpublic void Init(Action<LazyNotification> dispatcher, Id id)\n\t\t{\n\t\t\trun = true;\n\t\t\tthis.dispatcher = dispatcher;\n\n\t\t\tdispatchThread = new Thread(() =>\n\t\t\t{\n\t\t\t\tTools.SetLogId(id);\n\t\t\t\tDispatchLoop();\n\t\t\t})\n\t\t\t{ Name = EventDispatcherHelper.CreateDispatcherTitle(id) };\n\t\t\tdispatchThread.Start();\n\t\t}\n\n\t\tpublic void Invoke(LazyNotification lazyNotification)\n\t\t{\n\t\t\teventQueue.Enqueue(lazyNotification);\n\t\t\teventBlock.Set();\n\t\t}\n\n\t\tprivate void DispatchLoop()\n\t\t{\n\t\t\twhile (run)\n\t\t\t{\n\t\t\t\teventBlock.WaitOne();\n\t\t\t\twhile (!eventQueue.IsEmpty)\n\t\t\t\t{\n\t\t\t\t\tif (eventQueue.TryDequeue(out var lazyNotification))\n\t\t\t\t\t\tdispatcher.Invoke(lazyNotification);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void DoWork()\n\t\t{\n\t\t\tif (Thread.CurrentThread.ManagedThreadId != dispatchThread.ManagedThreadId)\n\t\t\t\treturn;\n\t\t\tif (eventQueue.TryDequeue(out var lazyNotification))\n\t\t\t\tdispatcher.Invoke(lazyNotification);\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\trun = false;\n\t\t\teventBlock.Set();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/Book/Book.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Linq;\nusing TSLib.Helper;\nusing TSLib.Messages;\nusing SocketAddr = System.String;\n\nnamespace TSLib.Full.Book\n{\n\tpublic partial class Connection\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n\t\tpublic Client? Self() => GetClient(OwnClient);\n\t\tpublic Channel? CurrentChannel()\n\t\t{\n\t\t\tvar self = Self();\n\t\t\tif (self is null)\n\t\t\t\treturn null;\n\t\t\treturn GetChannel(self.Channel);\n\t\t}\n\n\t\tprivate void SetServer(Server server)\n\t\t{\n\t\t\tServer = server;\n\t\t}\n\n\t\tprivate Channel? GetChannel(ChannelId id)\n\t\t{\n\t\t\tif (Channels.TryGetValue(id, out var channel))\n\t\t\t\treturn channel;\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate void SetChannel(Channel channel, ChannelId id)\n\t\t{\n\t\t\tchannel.Id = id;\n\t\t\tChannels[id] = channel;\n\t\t}\n\n\t\tprivate void RemoveChannel(ChannelId id)\n\t\t{\n\t\t\tvar cur = Channels[id];\n\t\t\tChannels.Remove(id);\n\t\t\tChannelOrderRemove(id, cur.Order);\n\t\t}\n\n\t\tprivate Client? GetClient(ClientId id)\n\t\t{\n\t\t\tif (Clients.TryGetValue(id, out var client))\n\t\t\t\treturn client;\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate void SetClient(Client client, ClientId id)\n\t\t{\n\t\t\tclient.Id = id;\n\t\t\tClients[id] = client;\n\t\t}\n\n\t\tprivate void RemoveClient(ClientId id)\n\t\t{\n\t\t\tClients.Remove(id);\n\t\t}\n\n\t\tprivate void SetConnectionClientData(ConnectionClientData connectionClientData, ClientId id)\n\t\t{\n\t\t\tif (!Clients.TryGetValue(id, out var client))\n\t\t\t\treturn;\n\t\t\tclient.ConnectionData = connectionClientData;\n\t\t}\n\n\t\tprivate void SetServerGroup(ServerGroup serverGroup, ServerGroupId id)\n\t\t{\n\t\t\tGroups[id] = serverGroup;\n\t\t}\n\n\t\tprivate Server GetServer()\n\t\t{\n\t\t\treturn Server;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tChannels.Clear();\n\t\t\tClients.Clear();\n\t\t\tGroups.Clear();\n\t\t\tOwnClient = ClientId.Null;\n\t\t\tServer = new Server();\n\t\t}\n\n\t\t// Manual post event functions\n\n\t\tpartial void PostClientEnterView(ClientEnterView msg) => SetOwnChannelSubscribed(msg.ClientId);\n\t\tpartial void PostClientMoved(ClientMoved msg) => SetOwnChannelSubscribed(msg.ClientId);\n\t\tprivate void SetOwnChannelSubscribed(ClientId clientId)\n\t\t{\n\t\t\tif (clientId == OwnClient)\n\t\t\t{\n\t\t\t\tvar curChan = CurrentChannel();\n\t\t\t\tif (curChan != null)\n\t\t\t\t{\n\t\t\t\t\tcurChan.Subscribed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Manual move functions\n\n\t\tprivate static (MaxClients?, MaxClients?) MaxClientsCcFun(ChannelCreated msg) => MaxClientsFun(msg.MaxClients, msg.IsMaxClientsUnlimited, msg.MaxFamilyClients, msg.IsMaxFamilyClientsUnlimited, msg.InheritsMaxFamilyClients);\n\t\tprivate static (MaxClients?, MaxClients?) MaxClientsCeFun(ChannelEdited msg) => MaxClientsFun(msg.MaxClients, msg.IsMaxClientsUnlimited, msg.MaxFamilyClients, msg.IsMaxFamilyClientsUnlimited, msg.InheritsMaxFamilyClients);\n\t\tprivate static (MaxClients?, MaxClients?) MaxClientsClFun(ChannelList msg) => MaxClientsFun(msg.MaxClients, msg.IsMaxClientsUnlimited, msg.MaxFamilyClients, msg.IsMaxFamilyClientsUnlimited, msg.InheritsMaxFamilyClients);\n\t\tprivate static (MaxClients?, MaxClients?) MaxClientsFun(int? MaxClients, bool? IsMaxClientsUnlimited, int? MaxFamilyClients, bool? IsMaxFamilyClientsUnlimited, bool? InheritsMaxFamilyClients)\n\t\t{\n\t\t\tvar chn = new MaxClients();\n\t\t\tif (IsMaxClientsUnlimited == true) chn.LimitKind = MaxClientsKind.Unlimited;\n\t\t\telse\n\t\t\t{\n\t\t\t\tchn.LimitKind = MaxClientsKind.Limited;\n\t\t\t\tchn.Count = (ushort)Math.Max(Math.Min(ushort.MaxValue, MaxClients ?? ushort.MaxValue), 0);\n\t\t\t}\n\n\t\t\tvar fam = new MaxClients();\n\t\t\tif (IsMaxFamilyClientsUnlimited == true) fam.LimitKind = MaxClientsKind.Unlimited;\n\t\t\telse if (InheritsMaxFamilyClients == true) fam.LimitKind = MaxClientsKind.Inherited;\n\t\t\telse\n\t\t\t{\n\t\t\t\tfam.LimitKind = MaxClientsKind.Limited;\n\t\t\t\tfam.Count = (ushort)Math.Max(Math.Min(ushort.MaxValue, MaxFamilyClients ?? ushort.MaxValue), 0);\n\t\t\t}\n\t\t\treturn (chn, fam);\n\t\t}\n\n\t\tprivate static ChannelType ChannelTypeCcFun(ChannelCreated msg) => ChannelTypeFun(msg.IsSemiPermanent, msg.IsPermanent);\n\t\tprivate static ChannelType ChannelTypeCeFun(ChannelEdited msg) => ChannelTypeFun(msg.IsSemiPermanent, msg.IsPermanent);\n\t\tprivate static ChannelType ChannelTypeClFun(ChannelList msg) => ChannelTypeFun(msg.IsSemiPermanent, msg.IsPermanent);\n\t\tprivate static ChannelType ChannelTypeFun(bool? semi, bool? perma)\n\t\t{\n\t\t\tif (semi == true) return ChannelType.SemiPermanent;\n\t\t\telse if (perma == true) return ChannelType.Permanent;\n\t\t\telse return ChannelType.Temporary;\n\t\t}\n\n\t\tprivate static string? AwayCevFun(ClientEnterView msg) => AwayFun(msg.IsAway, msg.AwayMessage);\n\t\tprivate static string? AwayCuFun(ClientUpdated msg) => AwayFun(msg.IsAway, msg.AwayMessage);\n\t\tprivate static string? AwayFun(bool? away, string? msg)\n\t\t\t=> away switch\n\t\t\t{\n\t\t\t\ttrue => msg ?? \"\",\n\t\t\t\t_ => null,\n\t\t\t};\n\n\t\tprivate static TalkPowerRequest? TalkPowerCevFun(ClientEnterView msg)\n\t\t{\n\t\t\tif (msg.TalkPowerRequestTime != Tools.UnixTimeStart)\n\t\t\t\treturn new TalkPowerRequest() { Time = msg.TalkPowerRequestTime, Message = msg.TalkPowerRequestMessage ?? \"\" };\n\t\t\treturn null;\n\t\t}\n\t\tprivate static TalkPowerRequest? TalkPowerCuFun(ClientUpdated msg) => TalkPowerFun(msg.TalkPowerRequestTime, msg.TalkPowerRequestMessage);\n\t\tprivate static TalkPowerRequest? TalkPowerFun(DateTime? time, string? message)\n\t\t{\n\t\t\tif (time != null && time != Tools.UnixTimeStart) // TODO\n\t\t\t\treturn new TalkPowerRequest() { Time = time.Value, Message = message ?? \"\" };\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate static ClientType ClientTypeCevFun(ClientEnterView msg) => msg.ClientType;\n\n\t\tprivate ChannelId ChannelOrderCcFun(ChannelCreated msg)\n\t\t{\n\t\t\tChannelOrderInsert(msg.ChannelId, msg.Order, msg.ParentId);\n\t\t\treturn msg.Order;\n\t\t}\n\t\tprivate ChannelId ChannelOrderCmFun(ChannelMoved msg) => ChannelOrderMoveFun(msg.ChannelId, msg.Order, msg.ParentId);\n\t\tprivate ChannelId? ChannelOrderCeFun(ChannelEdited msg)\n\t\t{\n\t\t\tif (msg.Order == null)\n\t\t\t\treturn null;\n\t\t\treturn ChannelOrderMoveFun(msg.ChannelId, msg.Order.Value, msg.ParentId);\n\t\t}\n\n\t\tprivate ChannelId ChannelOrderMoveFun(ChannelId id, ChannelId newOrder, ChannelId? parent)\n\t\t{\n\t\t\t// [ C:4 | O:0 ]\n\t\t\t// [ C:5 | O:4 ]──┐\n\t\t\t// [ C:7 | O:5 ]  │ (Up1: O -> 4)\n\t\t\t// [            <─┘ (Chg: C:5 | O:7)\n\t\t\t// [ C:8 | O:7 ]    (Up2: O -> 5)\n\n\t\t\tvar cur = Channels[id];\n\t\t\tvar oldOrder = cur.Order;\n\t\t\tvar newParent = parent ?? cur.Parent;\n\n\t\t\tChannelOrderRemove(id, oldOrder); // Up1\n\t\t\tChannelOrderInsert(id, newOrder, newParent); // Up2\n\t\t\treturn newOrder;\n\t\t}\n\n\t\tprivate void ChannelOrderRemove(ChannelId id, ChannelId oldOrder)\n\t\t{\n\t\t\t// [ C:7 | O:_ ]\n\t\t\t// [ C:5 | O:7 ] ─>X\n\t\t\t// [ C:_ | O:5 ]     (Upd: O -> 7)\n\n\t\t\tvar chan = Channels.Values.FirstOrDefault(x => x.Order == id);\n\t\t\tif (chan != null) chan.Order = oldOrder;\n\t\t}\n\n\t\tprivate void ChannelOrderInsert(ChannelId id, ChannelId newOrder, ChannelId parent)\n\t\t{\n\t\t\t// [ C:7 | O:_ ]\n\t\t\t// [            <── (New: C:5 | O:7)\n\t\t\t// [ C:_ | O:7 ]    (Upd: O -> 5)\n\n\t\t\t// or\n\n\t\t\t// [ C:_ | O:_ ]     \n\t\t\t//  ├ [            <── (New: C:5 | O:0)\n\t\t\t//  └ [ C:_ | O:0 ]    (Upd: O -> 5)\n\n\t\t\t// Multiple channel with Order:0 might exist,\n\t\t\t// we need to find one with the same parent as the inserted channel\n\t\t\tvar chan = Channels.Values.FirstOrDefault(x => x.Order == newOrder && x.Parent == parent);\n\t\t\tif (chan != null) chan.Order = id;\n\t\t}\n\n\t\tprivate static SocketAddr AddressFun(ClientConnectionInfo msg) => msg.Ip;\n\n\t\tprivate void SetClientDataFun(InitServer initServer)\n\t\t{\n\t\t\tOwnClient = initServer.ClientId;\n\t\t}\n\n\t\tprivate bool ChannelSubscribeFun(ChannelSubscribed _) => true;\n\n\t\tprivate bool ChannelUnsubscribeFun(ChannelUnsubscribed msg)\n\t\t{\n\t\t\tvar goneClients = Clients.Values.Where(client => client.Channel == msg.ChannelId).ToArray();\n\t\t\tforeach (var clid in goneClients)\n\t\t\t\tClients.Remove(clid.Id);\n\t\t\treturn false;\n\t\t}\n\n\t\tprivate static bool ReturnFalse<T>(T _) => false;\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/Book/SpecialTypes.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Full.Book\n{\n\tpublic struct MaxClients\n\t{\n\t\tpublic ushort Count { get; internal set; }\n\t\tpublic MaxClientsKind LimitKind { get; internal set; }\n\t}\n\n\tpublic enum MaxClientsKind\n\t{\n\t\tUnlimited,\n\t\tInherited,\n\t\tLimited,\n\t}\n\n\tpublic enum ChannelType\n\t{\n\t\tTemporary,\n\t\tSemiPermanent,\n\t\tPermanent,\n\t}\n\n\tpublic struct TalkPowerRequest\n\t{\n\t\tpublic DateTime Time { get; internal set; }\n\t\tpublic string Message { get; internal set; }\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/GenerationWindow.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Full\n{\n\tpublic sealed class GenerationWindow\n\t{\n\t\tpublic int MappedBaseOffset { get; set; }\n\t\tpublic uint Generation { get; set; }\n\t\tpublic int Mod { get; }\n\t\tpublic int ReceiveWindow { get; }\n\n\t\tpublic GenerationWindow(int mod) : this(mod, mod / 2) { }\n\n\t\tpublic GenerationWindow(int mod, int windowSize)\n\t\t{\n\t\t\tMod = mod;\n\t\t\tReceiveWindow = windowSize;\n\t\t}\n\n\t\tpublic bool SetAndDrag(int mappedValue)\n\t\t{\n\t\t\tvar inWindow = IsInWindow(mappedValue);\n\t\t\tif (inWindow)\n\t\t\t\tAdvanceToExcluded(mappedValue);\n\t\t\treturn inWindow;\n\t\t}\n\n\t\tpublic void Advance(int amount)\n\t\t{\n\t\t\tif (amount > Mod)\n\t\t\t\tthrow new Exception(\"Cannot advance more than one generation\");\n\t\t\tif (amount < 0)\n\t\t\t\tthrow new Exception(\"Cannot advance backwards\");\n\t\t\tif (amount == 0)\n\t\t\t\treturn;\n\t\t\tint newBaseOffset = MappedBaseOffset + amount;\n\t\t\tif (newBaseOffset >= Mod)\n\t\t\t{\n\t\t\t\tGeneration += (uint)(newBaseOffset / Mod);\n\t\t\t\tnewBaseOffset %= Mod;\n\t\t\t}\n\t\t\tMappedBaseOffset = newBaseOffset;\n\t\t}\n\n\t\tpublic void AdvanceToExcluded(int mappedValue)\n\t\t{\n\t\t\tvar moveDist = (mappedValue - MappedBaseOffset) + 1;\n\t\t\tif (moveDist <= 0)\n\t\t\t\treturn;\n\t\t\tAdvance(moveDist);\n\t\t}\n\n\t\tpublic bool IsInWindow(int mappedValue)\n\t\t{\n\t\t\tint maxOffset = MappedBaseOffset + ReceiveWindow;\n\t\t\tif (maxOffset < Mod)\n\t\t\t{\n\t\t\t\treturn mappedValue >= MappedBaseOffset && mappedValue < maxOffset;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn mappedValue >= MappedBaseOffset || mappedValue < maxOffset - Mod;\n\t\t\t}\n\t\t}\n\n\t\tpublic bool IsNextGen(int mappedValue) =>\n\t\t\t   MappedBaseOffset > (Mod - ReceiveWindow)\n\t\t\t&& mappedValue < (MappedBaseOffset + ReceiveWindow) - Mod;\n\n\t\tpublic uint GetGeneration(int mappedValue) => (uint)(Generation + (IsNextGen(mappedValue) ? 1 : 0));\n\n\t\tpublic int MappedToIndex(int mappedValue)\n\t\t{\n\t\t\tif (mappedValue >= Mod)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(mappedValue));\n\n\t\t\tif (IsNextGen(mappedValue))\n\t\t\t{\n\t\t\t\t// | XX             X>    | <= The part from BaseOffset to MappedMod is small enough to consider packets with wrapped numbers again\n\t\t\t\t//   /\\ NewValue    /\\ BaseOffset\n\t\t\t\treturn (mappedValue + Mod) - MappedBaseOffset;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// |  X>             XX   |\n\t\t\t\t//    /\\ BaseOffset  /\\ NewValue    // normal case\n\t\t\t\treturn mappedValue - MappedBaseOffset;\n\t\t\t}\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tMappedBaseOffset = 0;\n\t\t\tGeneration = 0;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/IdentityData.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Org.BouncyCastle.Math;\nusing Org.BouncyCastle.Math.EC;\nusing System;\n\nnamespace TSLib.Full\n{\n\t/// <summary>Represents the identity of a user.\n\t/// To generate new identities use <see cref=\"TsCrypt.GenerateNewIdentity\"/>.\n\t/// To improve the security level of this identity use <see cref=\"TsCrypt.ImproveSecurity\"/>.</summary>\n\tpublic class IdentityData\n\t{\n\t\tprivate string? publicKeyString;\n\t\tprivate string? privateKeyString;\n\t\tprivate string? publicAndPrivateKeyString;\n\n\t\t/// <summary>The public key encoded in base64.</summary>\n\t\tpublic string PublicKeyString => publicKeyString ??= TsCrypt.ExportPublicKey(PublicKey);\n\t\t/// <summary>The private key encoded in base64.</summary>\n\t\tpublic string PrivateKeyString => privateKeyString ??= TsCrypt.ExportPrivateKey(PrivateKey);\n\t\t/// <summary>The public and private key encoded in base64.</summary>\n\t\tpublic string PublicAndPrivateKeyString => publicAndPrivateKeyString ??= TsCrypt.ExportPublicAndPrivateKey(PublicKey, PrivateKey);\n\t\t/// <summary>The public key represented as its cryptographic data structure.</summary>\n\t\tpublic ECPoint PublicKey { get; }\n\t\t/// <summary>The private key represented as its cryptographic data structure.</summary>\n\t\tpublic BigInteger PrivateKey { get; }\n\t\t/// <summary>A number which is used to determine the security level of this identity.</summary>\n\t\tpublic ulong ValidKeyOffset { get; set; }\n\t\t/// <summary>When bruteforcing numbers linearly from 0, the last bruteforced number\n\t\t/// can be stored here to resume from when continuing to search.</summary>\n\t\tpublic ulong LastCheckedKeyOffset { get; set; }\n\n\t\tprivate Uid? clientUid;\n\t\t/// <summary>The client uid, which can be used in teamspeak for various features.</summary>\n\t\tpublic Uid ClientUid => clientUid ?? (clientUid = (Uid)TsCrypt.GetUidFromPublicKey(PublicKeyString)).Value;\n\n\t\tpublic IdentityData(BigInteger privateKey, ECPoint? publicKey = null)\n\t\t{\n\t\t\tPrivateKey = privateKey ?? throw new ArgumentNullException(nameof(privateKey));\n\t\t\tPublicKey = publicKey ?? TsCrypt.RestorePublicFromPrivateKey(privateKey);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/License.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Chaos.NaCl.Ed25519Ref10;\nusing System;\nusing System.Buffers.Binary;\nusing System.Collections.Generic;\nusing TSLib.Helper;\n\nnamespace TSLib.Full\n{\n\tpublic class Licenses\n\t{\n\t\tpublic static readonly byte[] LicenseRootKey =\n\t\t{\n\t\t\t0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c, 0xfd, 0x8f, 0x68, 0xb3, 0xdc, 0x75, 0x55, 0xb2,\n\t\t\t0x9d, 0xcc, 0xec, 0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a\n\t\t};\n\n\t\tpublic List<LicenseBlock> Blocks { get; } = new List<LicenseBlock>();\n\n\t\tpublic static R<Licenses, string> Parse(ReadOnlySpan<byte> data)\n\t\t{\n\t\t\tif (data.Length < 1)\n\t\t\t\treturn \"License too short\";\n\t\t\tvar version = data[0];\n\t\t\tif (version != 1)\n\t\t\t\treturn \"Unsupported version\";\n\n\t\t\t// Read licenses\n\t\t\tvar res = new Licenses();\n\t\t\tdata = data.Slice(1);\n\t\t\twhile (data.Length > 0)\n\t\t\t{\n\t\t\t\t// Read next license\n\t\t\t\tvar result = LicenseBlock.Parse(data);\n\t\t\t\tif (!result.Ok)\n\t\t\t\t\treturn result.Error;\n\t\t\t\tvar (license, len) = result.Value;\n\n\t\t\t\t// TODO Check valid times\n\n\t\t\t\tres.Blocks.Add(license);\n\t\t\t\tdata = data.Slice(len);\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\n\t\tpublic byte[] DeriveKey()\n\t\t{\n\t\t\tvar round = LicenseRootKey; //Ed25519.DecodePoint(LicenseRootKey);\n\t\t\tforeach (var block in Blocks)\n\t\t\t\tround = block.DeriveKey(round);\n\t\t\treturn round;\n\t\t}\n\t}\n\n\tpublic abstract class LicenseBlock\n\t{\n\t\tprivate const int MinBlockLen = 42;\n\n\t\tpublic abstract ChainBlockType Type { get; }\n\t\tpublic DateTime NotValidBefore { get; set; }\n\t\tpublic DateTime NotValidAfter { get; set; }\n#pragma warning disable CS8618\n\t\tpublic byte[] Key { get; set; }\n\t\tpublic byte[] Hash { get; set; }\n#pragma warning restore CS8618\n\n\t\tpublic static R<(LicenseBlock block, int read), string> Parse(ReadOnlySpan<byte> data)\n\t\t{\n\t\t\tif (data.Length < MinBlockLen)\n\t\t\t{\n\t\t\t\treturn \"License too short\";\n\t\t\t}\n\t\t\tif (data[0] != 0)\n\t\t\t{\n\t\t\t\treturn $\"Wrong key kind {data[0]} in license\";\n\t\t\t}\n\n\t\t\tLicenseBlock block;\n\t\t\tint read;\n\t\t\tswitch (data[33])\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tvar result = ReadNullString(data.Slice(46));\n\t\t\t\tif (!result.Ok) return result.Error;\n\t\t\t\tvar nullStr = result.Value;\n\t\t\t\tblock = new IntermediateLicenseBlock(nullStr.str);\n\t\t\t\tread = 5 + nullStr.read;\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tif (!Enum.IsDefined(typeof(ServerLicenseType), data[42]))\n\t\t\t\t\treturn $\"Unknown license type {data[42]}\";\n\t\t\t\tresult = ReadNullString(data.Slice(47));\n\t\t\t\tif (!result.Ok) return result.Error;\n\t\t\t\tnullStr = result.Value;\n\t\t\t\tblock = new ServerLicenseBlock(result.Value.str, (ServerLicenseType)data[42]);\n\t\t\t\tread = 6 + nullStr.read;\n\t\t\t\tbreak;\n\n\t\t\tcase 32:\n\t\t\t\tblock = new EphemeralLicenseBlock();\n\t\t\t\tread = 0;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn $\"Invalid license block type {data[33]}\";\n\t\t\t}\n\n\t\t\tblock.NotValidBefore = Tools.UnixTimeStart.AddSeconds(BinaryPrimitives.ReadUInt32BigEndian(data.Slice(34)) + 0x50e22700uL);\n\t\t\tblock.NotValidAfter = Tools.UnixTimeStart.AddSeconds(BinaryPrimitives.ReadUInt32BigEndian(data.Slice(38)) + 0x50e22700uL);\n\t\t\tif (block.NotValidAfter < block.NotValidBefore)\n\t\t\t\treturn \"License times are invalid\";\n\n\t\t\tblock.Key = data.Slice(1, 32).ToArray();\n\n\t\t\tvar allLen = MinBlockLen + read;\n\t\t\tvar hash = TsCrypt.Hash512It(data[1..allLen].ToArray());\n\t\t\tblock.Hash = hash.AsSpan(0, 32).ToArray();\n\n\t\t\treturn (block, allLen);\n\t\t}\n\n\t\tprivate static R<(string str, int read), string> ReadNullString(ReadOnlySpan<byte> data)\n\t\t{\n\t\t\tvar termIndex = data.IndexOf((byte)0);\n\t\t\tif (termIndex >= 0)\n\t\t\t\treturn (data.Slice(0, termIndex).NewUtf8String(), termIndex);\n\t\t\treturn \"Non-null-terminated issuer string\";\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Calculates a new public key by processing an existing one with this license bock.\n\t\t/// The key is calculated as following: <code>new_pub_key = pub_key * hash + parent</code>.\n\t\t/// Where <code>pub_key</code> and <code>parent</code> are public keys, and <code>hash</code> a private key.\n\t\t/// </summary>\n\t\t/// <param name=\"parent\">The preceeding key (from the previous block or root key).</param>\n\t\t/// <returns>The new public key after processing it with this block.</returns>\n\t\tpublic byte[] DeriveKey(ReadOnlySpan<byte> parent)\n\t\t{\n\t\t\tScalarOperations.sc_clamp(Hash);\n\t\t\tGroupOperations.ge_frombytes_negate_vartime(out var pubkey, Key);\n\t\t\tGroupOperations.ge_frombytes_negate_vartime(out var parkey, parent);\n\n\t\t\tGroupOperations.ge_scalarmult_vartime(out GroupElementP1P1 res, Hash, pubkey);\n\t\t\tGroupOperations.ge_p3_to_cached(out var pargrp, parkey);\n\n\t\t\tGroupOperations.ge_p1p1_to_p3(out var r, res);\n\t\t\tGroupOperations.ge_add(out var a, r, pargrp);\n\t\t\tGroupOperations.ge_p1p1_to_p3(out var r2, a);\n\t\t\tvar final = new byte[32];\n\t\t\tGroupOperations.ge_p3_tobytes(final, r2);\n\t\t\tfinal[31] ^= 0x80;\n\n\t\t\treturn final;\n\t\t}\n\t}\n\n\t#region BlockTypes\n\n\tpublic class IntermediateLicenseBlock : LicenseBlock\n\t{\n\t\tpublic override ChainBlockType Type => ChainBlockType.Intermediate;\n\t\tpublic string Issuer { get; }\n\n\t\tpublic IntermediateLicenseBlock(string issuer)\n\t\t{\n\t\t\tIssuer = issuer;\n\t\t}\n\t}\n\n\tpublic class WebsiteLicenseBlock : LicenseBlock\n\t{\n\t\tpublic override ChainBlockType Type => ChainBlockType.Website;\n\t\tpublic string Issuer { get; }\n\n\t\tpublic WebsiteLicenseBlock(string issuer)\n\t\t{\n\t\t\tIssuer = issuer;\n\t\t}\n\t}\n\n\tpublic class CodeLicenseBlock : LicenseBlock\n\t{\n\t\tpublic override ChainBlockType Type => ChainBlockType.Code;\n\t\tpublic string Issuer { get; }\n\n\t\tpublic CodeLicenseBlock(string issuer)\n\t\t{\n\t\t\tIssuer = issuer;\n\t\t}\n\t}\n\n\tpublic class ServerLicenseBlock : LicenseBlock\n\t{\n\t\tpublic override ChainBlockType Type => ChainBlockType.Server;\n\t\tpublic string Issuer { get; }\n\t\tpublic ServerLicenseType LicenseType { get; }\n\n\t\tpublic ServerLicenseBlock(string issuer, ServerLicenseType licenseType)\n\t\t{\n\t\t\tIssuer = issuer;\n\t\t\tLicenseType = licenseType;\n\t\t}\n\t}\n\n\tpublic class EphemeralLicenseBlock : LicenseBlock\n\t{\n\t\tpublic override ChainBlockType Type => ChainBlockType.Ephemeral;\n\t}\n\n\tpublic enum ChainBlockType : byte\n\t{\n\t\tIntermediate = 0,\n\t\tWebsite = 1,\n\t\tServer = 2,\n\t\tCode = 3,\n\t\t// (Not used in license parser)\n\t\t//Token = 4,\n\t\t//LicenseSign = 5,\n\t\t//MyTsIdSign = 6,\n\t\tEphemeral = 32,\n\t}\n\n\t#endregion\n\n\tpublic enum ServerLicenseType : byte\n\t{\n\t\tNone = 0,\n\t\tOffline,\n\t\tSdk,\n\t\tSdkOffline,\n\t\tNpl,\n\t\tAthp,\n\t\tAal,\n\t\tDefault,\n\t\tGamer,\n\t\tSponsorship,\n\t\tCommercial,\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/NetworkStats.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing TSLib.Commands;\nusing TSLib.Helper;\n\nnamespace TSLib.Full\n{\n\t// TODO include udp/ip header size to get correct values\n\t/// <summary>Provides connection stats by logging packets.</summary>\n\tpublic sealed class NetworkStats\n\t{\n\t\tprivate readonly long[] outPackets = new long[3];\n\t\tprivate readonly long[] inPackets = new long[3];\n\t\tprivate readonly long[] outBytes = new long[3];\n\t\tprivate readonly long[] inBytes = new long[3];\n\t\tprivate readonly Queue<PacketData> outBytesTime = new Queue<PacketData>();\n\t\tprivate readonly Queue<PacketData> inBytesTime = new Queue<PacketData>();\n\t\tprivate readonly Queue<TimeSpan> pingTimes = new Queue<TimeSpan>(60);\n\t\tprivate static readonly TimeSpan TimeSecond = TimeSpan.FromSeconds(1);\n\t\tprivate static readonly TimeSpan TimeMinute = TimeSpan.FromMinutes(1);\n\t\tprivate readonly object queueLock = new object();\n\n\t\tinternal void LogOutPacket<TDir>(ref Packet<TDir> packet)\n\t\t{\n\t\t\tvar kind = TypeToKind(packet.PacketType);\n\t\t\tlock (queueLock)\n\t\t\t{\n\t\t\t\toutPackets[(int)kind]++;\n\t\t\t\toutBytes[(int)kind] += packet.Raw.Length;\n\t\t\t\tDropOver(outBytesTime, TimeMinute);\n\t\t\t\toutBytesTime.Enqueue(new PacketData((ushort)packet.Raw.Length, Tools.Now, kind));\n\t\t\t}\n\t\t}\n\n\t\tinternal void LogInPacket<TDir>(ref Packet<TDir> packet)\n\t\t{\n\t\t\tvar kind = TypeToKind(packet.PacketType);\n\t\t\tlock (queueLock)\n\t\t\t{\n\t\t\t\tinPackets[(int)kind]++;\n\t\t\t\tinBytes[(int)kind] += packet.Raw.Length;\n\t\t\t\tDropOver(inBytesTime, TimeMinute);\n\t\t\t\tinBytesTime.Enqueue(new PacketData((ushort)packet.Raw.Length, Tools.Now, kind));\n\t\t\t}\n\t\t}\n\n\t\tpublic void LogLostPings(int count)\n\t\t{\n\t\t\t// TODO\n\t\t}\n\n\t\tpublic void AddPing(TimeSpan ping)\n\t\t{\n\t\t\tlock (queueLock)\n\t\t\t{\n\t\t\t\tif (pingTimes.Count >= 60)\n\t\t\t\t\tpingTimes.Dequeue();\n\t\t\t\tpingTimes.Enqueue(ping);\n\t\t\t}\n\t\t}\n\n\t\tprivate static PacketKind TypeToKind(PacketType type)\n\t\t{\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\tcase PacketType.Voice:\n\t\t\tcase PacketType.VoiceWhisper:\n\t\t\t\treturn PacketKind.Speech;\n\t\t\tcase PacketType.Command:\n\t\t\tcase PacketType.CommandLow:\n\t\t\tcase PacketType.Ack:\n\t\t\tcase PacketType.AckLow:\n\t\t\tcase PacketType.Init1:\n\t\t\t\treturn PacketKind.Control;\n\t\t\tcase PacketType.Ping:\n\t\t\tcase PacketType.Pong:\n\t\t\t\treturn PacketKind.Keepalive;\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(type);\n\t\t\t}\n\t\t}\n\n\t\tprivate static void GetWithin(Queue<PacketData> queue, TimeSpan time, out DataCatergory data)\n\t\t{\n\t\t\tvar now = Tools.Now;\n\t\t\tvar nowThresh = now - time;\n\t\t\tdata = new DataCatergory();\n\t\t\tforeach (var pack in queue.Reverse())\n\t\t\t\tif (nowThresh <= pack.SendPoint)\n\t\t\t\t{\n\t\t\t\t\tswitch (pack.Kind)\n\t\t\t\t\t{\n\t\t\t\t\tcase PacketKind.Speech: data.Speech += pack.Size; break;\n\t\t\t\t\tcase PacketKind.Keepalive: data.Keepalive += pack.Size; break;\n\t\t\t\t\tcase PacketKind.Control: data.Control += pack.Size; break;\n\t\t\t\t\tdefault: throw Tools.UnhandledDefault(pack.Kind);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse { break; }\n\t\t\tdata.Speech = (long)(data.Speech / time.TotalSeconds);\n\t\t\tdata.Keepalive = (long)(data.Keepalive / time.TotalSeconds);\n\t\t\tdata.Control = (long)(data.Control / time.TotalSeconds);\n\t\t}\n\n\t\tprivate static void DropOver(Queue<PacketData> queue, TimeSpan time)\n\t\t{\n\t\t\tvar now = Tools.Now;\n\t\t\twhile (queue.Count > 0 && now - queue.Peek().SendPoint > time)\n\t\t\t\tqueue.Dequeue();\n\t\t}\n\n\t\tpublic TsCommand GenerateStatusAnswer()\n\t\t{\n\t\t\tDataCatergory lastSecondIn;\n\t\t\tDataCatergory lastSecondOut;\n\t\t\tDataCatergory lastMinuteIn;\n\t\t\tDataCatergory lastMinuteOut;\n\t\t\tdouble lastPing;\n\t\t\tdouble deviationPing;\n\t\t\tlock (queueLock)\n\t\t\t{\n\t\t\t\tGetWithin(inBytesTime, TimeSecond, out lastSecondIn);\n\t\t\t\tGetWithin(outBytesTime, TimeSecond, out lastSecondOut);\n\t\t\t\tGetWithin(inBytesTime, TimeMinute, out lastMinuteIn);\n\t\t\t\tGetWithin(outBytesTime, TimeMinute, out lastMinuteOut);\n\t\t\t\tif (pingTimes.Count > 0)\n\t\t\t\t{\n\t\t\t\t\tlastPing = pingTimes.Last().TotalMilliseconds;\n\t\t\t\t\tdeviationPing = StdDev(pingTimes.Select(ts => ts.TotalMilliseconds));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlastPing = deviationPing = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new TsCommand(\"setconnectioninfo\") {\n\t\t\t\t{ \"connection_ping\", Math.Round(lastPing, 0) },\n\t\t\t\t{ \"connection_ping_deviation\", deviationPing },\n\t\t\t\t{ \"connection_packets_sent_speech\", outPackets[(int)PacketKind.Speech] },\n\t\t\t\t{ \"connection_packets_sent_keepalive\", outPackets[(int)PacketKind.Keepalive] },\n\t\t\t\t{ \"connection_packets_sent_control\", outPackets[(int)PacketKind.Control] },\n\t\t\t\t{ \"connection_bytes_sent_speech\", outBytes[(int)PacketKind.Speech] },\n\t\t\t\t{ \"connection_bytes_sent_keepalive\", outBytes[(int)PacketKind.Keepalive] },\n\t\t\t\t{ \"connection_bytes_sent_control\", outBytes[(int)PacketKind.Control] },\n\t\t\t\t{ \"connection_packets_received_speech\", inPackets[(int)PacketKind.Speech] },\n\t\t\t\t{ \"connection_packets_received_keepalive\", inPackets[(int)PacketKind.Keepalive] },\n\t\t\t\t{ \"connection_packets_received_control\", inPackets[(int)PacketKind.Control] },\n\t\t\t\t{ \"connection_bytes_received_speech\", inBytes[(int)PacketKind.Speech] },\n\t\t\t\t{ \"connection_bytes_received_keepalive\", inBytes[(int)PacketKind.Keepalive] },\n\t\t\t\t{ \"connection_bytes_received_control\", inBytes[(int)PacketKind.Control] },\n\t\t\t\t{ \"connection_server2client_packetloss_speech\", 42.0000f },\n\t\t\t\t{ \"connection_server2client_packetloss_keepalive\", 1.0000f },\n\t\t\t\t{ \"connection_server2client_packetloss_control\", 0.5000f },\n\t\t\t\t{ \"connection_server2client_packetloss_total\", 0.0000f },\n\t\t\t\t{ \"connection_bandwidth_sent_last_second_speech\", lastSecondOut.Speech },\n\t\t\t\t{ \"connection_bandwidth_sent_last_second_keepalive\", lastSecondOut.Keepalive },\n\t\t\t\t{ \"connection_bandwidth_sent_last_second_control\", lastSecondOut.Control },\n\t\t\t\t{ \"connection_bandwidth_sent_last_minute_speech\", lastMinuteOut.Speech },\n\t\t\t\t{ \"connection_bandwidth_sent_last_minute_keepalive\", lastMinuteOut.Keepalive },\n\t\t\t\t{ \"connection_bandwidth_sent_last_minute_control\", lastMinuteOut.Control },\n\t\t\t\t{ \"connection_bandwidth_received_last_second_speech\", lastSecondIn.Speech },\n\t\t\t\t{ \"connection_bandwidth_received_last_second_keepalive\", lastSecondIn.Keepalive },\n\t\t\t\t{ \"connection_bandwidth_received_last_second_control\", lastSecondIn.Control },\n\t\t\t\t{ \"connection_bandwidth_received_last_minute_speech\", lastMinuteIn.Speech },\n\t\t\t\t{ \"connection_bandwidth_received_last_minute_keepalive\", lastMinuteIn.Keepalive },\n\t\t\t\t{ \"connection_bandwidth_received_last_minute_control\", lastMinuteIn.Control },\n\t\t\t};\n\t\t}\n\n\t\tprivate static double StdDev(IEnumerable<double> values)\n\t\t{\n\t\t\tdouble avg = values.Average();\n\t\t\tdouble sum = 0;\n\t\t\tint n = 0;\n\t\t\tforeach (double val in values)\n\t\t\t{\n\t\t\t\tn++;\n\t\t\t\tsum += (val - avg) * (val - avg);\n\t\t\t}\n\t\t\tif (n > 1)\n\t\t\t\treturn Math.Sqrt(sum / (n - 1));\n\t\t\treturn 0;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tArray.Clear(outPackets, 0, outPackets.Length);\n\t\t\tArray.Clear(inPackets, 0, inPackets.Length);\n\t\t\tArray.Clear(outBytes, 0, outBytes.Length);\n\t\t\tArray.Clear(inBytes, 0, inBytes.Length);\n\t\t\tlock (queueLock)\n\t\t\t{\n\t\t\t\toutBytesTime.Clear();\n\t\t\t\tinBytesTime.Clear();\n\t\t\t\tpingTimes.Clear();\n\t\t\t}\n\t\t}\n\n\t\tprivate enum PacketKind : ushort\n\t\t{\n\t\t\tSpeech,\n\t\t\tKeepalive,\n\t\t\tControl,\n\t\t}\n\n\t\tprivate readonly struct PacketData\n\t\t{\n\t\t\tpublic DateTime SendPoint { get; }\n\t\t\tpublic ushort Size { get; }\n\t\t\tpublic PacketKind Kind { get; }\n\n\t\t\tpublic PacketData(ushort size, DateTime sendPoint, PacketKind kind) { Size = size; SendPoint = sendPoint; Kind = kind; }\n\t\t}\n\n\t\tstruct DataCatergory\n\t\t{\n\t\t\tpublic long Speech { get; set; }\n\t\t\tpublic long Keepalive { get; set; }\n\t\t\tpublic long Control { get; set; }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/Packet.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Buffers.Binary;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing TSLib.Helper;\n\nnamespace TSLib.Full\n{\n\tinternal struct Packet<TDir>\n\t{\n\t\tpublic static bool FromServer { get; } = typeof(TDir) == typeof(S2C);\n\t\tpublic static int HeaderLength { get; } = typeof(TDir) == typeof(S2C) ? S2C.HeaderLen : C2S.HeaderLen;\n\n\t\tpublic PacketType PacketType\n\t\t{\n\t\t\tget => (PacketType)(PacketTypeFlagged & 0x0F);\n\t\t\tset => PacketTypeFlagged = (byte)((PacketTypeFlagged & 0xF0) | ((byte)value & 0x0F));\n\t\t}\n\t\tpublic PacketFlags PacketFlags\n\t\t{\n\t\t\tget => (PacketFlags)(PacketTypeFlagged & 0xF0);\n\t\t\tset => PacketTypeFlagged = (byte)((PacketTypeFlagged & 0x0F) | ((byte)value & 0xF0));\n\t\t}\n\t\tpublic byte PacketTypeFlagged { get; set; }\n\t\tpublic ushort PacketId { get; set; }\n\t\tpublic uint GenerationId { get; set; }\n\t\tpublic int Size => Data.Length;\n\n\t\tpublic TDir HeaderExt { get; set; }\n\n\t\tpublic byte[] Raw { get; private set; }\n\t\tpublic byte[] Header { get; private set; }\n\t\tpublic byte[] Data { get; set; }\n\n\t\tpublic bool FragmentedFlag\n\t\t{\n\t\t\tget => (PacketFlags & PacketFlags.Fragmented) != 0;\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (value) PacketTypeFlagged |= (byte)PacketFlags.Fragmented;\n\t\t\t\telse PacketTypeFlagged &= (byte)~PacketFlags.Fragmented;\n\t\t\t}\n\t\t}\n\t\tpublic bool NewProtocolFlag\n\t\t{\n\t\t\tget => (PacketFlags & PacketFlags.Newprotocol) != 0;\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (value) PacketTypeFlagged |= (byte)PacketFlags.Newprotocol;\n\t\t\t\telse PacketTypeFlagged &= (byte)~PacketFlags.Newprotocol;\n\t\t\t}\n\t\t}\n\t\tpublic bool CompressedFlag\n\t\t{\n\t\t\tget => (PacketFlags & PacketFlags.Compressed) != 0;\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (value) PacketTypeFlagged |= (byte)PacketFlags.Compressed;\n\t\t\t\telse PacketTypeFlagged &= (byte)~PacketFlags.Compressed;\n\t\t\t}\n\t\t}\n\t\tpublic bool UnencryptedFlag\n\t\t{\n\t\t\tget => (PacketFlags & PacketFlags.Unencrypted) != 0;\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (value) PacketTypeFlagged |= (byte)PacketFlags.Unencrypted;\n\t\t\t\telse PacketTypeFlagged &= (byte)~PacketFlags.Unencrypted;\n\t\t\t}\n\t\t}\n\n\t\tpublic Packet(ReadOnlySpan<byte> data, PacketType packetType, ushort packetId, uint generationId) : this()\n\t\t{\n\t\t\tRaw = new byte[data.Length + HeaderLength + TsCrypt.MacLen];\n\t\t\tHeader = new byte[HeaderLength];\n\t\t\tData = data.ToArray();\n\t\t\tPacketType = packetType;\n\t\t\tPacketId = packetId;\n\t\t\tGenerationId = generationId;\n\t\t}\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic static Packet<TDir>? FromRaw(ReadOnlySpan<byte> raw)\n\t\t{\n\t\t\tif (raw.Length < HeaderLength + TsCrypt.MacLen)\n\t\t\t\treturn null;\n\t\t\tvar packet = new Packet<TDir>\n\t\t\t{\n\t\t\t\tRaw = raw.ToArray(),\n\t\t\t\tHeader = new byte[HeaderLength],\n\t\t\t};\n\t\t\tpacket.FromHeader();\n\t\t\treturn packet;\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn $\"Type: {PacketType}\\tFlags: [ \" +\n\t\t\t\t$\"{(FragmentedFlag ? \"F\" : \"_\")} {(NewProtocolFlag ? \"N\" : \"_\")} \" +\n\t\t\t\t$\"{(CompressedFlag ? \"C\" : \"_\")} {(UnencryptedFlag ? \"U\" : \"_\")} ]\\t\" +\n\t\t\t\t$\"Id: {PacketId}\\n\" +\n\t\t\t\t$\"  MAC: { (Raw is null ? string.Empty : DebugUtil.DebugToHex(Raw.AsSpan(0, 8))) }\\t\" +\n\t\t\t\t$\"  Header: { DebugUtil.DebugToHex(Header) }\\n\" +\n\t\t\t\t$\"  Data: { DebugUtil.DebugToHex(Data) }\";\n\t\t}\n\n\t\tpublic void BuildHeader() => BuildHeader(Header);\n\t\tpublic void BuildHeader(Span<byte> into)\n\t\t{\n\t\t\t// typeof(..) and casts get jitted away, don't worry :)\n\t\t\tif (typeof(TDir) == typeof(S2C))\n\t\t\t{\n\t\t\t\tBinaryPrimitives.WriteUInt16BigEndian(into.Slice(0, 2), PacketId);\n\t\t\t\tinto[2] = PacketTypeFlagged;\n\t\t\t}\n\t\t\telse if (typeof(TDir) == typeof(C2S))\n\t\t\t{\n\t\t\t\tvar self = (C2S)(object)HeaderExt!;\n\t\t\t\tBinaryPrimitives.WriteUInt16BigEndian(into.Slice(0, 2), PacketId);\n\t\t\t\tBinaryPrimitives.WriteUInt16BigEndian(into.Slice(2, 2), self.ClientId);\n\t\t\t\tinto[4] = PacketTypeFlagged;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTrace.Fail(\"Invalid associated Packet Data\");\n\t\t\t}\n#if DEBUG\n\t\t\tinto.CopyTo(Header.AsSpan());\n#endif\n\t\t}\n\n\t\tpublic void FromHeader()\n\t\t{\n\t\t\t// typeof(..) and casts get jitted away, don't worry :)\n\t\t\tvar rawSpan = Raw.AsSpan();\n\t\t\tif (typeof(TDir) == typeof(S2C))\n\t\t\t{\n\t\t\t\tPacketId = BinaryPrimitives.ReadUInt16BigEndian(rawSpan.Slice(TsCrypt.MacLen));\n\t\t\t\tPacketTypeFlagged = Raw[TsCrypt.MacLen + 2];\n\t\t\t}\n\t\t\telse if (typeof(TDir) == typeof(C2S))\n\t\t\t{\n\t\t\t\tvar ext = new C2S();\n\t\t\t\tPacketId = BinaryPrimitives.ReadUInt16BigEndian(rawSpan.Slice(TsCrypt.MacLen));\n\t\t\t\text.ClientId = BinaryPrimitives.ReadUInt16BigEndian(rawSpan.Slice(TsCrypt.MacLen + 2));\n\t\t\t\tPacketTypeFlagged = Raw[TsCrypt.MacLen + 4];\n\t\t\t\tHeaderExt = (TDir)(object)ext;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTrace.Fail(\"Invalid associated Packet Data\");\n\t\t\t}\n\t\t}\n\t}\n\n\tinternal class ResendPacket<T>\n\t{\n\t\tpublic /*readonly*/ Packet<T> Packet;\n\t\tpublic DateTime FirstSendTime { get; set; }\n\t\tpublic DateTime LastSendTime { get; set; }\n\n\t\tpublic ResendPacket(Packet<T> packet)\n\t\t{\n\t\t\tPacket = packet;\n\t\t\tvar now = Tools.Now;\n\t\t\tFirstSendTime = now;\n\t\t\tLastSendTime = now;\n\t\t}\n\n\t\tpublic override string ToString() => $\"RS(first:{FirstSendTime},last:{LastSendTime}) => {Packet}\";\n\t}\n\n\tinternal struct C2S\n\t{\n\t\tpublic const int HeaderLen = 5;\n\n\t\tpublic ushort ClientId { get; set; }\n\t}\n\n\tinternal struct S2C\n\t{\n\t\tpublic const int HeaderLen = 3;\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/PacketHandler.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing NLog;\nusing System;\nusing System.Buffers.Binary;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Threading;\nusing TSLib.Helper;\nusing static TSLib.Full.PacketHandlerConst;\n\nnamespace TSLib.Full\n{\n\tinternal sealed class PacketHandler<TIn, TOut>\n\t{\n\t\tprivate static readonly int OutHeaderSize = TsCrypt.MacLen + Packet<TOut>.HeaderLength;\n\t\tprivate static readonly int MaxOutContentSize = MaxOutPacketSize - OutHeaderSize;\n\n\t\t// Timout calculations\n\t\t/// <summary>The SmoothedRoundTripTime holds the smoothed average time\n\t\t/// it takes for a packet to get ack'd.</summary>\n\t\tprivate TimeSpan smoothedRtt;\n\t\t/// <summary>Holds the smoothed rtt variation.</summary>\n\t\tprivate TimeSpan smoothedRttVar;\n\t\t/// <summary>Holds the current RetransmissionTimeOut, which determines the timespan until\n\t\t/// a packet is considered to be lost.</summary>\n\t\tprivate TimeSpan currentRto;\n\t\tprivate readonly Stopwatch pingTimer = new Stopwatch();\n\t\tprivate readonly Stopwatch lastMessageTimer = new Stopwatch();\n\t\tprivate ushort lastSentPingId;\n\t\tprivate ushort lastReceivedPingId;\n\n\t\t// Out Packets\n\t\tprivate readonly ushort[] packetCounter;\n\t\tprivate readonly uint[] generationCounter;\n\t\tprivate ResendPacket<TOut>? initPacketCheck;\n\t\tprivate readonly Dictionary<ushort, ResendPacket<TOut>> packetAckManager = new Dictionary<ushort, ResendPacket<TOut>>();\n\t\t// In Packets\n\t\tprivate readonly GenerationWindow receiveWindowVoice;\n\t\tprivate readonly GenerationWindow receiveWindowVoiceWhisper;\n\t\tprivate readonly RingQueue<Packet<TIn>> receiveQueueCommand;\n\t\tprivate readonly RingQueue<Packet<TIn>> receiveQueueCommandLow;\n\t\t// ====\n\t\tprivate readonly object sendLoopLock = new object();\n\t\tprivate readonly TsCrypt tsCrypt;\n\t\tprivate Socket? socket;\n\t\tprivate Timer? resendTimer;\n\t\tprivate DateTime pingCheck;\n\t\tprivate int pingCheckRunning; // bool\n\t\tprivate readonly Id id; // Log id\n\n\t\tpublic NetworkStats NetworkStats { get; }\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tprivate IPEndPoint? remoteAddress;\n\t\tprivate int closed; // bool\n\n\t\tpublic PacketEvent<TIn>? PacketEvent;\n\t\tpublic Action<Reason?>? StopEvent;\n\n\t\tpublic PacketHandler(TsCrypt ts3Crypt, Id id)\n\t\t{\n\t\t\treceiveQueueCommand = new RingQueue<Packet<TIn>>(ReceivePacketWindowSize, ushort.MaxValue + 1);\n\t\t\treceiveQueueCommandLow = new RingQueue<Packet<TIn>>(ReceivePacketWindowSize, ushort.MaxValue + 1);\n\t\t\treceiveWindowVoice = new GenerationWindow(ushort.MaxValue + 1);\n\t\t\treceiveWindowVoiceWhisper = new GenerationWindow(ushort.MaxValue + 1);\n\n\t\t\tNetworkStats = new NetworkStats();\n\n\t\t\tpacketCounter = new ushort[TsCrypt.PacketTypeKinds];\n\t\t\tgenerationCounter = new uint[TsCrypt.PacketTypeKinds];\n\t\t\tthis.tsCrypt = ts3Crypt;\n\t\t\tthis.id = id;\n\t\t}\n\n\t\tpublic E<string> Connect(IPEndPoint address)\n\t\t{\n\t\t\tif (!Initialize(address, true).GetOk(out var error))\n\t\t\t\treturn \"Failed to initialize: \" + error.Message;\n\t\t\t// The old client used to send 'clientinitiv' as the first message.\n\t\t\t// All newer servers still ack it but do not require it anymore.\n\t\t\t// Therefore there is no use in sending it.\n\t\t\t// We still have to increase the packet counter as if we had sent\n\t\t\t//  it because the packed-ids the server expects are fixed.\n\t\t\tIncPacketCounter(PacketType.Command);\n\t\t\t// Send the actual new init packet.\n\t\t\treturn AddOutgoingPacket(tsCrypt.ProcessInit1<TIn>(null).Value, PacketType.Init1);\n\t\t}\n\n\t\tpublic void Listen(IPEndPoint address)\n\t\t{\n\t\t\tlock (sendLoopLock)\n\t\t\t{\n\t\t\t\tInitialize(address, false).Unwrap();\n\t\t\t\t// dummy\n\t\t\t\tinitPacketCheck = new ResendPacket<TOut>(new Packet<TOut>(Array.Empty<byte>(), 0, 0, 0))\n\t\t\t\t{\n\t\t\t\t\tFirstSendTime = DateTime.MaxValue,\n\t\t\t\t\tLastSendTime = DateTime.MaxValue\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tprivate E<Exception> Initialize(IPEndPoint address, bool connect)\n\t\t{\n\t\t\tif (address is null) throw new ArgumentNullException(nameof(address));\n\n\t\t\tlock (sendLoopLock)\n\t\t\t{\n\t\t\t\tClientId = default;\n\t\t\t\tclosed = 0;\n\t\t\t\tsmoothedRtt = MaxRetryInterval;\n\t\t\t\tsmoothedRttVar = TimeSpan.Zero;\n\t\t\t\tcurrentRto = MaxRetryInterval;\n\t\t\t\tlastSentPingId = 0;\n\t\t\t\tlastReceivedPingId = 0;\n\t\t\t\tlastMessageTimer.Restart();\n\n\t\t\t\tinitPacketCheck = null;\n\t\t\t\tpacketAckManager.Clear();\n\t\t\t\treceiveQueueCommand.Clear();\n\t\t\t\treceiveQueueCommandLow.Clear();\n\t\t\t\treceiveWindowVoice.Reset();\n\t\t\t\treceiveWindowVoiceWhisper.Reset();\n\t\t\t\tArray.Clear(packetCounter, 0, packetCounter.Length);\n\t\t\t\tArray.Clear(generationCounter, 0, generationCounter.Length);\n\t\t\t\tNetworkStats.Reset();\n\n\t\t\t\tsocket?.Dispose();\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (connect)\n\t\t\t\t\t{\n\t\t\t\t\t\tremoteAddress = address;\n\t\t\t\t\t\tsocket = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);\n\t\t\t\t\t\tsocket.Bind(new IPEndPoint(address.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, 0));\n\n\t\t\t\t\t\tvar socketEventArgs = new SocketAsyncEventArgs();\n\t\t\t\t\t\tsocketEventArgs.SetBuffer(new byte[4096], 0, 4096);\n\t\t\t\t\t\tsocketEventArgs.Completed += FetchPacketEvent;\n\t\t\t\t\t\tsocketEventArgs.UserToken = this;\n\t\t\t\t\t\tsocketEventArgs.RemoteEndPoint = remoteAddress;\n\t\t\t\t\t\tsocket.ReceiveFromAsync(socketEventArgs);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tremoteAddress = null;\n\t\t\t\t\t\tsocket = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);\n\t\t\t\t\t\tsocket.Bind(address);\n\t\t\t\t\t\t// TODO init socketevargs stuff\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (SocketException ex) { return ex; }\n\n\t\t\t\tpingCheckRunning = 0;\n\t\t\t\tpingCheck = Tools.Now;\n\t\t\t\tif (resendTimer == null)\n\t\t\t\t\tresendTimer = new Timer((_) => { using (MappedDiagnosticsLogicalContext.SetScoped(\"BotId\", id)) ResendLoop(); }, null, ClockResolution, ClockResolution);\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t}\n\n\t\tpublic void Stop() => Stop(null);\n\t\tprivate void Stop(Reason? closeReason)\n\t\t{\n\t\t\tvar wasClosed = Interlocked.Exchange(ref closed, 1);\n\t\t\tif (wasClosed != 0)\n\t\t\t\treturn;\n\t\t\tLog.Debug(\"Stopping PacketHandler {0}\", closeReason);\n\n\t\t\tlock (sendLoopLock)\n\t\t\t{\n\t\t\t\tresendTimer?.Dispose();\n\t\t\t\tsocket?.Dispose();\n\t\t\t\tPacketEvent = null;\n\t\t\t}\n\t\t\tStopEvent?.Invoke(closeReason);\n\t\t}\n\n\t\tpublic E<string> AddOutgoingPacket(ReadOnlySpan<byte> packet, PacketType packetType, PacketFlags addFlags = PacketFlags.None)\n\t\t{\n\t\t\tlock (sendLoopLock)\n\t\t\t{\n\t\t\t\tif (closed != 0)\n\t\t\t\t\treturn \"Connection closed\";\n\n\t\t\t\tif (NeedsSplitting(packet.Length) && packetType != PacketType.VoiceWhisper)\n\t\t\t\t{\n\t\t\t\t\t// VoiceWhisper packets are excluded for some reason\n\t\t\t\t\tif (packetType == PacketType.Voice)\n\t\t\t\t\t\treturn \"Voice packet too big\"; // This happens when a voice packet is bigger than the allowed size\n\n\t\t\t\t\tvar tmpCompress = QuickerLz.Compress(packet, 1);\n\t\t\t\t\tif (tmpCompress.Length < packet.Length)\n\t\t\t\t\t{\n\t\t\t\t\t\tpacket = tmpCompress;\n\t\t\t\t\t\taddFlags |= PacketFlags.Compressed;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (NeedsSplitting(packet.Length))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn AddOutgoingSplitData(packet, packetType, addFlags);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn SendOutgoingData(packet, packetType, addFlags);\n\t\t\t}\n\t\t}\n\n\t\tprivate E<string> AddOutgoingSplitData(ReadOnlySpan<byte> rawData, PacketType packetType, PacketFlags addFlags = PacketFlags.None)\n\t\t{\n\t\t\tint pos = 0;\n\t\t\tbool first = true;\n\t\t\tbool last;\n\n\t\t\t// TODO check if \"packBuffer.FreeSlots >= packetSplit.Count\"\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\tint blockSize = Math.Min(MaxOutContentSize, rawData.Length - pos);\n\t\t\t\tif (blockSize <= 0) break;\n\n\t\t\t\tvar flags = PacketFlags.None;\n\t\t\t\tlast = pos + blockSize == rawData.Length;\n\t\t\t\tif (first ^ last)\n\t\t\t\t\tflags |= PacketFlags.Fragmented;\n\t\t\t\tif (first)\n\t\t\t\t{\n\t\t\t\t\tflags |= addFlags;\n\t\t\t\t\tfirst = false;\n\t\t\t\t}\n\n\t\t\t\tDebug.Assert(!NeedsSplitting(blockSize));\n\t\t\t\tvar sendResult = SendOutgoingData(rawData.Slice(pos, blockSize), packetType, flags);\n\t\t\t\tif (!sendResult.Ok)\n\t\t\t\t\treturn sendResult;\n\n\t\t\t\tpos += blockSize;\n\t\t\t} while (!last);\n\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\t// is always locked on 'sendLoopLock' from a higher call\n\t\tprivate E<string> SendOutgoingData(ReadOnlySpan<byte> data, PacketType packetType, PacketFlags flags = PacketFlags.None)\n\t\t{\n\t\t\tvar ids = GetPacketCounter(packetType);\n\t\t\tIncPacketCounter(packetType);\n\n\t\t\tvar packet = new Packet<TOut>(data, packetType, ids.Id, ids.Generation) { PacketType = packetType };\n\t\t\tif (typeof(TOut) == typeof(C2S)) // TODO: XXX\n\t\t\t{\n\t\t\t\tvar meta = (C2S)(object)packet.HeaderExt!;\n\t\t\t\tmeta.ClientId = ClientId.Value;\n\t\t\t\tpacket.HeaderExt = (TOut)(object)meta;\n\t\t\t}\n\t\t\tpacket.PacketFlags |= flags;\n\n\t\t\tswitch (packet.PacketType)\n\t\t\t{\n\t\t\tcase PacketType.Voice:\n\t\t\tcase PacketType.VoiceWhisper:\n\t\t\t\tpacket.PacketFlags |= PacketFlags.Unencrypted;\n\t\t\t\tBinaryPrimitives.WriteUInt16BigEndian(packet.Data, packet.PacketId);\n\t\t\t\tLogRawVoice.Trace(\"[O] {0}\", packet);\n\t\t\t\tbreak;\n\n\t\t\tcase PacketType.Command:\n\t\t\tcase PacketType.CommandLow:\n\t\t\t\tpacket.PacketFlags |= PacketFlags.Newprotocol;\n\t\t\t\tvar resendPacket = new ResendPacket<TOut>(packet);\n\t\t\t\tpacketAckManager.Add(packet.PacketId, resendPacket);\n\t\t\t\tLogRaw.Debug(\"[O] {0}\", packet);\n\t\t\t\tbreak;\n\n\t\t\tcase PacketType.Ping:\n\t\t\t\tlastSentPingId = packet.PacketId;\n\t\t\t\tpacket.PacketFlags |= PacketFlags.Unencrypted;\n\t\t\t\tLogRaw.Trace(\"[O] Ping {0}\", packet.PacketId);\n\t\t\t\tbreak;\n\n\t\t\tcase PacketType.Pong:\n\t\t\t\tpacket.PacketFlags |= PacketFlags.Unencrypted;\n\t\t\t\tLogRaw.Trace(\"[O] Pong {0}\", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));\n\t\t\t\tbreak;\n\n\t\t\tcase PacketType.Ack:\n\t\t\t\tLogRaw.Debug(\"[O] Acking Ack: {0}\", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));\n\t\t\t\tbreak;\n\n\t\t\tcase PacketType.AckLow:\n\t\t\t\tpacket.PacketFlags |= PacketFlags.Unencrypted;\n\t\t\t\tLogRaw.Debug(\"[O] Acking AckLow: {0}\", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));\n\t\t\t\tbreak;\n\n\t\t\tcase PacketType.Init1:\n\t\t\t\tpacket.PacketFlags |= PacketFlags.Unencrypted;\n\t\t\t\tinitPacketCheck = new ResendPacket<TOut>(packet);\n\t\t\t\tLogRaw.Debug(\"[O] InitID: {0}\", packet.Data[4]);\n\t\t\t\tLogRaw.Trace(\"[O] {0}\", packet);\n\t\t\t\tbreak;\n\n\t\t\tdefault: throw Tools.UnhandledDefault(packet.PacketType);\n\t\t\t}\n\n\t\t\ttsCrypt.Encrypt(ref packet);\n\n\t\t\treturn SendRaw(ref packet);\n\t\t}\n\n\t\tprivate (ushort Id, uint Generation) GetPacketCounter(PacketType packetType)\n\t\t\t=> (packetType != PacketType.Init1)\n\t\t\t\t? (packetCounter[(int)packetType], generationCounter[(int)packetType])\n\t\t\t\t: (101, 0);\n\n\t\tprivate void IncPacketCounter(PacketType packetType)\n\t\t{\n\t\t\tunchecked { packetCounter[(int)packetType]++; }\n\t\t\tif (packetCounter[(int)packetType] == 0)\n\t\t\t\tgenerationCounter[(int)packetType]++;\n\t\t}\n\n\t\tprivate static bool NeedsSplitting(int dataSize) => dataSize + OutHeaderSize > MaxOutPacketSize;\n\n\t\tprivate static void FetchPacketEvent(object? selfObj, SocketAsyncEventArgs args)\n\t\t{\n\t\t\tvar self = (PacketHandler<TIn, TOut>)args.UserToken;\n\n\t\t\tbool isAsync;\n\t\t\tusing (MappedDiagnosticsLogicalContext.SetScoped(\"BotId\", self.id))\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (self.closed != 0)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (args.SocketError == SocketError.Success)\n\t\t\t\t\t{\n\t\t\t\t\t\tself.FetchPackets(args.Buffer.AsSpan(0, args.BytesTransferred));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tLog.Debug(\"Socket error: {@args}\", args);\n\t\t\t\t\t\tif (args.SocketError == SocketError.ConnectionReset)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tself.Stop(Reason.SocketError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlock (self.sendLoopLock)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (self.closed != 0)\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\tTrace.Assert(self.socket != null, nameof(self.socket) + \" is null\");\n\t\t\t\t\t\ttry { isAsync = self.socket!.ReceiveFromAsync(args); }\n\t\t\t\t\t\tcatch (Exception ex) { Log.Debug(ex, \"Error starting socket receive\"); return; }\n\t\t\t\t\t}\n\t\t\t\t} while (!isAsync);\n\t\t\t}\n\t\t}\n\n\t\tprivate void FetchPackets(Span<byte> buffer)\n\t\t{\n\t\t\tvar optpacket = Packet<TIn>.FromRaw(buffer);\n\t\t\t// Invalid packet, ignore\n\t\t\tif (optpacket is null)\n\t\t\t{\n\t\t\t\tLogRaw.Warn(\"Dropping invalid packet: {0}\", DebugUtil.DebugToHex(buffer));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar packet = optpacket.Value;\n\n\t\t\t// DebugToHex is costly and allocates, precheck before logging\n\t\t\tif (LogRaw.IsTraceEnabled)\n\t\t\t\tLogRaw.Trace(\"[I] Raw {0}\", DebugUtil.DebugToHex(packet.Raw));\n\n\t\t\tFindIncommingGenerationId(ref packet);\n\t\t\tif (!tsCrypt.Decrypt(ref packet))\n\t\t\t{\n\t\t\t\tLogRaw.Warn(\"Dropping not decryptable packet: {0}\", DebugUtil.DebugToHex(packet.Raw));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlastMessageTimer.Restart();\n\t\t\tNetworkStats.LogInPacket(ref packet);\n\n\t\t\tbool passPacketToEvent = true;\n\t\t\tswitch (packet.PacketType)\n\t\t\t{\n\t\t\tcase PacketType.Voice:\n\t\t\t\tLogRawVoice.Trace(\"[I] {0}\", packet);\n\t\t\t\tpassPacketToEvent = ReceiveVoice(ref packet, receiveWindowVoice);\n\t\t\t\tbreak;\n\t\t\tcase PacketType.VoiceWhisper:\n\t\t\t\tLogRawVoice.Trace(\"[I] {0}\", packet);\n\t\t\t\tpassPacketToEvent = ReceiveVoice(ref packet, receiveWindowVoiceWhisper);\n\t\t\t\tbreak;\n\t\t\tcase PacketType.Command:\n\t\t\t\tLogRaw.Debug(\"[I] {0}\", packet);\n\t\t\t\tpassPacketToEvent = ReceiveCommand(ref packet, receiveQueueCommand, PacketType.Ack);\n\t\t\t\tbreak;\n\t\t\tcase PacketType.CommandLow:\n\t\t\t\tLogRaw.Debug(\"[I] {0}\", packet);\n\t\t\t\tpassPacketToEvent = ReceiveCommand(ref packet, receiveQueueCommandLow, PacketType.AckLow);\n\t\t\t\tbreak;\n\t\t\tcase PacketType.Ping:\n\t\t\t\tLogRaw.Trace(\"[I] Ping {0}\", packet.PacketId);\n\t\t\t\tReceivePing(ref packet);\n\t\t\t\tbreak;\n\t\t\tcase PacketType.Pong:\n\t\t\t\tLogRaw.Trace(\"[I] Pong {0}\", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));\n\t\t\t\tpassPacketToEvent = ReceivePong(ref packet);\n\t\t\t\tbreak;\n\t\t\tcase PacketType.Ack:\n\t\t\t\tLogRaw.Debug(\"[I] Acking: {0}\", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));\n\t\t\t\tpassPacketToEvent = ReceiveAck(ref packet);\n\t\t\t\tbreak;\n\t\t\tcase PacketType.AckLow: break;\n\t\t\tcase PacketType.Init1:\n\t\t\t\tif (!LogRaw.IsTraceEnabled) LogRaw.Debug(\"[I] InitID: {0}\", packet.Data[0]);\n\t\t\t\tif (!LogRaw.IsDebugEnabled) LogRaw.Trace(\"[I] {0}\", packet);\n\t\t\t\tpassPacketToEvent = ReceiveInitAck(ref packet);\n\t\t\t\tbreak;\n\t\t\tdefault: throw Tools.UnhandledDefault(packet.PacketType);\n\t\t\t}\n\n\t\t\tif (passPacketToEvent)\n\t\t\t\tPacketEvent?.Invoke(ref packet);\n\t\t}\n\n\t\t#region Packet checking\n\t\t// These methods are for low level packet processing which the\n\t\t// rather high level TS3FullClient should not worry about.\n\n\t\tprivate void FindIncommingGenerationId(ref Packet<TIn> packet)\n\t\t{\n\t\t\tGenerationWindow window;\n\t\t\tswitch (packet.PacketType)\n\t\t\t{\n\t\t\tcase PacketType.Voice: window = receiveWindowVoice; break;\n\t\t\tcase PacketType.VoiceWhisper: window = receiveWindowVoiceWhisper; break;\n\t\t\tcase PacketType.Command: window = receiveQueueCommand.Window; break;\n\t\t\tcase PacketType.CommandLow: window = receiveQueueCommandLow.Window; break;\n\t\t\tdefault: return;\n\t\t\t}\n\n\t\t\tpacket.GenerationId = window.GetGeneration(packet.PacketId);\n\t\t}\n\n\t\tprivate bool ReceiveVoice(ref Packet<TIn> packet, GenerationWindow window)\n\t\t\t=> window.SetAndDrag(packet.PacketId);\n\n\t\tprivate bool ReceiveCommand(ref Packet<TIn> packet, RingQueue<Packet<TIn>> packetQueue, PacketType ackType)\n\t\t{\n\t\t\tvar setStatus = packetQueue.IsSet(packet.PacketId);\n\n\t\t\t// Check if we cannot accept this packet since it doesn't fit into the receive window\n\t\t\tif (setStatus == ItemSetStatus.OutOfWindowNotSet)\n\t\t\t\treturn false;\n\n\t\t\tSendAck(packet.PacketId, ackType);\n\n\t\t\t// Check if we already have this packet and only need to ack it.\n\t\t\tif (setStatus.HasFlag(ItemSetStatus.Set))\n\t\t\t\treturn false;\n\n\t\t\tpacketQueue.Set(packet.PacketId, packet);\n\t\t\twhile (TryGetCommand(packetQueue, out packet))\n\t\t\t\tPacketEvent?.Invoke(ref packet);\n\n\t\t\treturn false;\n\t\t}\n\n\t\tprivate static bool TryGetCommand(RingQueue<Packet<TIn>> packetQueue, out Packet<TIn> packet)\n\t\t{\n\t\t\tif (packetQueue.Count <= 0) { packet = default; return false; }\n\n\t\t\tint take = 0;\n\t\t\tint takeLen = 0;\n\t\t\tbool hasStart = false;\n\t\t\tbool hasEnd = false;\n\t\t\tfor (int i = 0; i < packetQueue.Count; i++)\n\t\t\t{\n\t\t\t\tif (packetQueue.TryPeekStart(i, out var peekPacket))\n\t\t\t\t{\n\t\t\t\t\ttake++;\n\t\t\t\t\ttakeLen += peekPacket.Size;\n\t\t\t\t\tif (peekPacket.FragmentedFlag)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!hasStart) { hasStart = true; }\n\t\t\t\t\t\telse { hasEnd = true; break; }\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!hasStart) { hasStart = true; hasEnd = true; break; }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!hasStart || !hasEnd) { packet = default; return false; }\n\n\t\t\t// GET\n\t\t\tif (!packetQueue.TryDequeue(out packet))\n\t\t\t\tTrace.Fail(\"Packet in queue got missing (?)\");\n\n\t\t\t// MERGE\n\t\t\tif (take > 1)\n\t\t\t{\n\t\t\t\tvar preFinalArray = new byte[takeLen];\n\n\t\t\t\t// for loop at 0th element\n\t\t\t\tint curCopyPos = packet.Size;\n\t\t\t\tpacket.Data.CopyTo(preFinalArray.AsSpan(0, packet.Size));\n\n\t\t\t\tfor (int i = 1; i < take; i++)\n\t\t\t\t{\n\t\t\t\t\tif (!packetQueue.TryDequeue(out var nextPacket))\n\t\t\t\t\t\tTrace.Fail(\"Packet in queue got missing (?)\");\n\n\t\t\t\t\tnextPacket.Data.CopyTo(preFinalArray.AsSpan(curCopyPos, nextPacket.Size));\n\t\t\t\t\tcurCopyPos += nextPacket.Size;\n\t\t\t\t}\n\t\t\t\tpacket.Data = preFinalArray;\n\t\t\t}\n\n\t\t\t// DECOMPRESS\n\t\t\tif (packet.CompressedFlag)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tpacket.Data = QuickerLz.Decompress(packet.Data, MaxDecompressedSize);\n\t\t\t\t}\n\t\t\t\tcatch (Exception ex)\n\t\t\t\t{\n\t\t\t\t\tLogRaw.Warn(ex, \"Got invalid compressed data.\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate void SendAck(ushort ackId, PacketType ackType)\n\t\t{\n\t\t\tSpan<byte> ackData = stackalloc byte[2];\n\t\t\tBinaryPrimitives.WriteUInt16BigEndian(ackData, ackId);\n\t\t\tTrace.Assert(ackType == PacketType.Ack || ackType == PacketType.AckLow, \"Packet type is not an Ack-type\");\n\t\t\tAddOutgoingPacket(ackData, ackType);\n\t\t}\n\n\t\tprivate bool ReceiveAck(ref Packet<TIn> packet)\n\t\t{\n\t\t\tif (!BinaryPrimitives.TryReadUInt16BigEndian(packet.Data, out var packetId))\n\t\t\t\treturn false;\n\n\t\t\tlock (sendLoopLock)\n\t\t\t{\n\t\t\t\tif (packetAckManager.TryGetValue(packetId, out var ackPacket))\n\t\t\t\t{\n\t\t\t\t\tUpdateRto(Tools.Now - ackPacket.LastSendTime);\n\t\t\t\t\tpacketAckManager.Remove(packetId);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate void SendPing()\n\t\t{\n\t\t\tpingTimer.Restart();\n\t\t\tAddOutgoingPacket(Array.Empty<byte>(), PacketType.Ping);\n\t\t}\n\n\t\tprivate void ReceivePing(ref Packet<TIn> packet)\n\t\t{\n\t\t\tvar idDiff = packet.PacketId - lastReceivedPingId;\n\t\t\tif (idDiff > 1 && idDiff < ReceivePacketWindowSize)\n\t\t\t\tNetworkStats.LogLostPings(idDiff - 1);\n\t\t\tif (idDiff > 0 || idDiff < -ReceivePacketWindowSize)\n\t\t\t\tlastReceivedPingId = packet.PacketId;\n\t\t\tSpan<byte> pongData = stackalloc byte[2];\n\t\t\tBinaryPrimitives.WriteUInt16BigEndian(pongData, packet.PacketId);\n\t\t\tAddOutgoingPacket(pongData, PacketType.Pong);\n\t\t}\n\n\t\tprivate bool ReceivePong(ref Packet<TIn> packet)\n\t\t{\n\t\t\tif (!BinaryPrimitives.TryReadUInt16BigEndian(packet.Data, out var answerId))\n\t\t\t\treturn false;\n\n\t\t\tif (lastSentPingId == answerId)\n\t\t\t{\n\t\t\t\tvar rtt = pingTimer.Elapsed;\n\t\t\t\tUpdateRto(rtt);\n\t\t\t\tNetworkStats.AddPing(rtt);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic void ReceivedFinalInitAck()\n\t\t{\n\t\t\tinitPacketCheck = null;\n\t\t}\n\n\t\tprivate bool ReceiveInitAck(ref Packet<TIn> packet)\n\t\t{\n\t\t\tlock (sendLoopLock)\n\t\t\t{\n\t\t\t\tif (initPacketCheck is null)\n\t\t\t\t\treturn true;\n\t\t\t\t// optional: add random number check from init data\n\t\t\t\tvar forwardData = tsCrypt.ProcessInit1<TIn>(packet.Data);\n\t\t\t\tif (!forwardData.Ok)\n\t\t\t\t{\n\t\t\t\t\tLogRaw.Debug(\"Error init: {0}\", forwardData.Error);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tinitPacketCheck = null;\n\t\t\t\tif (forwardData.Value.Length == 0) // TODO XXX\n\t\t\t\t\treturn true;\n\t\t\t\tAddOutgoingPacket(forwardData.Value, PacketType.Init1);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\tprivate void UpdateRto(TimeSpan sampleRtt)\n\t\t{\n\t\t\t// Timeout calculation (see: https://tools.ietf.org/html/rfc6298)\n\t\t\t// SRTT_{i+1}    = (1-a) * SRTT_i   + a * RTT\n\t\t\t// DevRTT_{i+1}  = (1-b) * DevRTT_i + b * | RTT - SRTT_{i+1} |\n\t\t\t// Timeout_{i+1} = SRTT_{i+1} + max(ClockRes, 4 * DevRTT_{i+1})\n\t\t\tif (smoothedRtt < TimeSpan.Zero)\n\t\t\t\tsmoothedRtt = sampleRtt;\n\t\t\telse\n\t\t\t\tsmoothedRtt = TimeSpan.FromTicks((long)((1 - AlphaSmooth) * smoothedRtt.Ticks + AlphaSmooth * sampleRtt.Ticks));\n\t\t\tsmoothedRttVar = TimeSpan.FromTicks((long)((1 - BetaSmooth) * smoothedRttVar.Ticks + BetaSmooth * Math.Abs(sampleRtt.Ticks - smoothedRtt.Ticks)));\n\t\t\tcurrentRto = smoothedRtt + Tools.Max(ClockResolution, TimeSpan.FromTicks(4 * smoothedRttVar.Ticks));\n\t\t\tLogRtt.Debug(\"RTT SRTT:{0} RTTVAR:{1} RTO:{2}\", smoothedRtt, smoothedRttVar, currentRto);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ResendLoop will regularly check if a packet has be acknowleged and trys to send it again\n\t\t/// if the timeout for a packet ran out.\n\t\t/// </summary>\n\t\tprivate void ResendLoop()\n\t\t{\n\t\t\tvar wasRunning = Interlocked.Exchange(ref pingCheckRunning, 1);\n\t\t\tif (wasRunning != 0)\n\t\t\t{\n\t\t\t\tLog.Warn(\"Previous resend tick didn't finish\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tbool close = false;\n\t\t\t\tlock (sendLoopLock)\n\t\t\t\t{\n\t\t\t\t\tif (closed != 0)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tclose = (packetAckManager.Count > 0 && ResendPackets(packetAckManager.Values))\n\t\t\t\t\t\t|| (initPacketCheck != null && ResendPacket(initPacketCheck));\n\t\t\t\t}\n\t\t\t\tif (close)\n\t\t\t\t{\n\t\t\t\t\tStop(Reason.Timeout);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar now = Tools.Now;\n\t\t\t\tvar nextTest = now - pingCheck - PingInterval;\n\t\t\t\t// we need to check if CryptoInitComplete because while false packet ids won't be incremented\n\t\t\t\tif (nextTest > TimeSpan.Zero && tsCrypt.CryptoInitComplete)\n\t\t\t\t{\n\t\t\t\t\t// Check that the last ping is more than PingInterval but not more than\n\t\t\t\t\t// 2*PingInterval away. This might happen for e.g. when the process was\n\t\t\t\t\t// suspended. If it was too long ago, reset the ping tick to now.\n\t\t\t\t\tif (nextTest > PingInterval)\n\t\t\t\t\t\tpingCheck = now;\n\t\t\t\t\telse\n\t\t\t\t\t\tpingCheck += PingInterval;\n\t\t\t\t\tSendPing();\n\t\t\t\t}\n\n\t\t\t\tvar elapsed = lastMessageTimer.Elapsed;\n\t\t\t\tif (elapsed > PacketTimeout)\n\t\t\t\t{\n\t\t\t\t\tLogTimeout.Debug(\"TIMEOUT: Got no ping packet response for {0}\", elapsed);\n\t\t\t\t\tStop(Reason.Timeout);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tInterlocked.Exchange(ref pingCheckRunning, 0);\n\t\t\t}\n\t\t}\n\n\t\tprivate bool ResendPackets(IEnumerable<ResendPacket<TOut>> packetList)\n\t\t{\n\t\t\tforeach (var outgoingPacket in packetList)\n\t\t\t\tif (ResendPacket(outgoingPacket))\n\t\t\t\t\treturn true;\n\t\t\treturn false;\n\t\t}\n\n\t\tprivate bool ResendPacket(ResendPacket<TOut> packet)\n\t\t{\n\t\t\tvar now = Tools.Now;\n\t\t\t// Check if the packet timed out completely\n\t\t\tif (packet.FirstSendTime < now - PacketTimeout)\n\t\t\t{\n\t\t\t\tLogTimeout.Debug(\"TIMEOUT: {0}\", packet);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Check if we should retransmit a packet because it probably got lost\n\t\t\tif (packet.LastSendTime < now - currentRto)\n\t\t\t{\n\t\t\t\tLogTimeout.Debug(\"RESEND: {0}\", packet);\n\t\t\t\tcurrentRto += currentRto;\n\t\t\t\tif (currentRto > MaxRetryInterval)\n\t\t\t\t\tcurrentRto = MaxRetryInterval;\n\t\t\t\tpacket.LastSendTime = Tools.Now;\n\t\t\t\tSendRaw(ref packet.Packet);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tprivate E<string> SendRaw(ref Packet<TOut> packet)\n\t\t{\n\t\t\tTrace.Assert(socket != null, nameof(socket) + \" is null\");\n\t\t\tTrace.Assert(packet.Raw != null, nameof(packet.Raw) + \" is null\");\n\t\t\tTrace.Assert(remoteAddress != null, nameof(remoteAddress) + \" is null\");\n\n\t\t\tNetworkStats.LogOutPacket(ref packet);\n\n\t\t\t// DebugToHex is costly and allocates, precheck before logging\n\t\t\tif (LogRaw.IsTraceEnabled)\n\t\t\t\tLogRaw.Trace(\"[O] Raw: {0}\", DebugUtil.DebugToHex(packet.Raw));\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar sw = Stopwatch.StartNew();\n\t\t\t\tsocket!.SendTo(packet.Raw, packet.Raw.Length, SocketFlags.None, remoteAddress);\n\t\t\t\tvar elap = sw.ElapsedMilliseconds;\n\t\t\t\tif (elap > 100)\n\t\t\t\t{\n\t\t\t\t\tLogRaw.Warn(\"Raw LONG: {0}ms\", elap);\n\t\t\t\t}\n\t\t\t\treturn R.Ok;\n\t\t\t}\n\t\t\tcatch (SocketException ex)\n\t\t\t{\n\t\t\t\tLogRaw.Warn(ex, \"Failed to deliver packet (Err:{0})\", ex.SocketErrorCode);\n\t\t\t\treturn \"Socket send error\";\n\t\t\t}\n\t\t}\n\t}\n\n\tinternal static class PacketHandlerConst\n\t{\n\t\tpublic static readonly Logger Log = LogManager.GetLogger(\"TSLib.PacketHandler\");\n\t\tpublic static readonly Logger LogRtt = LogManager.GetLogger(\"TSLib.PacketHandler.Rtt\");\n\t\tpublic static readonly Logger LogRaw = LogManager.GetLogger(\"TSLib.PacketHandler.Raw\");\n\t\tpublic static readonly Logger LogRawVoice = LogManager.GetLogger(\"TSLib.PacketHandler.Raw.Voice\");\n\t\tpublic static readonly Logger LogTimeout = LogManager.GetLogger(\"TSLib.PacketHandler.Timeout\");\n\n\t\t/// <summary>Elapsed time since first send timestamp until the connection is considered lost.</summary>\n\t\tpublic static readonly TimeSpan PacketTimeout = TimeSpan.FromSeconds(30);\n\t\t/// <summary>Smoothing factor for the SmoothedRtt.</summary>\n\t\tpublic const float AlphaSmooth = 0.125f;\n\t\t/// <summary>Smoothing factor for the SmoothedRttDev.</summary>\n\t\tpublic const float BetaSmooth = 0.25f;\n\t\t/// <summary>The maximum wait time to retransmit a packet.</summary>\n\t\tpublic static readonly TimeSpan MaxRetryInterval = TimeSpan.FromMilliseconds(1000);\n\t\t/// <summary>The timeout check loop interval.</summary>\n\t\tpublic static readonly TimeSpan ClockResolution = TimeSpan.FromMilliseconds(100);\n\t\tpublic static readonly TimeSpan PingInterval = TimeSpan.FromSeconds(1);\n\n\t\t/// <summary>Greatest allowed packet size, including the complete header.</summary>\n\t\tpublic const int MaxOutPacketSize = 500;\n\t\tpublic const int MaxDecompressedSize = 1024 * 1024; // ServerDefault: 40000 (check original code again)\n\t\tpublic const int ReceivePacketWindowSize = 128;\n\t}\n\n\tinternal delegate void PacketEvent<TDir>(ref Packet<TDir> packet);\n}\n"
  },
  {
    "path": "TSLib/Full/PacketType.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Full\n{\n\tpublic enum PacketType : byte\n\t{\n\t\tVoice = 0x0,\n\t\tVoiceWhisper = 0x1,\n\t\tCommand = 0x2,\n\t\tCommandLow = 0x3,\n\t\tPing = 0x4,\n\t\tPong = 0x5,\n\t\tAck = 0x6,\n\t\tAckLow = 0x7,\n\t\tInit1 = 0x8,\n\t}\n\n\t[Flags]\n\tpublic enum PacketFlags : byte\n\t{\n\t\tNone = 0x0,\n\t\tFragmented = 0x10,\n\t\tNewprotocol = 0x20,\n\t\tCompressed = 0x40,\n\t\tUnencrypted = 0x80,\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/QuickerLz.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Buffers.Binary;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Runtime.CompilerServices;\n\nnamespace TSLib.Full\n{\n\t/// <summary>An alternative QuickLZ compression implementation for C#.</summary>\n\tpublic static class QuickerLz\n\t{\n\t\tprivate const int TableSize = 4096;\n\t\tprivate const uint SetControl = 0x8000_0000;\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic static int GetCompressedSize(ReadOnlySpan<byte> data) => (data[0] & 0x02) != 0 ? BinaryPrimitives.ReadInt32LittleEndian(data.Slice(1)) : data[1];\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic static int GetDecompressedSize(ReadOnlySpan<byte> data) => (data[0] & 0x02) != 0 ? BinaryPrimitives.ReadInt32LittleEndian(data.Slice(5)) : data[2];\n\n\t\t[ThreadStatic]\n\t\tprivate static int[]? hashtable;\n\t\t[ThreadStatic]\n\t\tprivate static bool[]? hashCounter;\n\t\t[ThreadStatic]\n\t\tprivate static int[]? cachetable;\n\n\t\tpublic static Span<byte> Compress(ReadOnlySpan<byte> data, int level)\n\t\t{\n\t\t\tif (level != 1) // && level != 3\n\t\t\t\tthrow new ArgumentException(\"This QuickLZ implementation supports only level 1 compress\"); // (and 3)\n\t\t\tif (data.Length >= int.MaxValue)\n\t\t\t\tthrow new ArgumentException($\"This QuickLZ can only compress up to {int.MaxValue}\");\n\n\t\t\tint headerlen = data.Length < 216 ? 3 : 9;\n\t\t\tvar dest = new byte[data.Length + 400];\n\t\t\tvar destSpan = dest.AsSpan();\n\t\t\tint destPos = headerlen + 4;\n\n\t\t\tuint control = SetControl;\n\t\t\tint controlPos = headerlen;\n\t\t\tint sourcePos = 0;\n\n\t\t\tif (level == 1)\n\t\t\t{\n\t\t\t\tint unmatched = 0;\n\n\t\t\t\tif (hashtable is null) hashtable = new int[TableSize];\n\t\t\t\tif (hashCounter is null) hashCounter = new bool[TableSize];\n\t\t\t\telse Array.Clear(hashCounter, 0, TableSize);\n\t\t\t\tif (cachetable is null) cachetable = new int[TableSize];\n\t\t\t\telse Array.Clear(cachetable, 0, TableSize);\n\n\t\t\t\tint sourceLimit = data.Length - 10;\n\t\t\t\twhile (sourcePos < sourceLimit)\n\t\t\t\t{\n\t\t\t\t\tif ((control & 1) != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (sourcePos > data.Length / 2 && destPos > sourcePos - (sourcePos / 32))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdata.CopyTo(destSpan.Slice(headerlen));\n\t\t\t\t\t\t\tdestPos = headerlen + data.Length;\n\t\t\t\t\t\t\tdestSpan = destSpan.Slice(0, destPos);\n\t\t\t\t\t\t\tWriteHeader(destSpan, data.Length, level, headerlen, false);\n\t\t\t\t\t\t\treturn destSpan;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tBinaryPrimitives.WriteUInt32LittleEndian(destSpan.Slice(controlPos), (control >> 1) | SetControl); // C\n\t\t\t\t\t\tcontrolPos = destPos;\n\t\t\t\t\t\tdestPos += 4;\n\t\t\t\t\t\tcontrol = SetControl;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar next = Read24(data, sourcePos);\n\t\t\t\t\tvar hash = Hash(next);\n\t\t\t\t\tvar offset = hashtable[hash];\n\t\t\t\t\tvar chache = cachetable[hash];\n\t\t\t\t\tcachetable[hash] = next;\n\t\t\t\t\thashtable[hash] = sourcePos;\n\n\t\t\t\t\tif (chache == next\n\t\t\t\t\t\t&& hashCounter[hash]\n\t\t\t\t\t\t&& (sourcePos - offset >= 3\n\t\t\t\t\t\t\t|| sourcePos == offset + 1\n\t\t\t\t\t\t\t&& unmatched >= 3\n\t\t\t\t\t\t\t&& sourcePos > 3\n\t\t\t\t\t\t\t&& Is6Same(data.Slice(sourcePos - 3))))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = (control >> 1) | SetControl;\n\t\t\t\t\t\tint matchlen = 3;\n\t\t\t\t\t\tint remainder = Math.Min(data.Length - 4 - sourcePos, 0xFF);\n\t\t\t\t\t\twhile (data[offset + matchlen] == data[sourcePos + matchlen] && matchlen < remainder)\n\t\t\t\t\t\t\tmatchlen++;\n\t\t\t\t\t\tif (matchlen < 18)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tBinaryPrimitives.WriteUInt16LittleEndian(destSpan.Slice(destPos), (ushort)(hash << 4 | (matchlen - 2)));\n\t\t\t\t\t\t\tdestPos += 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tWrite24(destSpan, destPos, hash << 4 | (matchlen << 16));\n\t\t\t\t\t\t\tdestPos += 3;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsourcePos += matchlen;\n\t\t\t\t\t\tunmatched = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tunmatched++;\n\t\t\t\t\t\thashCounter[hash] = true;\n\n\t\t\t\t\t\tdest[destPos++] = data[sourcePos++];\n\t\t\t\t\t\tcontrol >>= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (sourcePos < data.Length)\n\t\t\t{\n\t\t\t\tif ((control & 1) != 0)\n\t\t\t\t{\n\t\t\t\t\tBinaryPrimitives.WriteUInt32LittleEndian(destSpan.Slice(controlPos), (control >> 1) | SetControl); // C\n\t\t\t\t\tcontrolPos = destPos;\n\t\t\t\t\tdestPos += 4;\n\t\t\t\t\tcontrol = SetControl;\n\t\t\t\t}\n\t\t\t\tdest[destPos++] = data[sourcePos++];\n\t\t\t\tcontrol >>= 1;\n\t\t\t}\n\n\t\t\twhile ((control & 1) == 0)\n\t\t\t\tcontrol >>= 1;\n\t\t\tBinaryPrimitives.WriteUInt32LittleEndian(destSpan.Slice(controlPos), (control >> 1) | SetControl); // C\n\n\t\t\tdestSpan = destSpan.Slice(0, destPos);\n\t\t\tWriteHeader(destSpan, data.Length, level, headerlen, true);\n\t\t\treturn destSpan;\n\t\t}\n\n\t\tpublic static byte[] Decompress(ReadOnlySpan<byte> data, int maxSize)\n\t\t{\n\t\t\t// Read header\n\t\t\tbyte flags = data[0];\n\t\t\tint level = (flags >> 2) & 0b11;\n\t\t\tif (level != 1) // && level != 3\n\t\t\t\tthrow new NotSupportedException(\"This QuickLZ implementation supports only level 1 decompress\"); // (and 3)\n\n\t\t\tint headerlen = (flags & 0x02) != 0 ? 9 : 3;\n\t\t\tint compressedSize = GetCompressedSize(data);\n\t\t\tint decompressedSize = GetDecompressedSize(data);\n\n\t\t\tif (decompressedSize >= maxSize)\n\t\t\t\tthrow new NotSupportedException(\"Maximum uncompressed size exceeded\");\n\n\t\t\tvar dest = new byte[decompressedSize];\n\n\t\t\tif ((flags & 0x01) == 0)\n\t\t\t{\n\t\t\t\t// Uncompressed\n\t\t\t\tif (compressedSize - headerlen != decompressedSize)\n\t\t\t\t\tthrow new InvalidDataException(\"Compressed and uncompressed size of uncompressed data do not match\");\n\t\t\t\tdata.Slice(headerlen).CopyTo(dest.AsSpan(0, decompressedSize));\n\t\t\t\treturn dest;\n\t\t\t}\n\n\t\t\tif (level == 1)\n\t\t\t{\n\t\t\t\tuint control = 1;\n\t\t\t\tint sourcePos = headerlen;\n\t\t\t\tint destPos = 0;\n\t\t\t\tint nextHashed = 0;\n\n\t\t\t\tif (hashtable is null) hashtable = new int[TableSize];\n\t\t\t\tArray.Clear(hashtable, 0, TableSize);\n\n\t\t\t\twhile (true)\n\t\t\t\t{\n\t\t\t\t\tif (control == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontrol = BinaryPrimitives.ReadUInt32LittleEndian(data.Slice(sourcePos));\n\t\t\t\t\t\tsourcePos += 4;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((control & 1) != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Found a reference\n\t\t\t\t\t\tcontrol >>= 1;\n\t\t\t\t\t\tbyte next = data[sourcePos++];\n\t\t\t\t\t\tint hash = (next >> 4) | (data[sourcePos++] << 4);\n\n\t\t\t\t\t\tint matchlen = next & 0x0F;\n\t\t\t\t\t\tif (matchlen != 0)\n\t\t\t\t\t\t\tmatchlen += 2;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tmatchlen = data[sourcePos++];\n\n\t\t\t\t\t\tint offset = hashtable[hash];\n\t\t\t\t\t\tdestPos = CopyBufferBytes(dest, destPos, offset, matchlen);\n\n\t\t\t\t\t\tint end = destPos + 1 - matchlen;\n\t\t\t\t\t\tUpdateHashtable(dest, nextHashed, end);\n\t\t\t\t\t\tnextHashed = destPos;\n\t\t\t\t\t}\n\t\t\t\t\telse if (destPos >= Math.Max(decompressedSize, 10) - 10)\n\t\t\t\t\t{\n\t\t\t\t\t\twhile (destPos < decompressedSize)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (control == 1)\n\t\t\t\t\t\t\t\tsourcePos += 4;\n\t\t\t\t\t\t\tcontrol >>= 1;\n\t\t\t\t\t\t\tdest[destPos++] = data[sourcePos++];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdest[destPos++] = data[sourcePos++];\n\t\t\t\t\t\tcontrol >>= 1;\n\t\t\t\t\t\tint end = Math.Max(destPos - 2, 0);\n\t\t\t\t\t\tUpdateHashtable(dest, nextHashed, end);\n\t\t\t\t\t\tnextHashed = Math.Max(nextHashed, end);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn dest;\n\t\t}\n\n\t\tprivate static void WriteHeader(Span<byte> dest, int srcLen, int level, int headerlen, bool compressed)\n\t\t{\n\t\t\tbyte flags;\n\t\t\tif (compressed)\n\t\t\t\tflags = (byte)(0x01 | (level << 2) | 0x40);\n\t\t\telse\n\t\t\t\tflags = (byte)((level << 2) | 0x40);\n\n\t\t\tif (headerlen == 3)\n\t\t\t{\n\t\t\t\t// short header\n\t\t\t\tdest[0] = flags;\n\t\t\t\tdest[1] = (byte)dest.Length;\n\t\t\t\tdest[2] = (byte)srcLen;\n\t\t\t}\n\t\t\telse if (headerlen == 9)\n\t\t\t{\n\t\t\t\t// long header\n\t\t\t\tdest[0] = (byte)(flags | 0x02);\n\t\t\t\tBinaryPrimitives.WriteInt32LittleEndian(dest.Slice(1), dest.Length);\n\t\t\t\tBinaryPrimitives.WriteInt32LittleEndian(dest.Slice(5), srcLen);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTrace.Fail($\"Invalid headerlen: {headerlen}\");\n\t\t\t}\n\t\t}\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tprivate static void Write24(Span<byte> outArr, int outOff, int value)\n\t\t{\n\t\t\tvar sli3 = outArr.Slice(outOff, 3);\n\t\t\tBinaryPrimitives.WriteUInt16LittleEndian(sli3, unchecked((ushort)value));\n\t\t\tsli3[2] = unchecked((byte)(value >> 16));\n\t\t}\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tprivate static int Read24(ReadOnlySpan<byte> intArr, int inOff)\n\t\t{\n\t\t\tvar sli3 = intArr.Slice(inOff, 3);\n\t\t\treturn unchecked(BinaryPrimitives.ReadUInt16LittleEndian(sli3) | (sli3[2] << 16));\n\t\t}\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tprivate static int Hash(int value) => ((value >> 12) ^ value) & 0xfff;\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tprivate static bool Is6Same(ReadOnlySpan<byte> arr)\n\t\t{\n\t\t\tvar sli6 = arr.Slice(0, 6);\n\t\t\tvar i0 = BinaryPrimitives.ReadUInt32LittleEndian(sli6);\n\t\t\tvar u1 = BinaryPrimitives.ReadUInt16LittleEndian(sli6.Slice(4));\n\t\t\treturn i0 == i0 >> 8 && unchecked((ushort)i0) == u1;\n\t\t}\n\n\t\t/// <summary>Copy <code>[start; start + length)</code> bytes from `data` to the end of `data`</summary>\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tprivate static int CopyBufferBytes(byte[] data, int destPos, int start, int length)\n\t\t{\n\t\t\tdata[destPos + 0] = data[start + 0];\n\t\t\tdata[destPos + 1] = data[start + 1];\n\t\t\tdata[destPos + 2] = data[start + 2];\n\t\t\tfor (int i = 3; i < length; i++)\n\t\t\t\tdata[destPos + i] = data[start + i];\n\t\t\treturn destPos + length;\n\t\t}\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tprivate static void UpdateHashtable(byte[] dest, int start, int end)\n\t\t{\n\t\t\tif (start >= end)\n\t\t\t\treturn;\n\t\t\tint next = Read24(dest, start);\n\t\t\thashtable![Hash(next)] = start;\n\t\t\tfor (int i = start + 1; i < end; i++)\n\t\t\t{\n\t\t\t\tnext = (next >> 8) | (dest[i + 2] << 16);\n\t\t\t\thashtable[Hash(next)] = i;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/RingQueue.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace TSLib.Full\n{\n\t/// <summary>Provides a ring queue with packet offset and direct item access functionality.</summary>\n\t/// <typeparam name=\"T\">Item type</typeparam>\n\tpublic sealed class RingQueue<T> where T : notnull\n\t{\n\t\tprivate const int InitialBufferSize = 16;\n\n\t\tprivate int currentStart;\n\t\tprivate T[] ringBuffer;\n\t\tprivate bool[] ringBufferSet;\n\n\t\tpublic int Count { get; private set; } // = currentLength\n\t\tpublic int MaxBufferSize { get; }\n\t\tpublic GenerationWindow Window { get; }\n\n\t\tpublic RingQueue(int maxBufferSize, int mod)\n\t\t{\n\t\t\tif (maxBufferSize >= mod)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(mod), \"Modulo must be bigger than buffer size\");\n\t\t\tMaxBufferSize = maxBufferSize;\n\t\t\tvar setBufferSize = Math.Min(InitialBufferSize, MaxBufferSize);\n\t\t\tringBuffer = new T[setBufferSize];\n\t\t\tringBufferSet = new bool[setBufferSize];\n\t\t\tWindow = new GenerationWindow(mod, MaxBufferSize);\n\t\t\tClear();\n\t\t}\n\n\t\t#region mapping ring array to flat [0 - size] array\n\n\t\tprivate void BufferSet(int index, T value)\n\t\t{\n\t\t\tBufferExtend(index);\n\t\t\tint local = IndexToLocal(index);\n\t\t\tint newLength = local - currentStart + 1 + (local >= currentStart ? 0 : ringBuffer.Length);\n\t\t\tCount = Math.Max(Count, newLength);\n\t\t\tringBuffer[local] = value;\n\t\t\tringBufferSet[local] = true;\n\t\t}\n\n\t\tprivate ref T BufferGet(int index)\n\t\t{\n\t\t\tBufferExtend(index);\n\t\t\tint local = IndexToLocal(index);\n\t\t\treturn ref ringBuffer[local];\n\t\t}\n\n\t\tprivate bool StateGet(int index)\n\t\t{\n\t\t\tBufferExtend(index);\n\t\t\tint local = IndexToLocal(index);\n\t\t\treturn ringBufferSet[local];\n\t\t}\n\n\t\tprivate void BufferPop()\n\t\t{\n\t\t\tringBufferSet[currentStart] = false;\n\t\t\tringBuffer[currentStart] = default!;\n\t\t\tcurrentStart = (currentStart + 1) % ringBuffer.Length;\n\t\t\tCount--;\n\t\t}\n\n\t\tprivate void BufferExtend(int index)\n\t\t{\n\t\t\tif (index < ringBuffer.Length)\n\t\t\t\treturn;\n\t\t\tif (index >= MaxBufferSize)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(index), \"The index does not fit into the maximal buffer size\");\n\t\t\tint extendTo = index < ringBuffer.Length * 2\n\t\t\t\t? Math.Min(ringBuffer.Length * 2, MaxBufferSize)\n\t\t\t\t: Math.Min(index + ringBuffer.Length, MaxBufferSize);\n\t\t\tvar extRingBuffer = new T[extendTo];\n\t\t\tvar extRingBufferSet = new bool[extendTo];\n\t\t\tArray.Copy(ringBuffer, currentStart, extRingBuffer, 0, ringBuffer.Length - currentStart);\n\t\t\tArray.Copy(ringBufferSet, currentStart, extRingBufferSet, 0, ringBufferSet.Length - currentStart);\n\t\t\tArray.Copy(ringBuffer, 0, extRingBuffer, ringBuffer.Length - currentStart, currentStart);\n\t\t\tArray.Copy(ringBufferSet, 0, extRingBufferSet, ringBufferSet.Length - currentStart, currentStart);\n\t\t\tcurrentStart = 0;\n\t\t\tringBuffer = extRingBuffer;\n\t\t\tringBufferSet = extRingBufferSet;\n\t\t}\n\n\t\tprivate int IndexToLocal(int index) => (currentStart + index) % ringBuffer.Length;\n\n\t\t#endregion\n\n\t\tpublic void Set(int mappedValue, T value)\n\t\t{\n\t\t\tint index = Window.MappedToIndex(mappedValue);\n\t\t\tif (IsSetIndex(index) != ItemSetStatus.InWindowNotSet)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(mappedValue), \"Object cannot be set.\");\n\n\t\t\tBufferSet(index, value);\n\t\t}\n\n\t\tpublic ItemSetStatus IsSet(int mappedValue)\n\t\t{\n\t\t\tint index = Window.MappedToIndex(mappedValue);\n\t\t\treturn IsSetIndex(index);\n\t\t}\n\n\t\tprivate ItemSetStatus IsSetIndex(int index)\n\t\t{\n\t\t\tif (index < 0)\n\t\t\t\treturn ItemSetStatus.OutOfWindowSet;\n\t\t\tif (index > Count && index < MaxBufferSize)\n\t\t\t\treturn ItemSetStatus.InWindowNotSet;\n\t\t\tif (index >= MaxBufferSize)\n\t\t\t\treturn ItemSetStatus.OutOfWindowNotSet;\n\t\t\treturn StateGet(index) ? ItemSetStatus.InWindowSet : ItemSetStatus.InWindowNotSet;\n\t\t}\n\n\t\tpublic bool TryDequeue([MaybeNullWhen(false)] out T value)\n\t\t{\n\t\t\tif (!TryPeekStart(0, out value)) return false;\n\t\t\tBufferPop();\n\t\t\tWindow.Advance(1);\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic bool TryPeekStart(int index, [MaybeNullWhen(false)] out T value)\n\t\t{\n\t\t\tif (index < 0)\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(index));\n\n\t\t\tif (index >= Count || Count <= 0 || !StateGet(index))\n\t\t\t{\n\t\t\t\tvalue = default!;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvalue = BufferGet(index);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tcurrentStart = 0;\n\t\t\tCount = 0;\n\t\t\tArray.Clear(ringBufferSet, 0, ringBufferSet.Length);\n\t\t\tWindow.Reset();\n\t\t}\n\t}\n\n\t//  X   |OXXOOOOOO|  X\n\t//  |     |   |      |\n\t//  |     |   |      OutOfWindowNotSet\n\t//  |     |   InWindowNotSet\n\t//  |     InWindowSet\n\t//  OutOfWindowSet\n\n\t[Flags]\n\tpublic enum ItemSetStatus\n\t{\n\t\tNotSet = 0b00,\n\t\tSet = 0b01,\n\t\tOutOfWindow = 0b00,\n\t\tInWindow = 0b10,\n\n\t\tOutOfWindowNotSet = OutOfWindow | NotSet,\n\t\tOutOfWindowSet = OutOfWindow | Set,\n\t\tInWindowNotSet = InWindow | NotSet,\n\t\tInWindowSet = InWindow | Set,\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/TsCrypt.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Chaos.NaCl.Ed25519Ref10;\nusing Org.BouncyCastle.Asn1;\nusing Org.BouncyCastle.Asn1.X9;\nusing Org.BouncyCastle.Crypto;\nusing Org.BouncyCastle.Crypto.Engines;\nusing Org.BouncyCastle.Crypto.Generators;\nusing Org.BouncyCastle.Crypto.Modes;\nusing Org.BouncyCastle.Crypto.Parameters;\nusing Org.BouncyCastle.Math;\nusing Org.BouncyCastle.Math.EC;\nusing Org.BouncyCastle.Security;\nusing System;\nusing System.Buffers.Binary;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing TSLib.Commands;\nusing TSLib.Helper;\n\nnamespace TSLib.Full\n{\n\t/// <summary>Provides all cryptographic functions needed for the low- and high level TeamSpeak protocol usage.</summary>\n\tpublic sealed class TsCrypt\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate const string DummyKeyAndNonceString = \"c:\\\\windows\\\\system\\\\firewall32.cpl\";\n\t\tprivate static readonly byte[] DummyKey = Encoding.ASCII.GetBytes(DummyKeyAndNonceString.Substring(0, 16));\n\t\tprivate static readonly byte[] DummyIv = Encoding.ASCII.GetBytes(DummyKeyAndNonceString.Substring(16, 16));\n\t\tprivate static readonly (byte[], byte[]) DummyKeyAndNonceTuple = (DummyKey, DummyIv);\n\t\tprivate static readonly byte[] Ts3InitMac = Encoding.ASCII.GetBytes(\"TS3INIT1\");\n\t\tprivate const uint InitVersion = 1566914096; // 3.5.0 [Stable]\n\t\tprivate readonly EaxBlockCipher eaxCipher = new EaxBlockCipher(new AesEngine());\n\n\t\tinternal const int MacLen = 8;\n\t\tinternal const int PacketTypeKinds = 9;\n\n\t\tinternal IdentityData Identity { get; }\n\n\t\tinternal bool CryptoInitComplete { get; private set; }\n\t\tprivate byte[]? alphaTmp;\n\t\tprivate byte[]? ivStruct;\n\t\tprivate readonly byte[] fakeSignature = new byte[MacLen];\n\t\tprivate readonly (byte[] key, byte[] nonce, uint generation)?[] cachedKeyNonces = new (byte[], byte[], uint)?[PacketTypeKinds * 2];\n\n\t\tpublic TsCrypt(IdentityData identity)\n\t\t{\n\t\t\tReset();\n\t\t\tIdentity = identity;\n\t\t}\n\n\t\tinternal void Reset()\n\t\t{\n\t\t\tCryptoInitComplete = false;\n\t\t\tivStruct = null;\n\t\t\tArray.Clear(fakeSignature, 0, fakeSignature.Length);\n\t\t\tArray.Clear(cachedKeyNonces, 0, cachedKeyNonces.Length);\n\t\t}\n\n\t\t#region KEY IMPORT/EXPROT\n\n\t\t/// <summary>\n\t\t/// Detects the kind of key and creates an identity from it.\n\t\t/// This method can import 3 kinds of identity keys.\n\t\t/// <list type=\"bullet\">\n\t\t/// <item><description>The Teamspeak 3 key as it is stored by the normal client.</description></item>\n\t\t/// <item><description>A libtomcrypt public+private key export. (+KeyOffset).</description></item>\n\t\t/// <item><description>A TSLib private-only key export. (+KeyOffset).</description></item>\n\t\t/// </list>\n\t\t/// Keys with \"(+KeyOffset)\" should add the key offset for the security level in the separate parameter.\n\t\t/// </summary>\n\t\t/// <param name=\"key\">The identity string.</param>\n\t\t/// <param name=\"keyOffset\">A number which determines the security level of an identity.</param>\n\t\t/// <param name=\"lastCheckedKeyOffset\">The last brute forced number. Default 0: will take the current keyOffset.</param>\n\t\t/// <returns>The identity information.</returns>\n\t\tpublic static R<IdentityData, string> LoadIdentityDynamic(string key, ulong keyOffset = 0, ulong lastCheckedKeyOffset = 0)\n\t\t{\n\t\t\tvar tsIdentity = DeobfuscateAndImportTsIdentity(key);\n\t\t\tif (tsIdentity.Ok)\n\t\t\t\treturn tsIdentity.Value;\n\t\t\treturn LoadIdentity(key, keyOffset, lastCheckedKeyOffset);\n\t\t}\n\n\t\t/// <summary>This methods loads a secret identity.</summary>\n\t\t/// <param name=\"key\">The key stored in base64, encoded like the libtomcrypt export method of a private key.\n\t\t/// Or the TSLib's shorted private-only key.</param>\n\t\t/// <param name=\"keyOffset\">A number which determines the security level of an identity.</param>\n\t\t/// <param name=\"lastCheckedKeyOffset\">The last brute forced number. Default 0: will take the current keyOffset.</param>\n\t\t/// <returns>The identity information.</returns>\n\t\tpublic static R<IdentityData, string> LoadIdentity(string key, ulong keyOffset, ulong lastCheckedKeyOffset = 0)\n\t\t{\n\t\t\tvar asnByteArray = Base64Decode(key);\n\t\t\tif (asnByteArray is null)\n\t\t\t\treturn \"Invalid identity base64 string\";\n\t\t\tvar importRes = ImportKeyDynamic(asnByteArray);\n\t\t\tif (!importRes.Ok)\n\t\t\t\treturn importRes.Error;\n\t\t\tvar (publicKey, privateKey) = importRes.Value;\n\t\t\tif (privateKey is null)\n\t\t\t\treturn \"Key string did not contain a private key\";\n\t\t\treturn LoadIdentity(publicKey, privateKey, keyOffset, lastCheckedKeyOffset);\n\t\t}\n\n\t\tprivate static IdentityData LoadIdentity(ECPoint? publicKey, BigInteger privateKey, ulong keyOffset, ulong lastCheckedKeyOffset)\n\t\t{\n\t\t\treturn new IdentityData(privateKey, publicKey)\n\t\t\t{\n\t\t\t\tValidKeyOffset = keyOffset,\n\t\t\t\tLastCheckedKeyOffset = lastCheckedKeyOffset < keyOffset ? keyOffset : lastCheckedKeyOffset,\n\t\t\t};\n\t\t}\n\n\t\tprivate static readonly ECKeyGenerationParameters KeyGenParams = new ECKeyGenerationParameters(X9ObjectIdentifiers.Prime256v1, new SecureRandom());\n\n\t\tprivate static R<ECPoint, string> ImportPublicKey(byte[] asnByteArray)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar asnKeyData = (DerSequence)Asn1Object.FromByteArray(asnByteArray);\n\t\t\t\tvar x = ((DerInteger)asnKeyData[2]).Value;\n\t\t\t\tvar y = ((DerInteger)asnKeyData[3]).Value;\n\n\t\t\t\tvar ecPoint = KeyGenParams.DomainParameters.Curve.CreatePoint(x, y);\n\t\t\t\treturn ecPoint;\n\t\t\t}\n\t\t\tcatch (Exception) { return \"Could not import public key\"; }\n\t\t}\n\n\t\tprivate static R<(ECPoint? publicKey, BigInteger? privateKey), string> ImportKeyDynamic(byte[] asnByteArray)\n\t\t{\n\t\t\tBigInteger? privateKey = null;\n\t\t\tECPoint? publicKey = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar asnKeyData = (DerSequence)Asn1Object.FromByteArray(asnByteArray);\n\t\t\t\tvar bitInfo = ((DerBitString)asnKeyData[0]).IntValue;\n\t\t\t\tif (bitInfo == 0b0000_0000 || bitInfo == 0b1000_0000)\n\t\t\t\t{\n\t\t\t\t\tvar x = ((DerInteger)asnKeyData[2]).Value;\n\t\t\t\t\tvar y = ((DerInteger)asnKeyData[3]).Value;\n\t\t\t\t\tpublicKey = KeyGenParams.DomainParameters.Curve.CreatePoint(x, y);\n\n\t\t\t\t\tif (bitInfo == 0b1000_0000)\n\t\t\t\t\t{\n\t\t\t\t\t\tprivateKey = ((DerInteger)asnKeyData[4]).Value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (bitInfo == 0b1100_0000)\n\t\t\t\t{\n\t\t\t\t\tprivateKey = ((DerInteger)asnKeyData[2]).Value;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (Exception ex) { return $\"Could not import identity: {ex.Message}\"; }\n\t\t\treturn (publicKey, privateKey);\n\t\t}\n\n\t\tinternal static string ExportPublicKey(ECPoint publicKey)\n\t\t{\n\t\t\tvar dataArray = new DerSequence(\n\t\t\t\tnew DerBitString(new byte[] { 0b0000_0000 }, 7),\n\t\t\t\tnew DerInteger(32),\n\t\t\t\tnew DerInteger(publicKey.AffineXCoord.ToBigInteger()),\n\t\t\t\tnew DerInteger(publicKey.AffineYCoord.ToBigInteger())).GetDerEncoded();\n\t\t\treturn Convert.ToBase64String(dataArray);\n\t\t}\n\n\t\tinternal static string ExportPrivateKey(BigInteger privateKey)\n\t\t{\n\t\t\tvar dataArray = new DerSequence(\n\t\t\t\tnew DerBitString(new byte[] { 0b1100_0000 }, 6),\n\t\t\t\tnew DerInteger(32),\n\t\t\t\tnew DerInteger(privateKey)).GetDerEncoded();\n\t\t\treturn Convert.ToBase64String(dataArray);\n\t\t}\n\n\t\tinternal static string ExportPublicAndPrivateKey(ECPoint publicKey, BigInteger privateKey)\n\t\t{\n\t\t\tvar dataArray = new DerSequence(\n\t\t\t\tnew DerBitString(new byte[] { 0b1000_0000 }, 7),\n\t\t\t\tnew DerInteger(32),\n\t\t\t\tnew DerInteger(publicKey.AffineXCoord.ToBigInteger()),\n\t\t\t\tnew DerInteger(publicKey.AffineYCoord.ToBigInteger()),\n\t\t\t\tnew DerInteger(privateKey)).GetDerEncoded();\n\t\t\treturn Convert.ToBase64String(dataArray);\n\t\t}\n\n\t\tinternal static string GetUidFromPublicKey(string publicKey)\n\t\t{\n\t\t\tvar publicKeyBytes = Encoding.ASCII.GetBytes(publicKey);\n\t\t\tvar hashBytes = Hash1It(publicKeyBytes);\n\t\t\treturn Convert.ToBase64String(hashBytes);\n\t\t}\n\n\t\tinternal static ECPoint RestorePublicFromPrivateKey(BigInteger privateKey)\n\t\t{\n\t\t\tvar curve = ECNamedCurveTable.GetByOid(X9ObjectIdentifiers.Prime256v1);\n\t\t\treturn curve.G.Multiply(privateKey).Normalize();\n\t\t}\n\n\t\tprivate static readonly Regex IdentityRegex = new Regex(@\"^(?<level>\\d+)V(?<identity>[\\w\\/\\+]+={0,2})$\", RegexOptions.ECMAScript | RegexOptions.CultureInvariant);\n\t\tprivate static readonly byte[] TsIdentityObfuscationKey = Encoding.ASCII.GetBytes(\"b9dfaa7bee6ac57ac7b65f1094a1c155e747327bc2fe5d51c512023fe54a280201004e90ad1daaae1075d53b7d571c30e063b5a62a4a017bb394833aa0983e6e\");\n\n\t\tpublic static R<IdentityData, string> DeobfuscateAndImportTsIdentity(string identity)\n\t\t{\n\t\t\tvar match = IdentityRegex.Match(identity);\n\t\t\tif (!match.Success)\n\t\t\t\treturn \"Identity could not get matched as teamspeak identity\";\n\n\t\t\tif (!ulong.TryParse(match.Groups[\"level\"].Value, out var level))\n\t\t\t\treturn \"Invalid key offset\";\n\n\t\t\tvar ident = Base64Decode(match.Groups[\"identity\"].Value);\n\t\t\tif (ident is null)\n\t\t\t\treturn \"Invalid identity base64 string\";\n\n\t\t\tif (ident.Length < 20)\n\t\t\t\treturn \"Identity too short\";\n\n\t\t\tint nullIdx = ident.AsSpan(20).IndexOf((byte)0);\n\t\t\tvar hash = Hash1It(ident, 20, nullIdx < 0 ? ident.Length - 20 : nullIdx);\n\n\t\t\tXorBinary(ident, hash, 20, ident);\n\t\t\tXorBinary(ident, TsIdentityObfuscationKey, Math.Min(100, ident.Length), ident);\n\n\t\t\tif (System.Buffers.Text.Base64.DecodeFromUtf8InPlace(ident, out var length) != System.Buffers.OperationStatus.Done)\n\t\t\t\treturn \"Invalid deobfuscated base64 string\";\n\n\t\t\tvar importRes = ImportKeyDynamic(ident.AsSpan(0, length).ToArray());\n\t\t\tif (!importRes.Ok)\n\t\t\t\treturn importRes.Error;\n\n\t\t\tvar (publicKey, privateKey) = importRes.Value;\n\t\t\tif (privateKey is null)\n\t\t\t\treturn \"Key string did not contain a private key\";\n\t\t\treturn LoadIdentity(publicKey, privateKey, level, level);\n\t\t}\n\n\t\t#endregion\n\n\t\t#region TS3INIT1 / CRYPTO INIT\n\n\t\t/// <summary>Calculates and initializes all required variables for the secure communication.</summary>\n\t\t/// <param name=\"alpha\">The alpha key from clientinit encoded in base64.</param>\n\t\t/// <param name=\"beta\">The beta key from clientinit encoded in base64.</param>\n\t\t/// <param name=\"omega\">The omega key from clientinit encoded in base64.</param>\n\t\tinternal E<string> CryptoInit(string alpha, string beta, string omega)\n\t\t{\n\t\t\tvar alphaBytes = Base64Decode(alpha);\n\t\t\tif (alphaBytes is null) return \"alphaBytes parameter is invalid\";\n\t\t\tvar betaBytes = Base64Decode(beta);\n\t\t\tif (betaBytes is null) return \"betaBytes parameter is invalid\";\n\t\t\tvar omegaBytes = Base64Decode(omega);\n\t\t\tif (omegaBytes is null) return \"omegaBytes parameter is invalid\";\n\t\t\tvar serverPublicKey = ImportPublicKey(omegaBytes);\n\t\t\tif (!serverPublicKey.Ok) return \"server public key is invalid\";\n\n\t\t\tbyte[] sharedKey = GetSharedSecret(serverPublicKey.Value);\n\t\t\treturn SetSharedSecret(alphaBytes, betaBytes, sharedKey);\n\t\t}\n\n\t\t/// <summary>Calculates a shared secred with ECDH from the client private and server public key.</summary>\n\t\t/// <param name=\"publicKeyPoint\">The public key of the server.</param>\n\t\t/// <returns>Returns a 32 byte shared secret.</returns>\n\t\tprivate byte[] GetSharedSecret(ECPoint publicKeyPoint)\n\t\t{\n\t\t\tECPoint p = publicKeyPoint.Multiply(Identity.PrivateKey).Normalize();\n\t\t\tbyte[] keyArr = p.AffineXCoord.ToBigInteger().ToByteArray();\n\t\t\tif (keyArr.Length == 32)\n\t\t\t\treturn Hash1It(keyArr);\n\t\t\tif (keyArr.Length > 32)\n\t\t\t\treturn Hash1It(keyArr, keyArr.Length - 32, 32);\n\t\t\t// else keyArr.Length < 32\n\t\t\tvar keyArrExt = new byte[32];\n\t\t\tArray.Copy(keyArr, 0, keyArrExt, 32 - keyArr.Length, keyArr.Length);\n\t\t\treturn Hash1It(keyArrExt);\n\t\t}\n\n\t\t/// <summary>Initializes all required variables for the secure communication.</summary>\n\t\t/// <param name=\"alpha\">The alpha key from clientinit.</param>\n\t\t/// <param name=\"beta\">The beta key from clientinit.</param>\n\t\t/// <param name=\"sharedKey\">The omega key from clientinit.</param>\n\t\tprivate E<string> SetSharedSecret(ReadOnlySpan<byte> alpha, ReadOnlySpan<byte> beta, ReadOnlySpan<byte> sharedKey)\n\t\t{\n\t\t\tif (beta.Length != 10 && beta.Length != 54)\n\t\t\t\treturn $\"Invalid beta size ({beta.Length})\";\n\n\t\t\t// prepares the ivstruct consisting of 2 random byte chains of 10/10 or 10/54 bytes which both sides agreed on\n\t\t\tivStruct = new byte[10 + beta.Length];\n\n\t\t\t// applying hashes to get the required values for ts\n\t\t\tXorBinary(sharedKey, alpha, alpha.Length, ivStruct);\n\t\t\tXorBinary(sharedKey.Slice(10), beta, beta.Length, ivStruct.AsSpan(10));\n\n\t\t\t// creating a dummy signature which will be used on packets which dont use a real encryption signature (like plain voice)\n\t\t\tvar buffer2 = Hash1It(ivStruct, 0, ivStruct.Length);\n\t\t\tArray.Copy(buffer2, 0, fakeSignature, 0, 8);\n\n\t\t\talphaTmp = null;\n\t\t\tCryptoInitComplete = true;\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tinternal E<string> CryptoInit2(string license, string omega, string proof, string beta, byte[] privateKey)\n\t\t{\n\t\t\tvar licenseBytes = Base64Decode(license);\n\t\t\tif (licenseBytes is null) return \"license parameter is invalid\";\n\t\t\tvar omegaBytes = Base64Decode(omega);\n\t\t\tif (omegaBytes is null) return \"omega parameter is invalid\";\n\t\t\tvar proofBytes = Base64Decode(proof);\n\t\t\tif (proofBytes is null) return \"proof parameter is invalid\";\n\t\t\tvar betaBytes = Base64Decode(beta);\n\t\t\tif (betaBytes is null) return \"beta parameter is invalid\";\n\t\t\tvar serverPublicKey = ImportPublicKey(omegaBytes);\n\t\t\tif (!serverPublicKey.Ok) return \"server public key is invalid\";\n\n\t\t\t// Verify that our connection isn't tampered with\n\t\t\tif (!VerifySign(serverPublicKey.Value, licenseBytes, proofBytes))\n\t\t\t\treturn \"The init proof is not valid. Your connection might be tampered with or the server is an idiot.\";\n\n\t\t\tvar sw = Stopwatch.StartNew();\n\t\t\tvar licenseChainR = Licenses.Parse(licenseBytes);\n\t\t\tif (!licenseChainR.Ok)\n\t\t\t\treturn licenseChainR.Error;\n\t\t\tLog.Debug(\"Parsed license successfully in {0:F3}ms\", sw.Elapsed.TotalMilliseconds);\n\n\t\t\tvar licenseChain = licenseChainR.Value;\n\t\t\tsw.Restart();\n\t\t\tvar key = licenseChain.DeriveKey();\n\t\t\tLog.Debug(\"Processed license successfully in {0:F3}ms\", sw.Elapsed.TotalMilliseconds);\n\n\t\t\tsw.Restart();\n\t\t\tvar keyArr = GetSharedSecret2(key, privateKey);\n\t\t\tLog.Debug(\"Calculated shared secret in {0:F3}ms\", sw.Elapsed.TotalMilliseconds);\n\n\t\t\treturn SetSharedSecret(alphaTmp, betaBytes, keyArr);\n\t\t}\n\n\t\tprivate static byte[] GetSharedSecret2(ReadOnlySpan<byte> publicKey, ReadOnlySpan<byte> privateKey)\n\t\t{\n\t\t\tSpan<byte> privateKeyCpy = stackalloc byte[32];\n\t\t\tprivateKey.CopyTo(privateKeyCpy);\n\t\t\tprivateKeyCpy[31] &= 0x7F;\n\t\t\tGroupOperations.ge_frombytes_negate_vartime(out var pub1, publicKey);\n\t\t\tGroupOperations.ge_scalarmult_vartime(out GroupElementP2 mul, privateKeyCpy, pub1);\n\t\t\tSpan<byte> sharedTmp = stackalloc byte[32];\n\t\t\tGroupOperations.ge_tobytes(sharedTmp, mul);\n\t\t\tsharedTmp[31] ^= 0x80;\n\t\t\tvar bytes = new byte[64];\n\t\t\tChaos.NaCl.Sha512.Hash(sharedTmp, bytes);\n\t\t\treturn bytes;\n\t\t}\n\n\t\tinternal R<byte[], string> ProcessInit1<TDir>(byte[]? data)\n\t\t{\n\t\t\tconst int versionLen = 4;\n\t\t\tconst int initTypeLen = 1;\n\n\t\t\tconst string packetInvalid = \"Invalid Init1 packet\";\n\t\t\tconst string packetTooShort = packetInvalid + \" (too short)\";\n\t\t\tconst string packetInvalidStep = packetInvalid + \" (invalid step)\";\n\t\t\tconst string packetInvalidLength = packetInvalid + \" (invalid length)\";\n\n\t\t\tint type;\n\t\t\tbyte[] sendData;\n\t\t\tif (data != null)\n\t\t\t{\n\t\t\t\tif (Packet<TDir>.FromServer)\n\t\t\t\t{\n\t\t\t\t\tif (data.Length < initTypeLen)\n\t\t\t\t\t\treturn packetTooShort;\n\t\t\t\t\ttype = data[0];\n\t\t\t\t\tif (type != 1 && type != 3 && type != 0x7F)\n\t\t\t\t\t\treturn packetInvalidStep;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (data.Length < versionLen + initTypeLen)\n\t\t\t\t\t\treturn packetTooShort;\n\t\t\t\t\ttype = data[4];\n\t\t\t\t\tif (type != 0 && type != 2 && type != 4)\n\t\t\t\t\t\treturn packetInvalidStep;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse type = -1;\n\n\t\t\tif (data == null || type == 0x7F)\n\t\t\t{\n\t\t\t\t// 0x7F: Some strange servers do this\n\t\t\t\t// the normal client responds by starting again\n\t\t\t\tsendData = new byte[versionLen + initTypeLen + 4 + 4 + 8];\n\t\t\t\tBinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(0), InitVersion); // initVersion\n\t\t\t\tsendData[versionLen] = 0x00; // initType\n\t\t\t\tBinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(versionLen + initTypeLen), Tools.UnixNow); // 4byte timestamp\n\t\t\t\tBinaryPrimitives.WriteInt32BigEndian(sendData.AsSpan(versionLen + initTypeLen + 4), Tools.Random.Next()); // 4byte random\n\t\t\t\treturn sendData;\n\t\t\t}\n\n\t\t\tswitch (type)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tif (data.Length != 21)\n\t\t\t\t\treturn packetInvalidLength;\n\t\t\t\tsendData = new byte[initTypeLen + 16 + 4];\n\t\t\t\tsendData[0] = 0x01; // initType\n\t\t\t\tBinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(initTypeLen + 16), BinaryPrimitives.ReadUInt32LittleEndian(data.AsSpan(versionLen + initTypeLen + 4)));\n\t\t\t\treturn sendData;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (data.Length)\n\t\t\t\t{\n\t\t\t\tcase 21:\n\t\t\t\t\tsendData = new byte[versionLen + initTypeLen + 16 + 4];\n\t\t\t\t\tBinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(0), InitVersion); // initVersion\n\t\t\t\t\tsendData[versionLen] = 0x02; // initType\n\t\t\t\t\tArray.Copy(data, initTypeLen, sendData, versionLen + initTypeLen, 20);\n\t\t\t\t\treturn sendData;\n\t\t\t\tcase 5:\n\t\t\t\t\tvar errorNum = BinaryPrimitives.ReadUInt32BigEndian(data.AsSpan(initTypeLen));\n\t\t\t\t\tif (Enum.IsDefined(typeof(TsErrorCode), errorNum))\n\t\t\t\t\t\treturn $\"Got Init1(1) error: {(TsErrorCode)errorNum}\";\n\t\t\t\t\treturn $\"Got Init1(1) undefined error code: {errorNum}\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn packetInvalidLength;\n\t\t\t\t}\n\n\t\t\tcase 2:\n\t\t\t\tif (data.Length != versionLen + initTypeLen + 16 + 4)\n\t\t\t\t\treturn packetInvalidLength;\n\t\t\t\tsendData = new byte[initTypeLen + 64 + 64 + 4 + 100];\n\t\t\t\tsendData[0] = 0x03; // initType\n\t\t\t\tsendData[initTypeLen + 64 - 1] = 1; // dummy x to 1\n\t\t\t\tsendData[initTypeLen + 64 + 64 - 1] = 1; // dummy n to 1\n\t\t\t\tBinaryPrimitives.WriteInt32BigEndian(sendData.AsSpan(initTypeLen + 64 + 64), 1); // dummy level to 1\n\t\t\t\treturn sendData;\n\n\t\t\tcase 3:\n\t\t\t\tif (data.Length != initTypeLen + 64 + 64 + 4 + 100)\n\t\t\t\t\treturn packetInvalidLength;\n\t\t\t\talphaTmp = new byte[10];\n\t\t\t\tTools.Random.NextBytes(alphaTmp);\n\t\t\t\tvar alpha = Convert.ToBase64String(alphaTmp);\n\t\t\t\tstring initAdd = TsCommand.BuildToString(\"clientinitiv\",\n\t\t\t\t\tnew ICommandPart[] {\n\t\t\t\t\t\tnew CommandParameter(\"alpha\", alpha),\n\t\t\t\t\t\tnew CommandParameter(\"omega\", Identity.PublicKeyString),\n\t\t\t\t\t\tnew CommandParameter(\"ot\", 1),\n\t\t\t\t\t\tnew CommandParameter(\"ip\", string.Empty) });\n\t\t\t\tvar textBytes = Tools.Utf8Encoder.GetBytes(initAdd);\n\n\t\t\t\t// Prepare solution\n\t\t\t\tint level = BinaryPrimitives.ReadInt32BigEndian(data.AsSpan(initTypeLen + 128));\n\t\t\t\tvar y = SolveRsaChallange(data, initTypeLen, level);\n\t\t\t\tif (!y.Ok)\n\t\t\t\t\treturn y.Error;\n\n\t\t\t\t// Copy bytes for this result: [Version..., InitType..., data..., y..., text...]\n\t\t\t\tsendData = new byte[versionLen + initTypeLen + 64 + 64 + 4 + 100 + 64 + textBytes.Length];\n\t\t\t\t// Copy initVersion\n\t\t\t\tBinaryPrimitives.WriteUInt32BigEndian(sendData.AsSpan(0), InitVersion);\n\t\t\t\t// Write InitType\n\t\t\t\tsendData[versionLen] = 0x04;\n\t\t\t\t// Copy data\n\t\t\t\tArray.Copy(data, initTypeLen, sendData, versionLen + initTypeLen, 232);\n\t\t\t\t// Copy y\n\t\t\t\tArray.Copy(y.Value, 0, sendData, versionLen + initTypeLen + 232 + (64 - y.Value.Length), y.Value.Length);\n\t\t\t\t// Copy text\n\t\t\t\tArray.Copy(textBytes, 0, sendData, versionLen + initTypeLen + 232 + 64, textBytes.Length);\n\t\t\t\treturn sendData;\n\n\t\t\tcase 4:\n\t\t\t\tif (data.Length < versionLen + initTypeLen + 64 + 64 + 4 + 100 + 64)\n\t\t\t\t\treturn packetTooShort;\n\t\t\t\t// TODO check result\n\t\t\t\treturn Array.Empty<byte>();\n\n\t\t\tdefault:\n\t\t\t\treturn $\"Got invalid Init1({type}) packet id\";\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>This method calculates x ^ (2^level) % n = y which is the solution to the server RSA puzzle.</summary>\n\t\t/// <param name=\"data\">The data array, containing x=[0,63] and n=[64,127], each unsigned, as a BigInteger bytearray.</param>\n\t\t/// <param name=\"offset\">The offset of x and n in the data array.</param>\n\t\t/// <param name=\"level\">The exponent to x.</param>\n\t\t/// <returns>The y value, unsigned, as a BigInteger bytearray.</returns>\n\t\tprivate static R<byte[], string> SolveRsaChallange(byte[] data, int offset, int level)\n\t\t{\n\t\t\tif (level < 0 || level > 1_000_000)\n\t\t\t\treturn \"RSA challange level is not within an acceptable range\";\n\n\t\t\t// x is the base, n is the modulus.\n\t\t\tvar x = new BigInteger(1, data, 00 + offset, 64);\n\t\t\tvar n = new BigInteger(1, data, 64 + offset, 64);\n\t\t\treturn x.ModPow(BigInteger.Two.Pow(level), n).ToByteArrayUnsigned();\n\t\t}\n\n\t\tinternal static (byte[] publicKey, byte[] privateKey) GenerateTemporaryKey()\n\t\t{\n\t\t\tvar privateKey = new byte[32];\n\t\t\tusing (var rng = System.Security.Cryptography.RandomNumberGenerator.Create())\n\t\t\t\trng.GetBytes(privateKey);\n\t\t\tScalarOperations.sc_clamp(privateKey);\n\n\t\t\tGroupOperations.ge_scalarmult_base(out var A, privateKey);\n\t\t\tvar publicKey = new byte[32];\n\t\t\tGroupOperations.ge_p3_tobytes(publicKey, A);\n\n\t\t\treturn (publicKey, privateKey);\n\t\t}\n\n\t\t#endregion\n\n\t\t#region ENCRYPTION/DECRYPTION\n\n\t\tinternal void Encrypt<TDir>(ref Packet<TDir> packet)\n\t\t{\n\t\t\tif (packet.PacketType == PacketType.Init1)\n\t\t\t{\n\t\t\t\tFakeEncrypt(ref packet, Ts3InitMac);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (packet.UnencryptedFlag)\n\t\t\t{\n\t\t\t\tFakeEncrypt(ref packet, fakeSignature);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar (key, nonce) = GetKeyNonce(Packet<TDir>.FromServer, packet.PacketId, packet.GenerationId, packet.PacketType, !CryptoInitComplete);\n\t\t\tpacket.BuildHeader();\n\t\t\tICipherParameters ivAndKey = new AeadParameters(new KeyParameter(key), 8 * MacLen, nonce, packet.Header);\n\n\t\t\tbyte[] result;\n\t\t\tint len;\n\t\t\tlock (eaxCipher)\n\t\t\t{\n\t\t\t\teaxCipher.Init(true, ivAndKey);\n\t\t\t\tresult = new byte[eaxCipher.GetOutputSize(packet.Size)];\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlen = eaxCipher.ProcessBytes(packet.Data, 0, packet.Size, result, 0);\n\t\t\t\t\tlen += eaxCipher.DoFinal(result, len);\n\t\t\t\t}\n\t\t\t\tcatch (Exception ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Error(ex, \"Internal encryption error.\");\n\t\t\t\t\tthrow;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// result consists of [Data..., Mac...]\n\t\t\t// to build the final TS/libtomcrypt we need to copy it into another order\n\n\t\t\t// len is Data.Length + Mac.Length\n\t\t\t// //packet.Raw = new byte[Packet<TDir>.HeaderLength + len];\n\t\t\t// Copy the Mac from [Data..., Mac...] to [Mac..., Header..., Data...]\n\t\t\tArray.Copy(result, len - MacLen, packet.Raw, 0, MacLen);\n\t\t\t// Copy the Header from packet.Header to [Mac..., Header..., Data...]\n\t\t\tArray.Copy(packet.Header, 0, packet.Raw, MacLen, Packet<TDir>.HeaderLength);\n\t\t\t// Copy the Data from [Data..., Mac...] to [Mac..., Header..., Data...]\n\t\t\tArray.Copy(result, 0, packet.Raw, MacLen + Packet<TDir>.HeaderLength, len - MacLen);\n\t\t\t// Raw is now [Mac..., Header..., Data...]\n\t\t}\n\n\t\tprivate static void FakeEncrypt<TDir>(ref Packet<TDir> packet, byte[] mac)\n\t\t{\n\t\t\t// //packet.Raw = new byte[packet.Data.Length + MacLen + Packet<TDir>.HeaderLength];\n\t\t\t// Copy the Mac from [Mac...] to [Mac..., Header..., Data...]\n\t\t\tArray.Copy(mac, 0, packet.Raw, 0, MacLen);\n\t\t\t// Copy the Header from packet.Header to [Mac..., Header..., Data...]\n\t\t\tpacket.BuildHeader(packet.Raw.AsSpan(MacLen, Packet<TDir>.HeaderLength));\n\t\t\t// Copy the Data from packet.Data to [Mac..., Header..., Data...]\n\t\t\tArray.Copy(packet.Data, 0, packet.Raw, MacLen + Packet<TDir>.HeaderLength, packet.Data.Length);\n\t\t\t// Raw is now [Mac..., Header..., Data...]\n\t\t}\n\n\t\tinternal bool Decrypt<TDir>(ref Packet<TDir> packet)\n\t\t{\n\t\t\tif (packet.PacketType == PacketType.Init1)\n\t\t\t\treturn FakeDecrypt(ref packet, Ts3InitMac);\n\n\t\t\tif (packet.UnencryptedFlag)\n\t\t\t\treturn FakeDecrypt(ref packet, fakeSignature);\n\n\t\t\tvar decryptResult = DecryptData(ref packet, !CryptoInitComplete);\n\t\t\tif (decryptResult)\n\t\t\t\treturn true;\n\n\t\t\t// This is a hacky workaround for a special ack:\n\t\t\t// We send these two packets simultaneously:\n\t\t\t// - [Id:1] clientek    (dummy-encrypted)\n\t\t\t// - [Id:2] clientinit  (session-encrypted)\n\t\t\t// We get an ack for each with the same encryption scheme.\n\t\t\t// We can't know for sure which ack comes first and therefore\n\t\t\t//  whether the dummy or session key should be used.\n\t\t\t// In case we actually picked the wrong key, try it again\n\t\t\t//  with the dummy key.\n\t\t\tif (packet.PacketType == PacketType.Ack && packet.PacketId <= 2)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Using shady ack workaround.\");\n\t\t\t\treturn DecryptData(ref packet, true);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tprivate bool DecryptData<TDir>(ref Packet<TDir> packet, bool dummyEncryption)\n\t\t{\n\t\t\tArray.Copy(packet.Raw, MacLen, packet.Header, 0, Packet<TDir>.HeaderLength);\n\t\t\tvar (key, nonce) = GetKeyNonce(Packet<TDir>.FromServer, packet.PacketId, packet.GenerationId, packet.PacketType, dummyEncryption);\n\t\t\tint dataLen = packet.Raw.Length - (MacLen + Packet<TDir>.HeaderLength);\n\n\t\t\tICipherParameters ivAndKey = new AeadParameters(new KeyParameter(key), 8 * MacLen, nonce, packet.Header);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tbyte[] result;\n\t\t\t\tlock (eaxCipher)\n\t\t\t\t{\n\t\t\t\t\teaxCipher.Init(false, ivAndKey);\n\t\t\t\t\tresult = new byte[eaxCipher.GetOutputSize(dataLen + MacLen)];\n\n\t\t\t\t\tint len = eaxCipher.ProcessBytes(packet.Raw, MacLen + Packet<TDir>.HeaderLength, dataLen, result, 0);\n\t\t\t\t\tlen += eaxCipher.ProcessBytes(packet.Raw, 0, MacLen, result, len);\n\t\t\t\t\tlen += eaxCipher.DoFinal(result, len);\n\n\t\t\t\t\tif (len != dataLen)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tpacket.Data = result;\n\t\t\t}\n\t\t\tcatch (Exception) { return false; }\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate static bool FakeDecrypt<TDir>(ref Packet<TDir> packet, byte[] mac)\n\t\t{\n\t\t\tif (!CheckEqual(packet.Raw, mac, MacLen))\n\t\t\t\treturn false;\n\t\t\tint dataLen = packet.Raw.Length - (MacLen + Packet<TDir>.HeaderLength);\n\t\t\tpacket.Data = new byte[dataLen];\n\t\t\tArray.Copy(packet.Raw, MacLen + Packet<TDir>.HeaderLength, packet.Data, 0, dataLen);\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>TS uses a new key and nonce for each packet sent and received. This method generates and caches these.</summary>\n\t\t/// <param name=\"fromServer\">True if the packet is from server to client, false for client to server.</param>\n\t\t/// <param name=\"packetId\">The id of the packet, host order.</param>\n\t\t/// <param name=\"generationId\">Each time the packetId reaches 65535 the next packet will go on with 0 and the generationId will be increased by 1.</param>\n\t\t/// <param name=\"packetType\">The packetType.</param>\n\t\t/// <returns>A tuple of (key, nonce)</returns>\n\t\tprivate (byte[] key, byte[] nonce) GetKeyNonce(bool fromServer, ushort packetId, uint generationId, PacketType packetType, bool dummyEncryption)\n\t\t{\n\t\t\tif (dummyEncryption)\n\t\t\t\treturn DummyKeyAndNonceTuple;\n\n\t\t\t// only the lower 4 bits are used for the real packetType\n\t\t\tvar packetTypeRaw = (byte)packetType;\n\n\t\t\tint cacheIndex = packetTypeRaw * (fromServer ? 1 : 2);\n\t\t\tvar cacheValue = cachedKeyNonces[cacheIndex];\n\t\t\tif (cacheValue is null || cacheValue.Value.generation != generationId)\n\t\t\t{\n\t\t\t\t// this part of the key/nonce is fixed by the message direction and packetType\n\n\t\t\t\tvar tmpToHash = new byte[ivStruct!.Length == 20 ? 26 : 70];\n\n\t\t\t\ttmpToHash[0] = fromServer ? (byte)0x30 : (byte)0x31;\n\t\t\t\ttmpToHash[1] = packetTypeRaw;\n\n\t\t\t\tBinaryPrimitives.WriteUInt32BigEndian(tmpToHash.AsSpan(2), generationId);\n\t\t\t\tArray.Copy(ivStruct, 0, tmpToHash, 6, ivStruct.Length);\n\n\t\t\t\tvar result = Hash256It(tmpToHash).AsSpan();\n\n\t\t\t\tcacheValue = (result.Slice(0, 16).ToArray(), result.Slice(16, 16).ToArray(), generationId);\n\t\t\t\tcachedKeyNonces[cacheIndex] = cacheValue;\n\t\t\t}\n\n\t\t\tvar key = new byte[16];\n\t\t\tvar nonce = new byte[16];\n\t\t\tArray.Copy(cacheValue.Value.key, 0, key, 0, 16);\n\t\t\tArray.Copy(cacheValue.Value.nonce, 0, nonce, 0, 16);\n\n\t\t\t// finally the first two bytes get xor'd with the packet id\n\t\t\tkey[0] ^= unchecked((byte)(packetId >> 8));\n\t\t\tkey[1] ^= unchecked((byte)(packetId >> 0));\n\n\t\t\treturn (key, nonce);\n\t\t}\n\n\t\t#endregion\n\n\t\t#region CRYPT HELPER\n\n\t\tprivate static bool CheckEqual(ReadOnlySpan<byte> a1, ReadOnlySpan<byte> a2, int len)\n\t\t{\n\t\t\tif (a1.Length < len || a2.Length < len)\n\t\t\t\tthrow new ArgumentOutOfRangeException();\n\n\t\t\tint res = 0;\n\t\t\tfor (int i = 0; i < len; i++)\n\t\t\t\tres |= a1[i] ^ a2[i];\n\t\t\treturn res == 0;\n\t\t}\n\n\t\tprivate static void XorBinary(ReadOnlySpan<byte> a, ReadOnlySpan<byte> b, int len, Span<byte> outBuf)\n\t\t{\n\t\t\tif (a.Length < len || b.Length < len || outBuf.Length < len) throw new ArgumentException();\n\t\t\tfor (int i = 0; i < len; i++)\n\t\t\t\toutBuf[i] = (byte)(a[i] ^ b[i]);\n\t\t}\n\n\t\tprivate static readonly System.Security.Cryptography.SHA1Managed Sha1Hash = new System.Security.Cryptography.SHA1Managed();\n\t\tprivate static readonly System.Security.Cryptography.SHA256Managed Sha256Hash = new System.Security.Cryptography.SHA256Managed();\n\t\tprivate static readonly System.Security.Cryptography.SHA512Managed Sha512Hash = new System.Security.Cryptography.SHA512Managed();\n\t\tinternal static byte[] Hash1It(byte[] data, int offset = 0, int len = 0) => HashItInternal(Sha1Hash, data, offset, len);\n\t\tinternal static byte[] Hash256It(byte[] data, int offset = 0, int len = 0) => HashItInternal(Sha256Hash, data, offset, len);\n\t\tinternal static byte[] Hash512It(byte[] data, int offset = 0, int len = 0) => HashItInternal(Sha512Hash, data, offset, len);\n\t\tprivate static byte[] HashItInternal(System.Security.Cryptography.HashAlgorithm hashAlgo, byte[] data, int offset = 0, int len = 0)\n\t\t{\n\t\t\tlock (hashAlgo)\n\t\t\t{\n\t\t\t\treturn hashAlgo.ComputeHash(data, offset, len == 0 ? data.Length - offset : len);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Hashes a password like TeamSpeak.\n\t\t/// The hash works like this: base64(sha1(password))\n\t\t/// </summary>\n\t\t/// <param name=\"password\">The password to hash.</param>\n\t\t/// <returns>The hashed password.</returns>\n\t\tpublic static string HashPassword(string password)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(password))\n\t\t\t\treturn string.Empty;\n\t\t\tvar bytes = Tools.Utf8Encoder.GetBytes(password);\n\t\t\tvar hashed = Hash1It(bytes);\n\t\t\treturn Convert.ToBase64String(hashed);\n\t\t}\n\n\t\tpublic static byte[] Sign(BigInteger privateKey, byte[] data)\n\t\t{\n\t\t\tvar signer = SignerUtilities.GetSigner(X9ObjectIdentifiers.ECDsaWithSha256);\n\t\t\tvar signKey = new ECPrivateKeyParameters(privateKey, KeyGenParams.DomainParameters);\n\t\t\tsigner.Init(true, signKey);\n\t\t\tsigner.BlockUpdate(data, 0, data.Length);\n\t\t\treturn signer.GenerateSignature();\n\t\t}\n\n\t\tpublic static bool VerifySign(ECPoint publicKey, byte[] data, byte[] proof)\n\t\t{\n\t\t\tvar signer = SignerUtilities.GetSigner(X9ObjectIdentifiers.ECDsaWithSha256);\n\t\t\tvar signKey = new ECPublicKeyParameters(publicKey, KeyGenParams.DomainParameters);\n\t\t\tsigner.Init(false, signKey);\n\t\t\tsigner.BlockUpdate(data, 0, data.Length);\n\t\t\treturn signer.VerifySignature(proof);\n\t\t}\n\n\t\tprivate static readonly byte[] TsVersionSignPublicKey = Convert.FromBase64String(\"UrN1jX0dBE1vulTNLCoYwrVpfITyo+NBuq/twbf9hLw=\");\n\n\t\tpublic static bool EdCheck(TsVersionSigned sign)\n\t\t{\n\t\t\tvar ver = Encoding.ASCII.GetBytes(sign.Platform + sign.Version);\n\t\t\tvar signArr = Base64Decode(sign.Sign);\n\t\t\tif (signArr is null)\n\t\t\t\treturn false;\n\t\t\treturn Chaos.NaCl.Ed25519.Verify(signArr, ver, TsVersionSignPublicKey);\n\t\t}\n\n\t\tpublic static void VersionSelfCheck()\n\t\t{\n\t\t\tvar versions = typeof(TsVersionSigned).GetProperties().Where(prop => prop.PropertyType == typeof(TsVersionSigned));\n\t\t\tforeach (var ver in versions)\n\t\t\t{\n\t\t\t\tvar verObj = (TsVersionSigned)ver.GetValue(null)!;\n\t\t\t\tif (!EdCheck(verObj))\n\t\t\t\t\tthrow new Exception($\"Version is invalid: {verObj}\");\n\t\t\t}\n\t\t}\n\n\t\tinternal static byte[]? Base64Decode(string str)\n\t\t{\n\t\t\ttry { return Convert.FromBase64String(str); }\n\t\t\tcatch (FormatException) { return null; }\n\t\t}\n\n\t\t#endregion\n\n\t\t#region IDENTITY & SECURITY LEVEL\n\n\t\t/// <summary>Equals ulong.MaxValue.ToString().Length</summary>\n\t\tprivate const int MaxUlongStringLen = 20;\n\n\t\t/// <summary><para>Tries to improve the security level of the provided identity to the new level.</para>\n\t\t/// <para>The algorithm takes approximately 2^toLevel milliseconds to calculate; so be careful!</para>\n\t\t/// This method can be canceled anytime since progress which is not enough for the next level\n\t\t/// will be saved in <see cref=\"IdentityData.LastCheckedKeyOffset\"/> continuously.</summary>\n\t\t/// <param name=\"identity\">The identity to improve.</param>\n\t\t/// <param name=\"toLevel\">The targeted level.</param>\n\t\tpublic static void ImproveSecurity(IdentityData identity, int toLevel)\n\t\t{\n\t\t\tvar hashBuffer = new byte[identity.PublicKeyString.Length + MaxUlongStringLen];\n\t\t\tvar pubKeyBytes = Encoding.ASCII.GetBytes(identity.PublicKeyString);\n\t\t\tArray.Copy(pubKeyBytes, 0, hashBuffer, 0, pubKeyBytes.Length);\n\n\t\t\tidentity.LastCheckedKeyOffset = Math.Max(identity.ValidKeyOffset, identity.LastCheckedKeyOffset);\n\t\t\tint best = GetSecurityLevel(hashBuffer, pubKeyBytes.Length, identity.ValidKeyOffset);\n\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tif (best >= toLevel) return;\n\n\t\t\t\tint curr = GetSecurityLevel(hashBuffer, pubKeyBytes.Length, identity.LastCheckedKeyOffset);\n\t\t\t\tif (curr > best)\n\t\t\t\t{\n\t\t\t\t\tidentity.ValidKeyOffset = identity.LastCheckedKeyOffset;\n\t\t\t\t\tbest = curr;\n\t\t\t\t}\n\t\t\t\tidentity.LastCheckedKeyOffset++;\n\t\t\t}\n\t\t}\n\n\t\tpublic static int GetSecurityLevel(IdentityData identity)\n\t\t{\n\t\t\tvar hashBuffer = new byte[identity.PublicKeyString.Length + MaxUlongStringLen];\n\t\t\tvar pubKeyBytes = Encoding.ASCII.GetBytes(identity.PublicKeyString);\n\t\t\tArray.Copy(pubKeyBytes, 0, hashBuffer, 0, pubKeyBytes.Length);\n\t\t\treturn GetSecurityLevel(hashBuffer, pubKeyBytes.Length, identity.ValidKeyOffset);\n\t\t}\n\n\t\t/// <summary>Creates a new TeamSpeak3 identity.</summary>\n\t\t/// <param name=\"securityLevel\">Minimum security level this identity will have.</param>\n\t\t/// <returns>The identity information.</returns>\n\t\tpublic static IdentityData GenerateNewIdentity(int securityLevel = 8)\n\t\t{\n\t\t\tvar ecp = ECNamedCurveTable.GetByName(\"prime256v1\");\n\t\t\tvar domainParams = new ECDomainParameters(ecp.Curve, ecp.G, ecp.N, ecp.H, ecp.GetSeed());\n\t\t\tvar keyGenParams = new ECKeyGenerationParameters(domainParams, new SecureRandom());\n\t\t\tvar generator = new ECKeyPairGenerator();\n\t\t\tgenerator.Init(keyGenParams);\n\t\t\tvar keyPair = generator.GenerateKeyPair();\n\n\t\t\tvar privateKey = (ECPrivateKeyParameters)keyPair.Private;\n\t\t\tvar publicKey = (ECPublicKeyParameters)keyPair.Public;\n\n\t\t\tvar identity = LoadIdentity(publicKey.Q.Normalize(), privateKey.D, 0, 0);\n\t\t\tImproveSecurity(identity, securityLevel);\n\t\t\treturn identity;\n\t\t}\n\n\t\tprivate static int GetSecurityLevel(byte[] hashBuffer, int pubKeyLen, ulong offset)\n\t\t{\n\t\t\tvar numBuffer = new byte[MaxUlongStringLen];\n\t\t\tint numLen = 0;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tnumBuffer[numLen] = (byte)('0' + (offset % 10));\n\t\t\t\toffset /= 10;\n\t\t\t\tnumLen++;\n\t\t\t} while (offset > 0);\n\t\t\tfor (int i = 0; i < numLen; i++)\n\t\t\t\thashBuffer[pubKeyLen + i] = numBuffer[numLen - (i + 1)];\n\t\t\tbyte[] outHash = Hash1It(hashBuffer, 0, pubKeyLen + numLen);\n\n\t\t\treturn GetLeadingZeroBits(outHash);\n\t\t}\n\n\t\tprivate static int GetLeadingZeroBits(byte[] data)\n\t\t{\n\t\t\t// TODO dnc 3.0 sse ?\n\t\t\tint curr = 0;\n\t\t\tint i;\n\t\t\tfor (i = 0; i < data.Length; i++)\n\t\t\t\tif (data[i] == 0) curr += 8;\n\t\t\t\telse break;\n\t\t\tif (i < data.Length)\n\t\t\t\tfor (int bit = 0; bit < 8; bit++)\n\t\t\t\t\tif ((data[i] & (1 << bit)) == 0) curr++;\n\t\t\t\t\telse break;\n\t\t\treturn curr;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/TsFullClient.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Buffers.Binary;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing TSLib.Audio;\nusing TSLib.Commands;\nusing TSLib.Full.Book;\nusing TSLib.Helper;\nusing TSLib.Messages;\nusing TSLib.Scheduler;\nusing CmdR = System.Threading.Tasks.Task<System.E<TSLib.Messages.CommandError>>;\n\nnamespace TSLib.Full\n{\n\t/// <summary>Creates a full TeamSpeak3 client with voice capabilities.</summary>\n\tpublic sealed partial class TsFullClient : TsBaseFunctions, IAudioActiveProducer, IAudioPassiveConsumer\n\t{\n\t\tprivate readonly AsyncMessageProcessor msgProc;\n\t\tprivate readonly DedicatedTaskScheduler scheduler;\n\t\tprivate readonly bool isOwnScheduler;\n\n\t\tprivate uint returnCode;\n\t\tprivate ConnectionContext? context;\n\n\t\tpublic override ClientType ClientType => ClientType.Full;\n\t\t/// <summary>The client id given to this connection by the server.</summary>\n\t\tpublic ClientId ClientId => context?.PacketHandler.ClientId ?? ClientId.Null;\n\t\t/// <summary>The disonnect message when leaving.</summary>\n\t\tpublic string QuitMessage { get; set; } = \"Disconnected\";\n\t\t/// <summary>The <see cref=\"TsVersionSigned\"/> used to connect.</summary>\n\t\tpublic TsVersionSigned? VersionSign => context?.ConnectionDataFull.VersionSign;\n\t\t/// <summary>The <see cref=\"IdentityData\"/> used to connect.</summary>\n\t\tpublic IdentityData? Identity => context?.ConnectionDataFull.Identity;\n\t\t/// <summary>\n\t\t/// Status overview:\n\t\t/// <list type=\"bullet\">\n\t\t/// <item> Disconnected:\n\t\t///   <para> ! PacketHandler is not initalized, context == null</para>\n\t\t///   <para> -> Connect() => Connecting</para>\n\t\t/// </item>\n\t\t/// <item> Connecting:\n\t\t///   <para> -> Init/Crypto-Error => Disconnected</para>\n\t\t///   <para> -> Timeout => Disconnected</para>\n\t\t///   <para> -> Final Init => Connected</para>\n\t\t/// </item>\n\t\t/// <item> Connected:\n\t\t///   <para> -> Timeout => Disconnected</para>\n\t\t///   <para> -> Kick/Leave => Disconnecting</para>\n\t\t/// </item>\n\t\t/// <item> Disconnecting:\n\t\t///   <para> -> Timeout => Disconnected</para>\n\t\t///   <para> -> Final Ack => Disconnected</para>\n\t\t/// </item>\n\t\t/// </list>\n\t\t/// </summary>\n\t\tprivate TsClientStatus status;\n\t\tpublic override bool Connected => status == TsClientStatus.Connected;\n\t\tpublic override bool Connecting => status == TsClientStatus.Connecting;\n\t\tprotected override Deserializer Deserializer => msgProc.Deserializer;\n\t\tpublic Connection Book { get; } = new Connection();\n\n\t\tpublic override event EventHandler<DisconnectEventArgs>? OnDisconnected;\n\t\tpublic event EventHandler<CommandError>? OnErrorEvent;\n\n\t\t/// <summary>Creates a new client. A client can manage one connection to a server.</summary>\n\t\t/// <param name=\"dispatcherType\">The message processing method for incomming notifications.\n\t\t/// See <see cref=\"EventDispatchType\"/> for further information about each type.</param>\n\t\tpublic TsFullClient(DedicatedTaskScheduler? scheduler = null)\n\t\t{\n\t\t\tstatus = TsClientStatus.Disconnected;\n\t\t\tmsgProc = new AsyncMessageProcessor(MessageHelper.GetToClientNotificationType);\n\t\t\tthis.scheduler = scheduler ?? new DedicatedTaskScheduler(Id.Null);\n\t\t\tthis.isOwnScheduler = scheduler is null;\n\t\t}\n\n\t\t/// <summary>Tries to connect to a server.</summary>\n\t\t/// <param name=\"conData\">Set the connection information properties as needed.\n\t\t/// For further details about each setting see the respective property documentation in <see cref=\"ConnectionData\"/></param>\n\t\t/// <exception cref=\"ArgumentException\">When some required values are not set or invalid.</exception>\n\t\t/// <exception cref=\"TsException\">When the connection could not be established.</exception>\n\t\tpublic override async CmdR Connect(ConnectionData conData)\n\t\t{\n\t\t\tscheduler.VerifyOwnThread();\n\t\t\tif (!(conData is ConnectionDataFull conDataFull)) throw new ArgumentException($\"Use the {nameof(ConnectionDataFull)} derivative to connect with the full client.\", nameof(conData));\n\t\t\tif (conDataFull.Identity is null) throw new ArgumentNullException(nameof(conDataFull.Identity));\n\t\t\tif (conDataFull.VersionSign is null) throw new ArgumentNullException(nameof(conDataFull.VersionSign));\n\n\t\t\tawait Disconnect();\n\n\t\t\tremoteAddress = await TsDnsResolver.TryResolve(conData.Address);\n\t\t\tif (remoteAddress is null)\n\t\t\t\treturn CommandError.Custom(\"Could not read or resolve address.\");\n\n\t\t\tConnectionData = conData;\n\t\t\tServerConstants = TsConst.Default;\n\t\t\tBook.Reset();\n\t\t\treturnCode = 0;\n\n\t\t\tvar ctx = new ConnectionContext(conDataFull);\n\t\t\tcontext = ctx;\n\n\t\t\tctx.PacketHandler.PacketEvent = (ref Packet<S2C> packet) =>\n\t\t\t{\n\t\t\t\tif (status == TsClientStatus.Disconnected)\n\t\t\t\t\treturn;\n\t\t\t\tPacketEvent(ctx, ref packet);\n\t\t\t};\n\t\t\tctx.PacketHandler.StopEvent = (closeReason) =>\n\t\t\t{\n\t\t\t\t_ = scheduler.Invoke(() =>\n\t\t\t\t{\n\t\t\t\t\tctx.ExitReason ??= closeReason;\n\t\t\t\t\tChangeState(ctx, TsClientStatus.Disconnected);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tChangeState(ctx, TsClientStatus.Connecting);\n\t\t\tif (!ctx.PacketHandler.Connect(remoteAddress).GetOk(out var error))\n\t\t\t{\n\t\t\t\tChangeState(ctx, TsClientStatus.Disconnected);\n\t\t\t\treturn CommandError.Custom(error);\n\t\t\t}\n\t\t\treturn await ctx.ConnectEvent.Task; // TODO check error state\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Disconnects from the current server and closes the connection.\n\t\t/// Does nothing if the client is not connected.\n\t\t/// </summary>\n\t\tpublic override async Task Disconnect()\n\t\t{\n\t\t\tscheduler.VerifyOwnThread();\n\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null)\n\t\t\t\treturn;\n\n\t\t\t// TODO: Consider if it is better when in connecting state to wait for connect completion then disconnect\n\t\t\tif (status == TsClientStatus.Connected)\n\t\t\t{\n\t\t\t\tawait ClientDisconnect(Reason.LeftServer, QuitMessage);\n\t\t\t\tChangeState(ctx, TsClientStatus.Disconnecting);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tChangeState(ctx, TsClientStatus.Disconnected);\n\t\t\t}\n\t\t\tawait ctx.DisconnectEvent.Task;\n\t\t}\n\n\t\tprivate void ChangeState(ConnectionContext ctx, TsClientStatus setStatus, CommandError? error = null)\n\t\t{\n\t\t\tscheduler.VerifyOwnThread();\n\n\t\t\tif (ctx != context)\n\t\t\t\tLog.Debug(\"Stray disconnect from old packethandler\");\n\n\t\t\tLog.Debug(\"ChangeState {0} -> {1} (error:{2})\", status, setStatus, error?.ErrorFormat() ?? \"none\");\n\n\t\t\tswitch ((status, setStatus))\n\t\t\t{\n\t\t\tcase (TsClientStatus.Disconnected, TsClientStatus.Disconnected):\n\t\t\t\t// Already disconnected, do nothing\n\t\t\t\tbreak;\n\n\t\t\tcase (TsClientStatus.Disconnected, TsClientStatus.Connecting):\n\t\t\t\tstatus = TsClientStatus.Connecting;\n\t\t\t\tbreak;\n\n\t\t\tcase (TsClientStatus.Connecting, TsClientStatus.Connected):\n\t\t\t\tstatus = TsClientStatus.Connected;\n\t\t\t\tctx.ConnectEvent.SetResult(R.Ok);\n\t\t\t\tbreak;\n\n\t\t\tcase (TsClientStatus.Connecting, TsClientStatus.Disconnected):\n\t\t\tcase (TsClientStatus.Connected, TsClientStatus.Disconnected):\n\t\t\tcase (TsClientStatus.Disconnecting, TsClientStatus.Disconnected):\n\t\t\t\tstatus = TsClientStatus.Disconnected;\n\t\t\t\tctx.PacketHandler.Stop();\n\t\t\t\tmsgProc.DropQueue();\n\n\t\t\t\tvar statusBefore = status;\n\t\t\t\tcontext = null;\n\t\t\t\tif (statusBefore == TsClientStatus.Connecting)\n\t\t\t\t\tctx.ConnectEvent.SetResult(error ?? CommandError.ConnectionClosed); // TODO: Set exception maybe ?\n\t\t\t\tctx.DisconnectEvent.SetResult(null);\n\t\t\t\tOnDisconnected?.Invoke(this, new DisconnectEventArgs(ctx.ExitReason ?? Reason.LeftServer, error));\n\t\t\t\tbreak;\n\n\t\t\tcase (TsClientStatus.Connected, TsClientStatus.Disconnecting):\n\t\t\t\tstatus = TsClientStatus.Disconnecting;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tTrace.Fail($\"Invalid transition change from {status} to {setStatus}\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tprivate void PacketEvent(ConnectionContext ctx, ref Packet<S2C> packet)\n\t\t{\n\t\t\tswitch (packet.PacketType)\n\t\t\t{\n\t\t\tcase PacketType.Command:\n\t\t\tcase PacketType.CommandLow:\n\t\t\t\tvar data = packet.Data;\n\t\t\t\tif (Log.IsDebugEnabled)\n\t\t\t\t\tLog.Debug(\"[I] {0}\", Tools.Utf8Encoder.GetString(packet.Data));\n\t\t\t\t_ = scheduler.Invoke(() =>\n\t\t\t\t{\n\t\t\t\t\tif (ctx != context)\n\t\t\t\t\t\tLog.Debug(\"Stray packet from old packethandler\");\n\n\t\t\t\t\tvar result = msgProc.PushMessage(data);\n\t\t\t\t\tif (result != null)\n\t\t\t\t\t\tInvokeEvent(result.Value);\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase PacketType.Voice:\n\t\t\tcase PacketType.VoiceWhisper:\n\t\t\t\tOutStream?.Write(packet.Data, new Meta\n\t\t\t\t{\n\t\t\t\t\tIn = new MetaIn\n\t\t\t\t\t{\n\t\t\t\t\t\tWhisper = packet.PacketType == PacketType.VoiceWhisper\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase PacketType.Init1:\n\t\t\t\t// Init error\n\t\t\t\tif (packet.Data.Length == 5 && packet.Data[0] == 1)\n\t\t\t\t{\n\t\t\t\t\tvar errorNum = BinaryPrimitives.ReadUInt32LittleEndian(packet.Data.AsSpan(1));\n\t\t\t\t\tif (Enum.IsDefined(typeof(TsErrorCode), errorNum))\n\t\t\t\t\t\tLog.Info(\"Got init error: {0}\", (TsErrorCode)errorNum);\n\t\t\t\t\telse\n\t\t\t\t\t\tLog.Warn(\"Got undefined init error: {0}\", errorNum);\n\t\t\t\t\t_ = scheduler.Invoke(() => ChangeState(ctx, TsClientStatus.Disconnected));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Local event processing\n\n\t\tasync partial void ProcessEachInitIvExpand(InitIvExpand initIvExpand)\n\t\t{\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null) throw new InvalidOperationException(\"context should be set\");\n\n\t\t\tctx.PacketHandler.ReceivedFinalInitAck();\n\n\t\t\tvar result = ctx.TsCrypt.CryptoInit(initIvExpand.Alpha, initIvExpand.Beta, initIvExpand.Omega);\n\t\t\tif (!result)\n\t\t\t{\n\t\t\t\tChangeState(ctx, TsClientStatus.Disconnected, CommandError.Custom($\"Failed to calculate shared secret: {result.Error}\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait DefaultClientInit(ctx);\n\t\t}\n\n\t\tasync partial void ProcessEachInitIvExpand2(InitIvExpand2 initIvExpand2)\n\t\t{\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null) throw new InvalidOperationException(\"context should be set\");\n\n\t\t\tctx.PacketHandler.ReceivedFinalInitAck();\n\n\t\t\tvar (publicKey, privateKey) = TsCrypt.GenerateTemporaryKey();\n\n\t\t\tvar ekBase64 = Convert.ToBase64String(publicKey);\n\t\t\tvar toSign = new byte[86];\n\t\t\tArray.Copy(publicKey, 0, toSign, 0, 32);\n\t\t\tvar beta = Convert.FromBase64String(initIvExpand2.Beta);\n\t\t\tArray.Copy(beta, 0, toSign, 32, 54);\n\t\t\tvar sign = TsCrypt.Sign(ctx.ConnectionDataFull.Identity.PrivateKey, toSign);\n\t\t\tvar proof = Convert.ToBase64String(sign);\n\t\t\tawait ClientEk(ekBase64, proof);\n\n\t\t\tvar result = ctx.TsCrypt.CryptoInit2(initIvExpand2.License, initIvExpand2.Omega, initIvExpand2.Proof, initIvExpand2.Beta, privateKey);\n\t\t\tif (!result)\n\t\t\t{\n\t\t\t\tChangeState(ctx, TsClientStatus.Disconnected, CommandError.Custom($\"Failed to calculate shared secret: {result.Error}\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait DefaultClientInit(ctx);\n\t\t}\n\n\t\tpartial void ProcessEachInitServer(InitServer initServer)\n\t\t{\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null) throw new InvalidOperationException(\"context should be set\");\n\n\t\t\tctx.PacketHandler.ClientId = initServer.ClientId;\n\t\t\tvar serverVersion = TsVersion.TryParse(initServer.ServerVersion, initServer.ServerPlatform);\n\t\t\tif (serverVersion != null)\n\t\t\t\tServerConstants = TsConst.GetByServerBuildNum(serverVersion.Build);\n\n\t\t\tChangeState(ctx, TsClientStatus.Connected);\n\n\t\t}\n\n\t\tasync partial void ProcessEachPluginCommand(PluginCommand cmd)\n\t\t{\n\t\t\tif (cmd.Name == \"cliententerview\" && cmd.Data == \"version\")\n\t\t\t\tawait SendPluginCommand(\"cliententerview\", \"TAB\", PluginTargetMode.Server);\n\t\t}\n\n\t\tpartial void ProcessEachCommandError(CommandError error)\n\t\t{\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null) throw new InvalidOperationException(\"context should be set\");\n\n\t\t\tif (status == TsClientStatus.Connecting)\n\t\t\t\tChangeState(ctx, TsClientStatus.Disconnected, error);\n\t\t\telse\n\t\t\t\tOnErrorEvent?.Invoke(this, error);\n\t\t}\n\n\t\tpartial void ProcessEachClientLeftView(ClientLeftView clientLeftView)\n\t\t{\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null) throw new InvalidOperationException(\"context should be set\");\n\n\t\t\tif (clientLeftView.ClientId == ctx.PacketHandler.ClientId)\n\t\t\t{\n\t\t\t\tctx.ExitReason = clientLeftView.Reason;\n\t\t\t\tChangeState(ctx, TsClientStatus.Disconnected);\n\t\t\t}\n\t\t}\n\n\t\tasync partial void ProcessEachChannelListFinished(ChannelListFinished _)\n\t\t{\n\t\t\tawait ChannelSubscribeAll();\n\t\t\tawait PermissionList();\n\t\t}\n\n\t\tasync partial void ProcessEachClientConnectionInfoUpdateRequest(ClientConnectionInfoUpdateRequest _)\n\t\t{\n\t\t\tif (context is null) throw new InvalidOperationException(\"context should be set\");\n\n\t\t\tawait SendNoResponsed(context.PacketHandler.NetworkStats.GenerateStatusAnswer());\n\t\t}\n\n\t\tpartial void ProcessPermList(PermList[] permList)\n\t\t{\n\t\t\tvar buildPermissions = new List<TsPermission>(permList.Length + 1) { TsPermission.undefined };\n\t\t\tforeach (var perm in permList)\n\t\t\t{\n\t\t\t\tif (!string.IsNullOrEmpty(perm.PermissionName))\n\t\t\t\t{\n\t\t\t\t\tif (Enum.TryParse<TsPermission>(perm.PermissionName, out var tsPerm))\n\t\t\t\t\t\tbuildPermissions.Add(tsPerm);\n\t\t\t\t\telse\n\t\t\t\t\t\tbuildPermissions.Add(TsPermission.undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t\tDeserializer.PermissionTransform = new TablePermissionTransform(buildPermissions.ToArray());\n\t\t}\n\n\t\tprivate Task DefaultClientInit(ConnectionContext context)\n\t\t{\n\t\t\tvar cdf = context.ConnectionDataFull;\n\t\t\treturn ClientInit(\n\t\t\t\tcdf.Username,\n\t\t\t\ttrue, true,\n\t\t\t\tcdf.DefaultChannel,\n\t\t\t\tcdf.DefaultChannelPassword.HashedPassword,\n\t\t\t\tcdf.ServerPassword.HashedPassword,\n\t\t\t\tstring.Empty, string.Empty, string.Empty,\n\t\t\t\tcdf.Identity.ClientUid.ToString(), cdf.VersionSign, cdf.Identity.ValidKeyOffset);\n\t\t}\n\n\t\t// ***\n\n\t\t/// <summary>\n\t\t/// Sends a command without expecting a 'error' return code.\n\t\t/// <para>NOTE: Do not use this method unless you are sure the ts3 command fits the criteria.</para>\n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command to send.</param>\n\t\tpublic Task SendNoResponsed(TsCommand command)\n\t\t{\n\t\t\treturn SendVoid(command.ExpectsResponse(false));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Sends a command to the server. Commands look exactly like query commands and mostly also behave identically.\n\t\t/// <para>NOTE: Do not expect all commands to work exactly like in the query documentation.</para>\n\t\t/// </summary>\n\t\t/// <typeparam name=\"T\">The type to deserialize the response to. Use <see cref=\"ResponseDictionary\"/> for unknow response data.</typeparam>\n\t\t/// <param name=\"com\">The command to send.\n\t\t/// <para>NOTE: By default does the command expect an answer from the server. Set <see cref=\"TsCommand.ExpectResponse\"/> to false\n\t\t/// if the client hangs after a special command (<see cref=\"Send{T}(TsCommand)\"/> will return a generic error instead).</para></param>\n\t\t/// <returns>Returns <code>R(OK)</code> with an enumeration of the deserialized and split up in <see cref=\"T\"/> objects data.\n\t\t/// Or <code>R(ERR)</code> with the returned error if no response is expected.</returns>\n\t\tpublic override async Task<R<T[], CommandError>> Send<T>(TsCommand com)\n\t\t{\n\t\t\tusing var wb = new WaitBlock(msgProc.Deserializer);\n\t\t\tvar result = SendCommandBase(wb, com);\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result.Error;\n\t\t\tif (com.ExpectResponse)\n\t\t\t\treturn await wb.WaitForMessageAsync<T>();\n\t\t\telse\n\t\t\t\t// This might not be the nicest way to return in this case\n\t\t\t\t// but we don't know what the response is, so this acceptable.\n\t\t\t\treturn CommandError.NoResult;\n\t\t}\n\n\t\tpublic override async Task<R<T[], CommandError>> SendHybrid<T>(TsCommand com, NotificationType type)\n\t\t{\n\t\t\tvar notification = await SendNotifyCommand(com, type);\n\t\t\treturn notification.UnwrapNotification<T>();\n\t\t}\n\n\t\tpublic async Task<R<LazyNotification, CommandError>> SendNotifyCommand(TsCommand com, params NotificationType[] dependsOn)\n\t\t{\n\t\t\tif (!com.ExpectResponse)\n\t\t\t\tthrow new ArgumentException(\"A special command must take a response\");\n\n\t\t\tusing var wb = new WaitBlock(msgProc.Deserializer, dependsOn);\n\t\t\tvar result = SendCommandBase(wb, com);\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result.Error;\n\t\t\treturn await wb.WaitForNotificationAsync();\n\t\t}\n\n\t\tprivate E<CommandError> SendCommandBase(WaitBlock wb, TsCommand com)\n\t\t{\n\t\t\tscheduler.VerifyOwnThread();\n\n\t\t\tif (status != TsClientStatus.Connecting && status != TsClientStatus.Connected)\n\t\t\t\treturn CommandError.ConnectionClosed;\n\n\t\t\tif (context is null) throw new InvalidOperationException(\"context should be set\");\n\n\t\t\tif (com.ExpectResponse)\n\t\t\t{\n\t\t\t\tvar responseNumber = unchecked(++returnCode);\n\t\t\t\tvar retCodeParameter = new CommandParameter(\"return_code\", responseNumber);\n\t\t\t\tcom.Add(retCodeParameter);\n\t\t\t\tmsgProc.EnqueueRequest(retCodeParameter.Value, wb);\n\t\t\t}\n\n\t\t\tvar message = com.ToString();\n\t\t\tLog.Debug(\"[O] {0}\", message);\n\t\t\tbyte[] data = Tools.Utf8Encoder.GetBytes(message);\n\t\t\tvar sendResult = context.PacketHandler.AddOutgoingPacket(data, PacketType.Command);\n\t\t\tif (!sendResult)\n\t\t\t\tLog.Debug(\"packetHandler couldn't send packet: {0}\", sendResult.Error);\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\t/// <summary>Release all resources. Does not wait for a normal disconnect. Await Disconnect for this instead.</summary>\n\t\tpublic override void Dispose()\n\t\t{\n\t\t\tcontext?.PacketHandler.Stop();\n\t\t\tif (isOwnScheduler && scheduler is IDisposable disp)\n\t\t\t\tdisp.Dispose();\n\t\t}\n\n\t\t#region Audio\n\t\t/// <summary>Receive voice packets.</summary>\n\t\tpublic IAudioPassiveConsumer? OutStream { get; set; }\n\t\t/// <summary>When voice data can be sent.</summary>\n\t\t// TODO may set to false if no talk power, etc.\n\t\tpublic bool Active => true;\n\t\t/// <summary>Send voice data.</summary>\n\t\t/// <param name=\"data\">The encoded audio buffer.</param>\n\t\t/// <param name=\"meta\">The metadata where to send the packet.</param>\n\t\tpublic void Write(Span<byte> data, Meta? meta)\n\t\t{\n\t\t\tif (meta?.Out is null\n\t\t\t\t|| meta.Out.SendMode == TargetSendMode.None\n\t\t\t\t|| !meta.Codec.HasValue\n\t\t\t\t|| meta.Codec.Value == Codec.Raw)\n\t\t\t\treturn;\n\n\t\t\tswitch (meta.Out.SendMode)\n\t\t\t{\n\t\t\tcase TargetSendMode.None:\n\t\t\t\tbreak;\n\t\t\tcase TargetSendMode.Voice:\n\t\t\t\tSendAudio(data, meta.Codec.Value);\n\t\t\t\tbreak;\n\t\t\tcase TargetSendMode.Whisper:\n\t\t\t\tSendAudioWhisper(data, meta.Codec.Value, meta.Out.ChannelIds!, meta.Out.ClientIds!);\n\t\t\t\tbreak;\n\t\t\tcase TargetSendMode.WhisperGroup:\n\t\t\t\tSendAudioGroupWhisper(data, meta.Codec.Value, meta.Out.GroupWhisperType, meta.Out.GroupWhisperTarget, meta.Out.TargetId);\n\t\t\t\tbreak;\n\t\t\tdefault: throw Tools.UnhandledDefault(meta.Out.SendMode);\n\t\t\t}\n\t\t}\n\t\t#endregion\n\n\t\t#region FULLCLIENT SPECIFIC COMMANDS\n\n\t\tpublic CmdR ChangeIsChannelCommander(bool isChannelCommander)\n\t\t\t=> SendVoid(new TsCommand(\"clientupdate\") {\n\t\t\t\t{ \"client_is_channel_commander\", isChannelCommander },\n\t\t\t});\n\n\t\tpublic CmdR ChangeDescription(string newDescription)\n\t\t\t=> ChangeDescription(newDescription, ClientId);\n\n\t\tpublic CmdR RequestTalkPower(string? message = null)\n\t\t\t=> SendVoid(new TsCommand(\"clientupdate\") {\n\t\t\t\t{ \"client_talk_request\", true },\n\t\t\t\t{ \"client_talk_request_msg\", message },\n\t\t\t});\n\n\t\tpublic CmdR CancelTalkPowerRequest()\n\t\t\t=> SendVoid(new TsCommand(\"clientupdate\") {\n\t\t\t\t{ \"client_talk_request\", false },\n\t\t\t});\n\n\t\tpublic Task ClientEk(string ek, string proof)\n\t\t\t=> SendNoResponsed(new TsCommand(\"clientek\") {\n\t\t\t\t{ \"ek\", ek },\n\t\t\t\t{ \"proof\", proof },\n\t\t\t});\n\n\t\tpublic Task ClientInit(string nickname, bool inputHardware, bool outputHardware,\n\t\t\t\tstring defaultChannel, string defaultChannelPassword, string serverPassword, string metaData,\n\t\t\t\tstring nicknamePhonetic, string defaultToken, string hwid, TsVersionSigned versionSign, ulong keyOffset)\n\t\t\t=> SendNoResponsed(new TsCommand(\"clientinit\") {\n\t\t\t\t{ \"client_nickname\", nickname },\n\t\t\t\t{ \"client_version\", versionSign.Version },\n\t\t\t\t{ \"client_platform\", versionSign.Platform },\n\t\t\t\t{ \"client_input_hardware\", inputHardware },\n\t\t\t\t{ \"client_output_hardware\", outputHardware },\n\t\t\t\t{ \"client_default_channel\", defaultChannel },\n\t\t\t\t{ \"client_default_channel_password\", defaultChannelPassword }, // base64(sha1(pass))\n\t\t\t\t{ \"client_server_password\", serverPassword }, // base64(sha1(pass))\n\t\t\t\t{ \"client_meta_data\", metaData },\n\t\t\t\t{ \"client_version_sign\", versionSign.Sign },\n\t\t\t\t{ \"client_key_offset\", keyOffset },\n\t\t\t\t{ \"client_nickname_phonetic\", nicknamePhonetic },\n\t\t\t\t{ \"client_default_token\", defaultToken },\n\t\t\t\t{ \"hwid\", hwid },\n\t\t\t});\n\n\t\tpublic Task ClientDisconnect(Reason reason, string reasonMsg)\n\t\t\t=> SendNoResponsed(new TsCommand(\"clientdisconnect\") {\n\t\t\t\t{ \"reasonid\", (int)reason },\n\t\t\t\t{ \"reasonmsg\", reasonMsg }\n\t\t\t});\n\n\t\tpublic CmdR ChannelSubscribeAll()\n\t\t\t=> SendVoid(new TsCommand(\"channelsubscribeall\"));\n\n\t\tpublic CmdR ChannelUnsubscribeAll()\n\t\t\t=> SendVoid(new TsCommand(\"channelunsubscribeall\"));\n\n\t\tpublic Task PokeClient(string message, ClientId clientId)\n\t\t\t=> SendNoResponsed(new TsCommand(\"clientpoke\") {\n\t\t\t\t{ \"clid\", clientId },\n\t\t\t\t{ \"msg\", message },\n\t\t\t});\n\n\t\tpublic void SendAudio(in ReadOnlySpan<byte> data, Codec codec)\n\t\t{\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null) return;\n\n\t\t\t// [X,X,Y,DATA]\n\t\t\t// > X is a ushort in H2N order of an own audio packet counter\n\t\t\t//     it seems it can be the same as the packet counter so we will let the packethandler do it.\n\t\t\t// > Y is the codec byte (see Enum)\n\t\t\tSpan<byte> tmpBuffer = stackalloc byte[data.Length + 3];\n\t\t\ttmpBuffer[2] = (byte)codec;\n\t\t\tdata.CopyTo(tmpBuffer.Slice(3));\n\n\t\t\tctx.PacketHandler.AddOutgoingPacket(tmpBuffer, PacketType.Voice);\n\t\t}\n\n\t\tpublic void SendAudioWhisper(in ReadOnlySpan<byte> data, Codec codec, IReadOnlyList<ChannelId> channelIds, IReadOnlyList<ClientId> clientIds)\n\t\t{\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null) return;\n\n\t\t\t// [X,X,Y,N,M,(U,U,U,U,U,U,U,U)*,(T,T)*,DATA]\n\t\t\t// > X is a ushort in H2N order of an own audio packet counter\n\t\t\t//     it seems it can be the same as the packet counter so we will let the packethandler do it.\n\t\t\t// > Y is the codec byte (see Enum)\n\t\t\t// > N is a byte, the count of ChannelIds to send to\n\t\t\t// > M is a byte, the count of ClientIds to send to\n\t\t\t// > U is a ulong in H2N order of each targeted channelId, (U...U) is repeated N times\n\t\t\t// > T is a ushort in H2N order of each targeted clientId, (T...T) is repeated M times\n\t\t\tint offset = 2 + 1 + 2 + channelIds.Count * 8 + clientIds.Count * 2;\n\t\t\tSpan<byte> tmpBuffer = stackalloc byte[data.Length + offset];\n\t\t\ttmpBuffer[2] = (byte)codec;\n\t\t\ttmpBuffer[3] = (byte)channelIds.Count;\n\t\t\ttmpBuffer[4] = (byte)clientIds.Count;\n\t\t\tfor (int i = 0; i < channelIds.Count; i++)\n\t\t\t\tBinaryPrimitives.WriteUInt64BigEndian(tmpBuffer.Slice(5 + (i * 8)), channelIds[i].Value);\n\t\t\tfor (int i = 0; i < clientIds.Count; i++)\n\t\t\t\tBinaryPrimitives.WriteUInt16BigEndian(tmpBuffer.Slice(5 + channelIds.Count * 8 + (i * 2)), clientIds[i].Value);\n\t\t\tdata.CopyTo(tmpBuffer.Slice(offset));\n\n\t\t\tctx.PacketHandler.AddOutgoingPacket(tmpBuffer, PacketType.VoiceWhisper);\n\t\t}\n\n\t\tpublic void SendAudioGroupWhisper(in ReadOnlySpan<byte> data, Codec codec, GroupWhisperType type, GroupWhisperTarget target, ulong targetId = 0)\n\t\t{\n\t\t\tvar ctx = context;\n\t\t\tif (ctx is null) return;\n\n\t\t\t// [X,X,Y,N,M,U,U,U,U,U,U,U,U,DATA]\n\t\t\t// > X is a ushort in H2N order of an own audio packet counter\n\t\t\t//     it seems it can be the same as the packet counter so we will let the packethandler do it.\n\t\t\t// > Y is the codec byte (see Enum)\n\t\t\t// > N is a byte, specifying the GroupWhisperType\n\t\t\t// > M is a byte, specifying the GroupWhisperTarget\n\t\t\t// > U is a ulong in H2N order for the targeted channelId or groupId (0 if not applicable)\n\t\t\tSpan<byte> tmpBuffer = stackalloc byte[data.Length + 13];\n\t\t\ttmpBuffer[2] = (byte)codec;\n\t\t\ttmpBuffer[3] = (byte)type;\n\t\t\ttmpBuffer[4] = (byte)target;\n\t\t\tBinaryPrimitives.WriteUInt64BigEndian(tmpBuffer.Slice(5), targetId);\n\t\t\tdata.CopyTo(tmpBuffer.Slice(13));\n\n\t\t\tctx.PacketHandler.AddOutgoingPacket(tmpBuffer, PacketType.VoiceWhisper, PacketFlags.Newprotocol);\n\t\t}\n\n\t\tpublic async Task<R<ClientConnectionInfo, CommandError>> GetClientConnectionInfo(ClientId clientId)\n\t\t{\n\t\t\tvar result = await SendNotifyCommand(new TsCommand(\"getconnectioninfo\") {\n\t\t\t\t{ \"clid\", clientId }\n\t\t\t}, NotificationType.ClientConnectionInfo);\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result.Error;\n\t\t\treturn result.Value.Notifications\n\t\t\t\t.Cast<ClientConnectionInfo>()\n\t\t\t\t.Where(x => x.ClientId == clientId)\n\t\t\t\t.MapToSingle();\n\t\t}\n\n\t\tpublic async Task<R<ClientUpdated, CommandError>> GetClientVariables(ushort clientId)\n\t\t\t=> await SendNotifyCommand(new TsCommand(\"clientgetvariables\") {\n\t\t\t\t{ \"clid\", clientId }\n\t\t\t}, NotificationType.ClientUpdated).MapToSingle<ClientUpdated>();\n\n\t\tpublic Task<R<ServerUpdated, CommandError>> GetServerVariables()\n\t\t\t=> SendNotifyCommand(new TsCommand(\"servergetvariables\"),\n\t\t\t\tNotificationType.ServerUpdated).MapToSingle<ServerUpdated>();\n\n\t\tpublic CmdR SendPluginCommand(string name, string data, PluginTargetMode targetmode)\n\t\t\t=> SendVoid(new TsCommand(\"plugincmd\") {\n\t\t\t\t{ \"name\", name },\n\t\t\t\t{ \"data\", data },\n\t\t\t\t{ \"targetmode\", (int)targetmode },\n\t\t\t});\n\n\t\t// Splitted base commands\n\n\t\tpublic override async Task<R<IChannelCreateResponse, CommandError>> ChannelCreate(string name,\n\t\t\tstring? namePhonetic = null, string? topic = null, string? description = null, string? password = null,\n\t\t\tCodec? codec = null, int? codecQuality = null, int? codecLatencyFactor = null, bool? codecEncrypted = null,\n\t\t\tint? maxClients = null, int? maxFamilyClients = null, bool? maxClientsUnlimited = null,\n\t\t\tbool? maxFamilyClientsUnlimited = null, bool? maxFamilyClientsInherited = null, ChannelId? order = null,\n\t\t\tChannelId? parent = null, ChannelType? type = null, TimeSpan? deleteDelay = null, int? neededTalkPower = null)\n\t\t{\n\t\t\tvar result = await SendNotifyCommand(ChannelOp(\"channelcreate\", null, name, namePhonetic, topic, description,\n\t\t\t\t  password, codec, codecQuality, codecLatencyFactor, codecEncrypted,\n\t\t\t\t  maxClients, maxFamilyClients, maxClientsUnlimited, maxFamilyClientsUnlimited,\n\t\t\t\t  maxFamilyClientsInherited, order, parent, type, deleteDelay, neededTalkPower),\n\t\t\t\t  NotificationType.ChannelCreated);\n\t\t\treturn result.UnwrapNotification<ChannelCreated>()\n\t\t\t\t  .MapToSingle()\n\t\t\t\t  .WrapInterface<ChannelCreated, IChannelCreateResponse>();\n\t\t}\n\n\t\tpublic override async Task<R<ServerGroupAddResponse, CommandError>> ServerGroupAdd(string name, GroupType? type = null)\n\t\t{\n\t\t\tvar result = await SendNotifyCommand(new TsCommand(\"servergroupadd\") {\n\t\t\t\t{ \"name\", name },\n\t\t\t\t{ \"type\", (int?)type }\n\t\t\t}, NotificationType.ServerGroupList);\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result.Error;\n\t\t\treturn result.Value.Notifications\n\t\t\t\t.Cast<ServerGroupList>()\n\t\t\t\t.Where(x => x.Name == name)\n\t\t\t\t.Take(1)\n\t\t\t\t.Select(x => new ServerGroupAddResponse() { ServerGroupId = x.ServerGroupId })\n\t\t\t\t.MapToSingle();\n\t\t}\n\n\t\tpublic override async Task<R<FileUpload, CommandError>> FileTransferInitUpload(ChannelId channelId, string path,\n\t\t\tstring channelPassword, ushort clientTransferId, long fileSize, bool overwrite, bool resume)\n\t\t{\n\t\t\tvar result = await SendNotifyCommand(new TsCommand(\"ftinitupload\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"name\", path },\n\t\t\t\t{ \"cpw\", channelPassword },\n\t\t\t\t{ \"clientftfid\", clientTransferId },\n\t\t\t\t{ \"size\", fileSize },\n\t\t\t\t{ \"overwrite\", overwrite },\n\t\t\t\t{ \"resume\", resume }\n\t\t\t}, NotificationType.FileUpload, NotificationType.FileTransferStatus);\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result.Error;\n\t\t\tif (result.Value.NotifyType == NotificationType.FileUpload)\n\t\t\t\treturn result.MapToSingle<FileUpload>();\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar ftresult = result.MapToSingle<FileTransferStatus>();\n\t\t\t\tif (!ftresult)\n\t\t\t\t\treturn ftresult.Error;\n\t\t\t\treturn new CommandError() { Id = ftresult.Value.Status, Message = ftresult.Value.Message };\n\t\t\t}\n\t\t}\n\n\t\tpublic override async Task<R<FileDownload, CommandError>> FileTransferInitDownload(ChannelId channelId,\n\t\t\tstring path, string channelPassword, ushort clientTransferId, long seek)\n\t\t{\n\t\t\tvar result = await SendNotifyCommand(new TsCommand(\"ftinitdownload\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"name\", path },\n\t\t\t\t{ \"cpw\", channelPassword },\n\t\t\t\t{ \"clientftfid\", clientTransferId },\n\t\t\t\t{ \"seekpos\", seek } }, NotificationType.FileDownload, NotificationType.FileTransferStatus);\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result.Error;\n\t\t\tif (result.Value.NotifyType == NotificationType.FileDownload)\n\t\t\t\treturn result.MapToSingle<FileDownload>();\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar ftresult = result.MapToSingle<FileTransferStatus>();\n\t\t\t\tif (!ftresult)\n\t\t\t\t\treturn ftresult.Error;\n\t\t\t\treturn new CommandError() { Id = ftresult.Value.Status, Message = ftresult.Value.Message };\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\tprivate enum TsClientStatus\n\t\t{\n\t\t\tDisconnected,\n\t\t\tDisconnecting,\n\t\t\tConnected,\n\t\t\tConnecting,\n\t\t}\n\t}\n\n\tinternal class ConnectionContext\n\t{\n\t\tpublic Reason? ExitReason { get; set; }\n\t\tpublic TsCrypt TsCrypt { get; }\n\t\tpublic PacketHandler<S2C, C2S> PacketHandler { get; set; }\n\t\tpublic ConnectionDataFull ConnectionDataFull { get; set; }\n\n\t\tpublic TaskCompletionSource<E<CommandError>> ConnectEvent { get; }\n\t\tpublic TaskCompletionSource<object?> DisconnectEvent { get; }\n\n\t\tpublic ConnectionContext(ConnectionDataFull connectionDataFull)\n\t\t{\n\t\t\t// Note: TCS.SetResult can continue to run the code of the 'await TSC.Task'\n\t\t\t// somewhere else synchronously.\n\t\t\t// While the TsFullClient class is designed to be resistend to problems regarding\n\t\t\t// intermediate state changes with such call, we still add the runasync Task\n\t\t\t// option for a more consistent processing order and better predictable behaviour.\n\t\t\tConnectEvent = new TaskCompletionSource<E<CommandError>>(TaskCreationOptions.RunContinuationsAsynchronously);\n\t\t\tDisconnectEvent = new TaskCompletionSource<object?>(TaskCreationOptions.RunContinuationsAsynchronously);\n\t\t\tTsCrypt = new TsCrypt(connectionDataFull.Identity);\n\t\t\tPacketHandler = new PacketHandler<S2C, C2S>(TsCrypt, connectionDataFull.LogId);\n\t\t\tConnectionDataFull = connectionDataFull;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/TsFullClient.gen.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nusing System;\nusing TSLib.Helper;\nusing TSLib.Messages;\n\n#nullable enable\nnamespace TSLib.Full\n{\n\tpartial class TsFullClient\n\t{\n\t\t\n\t\tpublic event NotifyEventHandler<BanList>? OnBanList;\n\t\tpublic event EventHandler<BanList>? OnEachBanList;\n\t\tpublic override event NotifyEventHandler<ChannelChanged>? OnChannelChanged;\n\t\tpublic override event EventHandler<ChannelChanged>? OnEachChannelChanged;\n\t\tpublic event NotifyEventHandler<ChannelClientPermList>? OnChannelClientPermList;\n\t\tpublic event EventHandler<ChannelClientPermList>? OnEachChannelClientPermList;\n\t\tpublic override event NotifyEventHandler<ChannelCreated>? OnChannelCreated;\n\t\tpublic override event EventHandler<ChannelCreated>? OnEachChannelCreated;\n\t\tpublic override event NotifyEventHandler<ChannelDeleted>? OnChannelDeleted;\n\t\tpublic override event EventHandler<ChannelDeleted>? OnEachChannelDeleted;\n\t\tpublic event NotifyEventHandler<ChannelDescriptionChanged>? OnChannelDescriptionChanged;\n\t\tpublic event EventHandler<ChannelDescriptionChanged>? OnEachChannelDescriptionChanged;\n\t\tpublic override event NotifyEventHandler<ChannelEdited>? OnChannelEdited;\n\t\tpublic override event EventHandler<ChannelEdited>? OnEachChannelEdited;\n\t\tpublic event NotifyEventHandler<ChannelGroupClientList>? OnChannelGroupClientList;\n\t\tpublic event EventHandler<ChannelGroupClientList>? OnEachChannelGroupClientList;\n\t\tpublic event NotifyEventHandler<ChannelGroupList>? OnChannelGroupList;\n\t\tpublic event EventHandler<ChannelGroupList>? OnEachChannelGroupList;\n\t\tpublic event NotifyEventHandler<ChannelGroupPermList>? OnChannelGroupPermList;\n\t\tpublic event EventHandler<ChannelGroupPermList>? OnEachChannelGroupPermList;\n\t\tpublic event NotifyEventHandler<ChannelList>? OnChannelList;\n\t\tpublic event EventHandler<ChannelList>? OnEachChannelList;\n\t\tpublic event NotifyEventHandler<ChannelListFinished>? OnChannelListFinished;\n\t\tpublic event EventHandler<ChannelListFinished>? OnEachChannelListFinished;\n\t\tpublic override event NotifyEventHandler<ChannelMoved>? OnChannelMoved;\n\t\tpublic override event EventHandler<ChannelMoved>? OnEachChannelMoved;\n\t\tpublic override event NotifyEventHandler<ChannelPasswordChanged>? OnChannelPasswordChanged;\n\t\tpublic override event EventHandler<ChannelPasswordChanged>? OnEachChannelPasswordChanged;\n\t\tpublic event NotifyEventHandler<ChannelPermissionHints>? OnChannelPermissionHints;\n\t\tpublic event EventHandler<ChannelPermissionHints>? OnEachChannelPermissionHints;\n\t\tpublic event NotifyEventHandler<ChannelPermList>? OnChannelPermList;\n\t\tpublic event EventHandler<ChannelPermList>? OnEachChannelPermList;\n\t\tpublic event NotifyEventHandler<ChannelSubscribed>? OnChannelSubscribed;\n\t\tpublic event EventHandler<ChannelSubscribed>? OnEachChannelSubscribed;\n\t\tpublic event NotifyEventHandler<ChannelUnsubscribed>? OnChannelUnsubscribed;\n\t\tpublic event EventHandler<ChannelUnsubscribed>? OnEachChannelUnsubscribed;\n\t\tpublic event NotifyEventHandler<ClientChannelGroupChanged>? OnClientChannelGroupChanged;\n\t\tpublic event EventHandler<ClientChannelGroupChanged>? OnEachClientChannelGroupChanged;\n\t\tpublic event NotifyEventHandler<ClientChatClosed>? OnClientChatClosed;\n\t\tpublic event EventHandler<ClientChatClosed>? OnEachClientChatClosed;\n\t\tpublic event NotifyEventHandler<ClientChatComposing>? OnClientChatComposing;\n\t\tpublic event EventHandler<ClientChatComposing>? OnEachClientChatComposing;\n\t\tpublic event NotifyEventHandler<ClientConnectionInfo>? OnClientConnectionInfo;\n\t\tpublic event EventHandler<ClientConnectionInfo>? OnEachClientConnectionInfo;\n\t\tpublic event NotifyEventHandler<ClientConnectionInfoUpdateRequest>? OnClientConnectionInfoUpdateRequest;\n\t\tpublic event EventHandler<ClientConnectionInfoUpdateRequest>? OnEachClientConnectionInfoUpdateRequest;\n\t\tpublic event NotifyEventHandler<ClientDbFind>? OnClientDbFind;\n\t\tpublic event EventHandler<ClientDbFind>? OnEachClientDbFind;\n\t\tpublic event NotifyEventHandler<ClientDbIdFromUid>? OnClientDbIdFromUid;\n\t\tpublic event EventHandler<ClientDbIdFromUid>? OnEachClientDbIdFromUid;\n\t\tpublic event NotifyEventHandler<ClientDbList>? OnClientDbList;\n\t\tpublic event EventHandler<ClientDbList>? OnEachClientDbList;\n\t\tpublic override event NotifyEventHandler<ClientEnterView>? OnClientEnterView;\n\t\tpublic override event EventHandler<ClientEnterView>? OnEachClientEnterView;\n\t\tpublic event NotifyEventHandler<ClientIds>? OnClientIds;\n\t\tpublic event EventHandler<ClientIds>? OnEachClientIds;\n\t\tpublic override event NotifyEventHandler<ClientLeftView>? OnClientLeftView;\n\t\tpublic override event EventHandler<ClientLeftView>? OnEachClientLeftView;\n\t\tpublic override event NotifyEventHandler<ClientMoved>? OnClientMoved;\n\t\tpublic override event EventHandler<ClientMoved>? OnEachClientMoved;\n\t\tpublic event NotifyEventHandler<ClientNameFromDbId>? OnClientNameFromDbId;\n\t\tpublic event EventHandler<ClientNameFromDbId>? OnEachClientNameFromDbId;\n\t\tpublic event NotifyEventHandler<ClientNameFromUid>? OnClientNameFromUid;\n\t\tpublic event EventHandler<ClientNameFromUid>? OnEachClientNameFromUid;\n\t\tpublic event NotifyEventHandler<ClientNeededPermissions>? OnClientNeededPermissions;\n\t\tpublic event EventHandler<ClientNeededPermissions>? OnEachClientNeededPermissions;\n\t\tpublic event NotifyEventHandler<ClientPermissionHints>? OnClientPermissionHints;\n\t\tpublic event EventHandler<ClientPermissionHints>? OnEachClientPermissionHints;\n\t\tpublic event NotifyEventHandler<ClientPermList>? OnClientPermList;\n\t\tpublic event EventHandler<ClientPermList>? OnEachClientPermList;\n\t\tpublic event NotifyEventHandler<ClientPoke>? OnClientPoke;\n\t\tpublic event EventHandler<ClientPoke>? OnEachClientPoke;\n\t\tpublic event NotifyEventHandler<ClientServerGroupAdded>? OnClientServerGroupAdded;\n\t\tpublic event EventHandler<ClientServerGroupAdded>? OnEachClientServerGroupAdded;\n\t\tpublic event NotifyEventHandler<ClientServerGroupRemoved>? OnClientServerGroupRemoved;\n\t\tpublic event EventHandler<ClientServerGroupRemoved>? OnEachClientServerGroupRemoved;\n\t\tpublic event NotifyEventHandler<ClientSetServerQueryLogin>? OnClientSetServerQueryLogin;\n\t\tpublic event EventHandler<ClientSetServerQueryLogin>? OnEachClientSetServerQueryLogin;\n\t\tpublic event NotifyEventHandler<ClientUidFromClid>? OnClientUidFromClid;\n\t\tpublic event EventHandler<ClientUidFromClid>? OnEachClientUidFromClid;\n\t\tpublic event NotifyEventHandler<ClientUpdated>? OnClientUpdated;\n\t\tpublic event EventHandler<ClientUpdated>? OnEachClientUpdated;\n\t\tpublic event NotifyEventHandler<CommandError>? OnCommandError;\n\t\tpublic event EventHandler<CommandError>? OnEachCommandError;\n\t\tpublic event NotifyEventHandler<ComplainList>? OnComplainList;\n\t\tpublic event EventHandler<ComplainList>? OnEachComplainList;\n\t\tpublic event NotifyEventHandler<FileDownload>? OnFileDownload;\n\t\tpublic event EventHandler<FileDownload>? OnEachFileDownload;\n\t\tpublic event NotifyEventHandler<FileInfo>? OnFileInfo;\n\t\tpublic event EventHandler<FileInfo>? OnEachFileInfo;\n\t\tpublic event NotifyEventHandler<FileList>? OnFileList;\n\t\tpublic event EventHandler<FileList>? OnEachFileList;\n\t\tpublic event NotifyEventHandler<FileListFinished>? OnFileListFinished;\n\t\tpublic event EventHandler<FileListFinished>? OnEachFileListFinished;\n\t\tpublic event NotifyEventHandler<FileTransfer>? OnFileTransfer;\n\t\tpublic event EventHandler<FileTransfer>? OnEachFileTransfer;\n\t\tpublic event NotifyEventHandler<FileTransferStatus>? OnFileTransferStatus;\n\t\tpublic event EventHandler<FileTransferStatus>? OnEachFileTransferStatus;\n\t\tpublic event NotifyEventHandler<FileUpload>? OnFileUpload;\n\t\tpublic event EventHandler<FileUpload>? OnEachFileUpload;\n\t\tpublic event NotifyEventHandler<InitIvExpand>? OnInitIvExpand;\n\t\tpublic event EventHandler<InitIvExpand>? OnEachInitIvExpand;\n\t\tpublic event NotifyEventHandler<InitIvExpand2>? OnInitIvExpand2;\n\t\tpublic event EventHandler<InitIvExpand2>? OnEachInitIvExpand2;\n\t\tpublic event NotifyEventHandler<InitServer>? OnInitServer;\n\t\tpublic event EventHandler<InitServer>? OnEachInitServer;\n\t\tpublic event NotifyEventHandler<OfflineMessage>? OnOfflineMessage;\n\t\tpublic event EventHandler<OfflineMessage>? OnEachOfflineMessage;\n\t\tpublic event NotifyEventHandler<OfflineMessageList>? OnOfflineMessageList;\n\t\tpublic event EventHandler<OfflineMessageList>? OnEachOfflineMessageList;\n\t\tpublic event NotifyEventHandler<PermFind>? OnPermFind;\n\t\tpublic event EventHandler<PermFind>? OnEachPermFind;\n\t\tpublic event NotifyEventHandler<PermList>? OnPermList;\n\t\tpublic event EventHandler<PermList>? OnEachPermList;\n\t\tpublic event NotifyEventHandler<PermOverview>? OnPermOverview;\n\t\tpublic event EventHandler<PermOverview>? OnEachPermOverview;\n\t\tpublic event NotifyEventHandler<PluginCommand>? OnPluginCommand;\n\t\tpublic event EventHandler<PluginCommand>? OnEachPluginCommand;\n\t\tpublic event NotifyEventHandler<ServerConnectionInfo>? OnServerConnectionInfo;\n\t\tpublic event EventHandler<ServerConnectionInfo>? OnEachServerConnectionInfo;\n\t\tpublic override event NotifyEventHandler<ServerEdited>? OnServerEdited;\n\t\tpublic override event EventHandler<ServerEdited>? OnEachServerEdited;\n\t\tpublic event NotifyEventHandler<ServerGroupClientList>? OnServerGroupClientList;\n\t\tpublic event EventHandler<ServerGroupClientList>? OnEachServerGroupClientList;\n\t\tpublic event NotifyEventHandler<ServerGroupList>? OnServerGroupList;\n\t\tpublic event EventHandler<ServerGroupList>? OnEachServerGroupList;\n\t\tpublic event NotifyEventHandler<ServerGroupPermList>? OnServerGroupPermList;\n\t\tpublic event EventHandler<ServerGroupPermList>? OnEachServerGroupPermList;\n\t\tpublic event NotifyEventHandler<ServerGroupsByClientId>? OnServerGroupsByClientId;\n\t\tpublic event EventHandler<ServerGroupsByClientId>? OnEachServerGroupsByClientId;\n\t\tpublic event NotifyEventHandler<ServerLog>? OnServerLog;\n\t\tpublic event EventHandler<ServerLog>? OnEachServerLog;\n\t\tpublic event NotifyEventHandler<ServerTempPasswordList>? OnServerTempPasswordList;\n\t\tpublic event EventHandler<ServerTempPasswordList>? OnEachServerTempPasswordList;\n\t\tpublic event NotifyEventHandler<ServerUpdated>? OnServerUpdated;\n\t\tpublic event EventHandler<ServerUpdated>? OnEachServerUpdated;\n\t\tpublic override event NotifyEventHandler<TextMessage>? OnTextMessage;\n\t\tpublic override event EventHandler<TextMessage>? OnEachTextMessage;\n\t\tpublic event NotifyEventHandler<TokenAdd>? OnTokenAdd;\n\t\tpublic event EventHandler<TokenAdd>? OnEachTokenAdd;\n\t\tpublic event NotifyEventHandler<TokenList>? OnTokenList;\n\t\tpublic event EventHandler<TokenList>? OnEachTokenList;\n\t\tpublic override event NotifyEventHandler<TokenUsed>? OnTokenUsed;\n\t\tpublic override event EventHandler<TokenUsed>? OnEachTokenUsed;\n\n\n\t\tprivate void InvokeEvent(LazyNotification lazyNotification)\n\t\t{\n\t\t\tvar ntf = lazyNotification.Notifications;\n\t\t\tswitch (lazyNotification.NotifyType)\n\t\t\t{\n\t\t\t\n\t\t\tcase NotificationType.BanList: {\n\t\t\t\tvar ntfc = (BanList[])ntf;\n\t\t\t\tProcessBanList(ntfc);\n\t\t\t\tOnBanList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachBanList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachBanList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelChanged: {\n\t\t\t\tvar ntfc = (ChannelChanged[])ntf;\n\t\t\t\tProcessChannelChanged(ntfc);\n\t\t\t\tOnChannelChanged?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelChanged;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelChanged(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelClientPermList: {\n\t\t\t\tvar ntfc = (ChannelClientPermList[])ntf;\n\t\t\t\tProcessChannelClientPermList(ntfc);\n\t\t\t\tOnChannelClientPermList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelClientPermList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelClientPermList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelCreated: {\n\t\t\t\tvar ntfc = (ChannelCreated[])ntf;\n\t\t\t\tProcessChannelCreated(ntfc);\n\t\t\t\tOnChannelCreated?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelCreated;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateChannelCreated(that);\n\t\t\t\t\tProcessEachChannelCreated(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelDeleted: {\n\t\t\t\tvar ntfc = (ChannelDeleted[])ntf;\n\t\t\t\tProcessChannelDeleted(ntfc);\n\t\t\t\tOnChannelDeleted?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelDeleted;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateChannelDeleted(that);\n\t\t\t\t\tProcessEachChannelDeleted(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelDescriptionChanged: {\n\t\t\t\tvar ntfc = (ChannelDescriptionChanged[])ntf;\n\t\t\t\tProcessChannelDescriptionChanged(ntfc);\n\t\t\t\tOnChannelDescriptionChanged?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelDescriptionChanged;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelDescriptionChanged(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelEdited: {\n\t\t\t\tvar ntfc = (ChannelEdited[])ntf;\n\t\t\t\tProcessChannelEdited(ntfc);\n\t\t\t\tOnChannelEdited?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelEdited;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateChannelEdited(that);\n\t\t\t\t\tProcessEachChannelEdited(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelGroupClientList: {\n\t\t\t\tvar ntfc = (ChannelGroupClientList[])ntf;\n\t\t\t\tProcessChannelGroupClientList(ntfc);\n\t\t\t\tOnChannelGroupClientList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelGroupClientList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelGroupClientList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelGroupList: {\n\t\t\t\tvar ntfc = (ChannelGroupList[])ntf;\n\t\t\t\tProcessChannelGroupList(ntfc);\n\t\t\t\tOnChannelGroupList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelGroupList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelGroupList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelGroupPermList: {\n\t\t\t\tvar ntfc = (ChannelGroupPermList[])ntf;\n\t\t\t\tProcessChannelGroupPermList(ntfc);\n\t\t\t\tOnChannelGroupPermList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelGroupPermList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelGroupPermList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelList: {\n\t\t\t\tvar ntfc = (ChannelList[])ntf;\n\t\t\t\tProcessChannelList(ntfc);\n\t\t\t\tOnChannelList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateChannelList(that);\n\t\t\t\t\tProcessEachChannelList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelListFinished: {\n\t\t\t\tvar ntfc = (ChannelListFinished[])ntf;\n\t\t\t\tProcessChannelListFinished(ntfc);\n\t\t\t\tOnChannelListFinished?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelListFinished;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelListFinished(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelMoved: {\n\t\t\t\tvar ntfc = (ChannelMoved[])ntf;\n\t\t\t\tProcessChannelMoved(ntfc);\n\t\t\t\tOnChannelMoved?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelMoved;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateChannelMoved(that);\n\t\t\t\t\tProcessEachChannelMoved(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelPasswordChanged: {\n\t\t\t\tvar ntfc = (ChannelPasswordChanged[])ntf;\n\t\t\t\tProcessChannelPasswordChanged(ntfc);\n\t\t\t\tOnChannelPasswordChanged?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelPasswordChanged;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelPasswordChanged(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelPermissionHints: {\n\t\t\t\tvar ntfc = (ChannelPermissionHints[])ntf;\n\t\t\t\tProcessChannelPermissionHints(ntfc);\n\t\t\t\tOnChannelPermissionHints?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelPermissionHints;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateChannelPermissionHints(that);\n\t\t\t\t\tProcessEachChannelPermissionHints(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelPermList: {\n\t\t\t\tvar ntfc = (ChannelPermList[])ntf;\n\t\t\t\tProcessChannelPermList(ntfc);\n\t\t\t\tOnChannelPermList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelPermList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachChannelPermList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelSubscribed: {\n\t\t\t\tvar ntfc = (ChannelSubscribed[])ntf;\n\t\t\t\tProcessChannelSubscribed(ntfc);\n\t\t\t\tOnChannelSubscribed?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelSubscribed;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateChannelSubscribed(that);\n\t\t\t\t\tProcessEachChannelSubscribed(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelUnsubscribed: {\n\t\t\t\tvar ntfc = (ChannelUnsubscribed[])ntf;\n\t\t\t\tProcessChannelUnsubscribed(ntfc);\n\t\t\t\tOnChannelUnsubscribed?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelUnsubscribed;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateChannelUnsubscribed(that);\n\t\t\t\t\tProcessEachChannelUnsubscribed(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientChannelGroupChanged: {\n\t\t\t\tvar ntfc = (ClientChannelGroupChanged[])ntf;\n\t\t\t\tProcessClientChannelGroupChanged(ntfc);\n\t\t\t\tOnClientChannelGroupChanged?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientChannelGroupChanged;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientChannelGroupChanged(that);\n\t\t\t\t\tProcessEachClientChannelGroupChanged(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientChatClosed: {\n\t\t\t\tvar ntfc = (ClientChatClosed[])ntf;\n\t\t\t\tProcessClientChatClosed(ntfc);\n\t\t\t\tOnClientChatClosed?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientChatClosed;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientChatClosed(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientChatComposing: {\n\t\t\t\tvar ntfc = (ClientChatComposing[])ntf;\n\t\t\t\tProcessClientChatComposing(ntfc);\n\t\t\t\tOnClientChatComposing?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientChatComposing;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientChatComposing(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientConnectionInfo: {\n\t\t\t\tvar ntfc = (ClientConnectionInfo[])ntf;\n\t\t\t\tProcessClientConnectionInfo(ntfc);\n\t\t\t\tOnClientConnectionInfo?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientConnectionInfo;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientConnectionInfo(that);\n\t\t\t\t\tProcessEachClientConnectionInfo(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientConnectionInfoUpdateRequest: {\n\t\t\t\tvar ntfc = (ClientConnectionInfoUpdateRequest[])ntf;\n\t\t\t\tProcessClientConnectionInfoUpdateRequest(ntfc);\n\t\t\t\tOnClientConnectionInfoUpdateRequest?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientConnectionInfoUpdateRequest;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientConnectionInfoUpdateRequest(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientDbFind: {\n\t\t\t\tvar ntfc = (ClientDbFind[])ntf;\n\t\t\t\tProcessClientDbFind(ntfc);\n\t\t\t\tOnClientDbFind?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientDbFind;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientDbFind(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientDbIdFromUid: {\n\t\t\t\tvar ntfc = (ClientDbIdFromUid[])ntf;\n\t\t\t\tProcessClientDbIdFromUid(ntfc);\n\t\t\t\tOnClientDbIdFromUid?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientDbIdFromUid;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientDbIdFromUid(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientDbList: {\n\t\t\t\tvar ntfc = (ClientDbList[])ntf;\n\t\t\t\tProcessClientDbList(ntfc);\n\t\t\t\tOnClientDbList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientDbList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientDbList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientEnterView: {\n\t\t\t\tvar ntfc = (ClientEnterView[])ntf;\n\t\t\t\tProcessClientEnterView(ntfc);\n\t\t\t\tOnClientEnterView?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientEnterView;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientEnterView(that);\n\t\t\t\t\tProcessEachClientEnterView(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientIds: {\n\t\t\t\tvar ntfc = (ClientIds[])ntf;\n\t\t\t\tProcessClientIds(ntfc);\n\t\t\t\tOnClientIds?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientIds;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientIds(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientLeftView: {\n\t\t\t\tvar ntfc = (ClientLeftView[])ntf;\n\t\t\t\tProcessClientLeftView(ntfc);\n\t\t\t\tOnClientLeftView?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientLeftView;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientLeftView(that);\n\t\t\t\t\tProcessEachClientLeftView(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientMoved: {\n\t\t\t\tvar ntfc = (ClientMoved[])ntf;\n\t\t\t\tProcessClientMoved(ntfc);\n\t\t\t\tOnClientMoved?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientMoved;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientMoved(that);\n\t\t\t\t\tProcessEachClientMoved(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientNameFromDbId: {\n\t\t\t\tvar ntfc = (ClientNameFromDbId[])ntf;\n\t\t\t\tProcessClientNameFromDbId(ntfc);\n\t\t\t\tOnClientNameFromDbId?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientNameFromDbId;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientNameFromDbId(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientNameFromUid: {\n\t\t\t\tvar ntfc = (ClientNameFromUid[])ntf;\n\t\t\t\tProcessClientNameFromUid(ntfc);\n\t\t\t\tOnClientNameFromUid?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientNameFromUid;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientNameFromUid(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientNeededPermissions: {\n\t\t\t\tvar ntfc = (ClientNeededPermissions[])ntf;\n\t\t\t\tProcessClientNeededPermissions(ntfc);\n\t\t\t\tOnClientNeededPermissions?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientNeededPermissions;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientNeededPermissions(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientPermissionHints: {\n\t\t\t\tvar ntfc = (ClientPermissionHints[])ntf;\n\t\t\t\tProcessClientPermissionHints(ntfc);\n\t\t\t\tOnClientPermissionHints?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientPermissionHints;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientPermissionHints(that);\n\t\t\t\t\tProcessEachClientPermissionHints(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientPermList: {\n\t\t\t\tvar ntfc = (ClientPermList[])ntf;\n\t\t\t\tProcessClientPermList(ntfc);\n\t\t\t\tOnClientPermList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientPermList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientPermList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientPoke: {\n\t\t\t\tvar ntfc = (ClientPoke[])ntf;\n\t\t\t\tProcessClientPoke(ntfc);\n\t\t\t\tOnClientPoke?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientPoke;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientPoke(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientServerGroupAdded: {\n\t\t\t\tvar ntfc = (ClientServerGroupAdded[])ntf;\n\t\t\t\tProcessClientServerGroupAdded(ntfc);\n\t\t\t\tOnClientServerGroupAdded?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientServerGroupAdded;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientServerGroupAdded(that);\n\t\t\t\t\tProcessEachClientServerGroupAdded(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientServerGroupRemoved: {\n\t\t\t\tvar ntfc = (ClientServerGroupRemoved[])ntf;\n\t\t\t\tProcessClientServerGroupRemoved(ntfc);\n\t\t\t\tOnClientServerGroupRemoved?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientServerGroupRemoved;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientServerGroupRemoved(that);\n\t\t\t\t\tProcessEachClientServerGroupRemoved(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientSetServerQueryLogin: {\n\t\t\t\tvar ntfc = (ClientSetServerQueryLogin[])ntf;\n\t\t\t\tProcessClientSetServerQueryLogin(ntfc);\n\t\t\t\tOnClientSetServerQueryLogin?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientSetServerQueryLogin;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientSetServerQueryLogin(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientUidFromClid: {\n\t\t\t\tvar ntfc = (ClientUidFromClid[])ntf;\n\t\t\t\tProcessClientUidFromClid(ntfc);\n\t\t\t\tOnClientUidFromClid?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientUidFromClid;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachClientUidFromClid(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientUpdated: {\n\t\t\t\tvar ntfc = (ClientUpdated[])ntf;\n\t\t\t\tProcessClientUpdated(ntfc);\n\t\t\t\tOnClientUpdated?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientUpdated;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateClientUpdated(that);\n\t\t\t\t\tProcessEachClientUpdated(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.CommandError: {\n\t\t\t\tvar ntfc = (CommandError[])ntf;\n\t\t\t\tProcessCommandError(ntfc);\n\t\t\t\tOnCommandError?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachCommandError;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachCommandError(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ComplainList: {\n\t\t\t\tvar ntfc = (ComplainList[])ntf;\n\t\t\t\tProcessComplainList(ntfc);\n\t\t\t\tOnComplainList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachComplainList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachComplainList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.FileDownload: {\n\t\t\t\tvar ntfc = (FileDownload[])ntf;\n\t\t\t\tProcessFileDownload(ntfc);\n\t\t\t\tOnFileDownload?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachFileDownload;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachFileDownload(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.FileInfo: {\n\t\t\t\tvar ntfc = (FileInfo[])ntf;\n\t\t\t\tProcessFileInfo(ntfc);\n\t\t\t\tOnFileInfo?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachFileInfo;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachFileInfo(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.FileList: {\n\t\t\t\tvar ntfc = (FileList[])ntf;\n\t\t\t\tProcessFileList(ntfc);\n\t\t\t\tOnFileList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachFileList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachFileList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.FileListFinished: {\n\t\t\t\tvar ntfc = (FileListFinished[])ntf;\n\t\t\t\tProcessFileListFinished(ntfc);\n\t\t\t\tOnFileListFinished?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachFileListFinished;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachFileListFinished(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.FileTransfer: {\n\t\t\t\tvar ntfc = (FileTransfer[])ntf;\n\t\t\t\tProcessFileTransfer(ntfc);\n\t\t\t\tOnFileTransfer?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachFileTransfer;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachFileTransfer(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.FileTransferStatus: {\n\t\t\t\tvar ntfc = (FileTransferStatus[])ntf;\n\t\t\t\tProcessFileTransferStatus(ntfc);\n\t\t\t\tOnFileTransferStatus?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachFileTransferStatus;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachFileTransferStatus(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.FileUpload: {\n\t\t\t\tvar ntfc = (FileUpload[])ntf;\n\t\t\t\tProcessFileUpload(ntfc);\n\t\t\t\tOnFileUpload?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachFileUpload;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachFileUpload(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.InitIvExpand: {\n\t\t\t\tvar ntfc = (InitIvExpand[])ntf;\n\t\t\t\tProcessInitIvExpand(ntfc);\n\t\t\t\tOnInitIvExpand?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachInitIvExpand;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachInitIvExpand(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.InitIvExpand2: {\n\t\t\t\tvar ntfc = (InitIvExpand2[])ntf;\n\t\t\t\tProcessInitIvExpand2(ntfc);\n\t\t\t\tOnInitIvExpand2?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachInitIvExpand2;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachInitIvExpand2(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.InitServer: {\n\t\t\t\tvar ntfc = (InitServer[])ntf;\n\t\t\t\tProcessInitServer(ntfc);\n\t\t\t\tOnInitServer?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachInitServer;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateInitServer(that);\n\t\t\t\t\tProcessEachInitServer(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.OfflineMessage: {\n\t\t\t\tvar ntfc = (OfflineMessage[])ntf;\n\t\t\t\tProcessOfflineMessage(ntfc);\n\t\t\t\tOnOfflineMessage?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachOfflineMessage;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachOfflineMessage(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.OfflineMessageList: {\n\t\t\t\tvar ntfc = (OfflineMessageList[])ntf;\n\t\t\t\tProcessOfflineMessageList(ntfc);\n\t\t\t\tOnOfflineMessageList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachOfflineMessageList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachOfflineMessageList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.PermFind: {\n\t\t\t\tvar ntfc = (PermFind[])ntf;\n\t\t\t\tProcessPermFind(ntfc);\n\t\t\t\tOnPermFind?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachPermFind;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachPermFind(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.PermList: {\n\t\t\t\tvar ntfc = (PermList[])ntf;\n\t\t\t\tProcessPermList(ntfc);\n\t\t\t\tOnPermList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachPermList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachPermList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.PermOverview: {\n\t\t\t\tvar ntfc = (PermOverview[])ntf;\n\t\t\t\tProcessPermOverview(ntfc);\n\t\t\t\tOnPermOverview?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachPermOverview;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachPermOverview(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.PluginCommand: {\n\t\t\t\tvar ntfc = (PluginCommand[])ntf;\n\t\t\t\tProcessPluginCommand(ntfc);\n\t\t\t\tOnPluginCommand?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachPluginCommand;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachPluginCommand(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerConnectionInfo: {\n\t\t\t\tvar ntfc = (ServerConnectionInfo[])ntf;\n\t\t\t\tProcessServerConnectionInfo(ntfc);\n\t\t\t\tOnServerConnectionInfo?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerConnectionInfo;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachServerConnectionInfo(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerEdited: {\n\t\t\t\tvar ntfc = (ServerEdited[])ntf;\n\t\t\t\tProcessServerEdited(ntfc);\n\t\t\t\tOnServerEdited?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerEdited;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateServerEdited(that);\n\t\t\t\t\tProcessEachServerEdited(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerGroupClientList: {\n\t\t\t\tvar ntfc = (ServerGroupClientList[])ntf;\n\t\t\t\tProcessServerGroupClientList(ntfc);\n\t\t\t\tOnServerGroupClientList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerGroupClientList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachServerGroupClientList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerGroupList: {\n\t\t\t\tvar ntfc = (ServerGroupList[])ntf;\n\t\t\t\tProcessServerGroupList(ntfc);\n\t\t\t\tOnServerGroupList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerGroupList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tbook?.UpdateServerGroupList(that);\n\t\t\t\t\tProcessEachServerGroupList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerGroupPermList: {\n\t\t\t\tvar ntfc = (ServerGroupPermList[])ntf;\n\t\t\t\tProcessServerGroupPermList(ntfc);\n\t\t\t\tOnServerGroupPermList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerGroupPermList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachServerGroupPermList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerGroupsByClientId: {\n\t\t\t\tvar ntfc = (ServerGroupsByClientId[])ntf;\n\t\t\t\tProcessServerGroupsByClientId(ntfc);\n\t\t\t\tOnServerGroupsByClientId?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerGroupsByClientId;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachServerGroupsByClientId(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerLog: {\n\t\t\t\tvar ntfc = (ServerLog[])ntf;\n\t\t\t\tProcessServerLog(ntfc);\n\t\t\t\tOnServerLog?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerLog;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachServerLog(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerTempPasswordList: {\n\t\t\t\tvar ntfc = (ServerTempPasswordList[])ntf;\n\t\t\t\tProcessServerTempPasswordList(ntfc);\n\t\t\t\tOnServerTempPasswordList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerTempPasswordList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachServerTempPasswordList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerUpdated: {\n\t\t\t\tvar ntfc = (ServerUpdated[])ntf;\n\t\t\t\tProcessServerUpdated(ntfc);\n\t\t\t\tOnServerUpdated?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerUpdated;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachServerUpdated(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.TextMessage: {\n\t\t\t\tvar ntfc = (TextMessage[])ntf;\n\t\t\t\tProcessTextMessage(ntfc);\n\t\t\t\tOnTextMessage?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachTextMessage;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachTextMessage(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.TokenAdd: {\n\t\t\t\tvar ntfc = (TokenAdd[])ntf;\n\t\t\t\tProcessTokenAdd(ntfc);\n\t\t\t\tOnTokenAdd?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachTokenAdd;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachTokenAdd(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.TokenList: {\n\t\t\t\tvar ntfc = (TokenList[])ntf;\n\t\t\t\tProcessTokenList(ntfc);\n\t\t\t\tOnTokenList?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachTokenList;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachTokenList(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.TokenUsed: {\n\t\t\t\tvar ntfc = (TokenUsed[])ntf;\n\t\t\t\tProcessTokenUsed(ntfc);\n\t\t\t\tOnTokenUsed?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachTokenUsed;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tProcessEachTokenUsed(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.Unknown:\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(lazyNotification.NotifyType);\n\t\t\t}\n\t\t}\n\n\t\tpartial void ProcessBanList(BanList[] notifies);\n\t\tpartial void ProcessEachBanList(BanList notifies);\n\t\tpartial void ProcessChannelChanged(ChannelChanged[] notifies);\n\t\tpartial void ProcessEachChannelChanged(ChannelChanged notifies);\n\t\tpartial void ProcessChannelClientPermList(ChannelClientPermList[] notifies);\n\t\tpartial void ProcessEachChannelClientPermList(ChannelClientPermList notifies);\n\t\tpartial void ProcessChannelCreated(ChannelCreated[] notifies);\n\t\tpartial void ProcessEachChannelCreated(ChannelCreated notifies);\n\t\tpartial void ProcessChannelDeleted(ChannelDeleted[] notifies);\n\t\tpartial void ProcessEachChannelDeleted(ChannelDeleted notifies);\n\t\tpartial void ProcessChannelDescriptionChanged(ChannelDescriptionChanged[] notifies);\n\t\tpartial void ProcessEachChannelDescriptionChanged(ChannelDescriptionChanged notifies);\n\t\tpartial void ProcessChannelEdited(ChannelEdited[] notifies);\n\t\tpartial void ProcessEachChannelEdited(ChannelEdited notifies);\n\t\tpartial void ProcessChannelGroupClientList(ChannelGroupClientList[] notifies);\n\t\tpartial void ProcessEachChannelGroupClientList(ChannelGroupClientList notifies);\n\t\tpartial void ProcessChannelGroupList(ChannelGroupList[] notifies);\n\t\tpartial void ProcessEachChannelGroupList(ChannelGroupList notifies);\n\t\tpartial void ProcessChannelGroupPermList(ChannelGroupPermList[] notifies);\n\t\tpartial void ProcessEachChannelGroupPermList(ChannelGroupPermList notifies);\n\t\tpartial void ProcessChannelList(ChannelList[] notifies);\n\t\tpartial void ProcessEachChannelList(ChannelList notifies);\n\t\tpartial void ProcessChannelListFinished(ChannelListFinished[] notifies);\n\t\tpartial void ProcessEachChannelListFinished(ChannelListFinished notifies);\n\t\tpartial void ProcessChannelMoved(ChannelMoved[] notifies);\n\t\tpartial void ProcessEachChannelMoved(ChannelMoved notifies);\n\t\tpartial void ProcessChannelPasswordChanged(ChannelPasswordChanged[] notifies);\n\t\tpartial void ProcessEachChannelPasswordChanged(ChannelPasswordChanged notifies);\n\t\tpartial void ProcessChannelPermissionHints(ChannelPermissionHints[] notifies);\n\t\tpartial void ProcessEachChannelPermissionHints(ChannelPermissionHints notifies);\n\t\tpartial void ProcessChannelPermList(ChannelPermList[] notifies);\n\t\tpartial void ProcessEachChannelPermList(ChannelPermList notifies);\n\t\tpartial void ProcessChannelSubscribed(ChannelSubscribed[] notifies);\n\t\tpartial void ProcessEachChannelSubscribed(ChannelSubscribed notifies);\n\t\tpartial void ProcessChannelUnsubscribed(ChannelUnsubscribed[] notifies);\n\t\tpartial void ProcessEachChannelUnsubscribed(ChannelUnsubscribed notifies);\n\t\tpartial void ProcessClientChannelGroupChanged(ClientChannelGroupChanged[] notifies);\n\t\tpartial void ProcessEachClientChannelGroupChanged(ClientChannelGroupChanged notifies);\n\t\tpartial void ProcessClientChatClosed(ClientChatClosed[] notifies);\n\t\tpartial void ProcessEachClientChatClosed(ClientChatClosed notifies);\n\t\tpartial void ProcessClientChatComposing(ClientChatComposing[] notifies);\n\t\tpartial void ProcessEachClientChatComposing(ClientChatComposing notifies);\n\t\tpartial void ProcessClientConnectionInfo(ClientConnectionInfo[] notifies);\n\t\tpartial void ProcessEachClientConnectionInfo(ClientConnectionInfo notifies);\n\t\tpartial void ProcessClientConnectionInfoUpdateRequest(ClientConnectionInfoUpdateRequest[] notifies);\n\t\tpartial void ProcessEachClientConnectionInfoUpdateRequest(ClientConnectionInfoUpdateRequest notifies);\n\t\tpartial void ProcessClientDbFind(ClientDbFind[] notifies);\n\t\tpartial void ProcessEachClientDbFind(ClientDbFind notifies);\n\t\tpartial void ProcessClientDbIdFromUid(ClientDbIdFromUid[] notifies);\n\t\tpartial void ProcessEachClientDbIdFromUid(ClientDbIdFromUid notifies);\n\t\tpartial void ProcessClientDbList(ClientDbList[] notifies);\n\t\tpartial void ProcessEachClientDbList(ClientDbList notifies);\n\t\tpartial void ProcessClientEnterView(ClientEnterView[] notifies);\n\t\tpartial void ProcessEachClientEnterView(ClientEnterView notifies);\n\t\tpartial void ProcessClientIds(ClientIds[] notifies);\n\t\tpartial void ProcessEachClientIds(ClientIds notifies);\n\t\tpartial void ProcessClientLeftView(ClientLeftView[] notifies);\n\t\tpartial void ProcessEachClientLeftView(ClientLeftView notifies);\n\t\tpartial void ProcessClientMoved(ClientMoved[] notifies);\n\t\tpartial void ProcessEachClientMoved(ClientMoved notifies);\n\t\tpartial void ProcessClientNameFromDbId(ClientNameFromDbId[] notifies);\n\t\tpartial void ProcessEachClientNameFromDbId(ClientNameFromDbId notifies);\n\t\tpartial void ProcessClientNameFromUid(ClientNameFromUid[] notifies);\n\t\tpartial void ProcessEachClientNameFromUid(ClientNameFromUid notifies);\n\t\tpartial void ProcessClientNeededPermissions(ClientNeededPermissions[] notifies);\n\t\tpartial void ProcessEachClientNeededPermissions(ClientNeededPermissions notifies);\n\t\tpartial void ProcessClientPermissionHints(ClientPermissionHints[] notifies);\n\t\tpartial void ProcessEachClientPermissionHints(ClientPermissionHints notifies);\n\t\tpartial void ProcessClientPermList(ClientPermList[] notifies);\n\t\tpartial void ProcessEachClientPermList(ClientPermList notifies);\n\t\tpartial void ProcessClientPoke(ClientPoke[] notifies);\n\t\tpartial void ProcessEachClientPoke(ClientPoke notifies);\n\t\tpartial void ProcessClientServerGroupAdded(ClientServerGroupAdded[] notifies);\n\t\tpartial void ProcessEachClientServerGroupAdded(ClientServerGroupAdded notifies);\n\t\tpartial void ProcessClientServerGroupRemoved(ClientServerGroupRemoved[] notifies);\n\t\tpartial void ProcessEachClientServerGroupRemoved(ClientServerGroupRemoved notifies);\n\t\tpartial void ProcessClientSetServerQueryLogin(ClientSetServerQueryLogin[] notifies);\n\t\tpartial void ProcessEachClientSetServerQueryLogin(ClientSetServerQueryLogin notifies);\n\t\tpartial void ProcessClientUidFromClid(ClientUidFromClid[] notifies);\n\t\tpartial void ProcessEachClientUidFromClid(ClientUidFromClid notifies);\n\t\tpartial void ProcessClientUpdated(ClientUpdated[] notifies);\n\t\tpartial void ProcessEachClientUpdated(ClientUpdated notifies);\n\t\tpartial void ProcessCommandError(CommandError[] notifies);\n\t\tpartial void ProcessEachCommandError(CommandError notifies);\n\t\tpartial void ProcessComplainList(ComplainList[] notifies);\n\t\tpartial void ProcessEachComplainList(ComplainList notifies);\n\t\tpartial void ProcessFileDownload(FileDownload[] notifies);\n\t\tpartial void ProcessEachFileDownload(FileDownload notifies);\n\t\tpartial void ProcessFileInfo(FileInfo[] notifies);\n\t\tpartial void ProcessEachFileInfo(FileInfo notifies);\n\t\tpartial void ProcessFileList(FileList[] notifies);\n\t\tpartial void ProcessEachFileList(FileList notifies);\n\t\tpartial void ProcessFileListFinished(FileListFinished[] notifies);\n\t\tpartial void ProcessEachFileListFinished(FileListFinished notifies);\n\t\tpartial void ProcessFileTransfer(FileTransfer[] notifies);\n\t\tpartial void ProcessEachFileTransfer(FileTransfer notifies);\n\t\tpartial void ProcessFileTransferStatus(FileTransferStatus[] notifies);\n\t\tpartial void ProcessEachFileTransferStatus(FileTransferStatus notifies);\n\t\tpartial void ProcessFileUpload(FileUpload[] notifies);\n\t\tpartial void ProcessEachFileUpload(FileUpload notifies);\n\t\tpartial void ProcessInitIvExpand(InitIvExpand[] notifies);\n\t\tpartial void ProcessEachInitIvExpand(InitIvExpand notifies);\n\t\tpartial void ProcessInitIvExpand2(InitIvExpand2[] notifies);\n\t\tpartial void ProcessEachInitIvExpand2(InitIvExpand2 notifies);\n\t\tpartial void ProcessInitServer(InitServer[] notifies);\n\t\tpartial void ProcessEachInitServer(InitServer notifies);\n\t\tpartial void ProcessOfflineMessage(OfflineMessage[] notifies);\n\t\tpartial void ProcessEachOfflineMessage(OfflineMessage notifies);\n\t\tpartial void ProcessOfflineMessageList(OfflineMessageList[] notifies);\n\t\tpartial void ProcessEachOfflineMessageList(OfflineMessageList notifies);\n\t\tpartial void ProcessPermFind(PermFind[] notifies);\n\t\tpartial void ProcessEachPermFind(PermFind notifies);\n\t\tpartial void ProcessPermList(PermList[] notifies);\n\t\tpartial void ProcessEachPermList(PermList notifies);\n\t\tpartial void ProcessPermOverview(PermOverview[] notifies);\n\t\tpartial void ProcessEachPermOverview(PermOverview notifies);\n\t\tpartial void ProcessPluginCommand(PluginCommand[] notifies);\n\t\tpartial void ProcessEachPluginCommand(PluginCommand notifies);\n\t\tpartial void ProcessServerConnectionInfo(ServerConnectionInfo[] notifies);\n\t\tpartial void ProcessEachServerConnectionInfo(ServerConnectionInfo notifies);\n\t\tpartial void ProcessServerEdited(ServerEdited[] notifies);\n\t\tpartial void ProcessEachServerEdited(ServerEdited notifies);\n\t\tpartial void ProcessServerGroupClientList(ServerGroupClientList[] notifies);\n\t\tpartial void ProcessEachServerGroupClientList(ServerGroupClientList notifies);\n\t\tpartial void ProcessServerGroupList(ServerGroupList[] notifies);\n\t\tpartial void ProcessEachServerGroupList(ServerGroupList notifies);\n\t\tpartial void ProcessServerGroupPermList(ServerGroupPermList[] notifies);\n\t\tpartial void ProcessEachServerGroupPermList(ServerGroupPermList notifies);\n\t\tpartial void ProcessServerGroupsByClientId(ServerGroupsByClientId[] notifies);\n\t\tpartial void ProcessEachServerGroupsByClientId(ServerGroupsByClientId notifies);\n\t\tpartial void ProcessServerLog(ServerLog[] notifies);\n\t\tpartial void ProcessEachServerLog(ServerLog notifies);\n\t\tpartial void ProcessServerTempPasswordList(ServerTempPasswordList[] notifies);\n\t\tpartial void ProcessEachServerTempPasswordList(ServerTempPasswordList notifies);\n\t\tpartial void ProcessServerUpdated(ServerUpdated[] notifies);\n\t\tpartial void ProcessEachServerUpdated(ServerUpdated notifies);\n\t\tpartial void ProcessTextMessage(TextMessage[] notifies);\n\t\tpartial void ProcessEachTextMessage(TextMessage notifies);\n\t\tpartial void ProcessTokenAdd(TokenAdd[] notifies);\n\t\tpartial void ProcessEachTokenAdd(TokenAdd notifies);\n\t\tpartial void ProcessTokenList(TokenList[] notifies);\n\t\tpartial void ProcessEachTokenList(TokenList notifies);\n\t\tpartial void ProcessTokenUsed(TokenUsed[] notifies);\n\t\tpartial void ProcessEachTokenUsed(TokenUsed notifies);\n\t\t\n\t}\n}\n"
  },
  {
    "path": "TSLib/Full/TsFullClient.gen.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"true\" hostSpecific=\"true\" language=\"C#\" #>\n<#@ include file=\"../Generated/M2BParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"../Generated/MessageParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"../Generated/BookParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"../Generated/NotificationUtil.ttinclude\" once=\"true\" #>\n<#@ output extension=\".cs\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n\nusing System;\nusing TSLib.Helper;\nusing TSLib.Messages;\n\n#nullable enable\nnamespace TSLib.Full\n{\n\tpartial class TsFullClient\n\t{\n\t\t<#\n\t\tvar genbook = BookDeclarations.Parse(Host.ResolvePath(\"../Declarations/Book.toml\"));\n\t\tvar genmsg = Messages.Parse(Host.ResolvePath(\"../Declarations/Messages.toml\"));\n\t\tvar genm2b = M2BDeclarations.Parse(Host.ResolvePath(\"../Declarations/MessagesToBook.toml\"), genmsg, genbook);\n\n\t\tGenNtfyDecls(OnlyS2C(genmsg.NotifiesSorted));\n\t\t#>\n\n\t\tprivate void InvokeEvent(LazyNotification lazyNotification)\n\t\t{\n\t\t\tvar ntf = lazyNotification.Notifications;\n\t\t\tswitch (lazyNotification.NotifyType)\n\t\t\t{\n\t\t\t<#\n\t\t\tforeach(var ntfy in OnlyS2C(genmsg.NotifiesSorted))\n\t\t\t{\n\t\t\t#>\n\t\t\tcase NotificationType.<#= ntfy.name #>: {\n\t\t\t\tvar ntfc = (<#=ntfy.name #>[])ntf;\n\t\t\t\tProcess<#= ntfy.name #>(ntfc);\n\t\t\t\tOn<#= ntfy.name #>?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEach<#= ntfy.name #>;\n\t\t\t\tvar book = Book;\n\t\t\t\tforeach(var that in ntfc) {<#\n\t\t\t\t\tvar bookitem = genm2b.rule.FirstOrDefault(x => x.from == ntfy.name);\n\t\t\t\t\tif(bookitem != null) {\n\t\t\t\t\t#>\n\t\t\t\t\tbook?.Update<#= ntfy.name #>(that);<# } #>\n\t\t\t\t\tProcessEach<#= ntfy.name #>(that);\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t<#\n\t\t\t}\n\t\t\t#>\n\t\t\tcase NotificationType.Unknown:\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(lazyNotification.NotifyType);\n\t\t\t}\n\t\t}\n\n\t\t<#\n\t\tPushIndent(\"\\t\\t\");\n\t\tforeach(var ntfy in OnlyS2C(genmsg.NotifiesSorted))\n\t\t{\n\t\t\tWriteLine($\"partial void Process{ntfy.name}({ntfy.name}[] notifies);\");\n\t\t\tWriteLine($\"partial void ProcessEach{ntfy.name}({ntfy.name} notifies);\");\n\t\t}\n\t\t#>\n\t}\n}"
  },
  {
    "path": "TSLib/Generated/Book.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\n\n\n\n\nusing System.Collections.Generic;\n\n#pragma warning disable CS8019 // Ignore unused imports\nusing i8  = System.SByte;\nusing u8  = System.Byte;\nusing i16 = System.Int16;\nusing u16 = System.UInt16;\nusing i32 = System.Int32;\nusing u32 = System.UInt32;\nusing i64 = System.Int64;\nusing u64 = System.UInt64;\nusing f32 = System.Single;\nusing f64 = System.Double;\nusing str = System.String;\n\nusing DateTime = System.DateTime;\nusing Duration = System.TimeSpan;\nusing DurationSeconds = System.TimeSpan;\nusing DurationMilliseconds = System.TimeSpan;\nusing SocketAddr = System.String;\nusing IpAddr = System.String;\nusing Ts3ErrorCode = TSLib.TsErrorCode;\nusing Ts3Permission = TSLib.TsPermission;\n\nusing IconHash = System.Int32;\nusing ConnectionId = System.UInt32;\nusing EccKeyPubP256 = TSLib.Uid;\n#pragma warning restore CS8019\n\n#nullable enable\nnamespace TSLib.Full.Book\n{\n\n\tpublic sealed partial class ServerGroup\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic ServerGroup()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic GroupType GroupType { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic ServerGroupId Id { get; internal set; }\n\t\tpublic bool IsPermanent { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic GroupNamingMode NamingMode { get; set; }\n\t\tpublic i32 NeededMemberAddPower { get; set; }\n\t\tpublic i32? NeededMemberRemovePower { get; set; }\n\t\tpublic i32 NeededModifyPower { get; set; }\n\t\tpublic i32 SortId { get; set; }\n\t}\n\n\tpublic sealed partial class File\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic File()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic bool IsFile { get; set; }\n\t\tpublic DateTime LastChanged { get; set; }\n\t\tpublic str Path { get; set; }\n\t\tpublic i64 Size { get; set; }\n\t}\n\n\tpublic sealed partial class OptionalChannelData\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic OptionalChannelData()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic str Description { get; set; }\n\t}\n\n\tpublic sealed partial class Channel\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic Channel()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic ChannelType ChannelType { get; set; }\n\t\tpublic Codec? Codec { get; set; }\n\t\tpublic i32? CodecLatencyFactor { get; set; }\n\t\tpublic u8? CodecQuality { get; set; }\n\t\tpublic Duration? DeleteDelay { get; set; }\n\t\tpublic bool ForcedSilence { get; internal set; }\n\t\tpublic bool? HasPassword { get; set; }\n\t\tpublic IconHash? IconId { get; set; }\n\t\tpublic ChannelId Id { get; internal set; }\n\t\tpublic bool? IsDefault { get; set; }\n\t\tpublic bool? IsPrivate { get; set; }\n\t\tpublic bool? IsUnencrypted { get; set; }\n\t\tpublic MaxClients? MaxClients { get; set; }\n\t\tpublic MaxClients? MaxFamilyClients { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32? NeededTalkPower { get; set; }\n\t\tpublic OptionalChannelData? OptionalData { get; internal set; }\n\t\tpublic ChannelId Order { get; set; }\n\t\tpublic ChannelId Parent { get; set; }\n\t\tpublic ChannelPermissionHint? PermissionHints { get; set; }\n\t\tpublic str? PhoneticName { get; set; }\n\t\tpublic bool Subscribed { get; set; }\n\t\tpublic str? Topic { get; set; }\n\t}\n\n\tpublic sealed partial class OptionalClientData\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic OptionalClientData()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic DateTime Created { get; internal set; }\n\t\tpublic DateTime LastConnected { get; internal set; }\n\t\tpublic str? LoginName { get; internal set; }\n\t\tpublic u64 MonthBytesDownloaded { get; internal set; }\n\t\tpublic u64 MonthBytesUploaded { get; internal set; }\n\t\tpublic str Platform { get; set; }\n\t\tpublic u64 TotalBytesDownloaded { get; internal set; }\n\t\tpublic u64 TotalBytesUploaded { get; internal set; }\n\t\tpublic u32 TotalConnection { get; internal set; }\n\t\tpublic str Version { get; set; }\n\t\tpublic str VersionSign { get; set; }\n\t}\n\n\tpublic sealed partial class ConnectionClientData\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic ConnectionClientData()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic u64 BandwidthReceivedLastMinuteControl { get; internal set; }\n\t\tpublic u64 BandwidthReceivedLastMinuteKeepalive { get; internal set; }\n\t\tpublic u64 BandwidthReceivedLastMinuteSpeech { get; internal set; }\n\t\tpublic u64 BandwidthReceivedLastSecondControl { get; internal set; }\n\t\tpublic u64 BandwidthReceivedLastSecondKeepalive { get; internal set; }\n\t\tpublic u64 BandwidthReceivedLastSecondSpeech { get; internal set; }\n\t\tpublic u64 BandwidthSentLastMinuteControl { get; internal set; }\n\t\tpublic u64 BandwidthSentLastMinuteKeepalive { get; internal set; }\n\t\tpublic u64 BandwidthSentLastMinuteSpeech { get; internal set; }\n\t\tpublic u64 BandwidthSentLastSecondControl { get; internal set; }\n\t\tpublic u64 BandwidthSentLastSecondKeepalive { get; internal set; }\n\t\tpublic u64 BandwidthSentLastSecondSpeech { get; internal set; }\n\t\tpublic u64 BytesReceivedControl { get; internal set; }\n\t\tpublic u64 BytesReceivedKeepalive { get; internal set; }\n\t\tpublic u64 BytesReceivedSpeech { get; internal set; }\n\t\tpublic u64 BytesSentControl { get; internal set; }\n\t\tpublic u64 BytesSentKeepalive { get; internal set; }\n\t\tpublic u64 BytesSentSpeech { get; internal set; }\n\t\tpublic SocketAddr? ClientAddress { get; internal set; }\n\t\tpublic f32 ClientToServerPacketlossControl { get; internal set; }\n\t\tpublic f32 ClientToServerPacketlossKeepalive { get; internal set; }\n\t\tpublic f32 ClientToServerPacketlossSpeech { get; internal set; }\n\t\tpublic f32 ClientToServerPacketlossTotal { get; internal set; }\n\t\tpublic Duration ConnectedTime { get; internal set; }\n\t\tpublic u64 FiletransferBandwidthReceived { get; internal set; }\n\t\tpublic u64 FiletransferBandwidthSent { get; internal set; }\n\t\tpublic Duration IdleTime { get; internal set; }\n\t\tpublic u64 PacketsReceivedControl { get; internal set; }\n\t\tpublic u64 PacketsReceivedKeepalive { get; internal set; }\n\t\tpublic u64 PacketsReceivedSpeech { get; internal set; }\n\t\tpublic u64 PacketsSentControl { get; internal set; }\n\t\tpublic u64 PacketsSentKeepalive { get; internal set; }\n\t\tpublic u64 PacketsSentSpeech { get; internal set; }\n\t\tpublic Duration Ping { get; internal set; }\n\t\tpublic Duration PingDeviation { get; internal set; }\n\t\tpublic f32 ServerToClientPacketlossControl { get; internal set; }\n\t\tpublic f32 ServerToClientPacketlossKeepalive { get; internal set; }\n\t\tpublic f32 ServerToClientPacketlossSpeech { get; internal set; }\n\t\tpublic f32 ServerToClientPacketlossTotal { get; internal set; }\n\t}\n\n\tpublic sealed partial class Client\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic Client()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\tServerGroups = new HashSet<ServerGroupId>();\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic str AvatarHash { get; internal set; }\n\t\tpublic str? AwayMessage { get; set; }\n\t\tpublic str Badges { get; set; }\n\t\tpublic ChannelId Channel { get; set; }\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic ClientType ClientType { get; internal set; }\n\t\tpublic ConnectionClientData? ConnectionData { get; internal set; }\n\t\tpublic str CountryCode { get; internal set; }\n\t\tpublic ClientDbId DatabaseId { get; internal set; }\n\t\tpublic str Description { get; set; }\n\t\tpublic IconHash IconId { get; internal set; }\n\t\tpublic ClientId Id { get; internal set; }\n\t\tpublic ChannelId InheritedChannelGroupFromChannel { get; internal set; }\n\t\tpublic bool InputHardwareEnabled { get; set; }\n\t\tpublic bool InputMuted { get; set; }\n\t\tpublic bool IsChannelCommander { get; set; }\n\t\tpublic bool IsPrioritySpeaker { get; set; }\n\t\tpublic bool IsRecording { get; set; }\n\t\tpublic str Metadata { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 NeededServerqueryViewPower { get; internal set; }\n\t\tpublic OptionalClientData? OptionalData { get; internal set; }\n\t\tpublic bool OutputHardwareEnabled { get; set; }\n\t\tpublic bool OutputMuted { get; set; }\n\t\tpublic bool OutputOnlyMuted { get; set; }\n\t\tpublic ClientPermissionHint? PermissionHints { get; set; }\n\t\tpublic str PhoneticName { get; set; }\n\t\tpublic HashSet<ServerGroupId> ServerGroups { get; set; }\n\t\tpublic i32 TalkPower { get; internal set; }\n\t\tpublic bool TalkPowerGranted { get; set; }\n\t\tpublic TalkPowerRequest? TalkPowerRequest { get; internal set; }\n\t\tpublic Uid? Uid { get; internal set; }\n\t\tpublic u32 UnreadMessages { get; internal set; }\n\t}\n\n\tpublic sealed partial class OptionalServerData\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic OptionalServerData()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic u32 AntifloodPointsNeededCommandBlock { get; set; }\n\t\tpublic u32 AntifloodPointsTickReduce { get; set; }\n\t\tpublic bool Autostart { get; set; }\n\t\tpublic u64 ChannelCount { get; internal set; }\n\t\tpublic u16 ClientCount { get; internal set; }\n\t\tpublic u32 ComplainAutobanCount { get; set; }\n\t\tpublic Duration ComplainAutobanTime { get; set; }\n\t\tpublic Duration ComplainRemoveTime { get; set; }\n\t\tpublic u32 ConnectionCount { get; internal set; }\n\t\tpublic ChannelGroupId DefaultChannelAdminGroup { get; set; }\n\t\tpublic u64 DownloadQuota { get; set; }\n\t\tpublic bool HasPassword { get; internal set; }\n\t\tpublic bool LogChannel { get; set; }\n\t\tpublic bool LogClient { get; set; }\n\t\tpublic bool LogFiletransfer { get; set; }\n\t\tpublic bool LogPermissions { get; set; }\n\t\tpublic bool LogQuery { get; set; }\n\t\tpublic bool LogServer { get; set; }\n\t\tpublic str MachineId { get; internal set; }\n\t\tpublic u64 MaxDownloadTotalBandwith { get; set; }\n\t\tpublic u64 MaxUploadTotalBandwith { get; set; }\n\t\tpublic DateTime MinAndroidVersion { get; internal set; }\n\t\tpublic u16 MinClientsForceSilence { get; set; }\n\t\tpublic DateTime MinClientVersion { get; internal set; }\n\t\tpublic DateTime MinIosVersion { get; internal set; }\n\t\tpublic u64 MonthBytesDownloaded { get; internal set; }\n\t\tpublic u64 MonthBytesUploaded { get; internal set; }\n\t\tpublic u8 NeededIdentitySecurityLevel { get; set; }\n\t\tpublic u16 Port { get; internal set; }\n\t\tpublic u32 QueryCount { get; internal set; }\n\t\tpublic u32 QueryOnlineCount { get; internal set; }\n\t\tpublic u16 ReservedSlots { get; set; }\n\t\tpublic u64 TotalBytesDownloaded { get; internal set; }\n\t\tpublic u64 TotalBytesUploaded { get; internal set; }\n\t\tpublic f32 TotalPacketlossControl { get; internal set; }\n\t\tpublic f32 TotalPacketlossKeepalive { get; internal set; }\n\t\tpublic f32 TotalPacketlossSpeech { get; internal set; }\n\t\tpublic f32 TotalPacketlossTotal { get; internal set; }\n\t\tpublic Duration TotalPing { get; internal set; }\n\t\tpublic u64 UploadQuota { get; set; }\n\t\tpublic Duration Uptime { get; internal set; }\n\t\tpublic bool WeblistEnabled { get; set; }\n\t}\n\n\tpublic sealed partial class ConnectionServerData\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic ConnectionServerData()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic u64 BandwidthReceivedLastMinuteTotal { get; internal set; }\n\t\tpublic u64 BandwidthReceivedLastSecondTotal { get; internal set; }\n\t\tpublic u64 BandwidthSentLastMinuteTotal { get; internal set; }\n\t\tpublic u64 BandwidthSentLastSecondTotal { get; internal set; }\n\t\tpublic u64 BytesReceivedTotal { get; internal set; }\n\t\tpublic u64 BytesSentTotal { get; internal set; }\n\t\tpublic Duration ConnectedTime { get; internal set; }\n\t\tpublic u64 FiletransferBandwidthReceived { get; internal set; }\n\t\tpublic u64 FiletransferBandwidthSent { get; internal set; }\n\t\tpublic u64 FiletransferBytesReceivedTotal { get; internal set; }\n\t\tpublic u64 FiletransferBytesSentTotal { get; internal set; }\n\t\tpublic f32 PacketlossTotal { get; internal set; }\n\t\tpublic u64 PacketsReceivedTotal { get; internal set; }\n\t\tpublic u64 PacketsSentTotal { get; internal set; }\n\t\tpublic Duration Ping { get; internal set; }\n\t}\n\n\tpublic sealed partial class Server\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic Server()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\tIps = new HashSet<IpAddr>();\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic bool AskForPrivilegekey { get; internal set; }\n\t\tpublic CodecEncryptionMode CodecEncryptionMode { get; set; }\n\t\tpublic ConnectionServerData? ConnectionData { get; internal set; }\n\t\tpublic DateTime Created { get; internal set; }\n\t\tpublic ChannelGroupId DefaultChannelGroup { get; set; }\n\t\tpublic ServerGroupId DefaultServerGroup { get; set; }\n\t\tpublic Duration HostbannerGfxInterval { get; set; }\n\t\tpublic str HostbannerGfxUrl { get; set; }\n\t\tpublic HostBannerMode HostbannerMode { get; set; }\n\t\tpublic str HostbannerUrl { get; set; }\n\t\tpublic str HostbuttonGfxUrl { get; set; }\n\t\tpublic str HostbuttonTooltip { get; set; }\n\t\tpublic str HostbuttonUrl { get; set; }\n\t\tpublic str Hostmessage { get; set; }\n\t\tpublic HostMessageMode HostmessageMode { get; set; }\n\t\tpublic IconHash IconId { get; internal set; }\n\t\tpublic HashSet<IpAddr> Ips { get; internal set; }\n\t\tpublic LicenseType License { get; internal set; }\n\t\tpublic u16 MaxClients { get; internal set; }\n\t\tpublic str Name { get; internal set; }\n\t\tpublic str Nickname { get; internal set; }\n\t\tpublic OptionalServerData? OptionalData { get; internal set; }\n\t\tpublic str PhoneticName { get; set; }\n\t\tpublic str Platform { get; internal set; }\n\t\tpublic f32 PrioritySpeakerDimmModificator { get; set; }\n\t\tpublic u16 ProtocolVersion { get; internal set; }\n\t\tpublic EccKeyPubP256 PublicKey { get; internal set; }\n\t\tpublic Duration TempChannelDefaultDeleteDelay { get; set; }\n\t\tpublic str Version { get; internal set; }\n\t\tpublic u64 VirtualServerId { get; internal set; }\n\t\tpublic str WelcomeMessage { get; internal set; }\n\t}\n\n\tpublic sealed partial class Connection\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic Connection()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\tClients = new Dictionary<ClientId,Client>();\n\t\t\tChannels = new Dictionary<ChannelId,Channel>();\n\t\t\tGroups = new Dictionary<ServerGroupId,ServerGroup>();\n\t\t\t\n\t\t}\n\n\t\n\t\tpublic Dictionary<ChannelId,Channel> Channels { get; internal set; }\n\t\tpublic Dictionary<ClientId,Client> Clients { get; internal set; }\n\t\tpublic Dictionary<ServerGroupId,ServerGroup> Groups { get; internal set; }\n\t\tpublic ClientId OwnClient { get; internal set; }\n\t\tpublic Server Server { get; internal set; }\n\t}\n\n}\n"
  },
  {
    "path": "TSLib/Generated/Book.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"true\" hostSpecific=\"true\" language=\"C#\" #>\n<#@ include file=\"BookParser.ttinclude\" once=\"true\" #>\n<#@ output extension=\".cs\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.IO\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n\nusing System.Collections.Generic;\n\n<#= ConversionSet #>\n\n#nullable enable\nnamespace TSLib.Full.Book\n{\n<#\nvar gen = BookDeclarations.Parse(Host.ResolvePath(\"../Declarations/Book.toml\"));\n\nforeach (var struc in gen.@struct)\n{\n#>\n\tpublic sealed partial class <#= struc.name #>\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic <#= struc.name #>()\n\t\t#pragma warning restore CS8618\n\t\t{\n\t\t\t<# ClearIndent();\n\t\t\tPushIndent(\"\\t\\t\\t\");\n\t\t\tforeach(var prop in struc.properties) {\n\t\t\t\tswitch(prop.mod) {\n\t\t\t\tcase \"array\":\n\t\t\t\t\tWriteLine($\"{prop.name} = new HashSet<{prop.type}>();\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"map\":\n\t\t\t\t\tWriteLine($\"{prop.name} = new Dictionary<{prop.key},{prop.type}>();\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} #>\n\t\t}\n\n\t<# foreach(var prop in struc.properties.OrderBy(x => x.name)) {\n\t\t\tif (!prop.get.Value && !prop.set.Value) continue;\n\t\t#>\n\t\tpublic <#\n\t\t\tswitch(prop.mod) {\n\t\t\tcase \"array\":\n\t\t\t\tWrite($\"HashSet<{prop.type}>\");\n\t\t\t\tbreak;\n\t\t\tcase \"map\":\n\t\t\t\tWrite($\"Dictionary<{prop.key},{prop.type}>\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tWrite($\"{prop.type}{(prop.opt == true ? \"?\" : \"\")}\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t#> <#= prop.name #> { <#= prop.get.Value?\"\":\"internal \" #>get; <#= prop.set.Value?\"\":\"internal \" #>set; }<# } #>\n\t}\n<#\n}\n#>\n}"
  },
  {
    "path": "TSLib/Generated/BookParser.ttinclude",
    "content": "<#@ include file=\"Util.ttinclude\" once=\"true\" #>\n<#+\npublic class BookDeclarations\n{\n\tpublic static BookDeclarations Parse(string file)\n\t{\n\t\tvar toml = Nett.Toml.ReadFile<BookDeclarations>(file);\n\n\t\t// transfer all optional get/set confs\n\t\tforeach (var struc in toml.@struct)\n\t\t{\n\t\t\tforeach (var prop in struc.properties)\n\t\t\t{\n\t\t\t\tprop.get ??= struc.accessor.get;\n\t\t\t\tprop.set ??= struc.accessor.set;\n\t\t\t}\n\t\t}\n\n\t\treturn toml;\n\t}\n\n\tpublic Struct[] @struct { get; set; }\n\n\tpublic class Struct\n\t{\n\t\tpublic string name { get; set; }\n\t\tpublic Id[] id { get; set; }\n\t\tpublic string doc { get; set; }\n\t\tpublic Accessor accessor { get; set; }\n\t\tpublic Property[] properties { get; set; }\n\t}\n\n\tpublic class Id\n\t{\n\t\tpublic string @struct { get; set; }\n\t\tpublic string prop { get; set; }\n\t}\n\n\tpublic class Accessor\n\t{\n\t\tpublic bool get { get; set; }\n\t\tpublic bool set { get; set; }\n\t}\n\n\tpublic class Property\n\t{\n\t\tpublic string name { get; set; }\n\t\tpublic string type { get; set; }\n\t\tpublic bool? get { get; set; }\n\t\tpublic bool? set { get; set; }\n\t\tpublic bool? opt { get; set; }\n\t\tpublic string mod { get; set; }\n\t\tpublic string key { get; set; }\n\t}\n}\n#>"
  },
  {
    "path": "TSLib/Generated/ErrorParser.ttinclude",
    "content": "<#@ assembly name=\"System.Core\" #>\n<#@ assembly name=\"Microsoft.VisualBasic\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ import namespace=\"Microsoft.VisualBasic.FileIO\" #>\n<#\nList<GenError> ParseErrors()\n{\n\tstring declFilePath = Host.ResolvePath(\"../Declarations/Errors.csv\");\n\tvar data = new List<GenError>();\n\tusing (TextFieldParser parser = new TextFieldParser(declFilePath))\n\t{\n\t\tparser.TextFieldType = FieldType.Delimited;\n\t\tparser.SetDelimiters(\",\");\n\t\twhile (!parser.EndOfData) {\n\t\t\tvar line = parser.ReadFields();\n\t\t\tdata.Add(new GenError { Doc = line[1], Name = line[0], Value = line[2] });\n\t\t}\n\t}\n\tdata.RemoveAt(0);\n\treturn data;\n}\n#><#+\nclass GenError\n{\n\tpublic string Doc { get; set; }\n\tpublic string Name { get; set; }\n\tpublic string Value { get; set; }\n}\n#>"
  },
  {
    "path": "TSLib/Generated/M2B.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nusing TSLib.Messages;\n\n#pragma warning disable CS8019 // Ignore unused imports\nusing i8  = System.SByte;\nusing u8  = System.Byte;\nusing i16 = System.Int16;\nusing u16 = System.UInt16;\nusing i32 = System.Int32;\nusing u32 = System.UInt32;\nusing i64 = System.Int64;\nusing u64 = System.UInt64;\nusing f32 = System.Single;\nusing f64 = System.Double;\nusing str = System.String;\n\nusing DateTime = System.DateTime;\nusing Duration = System.TimeSpan;\nusing DurationSeconds = System.TimeSpan;\nusing DurationMilliseconds = System.TimeSpan;\nusing SocketAddr = System.String;\nusing IpAddr = System.String;\nusing Ts3ErrorCode = TSLib.TsErrorCode;\nusing Ts3Permission = TSLib.TsPermission;\n\nusing IconHash = System.Int32;\nusing ConnectionId = System.UInt32;\nusing EccKeyPubP256 = TSLib.Uid;\n#pragma warning restore CS8019\n\nnamespace TSLib.Full.Book\n{\n\tpublic partial class Connection\n\t{\n#pragma warning disable IDE0017, CS0472 // Ignore \"Object initialization can be simplified\", \"Something with == and null...\"\n\t\n\t\tpublic void UpdateInitServer(InitServer msg)\n\t\t{\n\t\t\tvar obj = new Server();\n\t\t\tSetClientDataFun(msg);\n\t\t\t{ var tmpv = msg.AskForPrivilegekey; if (tmpv != null) obj.AskForPrivilegekey = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.CodecEncryptionMode; if (tmpv != null) obj.CodecEncryptionMode = (CodecEncryptionMode)tmpv; }\n\t\t\t{ var tmpv = msg.ServerCreated; if (tmpv != null) obj.Created = (DateTime)tmpv; }\n\t\t\t{ var tmpv = msg.DefaultChannelGroup; if (tmpv != null) obj.DefaultChannelGroup = (ChannelGroupId)tmpv; }\n\t\t\t{ var tmpv = msg.DefaultServerGroup; if (tmpv != null) obj.DefaultServerGroup = (ServerGroupId)tmpv; }\n\t\t\t{ var tmpv = msg.HostbannerGfxInterval; if (tmpv != null) obj.HostbannerGfxInterval = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.HostbannerGfxUrl; if (tmpv != null) obj.HostbannerGfxUrl = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostbannerMode; if (tmpv != null) obj.HostbannerMode = (HostBannerMode)tmpv; }\n\t\t\t{ var tmpv = msg.HostbannerUrl; if (tmpv != null) obj.HostbannerUrl = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostbuttonGfxUrl; if (tmpv != null) obj.HostbuttonGfxUrl = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostbuttonTooltip; if (tmpv != null) obj.HostbuttonTooltip = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostbuttonUrl; if (tmpv != null) obj.HostbuttonUrl = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Hostmessage; if (tmpv != null) obj.Hostmessage = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostmessageMode; if (tmpv != null) obj.HostmessageMode = (HostMessageMode)tmpv; }\n\t\t\t{ var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; }\n\t\t\t{ var tmpa = msg.ServerIp; if (tmpa != null) { obj.Ips.Clear(); obj.Ips.UnionWith(tmpa); } }\n\t\t\t{ var tmpv = msg.MaxClients; if (tmpv != null) obj.MaxClients = (u16)tmpv; }\n\t\t\t{ var tmpv = msg.ServerName; if (tmpv != null) obj.Name = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Nickname; if (tmpv != null) obj.Nickname = (str)tmpv; }\n\t\t\t{ var tmpv = msg.ServerPhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; }\n\t\t\t{ var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; }\n\t\t\t{ var tmpv = msg.ServerPlatform; if (tmpv != null) obj.Platform = (str)tmpv; }\n\t\t\t{ var tmpv = msg.PrioritySpeakerDimmModificator; if (tmpv != null) obj.PrioritySpeakerDimmModificator = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.ProtocolVersion; if (tmpv != null) obj.ProtocolVersion = (u16)tmpv; }\n\t\t\t{ var tmpv = msg.TempChannelDefaultDeleteDelay; if (tmpv != null) obj.TempChannelDefaultDeleteDelay = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.ServerVersion; if (tmpv != null) obj.Version = (str)tmpv; }\n\t\t\t{ var tmpv = msg.VirtualServerId; if (tmpv != null) obj.VirtualServerId = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.WelcomeMessage; if (tmpv != null) obj.WelcomeMessage = (str)tmpv; }\n\t\t\tSetServer(obj);\n\t\t\t\n\t\t\tPostInitServer(msg);\n\t\t}\n\n\t\tpartial void PostInitServer(InitServer msg);\n\t\n\t\tpublic void UpdateChannelCreated(ChannelCreated msg)\n\t\t{\n\t\t\tvar obj = new Channel();\n\t\t\t{\n\t\t\tvar tmp = MaxClientsCcFun(msg);\n\t\t\t{ var tmpv = tmp.Item1; if (tmpv != null) obj.MaxClients = (MaxClients)tmpv; }\n\t\t\t{ var tmpv = tmp.Item2; if (tmpv != null) obj.MaxFamilyClients = (MaxClients)tmpv; }\n\t\t\t}\n\t\t\t{ var tmpv = ChannelTypeCcFun(msg); if (tmpv != null) obj.ChannelType = (ChannelType)tmpv; }\n\t\t\t{ var tmpv = ReturnFalse(msg); if (tmpv != null) obj.ForcedSilence = (bool)tmpv; }\n\t\t\tobj.IsPrivate = null;\n\t\t\t{ var tmpv = ReturnFalse(msg); if (tmpv != null) obj.Subscribed = (bool)tmpv; }\n\t\t\tobj.PermissionHints = null;\n\t\t\tobj.OptionalData = null;\n\t\t\t{ var tmpv = ChannelOrderCcFun(msg); if (tmpv != null) obj.Order = (ChannelId)tmpv; }\n\t\t\t{ var tmpv = msg.Codec; if (tmpv != null) obj.Codec = (Codec)tmpv; }\n\t\t\t{ var tmpv = msg.CodecLatencyFactor; if (tmpv != null) obj.CodecLatencyFactor = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.CodecQuality; if (tmpv != null) obj.CodecQuality = (u8)tmpv; }\n\t\t\t{ var tmpv = msg.DeleteDelay; if (tmpv != null) obj.DeleteDelay = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.HasPassword; if (tmpv != null) obj.HasPassword = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; }\n\t\t\t{ var tmpv = msg.IsDefault; if (tmpv != null) obj.IsDefault = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsUnencrypted; if (tmpv != null) obj.IsUnencrypted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; }\n\t\t\t{ var tmpv = msg.NeededTalkPower; if (tmpv != null) obj.NeededTalkPower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.ParentId; if (tmpv != null) obj.Parent = (ChannelId)tmpv; }\n\t\t\t{ var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Topic; if (tmpv != null) obj.Topic = (str)tmpv; }\n\t\t\tSetChannel(obj, msg.ChannelId);\n\t\t\t\n\t\t\tPostChannelCreated(msg);\n\t\t}\n\n\t\tpartial void PostChannelCreated(ChannelCreated msg);\n\t\n\t\tpublic void UpdateChannelDeleted(ChannelDeleted msg)\n\t\t{\n\t\t\t\n\t\t\tRemoveChannel(msg.ChannelId);\n\t\t\tPostChannelDeleted(msg);\n\t\t}\n\n\t\tpartial void PostChannelDeleted(ChannelDeleted msg);\n\t\n\t\tpublic void UpdateChannelEdited(ChannelEdited msg)\n\t\t{\n\t\t\tvar obj = GetChannel(msg.ChannelId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ChannelEdited' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{\n\t\t\tvar tmp = MaxClientsCeFun(msg);\n\t\t\t{ var tmpv = tmp.Item1; if (tmpv != null) obj.MaxClients = (MaxClients)tmpv; }\n\t\t\t{ var tmpv = tmp.Item2; if (tmpv != null) obj.MaxFamilyClients = (MaxClients)tmpv; }\n\t\t\t}\n\t\t\t{ var tmpv = ChannelTypeCeFun(msg); if (tmpv != null) obj.ChannelType = (ChannelType)tmpv; }\n\t\t\t{ var tmpv = ChannelOrderCeFun(msg); if (tmpv != null) obj.Order = (ChannelId)tmpv; }\n\t\t\t{ var tmpv = msg.Codec; if (tmpv != null) obj.Codec = (Codec)tmpv; }\n\t\t\t{ var tmpv = msg.CodecLatencyFactor; if (tmpv != null) obj.CodecLatencyFactor = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.CodecQuality; if (tmpv != null) obj.CodecQuality = (u8)tmpv; }\n\t\t\t{ var tmpv = msg.DeleteDelay; if (tmpv != null) obj.DeleteDelay = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.HasPassword; if (tmpv != null) obj.HasPassword = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; }\n\t\t\t{ var tmpv = msg.IsDefault; if (tmpv != null) obj.IsDefault = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsUnencrypted; if (tmpv != null) obj.IsUnencrypted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; }\n\t\t\t{ var tmpv = msg.NeededTalkPower; if (tmpv != null) obj.NeededTalkPower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Topic; if (tmpv != null) obj.Topic = (str)tmpv; }\n\t\t\t\n\t\t\tPostChannelEdited(msg);\n\t\t}\n\n\t\tpartial void PostChannelEdited(ChannelEdited msg);\n\t\n\t\tpublic void UpdateChannelList(ChannelList msg)\n\t\t{\n\t\t\tvar obj = new Channel();\n\t\t\t{\n\t\t\tvar tmp = MaxClientsClFun(msg);\n\t\t\t{ var tmpv = tmp.Item1; if (tmpv != null) obj.MaxClients = (MaxClients)tmpv; }\n\t\t\t{ var tmpv = tmp.Item2; if (tmpv != null) obj.MaxFamilyClients = (MaxClients)tmpv; }\n\t\t\t}\n\t\t\t{ var tmpv = ChannelTypeClFun(msg); if (tmpv != null) obj.ChannelType = (ChannelType)tmpv; }\n\t\t\t{ var tmpv = ReturnFalse(msg); if (tmpv != null) obj.Subscribed = (bool)tmpv; }\n\t\t\tobj.PermissionHints = null;\n\t\t\tobj.OptionalData = null;\n\t\t\t{ var tmpv = msg.Codec; if (tmpv != null) obj.Codec = (Codec)tmpv; }\n\t\t\t{ var tmpv = msg.CodecLatencyFactor; if (tmpv != null) obj.CodecLatencyFactor = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.CodecQuality; if (tmpv != null) obj.CodecQuality = (u8)tmpv; }\n\t\t\t{ var tmpv = msg.DeleteDelay; if (tmpv != null) obj.DeleteDelay = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.ForcedSilence; if (tmpv != null) obj.ForcedSilence = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.HasPassword; if (tmpv != null) obj.HasPassword = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; }\n\t\t\t{ var tmpv = msg.IsDefault; if (tmpv != null) obj.IsDefault = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsPrivate; if (tmpv != null) obj.IsPrivate = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsUnencrypted; if (tmpv != null) obj.IsUnencrypted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; }\n\t\t\t{ var tmpv = msg.NeededTalkPower; if (tmpv != null) obj.NeededTalkPower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.Order; if (tmpv != null) obj.Order = (ChannelId)tmpv; }\n\t\t\t{ var tmpv = msg.ParentId; if (tmpv != null) obj.Parent = (ChannelId)tmpv; }\n\t\t\t{ var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Topic; if (tmpv != null) obj.Topic = (str)tmpv; }\n\t\t\tSetChannel(obj, msg.ChannelId);\n\t\t\t\n\t\t\tPostChannelList(msg);\n\t\t}\n\n\t\tpartial void PostChannelList(ChannelList msg);\n\t\n\t\tpublic void UpdateChannelMoved(ChannelMoved msg)\n\t\t{\n\t\t\tvar obj = GetChannel(msg.ChannelId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ChannelMoved' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = ChannelOrderCmFun(msg); if (tmpv != null) obj.Order = (ChannelId)tmpv; }\n\t\t\t{ var tmpv = msg.ParentId; if (tmpv != null) obj.Parent = (ChannelId)tmpv; }\n\t\t\t\n\t\t\tPostChannelMoved(msg);\n\t\t}\n\n\t\tpartial void PostChannelMoved(ChannelMoved msg);\n\t\n\t\tpublic void UpdateChannelSubscribed(ChannelSubscribed msg)\n\t\t{\n\t\t\tvar obj = GetChannel(msg.ChannelId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ChannelSubscribed' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = ChannelSubscribeFun(msg); if (tmpv != null) obj.Subscribed = (bool)tmpv; }\n\t\t\t\n\t\t\tPostChannelSubscribed(msg);\n\t\t}\n\n\t\tpartial void PostChannelSubscribed(ChannelSubscribed msg);\n\t\n\t\tpublic void UpdateChannelUnsubscribed(ChannelUnsubscribed msg)\n\t\t{\n\t\t\tvar obj = GetChannel(msg.ChannelId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ChannelUnsubscribed' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = ChannelUnsubscribeFun(msg); if (tmpv != null) obj.Subscribed = (bool)tmpv; }\n\t\t\t\n\t\t\tPostChannelUnsubscribed(msg);\n\t\t}\n\n\t\tpartial void PostChannelUnsubscribed(ChannelUnsubscribed msg);\n\t\n\t\tpublic void UpdateClientChannelGroupChanged(ClientChannelGroupChanged msg)\n\t\t{\n\t\t\tvar obj = GetClient(msg.ClientId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ClientChannelGroupChanged' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = msg.ChannelGroup; if (tmpv != null) obj.ChannelGroup = (ChannelGroupId)tmpv; }\n\t\t\t\n\t\t\tPostClientChannelGroupChanged(msg);\n\t\t}\n\n\t\tpartial void PostClientChannelGroupChanged(ClientChannelGroupChanged msg);\n\t\n\t\tpublic void UpdateClientEnterView(ClientEnterView msg)\n\t\t{\n\t\t\tvar obj = new Client();\n\t\t\t{ var tmpv = AwayCevFun(msg); if (tmpv != null) obj.AwayMessage = (str)tmpv; }\n\t\t\t{ var tmpv = ClientTypeCevFun(msg); if (tmpv != null) obj.ClientType = (ClientType)tmpv; }\n\t\t\t{ var tmpv = TalkPowerCevFun(msg); if (tmpv != null) obj.TalkPowerRequest = (TalkPowerRequest)tmpv; }\n\t\t\tobj.PermissionHints = null;\n\t\t\tobj.OptionalData = null;\n\t\t\tobj.ConnectionData = null;\n\t\t\t{ var tmpv = msg.AvatarHash; if (tmpv != null) obj.AvatarHash = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Badges; if (tmpv != null) obj.Badges = (str)tmpv; }\n\t\t\t{ var tmpv = msg.TargetChannelId; if (tmpv != null) obj.Channel = (ChannelId)tmpv; }\n\t\t\t{ var tmpv = msg.ChannelGroup; if (tmpv != null) obj.ChannelGroup = (ChannelGroupId)tmpv; }\n\t\t\t{ var tmpv = msg.CountryCode; if (tmpv != null) obj.CountryCode = (str)tmpv; }\n\t\t\t{ var tmpv = msg.DatabaseId; if (tmpv != null) obj.DatabaseId = (ClientDbId)tmpv; }\n\t\t\t{ var tmpv = msg.Description; if (tmpv != null) obj.Description = (str)tmpv; }\n\t\t\t{ var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; }\n\t\t\t{ var tmpv = msg.InheritedChannelGroupFromChannel; if (tmpv != null) obj.InheritedChannelGroupFromChannel = (ChannelId)tmpv; }\n\t\t\t{ var tmpv = msg.InputHardwareEnabled; if (tmpv != null) obj.InputHardwareEnabled = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.InputMuted; if (tmpv != null) obj.InputMuted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsChannelCommander; if (tmpv != null) obj.IsChannelCommander = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsPrioritySpeaker; if (tmpv != null) obj.IsPrioritySpeaker = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsRecording; if (tmpv != null) obj.IsRecording = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.Metadata; if (tmpv != null) obj.Metadata = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; }\n\t\t\t{ var tmpv = msg.NeededServerqueryViewPower; if (tmpv != null) obj.NeededServerqueryViewPower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.OutputHardwareEnabled; if (tmpv != null) obj.OutputHardwareEnabled = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.OutputMuted; if (tmpv != null) obj.OutputMuted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.OutputOnlyMuted; if (tmpv != null) obj.OutputOnlyMuted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; }\n\t\t\t{ var tmpa = msg.ServerGroups; if (tmpa != null) { obj.ServerGroups.Clear(); obj.ServerGroups.UnionWith(tmpa); } }\n\t\t\t{ var tmpv = msg.TalkPower; if (tmpv != null) obj.TalkPower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.TalkPowerGranted; if (tmpv != null) obj.TalkPowerGranted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.Uid; if (tmpv != null) obj.Uid = (Uid)tmpv; }\n\t\t\t{ var tmpv = msg.UnreadMessages; if (tmpv != null) obj.UnreadMessages = (u32)tmpv; }\n\t\t\tSetClient(obj, msg.ClientId);\n\t\t\t\n\t\t\tPostClientEnterView(msg);\n\t\t}\n\n\t\tpartial void PostClientEnterView(ClientEnterView msg);\n\t\n\t\tpublic void UpdateClientLeftView(ClientLeftView msg)\n\t\t{\n\t\t\t\n\t\t\tRemoveClient(msg.ClientId);\n\t\t\tPostClientLeftView(msg);\n\t\t}\n\n\t\tpartial void PostClientLeftView(ClientLeftView msg);\n\t\n\t\tpublic void UpdateClientMoved(ClientMoved msg)\n\t\t{\n\t\t\tvar obj = GetClient(msg.ClientId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ClientMoved' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = msg.TargetChannelId; if (tmpv != null) obj.Channel = (ChannelId)tmpv; }\n\t\t\t\n\t\t\tPostClientMoved(msg);\n\t\t}\n\n\t\tpartial void PostClientMoved(ClientMoved msg);\n\t\n\t\tpublic void UpdateClientConnectionInfo(ClientConnectionInfo msg)\n\t\t{\n\t\t\tvar obj = new ConnectionClientData();\n\t\t\t{ var tmpv = AddressFun(msg); if (tmpv != null) obj.ClientAddress = (SocketAddr)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthReceivedLastMinuteControl; if (tmpv != null) obj.BandwidthReceivedLastMinuteControl = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthReceivedLastMinuteKeepalive; if (tmpv != null) obj.BandwidthReceivedLastMinuteKeepalive = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthReceivedLastMinuteSpeech; if (tmpv != null) obj.BandwidthReceivedLastMinuteSpeech = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthReceivedLastSecondControl; if (tmpv != null) obj.BandwidthReceivedLastSecondControl = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthReceivedLastSecondKeepalive; if (tmpv != null) obj.BandwidthReceivedLastSecondKeepalive = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthReceivedLastSecondSpeech; if (tmpv != null) obj.BandwidthReceivedLastSecondSpeech = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthSentLastMinuteControl; if (tmpv != null) obj.BandwidthSentLastMinuteControl = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthSentLastMinuteKeepalive; if (tmpv != null) obj.BandwidthSentLastMinuteKeepalive = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthSentLastMinuteSpeech; if (tmpv != null) obj.BandwidthSentLastMinuteSpeech = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthSentLastSecondControl; if (tmpv != null) obj.BandwidthSentLastSecondControl = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthSentLastSecondKeepalive; if (tmpv != null) obj.BandwidthSentLastSecondKeepalive = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BandwidthSentLastSecondSpeech; if (tmpv != null) obj.BandwidthSentLastSecondSpeech = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BytesReceivedControl; if (tmpv != null) obj.BytesReceivedControl = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BytesReceivedKeepalive; if (tmpv != null) obj.BytesReceivedKeepalive = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BytesReceivedSpeech; if (tmpv != null) obj.BytesReceivedSpeech = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BytesSentControl; if (tmpv != null) obj.BytesSentControl = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BytesSentKeepalive; if (tmpv != null) obj.BytesSentKeepalive = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.BytesSentSpeech; if (tmpv != null) obj.BytesSentSpeech = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.ClientToServerPacketlossControl; if (tmpv != null) obj.ClientToServerPacketlossControl = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.ClientToServerPacketlossKeepalive; if (tmpv != null) obj.ClientToServerPacketlossKeepalive = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.ClientToServerPacketlossSpeech; if (tmpv != null) obj.ClientToServerPacketlossSpeech = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.ClientToServerPacketlossTotal; if (tmpv != null) obj.ClientToServerPacketlossTotal = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.ConnectedTime; if (tmpv != null) obj.ConnectedTime = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.FiletransferBandwidthReceived; if (tmpv != null) obj.FiletransferBandwidthReceived = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.FiletransferBandwidthSent; if (tmpv != null) obj.FiletransferBandwidthSent = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.IdleTime; if (tmpv != null) obj.IdleTime = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.PacketsReceivedControl; if (tmpv != null) obj.PacketsReceivedControl = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.PacketsReceivedKeepalive; if (tmpv != null) obj.PacketsReceivedKeepalive = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.PacketsReceivedSpeech; if (tmpv != null) obj.PacketsReceivedSpeech = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.PacketsSentControl; if (tmpv != null) obj.PacketsSentControl = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.PacketsSentKeepalive; if (tmpv != null) obj.PacketsSentKeepalive = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.PacketsSentSpeech; if (tmpv != null) obj.PacketsSentSpeech = (u64)tmpv; }\n\t\t\t{ var tmpv = msg.Ping; if (tmpv != null) obj.Ping = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.PingDeviation; if (tmpv != null) obj.PingDeviation = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.ServerToClientPacketlossControl; if (tmpv != null) obj.ServerToClientPacketlossControl = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.ServerToClientPacketlossKeepalive; if (tmpv != null) obj.ServerToClientPacketlossKeepalive = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.ServerToClientPacketlossSpeech; if (tmpv != null) obj.ServerToClientPacketlossSpeech = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.ServerToClientPacketlossTotal; if (tmpv != null) obj.ServerToClientPacketlossTotal = (f32)tmpv; }\n\t\t\tSetConnectionClientData(obj, msg.ClientId);\n\t\t\t\n\t\t\tPostClientConnectionInfo(msg);\n\t\t}\n\n\t\tpartial void PostClientConnectionInfo(ClientConnectionInfo msg);\n\t\n\t\tpublic void UpdateClientServerGroupAdded(ClientServerGroupAdded msg)\n\t\t{\n\t\t\tvar obj = GetClient(msg.ClientId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ClientServerGroupAdded' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tobj.ServerGroups.Add(msg.ServerGroupId);\n\t\t\t\n\t\t\tPostClientServerGroupAdded(msg);\n\t\t}\n\n\t\tpartial void PostClientServerGroupAdded(ClientServerGroupAdded msg);\n\t\n\t\tpublic void UpdateClientServerGroupRemoved(ClientServerGroupRemoved msg)\n\t\t{\n\t\t\tvar obj = GetClient(msg.ClientId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ClientServerGroupRemoved' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tobj.ServerGroups.Remove(msg.ServerGroupId);\n\t\t\t\n\t\t\tPostClientServerGroupRemoved(msg);\n\t\t}\n\n\t\tpartial void PostClientServerGroupRemoved(ClientServerGroupRemoved msg);\n\t\n\t\tpublic void UpdateClientUpdated(ClientUpdated msg)\n\t\t{\n\t\t\tvar obj = GetClient(msg.ClientId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ClientUpdated' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = AwayCuFun(msg); if (tmpv != null) obj.AwayMessage = (str)tmpv; }\n\t\t\t{ var tmpv = TalkPowerCuFun(msg); if (tmpv != null) obj.TalkPowerRequest = (TalkPowerRequest)tmpv; }\n\t\t\t{ var tmpv = msg.AvatarHash; if (tmpv != null) obj.AvatarHash = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Badges; if (tmpv != null) obj.Badges = (str)tmpv; }\n\t\t\t{ var tmpv = msg.Description; if (tmpv != null) obj.Description = (str)tmpv; }\n\t\t\t{ var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; }\n\t\t\t{ var tmpv = msg.InputHardwareEnabled; if (tmpv != null) obj.InputHardwareEnabled = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.InputMuted; if (tmpv != null) obj.InputMuted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsChannelCommander; if (tmpv != null) obj.IsChannelCommander = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsPrioritySpeaker; if (tmpv != null) obj.IsPrioritySpeaker = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.IsRecording; if (tmpv != null) obj.IsRecording = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; }\n\t\t\t{ var tmpv = msg.OutputHardwareEnabled; if (tmpv != null) obj.OutputHardwareEnabled = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.OutputMuted; if (tmpv != null) obj.OutputMuted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.PhoneticName; if (tmpv != null) obj.PhoneticName = (str)tmpv; }\n\t\t\t{ var tmpa = msg.ServerGroups; if (tmpa != null) { obj.ServerGroups.Clear(); obj.ServerGroups.UnionWith(tmpa); } }\n\t\t\t{ var tmpv = msg.TalkPower; if (tmpv != null) obj.TalkPower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.TalkPowerGranted; if (tmpv != null) obj.TalkPowerGranted = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.UnreadMessages; if (tmpv != null) obj.UnreadMessages = (u32)tmpv; }\n\t\t\t\n\t\t\tPostClientUpdated(msg);\n\t\t}\n\n\t\tpartial void PostClientUpdated(ClientUpdated msg);\n\t\n\t\tpublic void UpdateServerGroupList(ServerGroupList msg)\n\t\t{\n\t\t\tvar obj = new ServerGroup();\n\t\t\t{ var tmpv = msg.GroupType; if (tmpv != null) obj.GroupType = (GroupType)tmpv; }\n\t\t\t{ var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; }\n\t\t\t{ var tmpv = msg.IsPermanent; if (tmpv != null) obj.IsPermanent = (bool)tmpv; }\n\t\t\t{ var tmpv = msg.Name; if (tmpv != null) obj.Name = (str)tmpv; }\n\t\t\t{ var tmpv = msg.NamingMode; if (tmpv != null) obj.NamingMode = (GroupNamingMode)tmpv; }\n\t\t\t{ var tmpv = msg.NeededMemberAddPower; if (tmpv != null) obj.NeededMemberAddPower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.NeededMemberRemovePower; if (tmpv != null) obj.NeededMemberRemovePower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.NeededModifyPower; if (tmpv != null) obj.NeededModifyPower = (i32)tmpv; }\n\t\t\t{ var tmpv = msg.SortId; if (tmpv != null) obj.SortId = (i32)tmpv; }\n\t\t\tSetServerGroup(obj, msg.ServerGroupId);\n\t\t\t\n\t\t\tPostServerGroupList(msg);\n\t\t}\n\n\t\tpartial void PostServerGroupList(ServerGroupList msg);\n\t\n\t\tpublic void UpdateServerEdited(ServerEdited msg)\n\t\t{\n\t\t\tvar obj = GetServer();\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ServerEdited' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = msg.CodecEncryptionMode; if (tmpv != null) obj.CodecEncryptionMode = (CodecEncryptionMode)tmpv; }\n\t\t\t{ var tmpv = msg.DefaultChannelGroup; if (tmpv != null) obj.DefaultChannelGroup = (ChannelGroupId)tmpv; }\n\t\t\t{ var tmpv = msg.DefaultServerGroup; if (tmpv != null) obj.DefaultServerGroup = (ServerGroupId)tmpv; }\n\t\t\t{ var tmpv = msg.HostbannerGfxInterval; if (tmpv != null) obj.HostbannerGfxInterval = (Duration)tmpv; }\n\t\t\t{ var tmpv = msg.HostbannerGfxUrl; if (tmpv != null) obj.HostbannerGfxUrl = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostbannerMode; if (tmpv != null) obj.HostbannerMode = (HostBannerMode)tmpv; }\n\t\t\t{ var tmpv = msg.HostbannerUrl; if (tmpv != null) obj.HostbannerUrl = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostbuttonGfxUrl; if (tmpv != null) obj.HostbuttonGfxUrl = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostbuttonTooltip; if (tmpv != null) obj.HostbuttonTooltip = (str)tmpv; }\n\t\t\t{ var tmpv = msg.HostbuttonUrl; if (tmpv != null) obj.HostbuttonUrl = (str)tmpv; }\n\t\t\t{ var tmpv = msg.IconId; if (tmpv != null) obj.IconId = (IconHash)tmpv; }\n\t\t\t{ var tmpv = msg.Nickname; if (tmpv != null) obj.Nickname = (str)tmpv; }\n\t\t\t{ var tmpv = msg.PrioritySpeakerDimmModificator; if (tmpv != null) obj.PrioritySpeakerDimmModificator = (f32)tmpv; }\n\t\t\t{ var tmpv = msg.TempChannelDefaultDeleteDelay; if (tmpv != null) obj.TempChannelDefaultDeleteDelay = (Duration)tmpv; }\n\t\t\t\n\t\t\tPostServerEdited(msg);\n\t\t}\n\n\t\tpartial void PostServerEdited(ServerEdited msg);\n\t\n\t\tpublic void UpdateChannelPermissionHints(ChannelPermissionHints msg)\n\t\t{\n\t\t\tvar obj = GetChannel(msg.ChannelId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ChannelPermissionHints' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = msg.Flags; if (tmpv != null) obj.PermissionHints = (ChannelPermissionHint)tmpv; }\n\t\t\t\n\t\t\tPostChannelPermissionHints(msg);\n\t\t}\n\n\t\tpartial void PostChannelPermissionHints(ChannelPermissionHints msg);\n\t\n\t\tpublic void UpdateClientPermissionHints(ClientPermissionHints msg)\n\t\t{\n\t\t\tvar obj = GetClient(msg.ClientId);\n\t\t\tif (obj == null) {\n\t\t\t\tLog.Warn(\"Internal Book protocol error. Update 'ClientPermissionHints' has no local object ({$msg})\", msg);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t{ var tmpv = msg.Flags; if (tmpv != null) obj.PermissionHints = (ClientPermissionHint)tmpv; }\n\t\t\t\n\t\t\tPostClientPermissionHints(msg);\n\t\t}\n\n\t\tpartial void PostClientPermissionHints(ClientPermissionHints msg);\n\t\n#pragma warning restore IDE0017, CS0472\n\t}\n}\n"
  },
  {
    "path": "TSLib/Generated/M2B.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"true\" hostSpecific=\"true\" language=\"C#\" #>\n<#@ include file=\"M2BParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"MessageParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"BookParser.ttinclude\" once=\"true\" #>\n<#@ output extension=\".cs\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.IO\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#\nvar genbook = BookDeclarations.Parse(Host.ResolvePath(\"../Declarations/Book.toml\"));\nvar genmsg = Messages.Parse(Host.ResolvePath(\"../Declarations/Messages.toml\"));\nvar genm2b = M2BDeclarations.Parse(Host.ResolvePath(\"../Declarations/MessagesToBook.toml\"), genmsg, genbook);\n#>\nusing TSLib.Messages;\n\n<#= ConversionSet #>\n\nnamespace TSLib.Full.Book\n{\n\tpublic partial class Connection\n\t{\n#pragma warning disable IDE0017, CS0472 // Ignore \"Object initialization can be simplified\", \"Something with == and null...\"\n\t<# foreach (var rule in genm2b.rule) {\n\t\tvar msg = genmsg.NotifiesSorted.First(x => x.name == rule.from);\n\t\tvar bookItem = genbook.@struct.First(x => x.name == rule.to);\n\t#>\n\t\tpublic void Update<#= msg.name #>(<#= msg.name #> msg)\n\t\t{\n\t\t\t<# var idStr = string.Join(\", \", rule.id.Select(x => $\"msg.{x}\"));\n\n\t\tClearIndent();\n\t\tPushIndent(\"\\t\\t\\t\");\n\t\tswitch (rule.operation)\n\t\t{\n\t\tcase \"add\":\n\t\tcase \"update\":\n\t\t\tif (rule.operation == \"add\")\n\t\t\t\tWriteLine($\"var obj = new {rule.to}();\");\n\t\t\telse\n\t\t\t\tWriteLine($@\"var obj = Get{rule.to}({idStr});\n\t\t\tif (obj == null) {{\n\t\t\t\tLog.Warn(\"\"Internal Book protocol error. Update '{msg.name}' has no local object ({{$msg}})\"\", msg);\n\t\t\t\treturn;\n\t\t\t}}\");\n\n\t\t\tforeach (var prop in rule.properties.OrderBy(x => x.to)) {\n\t\t\t\tvoid WriteMove(string from, string to) {\n\t\t\t\t\tvar bookProp = bookItem.properties.FirstOrDefault(x => x.name == to);\n\t\t\t\t\tif(bookProp is null) {\n\t\t\t\t\t\tWarn($\"No property found: '{to}'\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (prop.operation is null) {\n\t\t\t\t\t\tif (bookProp.mod is null) {\n\t\t\t\t\t\t\tif (from == \"null\")\n\t\t\t\t\t\t\t\tWriteLine($\"obj.{to} = null;\");\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tWriteLine($\"{{ var tmpv = {from}; if (tmpv != null) obj.{to} = ({bookProp.type})tmpv; }}\");\n\t\t\t\t\t\t} else if (bookProp.mod == \"array\") {\n\t\t\t\t\t\t\t//WriteLine($\"obj.{to}.Add({from});\");\n\t\t\t\t\t\t\tif (prop.operation == \"add\")\n\t\t\t\t\t\t\t\tWriteLine($\"{{ var tmpa = {from}; if (tmpa != null) obj.{to}.UnionWith(tmpa); }}\");\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tWriteLine($\"{{ var tmpa = {from}; if (tmpa != null) {{ obj.{to}.Clear(); obj.{to}.UnionWith(tmpa); }} }}\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Exception(\"Unknown mod type: \" + bookProp.mod);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (prop.operation == \"add\") {\n\t\t\t\t\t\t// Currently hacky; Better check:\n\t\t\t\t\t\t//  [update:single->single]\n\t\t\t\t\t\t//  [add/remove/update:single->array]\n\t\t\t\t\t\t//  [update:array->array]\n\t\t\t\t\t\tWriteLine($\"obj.{to}.Add({from});\");\n\t\t\t\t\t} else if (prop.operation == \"remove\") {\n\t\t\t\t\t\t// Same here\n\t\t\t\t\t\tWriteLine($\"obj.{to}.Remove({from});\");\n\t\t\t\t\t} else\n\t\t\t\t\t\tthrow new Exception(\"Unknown operation: \" + prop.operation);\n\t\t\t\t}\n\n\t\t\t\tif (prop.from != null) {\n\t\t\t\t\tWriteMove($\"msg.{prop.from}\", prop.to);\n\t\t\t\t} else { /* function */\n\t\t\t\t\tif (prop.function == \"ReturnNone\")\n\t\t\t\t\t\tWriteMove($\"null\", prop.tolist[0]);\n\t\t\t\t\telse if (prop.function == \"VoidFun\") { /* Do Nothing */ }\n\t\t\t\t\telse if(prop.tolist.Length == 0)\n\t\t\t\t\t\tWriteLine($\"{prop.function}(msg);\");\n\t\t\t\t\telse if (prop.tolist.Length == 1)\n\t\t\t\t\t\tWriteMove($\"{prop.function}(msg)\", prop.tolist[0]);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tWriteLine(\"{\");\n\t\t\t\t\t\tWriteLine($\"var tmp = {prop.function}(msg);\", prop.to);\n\t\t\t\t\t\tfor (int i = 0; i < prop.tolist.Length; i++)\n\t\t\t\t\t\t\tWriteMove($\"tmp.Item{(i + 1)}\", prop.tolist[i]);\n\t\t\t\t\t\tWriteLine(\"}\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (rule.operation == \"add\") {\n\t\t\t\tWriteLine($\"Set{rule.to}(obj{(string.IsNullOrEmpty(idStr) ? \"\" : (\", \" + idStr))});\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"remove\":#>\n\t\t\tRemove<#=rule.to#>(<#=idStr#>);<#\n\t\t\tbreak;\n\t\t} #>\n\t\t\tPost<#= msg.name #>(msg);\n\t\t}\n\n\t\tpartial void Post<#= msg.name #>(<#= msg.name #> msg);\n\t<# } #>\n#pragma warning restore IDE0017, CS0472\n\t}\n}"
  },
  {
    "path": "TSLib/Generated/M2BParser.ttinclude",
    "content": "<#@ include file=\"Util.ttinclude\" once=\"true\" #>\n<#+\npublic class M2BDeclarations\n{\n\tpublic static M2BDeclarations Parse(string file, Messages msgs, BookDeclarations book)\n\t{\n\t\tvar toml = Nett.Toml.ReadFile<M2BDeclarations>(file);\n\n\t\tforeach (var rule in toml.rule)\n\t\t{\n\t\t\trule.properties ??= new List<M2BPropMove>();\n\t\t\t\n\t\t\t// Add implicit move operations\n\t\t\tvar msg = msgs.GetOrderedMsg().First(x => x.name == rule.from);\n\t\t\tvar msgProps = msg.attributes.Select(x => msgs.GetField(x).fld);\n\t\t\tvar bookItem = book.@struct.First(x => x.name == rule.to);\n\t\t\tvar funcResults = new HashSet<string>(rule.properties.Where(x => x.tolist != null).SelectMany(x => x.tolist));\n\n\t\t\tforeach (var prop in msgProps)\n\t\t\t{\n\t\t\t\tif (funcResults.Contains(prop.pretty))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (bookItem.properties.Any(x => x.name == prop.pretty))\n\t\t\t\t{\n\t\t\t\t\t// chek already exists\n\n\t\t\t\t\trule.properties.Add(new M2BPropMove {\n\t\t\t\t\t\tfrom = prop.pretty,\n\t\t\t\t\t\tto = prop.pretty,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn toml;\n\t}\n\n\tpublic M2BRule[] rule { get; set; }\n\n\tpublic class M2BRule\n\t{\n\t\tpublic string from { get; set; }\n\t\tpublic string[] id { get; set; }\n\t\tpublic string to { get; set; }\n\t\tpublic string operation { get; set; }\n\t\tpublic List<M2BPropMove> properties { get; set; }\n\t}\n\n\tpublic class M2BPropMove\n\t{\n\t\tpublic string from { get; set; }\n\t\tpublic string to { get; set; }\n\t\tpublic string function { get; set; }\n\t\tpublic string[] tolist { get; set; }\n\t\tpublic string operation { get; set; }\n\t}\n}\n#>"
  },
  {
    "path": "TSLib/Generated/MessageParser.ttinclude",
    "content": "<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ include file=\"Util.ttinclude\" once=\"true\" #>\n<#+\npublic static IEnumerable<Messages.Msg> OnlyS2C(IEnumerable<Messages.Msg> enu) => enu.Where(x => x.s2c.Value);\npublic class Messages\n{\n\tpublic static Messages Parse(string file)\n\t{\n\t\tvar toml = Nett.Toml.ReadFile<Messages>(file);\n\n\t\t// transfer all optional get/set confs\n\t\t/*foreach (var struc in toml.@struct)\n\t\t{\n\t\t\tforeach (var prop in struc.properties)\n\t\t\t{\n\t\t\t\tprop.get ??= struc.accessor.get;\n\t\t\t\tprop.set ??= struc.accessor.set;\n\t\t\t}\n\t\t}*/\n\n\t\treturn toml;\n\t}\n\n\tpublic IEnumerable<Msg> GetOrderedMsg()\n\t{\n\t\tforeach(var (grp, msg) in msg_group.SelectMany(group => group.msg.Select(msg => (group:group, msg:msg))).OrderBy(x => x.msg.name))\n\t\t{\n\t\t\t// transfer all default confs\n\t\t\tmsg.s2c      ??= grp.@default.s2c;\n\t\t\tmsg.c2s      ??= grp.@default.c2s;\n\t\t\tmsg.response ??= grp.@default.response;\n\t\t\tmsg.low      ??= grp.@default.low;\n\t\t\tmsg.np       ??= grp.@default.np;\n\n\t\t\tyield return msg;\n\t\t}\n\t}\n\n\tpublic IEnumerable<Msg> NotifiesSorted => GetOrderedMsg().Where(x => x.notify != null);\n\n\tpublic (Field fld, bool optional) GetField(string name)\n\t{\n\t\tvar ret = (fld:fields.FirstOrDefault(x => x.map == name.Trim('?')), optional:name.EndsWith(\"?\"));\n\t\tif(ret.fld == null)\n\t\t\tthrow new Exception($\"Field declaration for \\\"{name}\\\" not found\");\n\t\treturn ret;\n\t}\n\n\tpublic Field[] fields { get; set; }\n\tpublic MsgGroup[] msg_group { get; set; }\n\n\tpublic class Field\n\t{\n\t\tpublic string map { get; set; }\n\t\tpublic string ts { get; set; }\n\t\tpublic string pretty { get; set; }\n\t\tpublic string type { get; set; }\n\n\t\tpublic string mod { get; set; }\n\t\tpublic string doc { get; set; }\n\n\t\tpublic bool isArray => mod == \"array\";\n\t\tpublic string TypeFin(bool optional)\n\t\t{\n\t\t\tstring ltype;\n\t\t\tswitch(type)\n\t\t\t{\n\t\t\t\tcase \"PermissionId\": ltype = \"Ts3Permission\"; break;\n\t\t\t\tdefault: ltype = type; break;\n\t\t\t}\n\t\t\treturn ltype + (isArray ? \"[]\" : \"\") + (optional ? \"?\" : \"\");\n\t\t}\n\t}\n\n\tpublic class MsgGroup\n\t{\n\t\tpublic Default @default { get; set; }\n\t\tpublic Msg[] msg { get; set; }\n\t}\n\n\tpublic class Default\n\t{\n\t\tpublic bool s2c { get; set; }\n\t\tpublic bool c2s { get; set; }\n\t\tpublic bool response { get; set; }\n\t\tpublic bool low { get; set; }\n\t\tpublic bool np { get; set; }\n\t}\n\n\tpublic class Msg\n\t{\n\t\tpublic string name { get; set; }\n\t\tpublic string notify { get; set; }\n\t\tpublic string[] attributes { get; set; }\n\n\t\tpublic bool? s2c { get; set; }\n\t\tpublic bool? c2s { get; set; }\n\t\tpublic bool? response { get; set; }\n\t\tpublic bool? low { get; set; }\n\t\tpublic bool? np { get; set; }\n\t}\n}\n#>"
  },
  {
    "path": "TSLib/Generated/Messages.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nusing System;\nusing System.Collections.Generic;\nusing System.Buffers.Text;\nusing TSLib.Commands;\nusing TSLib.Helper;\n\n#pragma warning disable CS8019 // Ignore unused imports\nusing i8  = System.SByte;\nusing u8  = System.Byte;\nusing i16 = System.Int16;\nusing u16 = System.UInt16;\nusing i32 = System.Int32;\nusing u32 = System.UInt32;\nusing i64 = System.Int64;\nusing u64 = System.UInt64;\nusing f32 = System.Single;\nusing f64 = System.Double;\nusing str = System.String;\n\nusing DateTime = System.DateTime;\nusing Duration = System.TimeSpan;\nusing DurationSeconds = System.TimeSpan;\nusing DurationMilliseconds = System.TimeSpan;\nusing SocketAddr = System.String;\nusing IpAddr = System.String;\nusing Ts3ErrorCode = TSLib.TsErrorCode;\nusing Ts3Permission = TSLib.TsPermission;\n\nusing IconHash = System.Int32;\nusing ConnectionId = System.UInt32;\nusing EccKeyPubP256 = TSLib.Uid;\n#pragma warning restore CS8019\n\n#nullable enable\nnamespace TSLib.Messages\n{\n\n\tpublic sealed partial class BanAdd : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.BanAdd;\n\t\t\n\n\t\tpublic str? BanReason { get; set; }\n\t\tpublic IpAddr? Ip { get; set; }\n\t\tpublic str? Name { get; set; }\n\t\tpublic DurationSeconds? Time { get; set; }\n\t\tpublic Uid? Uid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"banreason\": BanReason = (str)TsString.Unescape(value); break;\n\t\t\tcase \"ip\": Ip = (IpAddr)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Time = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"uid\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (BanAdd[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"banreason\": foreach(var toi in toc) { toi.BanReason = BanReason; } break;\n\t\t\t\tcase \"ip\": foreach(var toi in toc) { toi.Ip = Ip; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"time\": foreach(var toi in toc) { toi.Time = Time; } break;\n\t\t\t\tcase \"uid\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class BanClient : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.BanClient;\n\t\t\n\n\t\tpublic str? BanReason { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic DurationSeconds? Time { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"banreason\": BanReason = (str)TsString.Unescape(value); break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Time = TimeSpan.FromSeconds(oval); } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (BanClient[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"banreason\": foreach(var toi in toc) { toi.BanReason = BanReason; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"time\": foreach(var toi in toc) { toi.Time = Time; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class BanDel : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.BanDel;\n\t\t\n\n\t\tpublic u32 BanId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"banid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) BanId = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (BanDel[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"banid\": foreach(var toi in toc) { toi.BanId = BanId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class BanDelAll : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.BanDelAll;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class BanList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.BanList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic u32 BanId { get; set; }\n\t\tpublic DateTime Created { get; set; }\n\t\tpublic DurationSeconds Duration { get; set; }\n\t\tpublic u32 Enforcements { get; set; }\n\t\tpublic ClientDbId InvokerDatabaseId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic IpAddr Ip { get; set; }\n\t\tpublic str LastNickname { get; set; }\n\t\tpublic str? MyTsId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic str Reason { get; set; }\n\t\tpublic Uid Uid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"banid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) BanId = (u32)oval; } break;\n\t\t\tcase \"created\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Created = Tools.FromUnix(oval); } break;\n\t\t\tcase \"duration\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Duration = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"enforcements\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Enforcements = (u32)oval; } break;\n\t\t\tcase \"invokercldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) InvokerDatabaseId = (ClientDbId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"ip\": Ip = (IpAddr)TsString.Unescape(value); break;\n\t\t\tcase \"lastnickname\": LastNickname = (str)TsString.Unescape(value); break;\n\t\t\tcase \"mytsid\": MyTsId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"reason\": Reason = (str)TsString.Unescape(value); break;\n\t\t\tcase \"uid\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (BanList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"banid\": foreach(var toi in toc) { toi.BanId = BanId; } break;\n\t\t\t\tcase \"created\": foreach(var toi in toc) { toi.Created = Created; } break;\n\t\t\t\tcase \"duration\": foreach(var toi in toc) { toi.Duration = Duration; } break;\n\t\t\t\tcase \"enforcements\": foreach(var toi in toc) { toi.Enforcements = Enforcements; } break;\n\t\t\t\tcase \"invokercldbid\": foreach(var toi in toc) { toi.InvokerDatabaseId = InvokerDatabaseId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"ip\": foreach(var toi in toc) { toi.Ip = Ip; } break;\n\t\t\t\tcase \"lastnickname\": foreach(var toi in toc) { toi.LastNickname = LastNickname; } break;\n\t\t\t\tcase \"mytsid\": foreach(var toi in toc) { toi.MyTsId = MyTsId; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"reason\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\tcase \"uid\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class BanListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.BanListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class BindingList : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.BindingList;\n\t\t\n\n\t\tpublic str? Subsystem { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"subsystem\": Subsystem = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (BindingList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"subsystem\": foreach(var toi in toc) { toi.Subsystem = Subsystem; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelAddPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelAddPerm;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelAddPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelChanged : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelChanged;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelChanged[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelClientAddPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelClientAddPerm;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelClientAddPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelClientDelPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelClientDelPerm;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelClientDelPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelClientPermList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelClientPermList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic bool PermissionNegated { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permnegated\": PermissionNegated = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permskip\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelClientPermList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permnegated\": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permskip\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelClientPermListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelClientPermListRequest;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelClientPermListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelCreate : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelCreate;\n\t\t\n\n\t\tpublic Codec? Codec { get; set; }\n\t\tpublic u8? CodecQuality { get; set; }\n\t\tpublic DurationSeconds? DeleteDelay { get; set; }\n\t\tpublic str? Description { get; set; }\n\t\tpublic bool? HasPassword { get; set; }\n\t\tpublic bool? InheritsMaxFamilyClients { get; set; }\n\t\tpublic bool? IsDefault { get; set; }\n\t\tpublic bool? IsMaxClientsUnlimited { get; set; }\n\t\tpublic bool? IsMaxFamilyClientsUnlimited { get; set; }\n\t\tpublic bool? IsPermanent { get; set; }\n\t\tpublic bool? IsSemiPermanent { get; set; }\n\t\tpublic bool? IsUnencrypted { get; set; }\n\t\tpublic i32? MaxClients { get; set; }\n\t\tpublic i32? MaxFamilyClients { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic ChannelId? Order { get; set; }\n\t\tpublic ChannelId? ParentId { get; set; }\n\t\tpublic str? Password { get; set; }\n\t\tpublic str? PhoneticName { get; set; }\n\t\tpublic str? Topic { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"channel_codec\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break;\n\t\t\tcase \"channel_codec_is_unencrypted\": IsUnencrypted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_codec_quality\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break;\n\t\t\tcase \"channel_delete_delay\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"channel_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_flag_default\": IsDefault = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxclients_unlimited\": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_password\": HasPassword = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_permanent\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_semi_permanent\": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_maxclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break;\n\t\t\tcase \"channel_maxfamilyclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break;\n\t\t\tcase \"channel_name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_name_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\tcase \"channel_password\": Password = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_topic\": Topic = (str)TsString.Unescape(value); break;\n\t\t\tcase \"cpid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelCreate[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"channel_codec\": foreach(var toi in toc) { toi.Codec = Codec; } break;\n\t\t\t\tcase \"channel_codec_is_unencrypted\": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break;\n\t\t\t\tcase \"channel_codec_quality\": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break;\n\t\t\t\tcase \"channel_delete_delay\": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break;\n\t\t\t\tcase \"channel_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"channel_flag_default\": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break;\n\t\t\t\tcase \"channel_flag_maxclients_unlimited\": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_password\": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break;\n\t\t\t\tcase \"channel_flag_permanent\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"channel_flag_semi_permanent\": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break;\n\t\t\t\tcase \"channel_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"channel_maxfamilyclients\": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break;\n\t\t\t\tcase \"channel_name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"channel_name_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"channel_order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\tcase \"channel_password\": foreach(var toi in toc) { toi.Password = Password; } break;\n\t\t\t\tcase \"channel_topic\": foreach(var toi in toc) { toi.Topic = Topic; } break;\n\t\t\t\tcase \"cpid\": foreach(var toi in toc) { toi.ParentId = ParentId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelCreated : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelCreated;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic Codec? Codec { get; set; }\n\t\tpublic i32? CodecLatencyFactor { get; set; }\n\t\tpublic u8? CodecQuality { get; set; }\n\t\tpublic DurationSeconds? DeleteDelay { get; set; }\n\t\tpublic bool? HasPassword { get; set; }\n\t\tpublic IconHash? IconId { get; set; }\n\t\tpublic bool? InheritsMaxFamilyClients { get; set; }\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic bool? IsDefault { get; set; }\n\t\tpublic bool? IsMaxClientsUnlimited { get; set; }\n\t\tpublic bool IsMaxFamilyClientsUnlimited { get; set; }\n\t\tpublic bool? IsPermanent { get; set; }\n\t\tpublic bool? IsSemiPermanent { get; set; }\n\t\tpublic bool? IsUnencrypted { get; set; }\n\t\tpublic i32? MaxClients { get; set; }\n\t\tpublic i32? MaxFamilyClients { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32? NeededTalkPower { get; set; }\n\t\tpublic ChannelId Order { get; set; }\n\t\tpublic ChannelId ParentId { get; set; }\n\t\tpublic str? PhoneticName { get; set; }\n\t\tpublic str? Topic { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"channel_codec\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break;\n\t\t\tcase \"channel_codec_is_unencrypted\": IsUnencrypted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_codec_latency_factor\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break;\n\t\t\tcase \"channel_codec_quality\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break;\n\t\t\tcase \"channel_delete_delay\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"channel_flag_default\": IsDefault = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxclients_unlimited\": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_password\": HasPassword = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_permanent\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_semi_permanent\": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"channel_maxclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break;\n\t\t\tcase \"channel_maxfamilyclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break;\n\t\t\tcase \"channel_name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_name_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_needed_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break;\n\t\t\tcase \"channel_order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\tcase \"channel_topic\": Topic = (str)TsString.Unescape(value); break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelCreated[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"channel_codec\": foreach(var toi in toc) { toi.Codec = Codec; } break;\n\t\t\t\tcase \"channel_codec_is_unencrypted\": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break;\n\t\t\t\tcase \"channel_codec_latency_factor\": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break;\n\t\t\t\tcase \"channel_codec_quality\": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break;\n\t\t\t\tcase \"channel_delete_delay\": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break;\n\t\t\t\tcase \"channel_flag_default\": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break;\n\t\t\t\tcase \"channel_flag_maxclients_unlimited\": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_password\": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break;\n\t\t\t\tcase \"channel_flag_permanent\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"channel_flag_semi_permanent\": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break;\n\t\t\t\tcase \"channel_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"channel_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"channel_maxfamilyclients\": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break;\n\t\t\t\tcase \"channel_name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"channel_name_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"channel_needed_talk_power\": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break;\n\t\t\t\tcase \"channel_order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\tcase \"channel_topic\": foreach(var toi in toc) { toi.Topic = Topic; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpid\": foreach(var toi in toc) { toi.ParentId = ParentId; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelCreateResponse : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelCreateResponse[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelDelete : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelDelete;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic bool Force { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"force\": Force = value.Length > 0 && value[0] != '0'; break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelDelete[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"force\": foreach(var toi in toc) { toi.Force = Force; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelDeleted : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelDeleted;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelDeleted[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelDelPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelDelPerm;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelDescriptionChanged : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelDescriptionChanged;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelDescriptionChanged[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelDescriptionRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelDescriptionRequest;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelDescriptionRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelEdit : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelEdit;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic Codec? Codec { get; set; }\n\t\tpublic i32? CodecLatencyFactor { get; set; }\n\t\tpublic u8? CodecQuality { get; set; }\n\t\tpublic DurationSeconds? DeleteDelay { get; set; }\n\t\tpublic str? Description { get; set; }\n\t\tpublic bool? HasPassword { get; set; }\n\t\tpublic IconHash? IconId { get; set; }\n\t\tpublic bool? InheritsMaxFamilyClients { get; set; }\n\t\tpublic bool? IsDefault { get; set; }\n\t\tpublic bool? IsMaxClientsUnlimited { get; set; }\n\t\tpublic bool? IsMaxFamilyClientsUnlimited { get; set; }\n\t\tpublic bool? IsPermanent { get; set; }\n\t\tpublic bool? IsSemiPermanent { get; set; }\n\t\tpublic bool? IsUnencrypted { get; set; }\n\t\tpublic i32? MaxClients { get; set; }\n\t\tpublic i32? MaxFamilyClients { get; set; }\n\t\tpublic str? Name { get; set; }\n\t\tpublic i32? NeededTalkPower { get; set; }\n\t\tpublic ChannelId? Order { get; set; }\n\t\tpublic ChannelId? ParentId { get; set; }\n\t\tpublic str? PhoneticName { get; set; }\n\t\tpublic str? Topic { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"channel_codec\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break;\n\t\t\tcase \"channel_codec_is_unencrypted\": IsUnencrypted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_codec_latency_factor\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break;\n\t\t\tcase \"channel_codec_quality\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break;\n\t\t\tcase \"channel_delete_delay\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"channel_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_flag_default\": IsDefault = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxclients_unlimited\": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_password\": HasPassword = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_permanent\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_semi_permanent\": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"channel_maxclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break;\n\t\t\tcase \"channel_maxfamilyclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break;\n\t\t\tcase \"channel_name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_name_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_needed_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break;\n\t\t\tcase \"channel_order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\tcase \"channel_topic\": Topic = (str)TsString.Unescape(value); break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelEdit[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"channel_codec\": foreach(var toi in toc) { toi.Codec = Codec; } break;\n\t\t\t\tcase \"channel_codec_is_unencrypted\": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break;\n\t\t\t\tcase \"channel_codec_latency_factor\": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break;\n\t\t\t\tcase \"channel_codec_quality\": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break;\n\t\t\t\tcase \"channel_delete_delay\": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break;\n\t\t\t\tcase \"channel_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"channel_flag_default\": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break;\n\t\t\t\tcase \"channel_flag_maxclients_unlimited\": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_password\": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break;\n\t\t\t\tcase \"channel_flag_permanent\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"channel_flag_semi_permanent\": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break;\n\t\t\t\tcase \"channel_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"channel_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"channel_maxfamilyclients\": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break;\n\t\t\t\tcase \"channel_name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"channel_name_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"channel_needed_talk_power\": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break;\n\t\t\t\tcase \"channel_order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\tcase \"channel_topic\": foreach(var toi in toc) { toi.Topic = Topic; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpid\": foreach(var toi in toc) { toi.ParentId = ParentId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelEdited : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelEdited;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic Codec? Codec { get; set; }\n\t\tpublic i32? CodecLatencyFactor { get; set; }\n\t\tpublic u8? CodecQuality { get; set; }\n\t\tpublic DurationSeconds? DeleteDelay { get; set; }\n\t\tpublic str? Description { get; set; }\n\t\tpublic bool? HasPassword { get; set; }\n\t\tpublic IconHash? IconId { get; set; }\n\t\tpublic bool? InheritsMaxFamilyClients { get; set; }\n\t\tpublic ClientId? InvokerId { get; set; }\n\t\tpublic str? InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic bool? IsDefault { get; set; }\n\t\tpublic bool? IsMaxClientsUnlimited { get; set; }\n\t\tpublic bool? IsMaxFamilyClientsUnlimited { get; set; }\n\t\tpublic bool? IsPermanent { get; set; }\n\t\tpublic bool? IsSemiPermanent { get; set; }\n\t\tpublic bool? IsUnencrypted { get; set; }\n\t\tpublic i32? MaxClients { get; set; }\n\t\tpublic i32? MaxFamilyClients { get; set; }\n\t\tpublic str? Name { get; set; }\n\t\tpublic i32? NeededTalkPower { get; set; }\n\t\tpublic ChannelId? Order { get; set; }\n\t\tpublic ChannelId? ParentId { get; set; }\n\t\tpublic str? PhoneticName { get; set; }\n\t\tpublic Reason Reason { get; set; }\n\t\tpublic str? Topic { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"channel_codec\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break;\n\t\t\tcase \"channel_codec_is_unencrypted\": IsUnencrypted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_codec_latency_factor\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break;\n\t\t\tcase \"channel_codec_quality\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break;\n\t\t\tcase \"channel_delete_delay\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"channel_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_flag_default\": IsDefault = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxclients_unlimited\": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_password\": HasPassword = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_permanent\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_semi_permanent\": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"channel_maxclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break;\n\t\t\tcase \"channel_maxfamilyclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break;\n\t\t\tcase \"channel_name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_name_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_needed_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break;\n\t\t\tcase \"channel_order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\tcase \"channel_topic\": Topic = (str)TsString.Unescape(value); break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"reasonid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelEdited[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"channel_codec\": foreach(var toi in toc) { toi.Codec = Codec; } break;\n\t\t\t\tcase \"channel_codec_is_unencrypted\": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break;\n\t\t\t\tcase \"channel_codec_latency_factor\": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break;\n\t\t\t\tcase \"channel_codec_quality\": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break;\n\t\t\t\tcase \"channel_delete_delay\": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break;\n\t\t\t\tcase \"channel_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"channel_flag_default\": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break;\n\t\t\t\tcase \"channel_flag_maxclients_unlimited\": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_password\": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break;\n\t\t\t\tcase \"channel_flag_permanent\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"channel_flag_semi_permanent\": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break;\n\t\t\t\tcase \"channel_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"channel_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"channel_maxfamilyclients\": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break;\n\t\t\t\tcase \"channel_name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"channel_name_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"channel_needed_talk_power\": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break;\n\t\t\t\tcase \"channel_order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\tcase \"channel_topic\": foreach(var toi in toc) { toi.Topic = Topic; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpid\": foreach(var toi in toc) { toi.ParentId = ParentId; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"reasonid\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelFind : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"channel_name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelFind[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"channel_name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelFindRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelFindRequest;\n\t\t\n\n\t\tpublic str Pattern { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"pattern\": Pattern = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelFindRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"pattern\": foreach(var toi in toc) { toi.Pattern = Pattern; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupAdd : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupAdd;\n\t\t\n\n\t\tpublic GroupType? GroupType { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupAdd[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"type\": foreach(var toi in toc) { toi.GroupType = GroupType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupAddPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupAddPerm;\n\t\t\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupAddPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupClientList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupClientList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupClientList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupClientListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupClientListRequest;\n\t\t\n\n\t\tpublic ChannelGroupId? ChannelGroup { get; set; }\n\t\tpublic ChannelId? ChannelId { get; set; }\n\t\tpublic ClientDbId? ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupClientListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupCopy : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupCopy;\n\t\t\n\n\t\tpublic GroupType GroupType { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic ChannelGroupId SourceChannelGroupId { get; set; }\n\t\tpublic ChannelGroupId TargetChannelGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"scgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SourceChannelGroupId = (ChannelGroupId)oval; } break;\n\t\t\tcase \"tcgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelGroupId = (ChannelGroupId)oval; } break;\n\t\t\tcase \"type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupCopy[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"scgid\": foreach(var toi in toc) { toi.SourceChannelGroupId = SourceChannelGroupId; } break;\n\t\t\t\tcase \"tcgid\": foreach(var toi in toc) { toi.TargetChannelGroupId = TargetChannelGroupId; } break;\n\t\t\t\tcase \"type\": foreach(var toi in toc) { toi.GroupType = GroupType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupDel : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupDel;\n\t\t\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic bool Force { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"force\": Force = value.Length > 0 && value[0] != '0'; break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupDel[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"force\": foreach(var toi in toc) { toi.Force = Force; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupDelPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupDelPerm;\n\t\t\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupDelPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic GroupType GroupType { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic bool IsPermanent { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic GroupNamingMode NamingMode { get; set; }\n\t\tpublic i32 NeededMemberAddPower { get; set; }\n\t\tpublic i32? NeededMemberRemovePower { get; set; }\n\t\tpublic i32 NeededModifyPower { get; set; }\n\t\tpublic i32 SortId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"iconid\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"n_member_addp\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededMemberAddPower = (i32)oval; } break;\n\t\t\tcase \"n_member_removep\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededMemberRemovePower = (i32)oval; } break;\n\t\t\tcase \"n_modifyp\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededModifyPower = (i32)oval; } break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"namemode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NamingMode = (GroupNamingMode)oval; } break;\n\t\t\tcase \"savedb\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"sortid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) SortId = (i32)oval; } break;\n\t\t\tcase \"type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"iconid\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"n_member_addp\": foreach(var toi in toc) { toi.NeededMemberAddPower = NeededMemberAddPower; } break;\n\t\t\t\tcase \"n_member_removep\": foreach(var toi in toc) { toi.NeededMemberRemovePower = NeededMemberRemovePower; } break;\n\t\t\t\tcase \"n_modifyp\": foreach(var toi in toc) { toi.NeededModifyPower = NeededModifyPower; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"namemode\": foreach(var toi in toc) { toi.NamingMode = NamingMode; } break;\n\t\t\t\tcase \"savedb\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"sortid\": foreach(var toi in toc) { toi.SortId = SortId; } break;\n\t\t\t\tcase \"type\": foreach(var toi in toc) { toi.GroupType = GroupType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupPermList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupPermList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic bool PermissionNegated { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permnegated\": PermissionNegated = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permskip\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupPermList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permnegated\": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permskip\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupPermListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupPermListRequest;\n\t\t\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupPermListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelGroupRename : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelGroupRename;\n\t\t\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelGroupRename[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelInfoRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelInfoRequest;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelInfoRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelInfoResponse : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic str? BannerGfxUrl { get; set; }\n\t\tpublic str BannerMode { get; set; }\n\t\tpublic Codec Codec { get; set; }\n\t\tpublic i32 CodecLatencyFactor { get; set; }\n\t\tpublic u8 CodecQuality { get; set; }\n\t\tpublic DurationSeconds DeleteDelay { get; set; }\n\t\tpublic str Description { get; set; }\n\t\tpublic DurationSeconds DurationEmpty { get; set; }\n\t\tpublic str FilePath { get; set; }\n\t\tpublic bool ForcedSilence { get; set; }\n\t\tpublic bool HasPassword { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic bool InheritsMaxFamilyClients { get; set; }\n\t\tpublic bool IsDefault { get; set; }\n\t\tpublic bool IsMaxClientsUnlimited { get; set; }\n\t\tpublic bool IsMaxFamilyClientsUnlimited { get; set; }\n\t\tpublic bool IsPermanent { get; set; }\n\t\tpublic bool IsSemiPermanent { get; set; }\n\t\tpublic bool IsUnencrypted { get; set; }\n\t\tpublic i32 MaxClients { get; set; }\n\t\tpublic i32 MaxFamilyClients { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 NeededTalkPower { get; set; }\n\t\tpublic ChannelId Order { get; set; }\n\t\tpublic ChannelId ParentChannelId { get; set; }\n\t\tpublic str? Password { get; set; }\n\t\tpublic str? PasswordSalt { get; set; }\n\t\tpublic str? PhoneticName { get; set; }\n\t\tpublic str Topic { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"channel_banner_gfx_url\": BannerGfxUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_banner_mode\": BannerMode = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_codec\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break;\n\t\t\tcase \"channel_codec_is_unencrypted\": IsUnencrypted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_codec_latency_factor\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break;\n\t\t\tcase \"channel_codec_quality\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break;\n\t\t\tcase \"channel_delete_delay\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"channel_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_filepath\": FilePath = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_flag_default\": IsDefault = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxclients_unlimited\": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_password\": HasPassword = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_permanent\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_semi_permanent\": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_forced_silence\": ForcedSilence = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"channel_maxclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break;\n\t\t\tcase \"channel_maxfamilyclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break;\n\t\t\tcase \"channel_name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_name_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_needed_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break;\n\t\t\tcase \"channel_order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\tcase \"channel_password\": Password = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_security_salt\": PasswordSalt = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_topic\": Topic = (str)TsString.Unescape(value); break;\n\t\t\tcase \"pid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"seconds_empty\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DurationEmpty = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelInfoResponse[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"channel_banner_gfx_url\": foreach(var toi in toc) { toi.BannerGfxUrl = BannerGfxUrl; } break;\n\t\t\t\tcase \"channel_banner_mode\": foreach(var toi in toc) { toi.BannerMode = BannerMode; } break;\n\t\t\t\tcase \"channel_codec\": foreach(var toi in toc) { toi.Codec = Codec; } break;\n\t\t\t\tcase \"channel_codec_is_unencrypted\": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break;\n\t\t\t\tcase \"channel_codec_latency_factor\": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break;\n\t\t\t\tcase \"channel_codec_quality\": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break;\n\t\t\t\tcase \"channel_delete_delay\": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break;\n\t\t\t\tcase \"channel_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"channel_filepath\": foreach(var toi in toc) { toi.FilePath = FilePath; } break;\n\t\t\t\tcase \"channel_flag_default\": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break;\n\t\t\t\tcase \"channel_flag_maxclients_unlimited\": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_password\": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break;\n\t\t\t\tcase \"channel_flag_permanent\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"channel_flag_semi_permanent\": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break;\n\t\t\t\tcase \"channel_forced_silence\": foreach(var toi in toc) { toi.ForcedSilence = ForcedSilence; } break;\n\t\t\t\tcase \"channel_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"channel_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"channel_maxfamilyclients\": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break;\n\t\t\t\tcase \"channel_name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"channel_name_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"channel_needed_talk_power\": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break;\n\t\t\t\tcase \"channel_order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\tcase \"channel_password\": foreach(var toi in toc) { toi.Password = Password; } break;\n\t\t\t\tcase \"channel_security_salt\": foreach(var toi in toc) { toi.PasswordSalt = PasswordSalt; } break;\n\t\t\t\tcase \"channel_topic\": foreach(var toi in toc) { toi.Topic = Topic; } break;\n\t\t\t\tcase \"pid\": foreach(var toi in toc) { toi.ParentChannelId = ParentChannelId; } break;\n\t\t\t\tcase \"seconds_empty\": foreach(var toi in toc) { toi.DurationEmpty = DurationEmpty; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelList : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelList;\n\t\t\n\n\t\tpublic str? BannerGfxUrl { get; set; }\n\t\tpublic str? BannerMode { get; set; }\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic Codec Codec { get; set; }\n\t\tpublic i32 CodecLatencyFactor { get; set; }\n\t\tpublic u8 CodecQuality { get; set; }\n\t\tpublic DurationSeconds DeleteDelay { get; set; }\n\t\tpublic bool ForcedSilence { get; set; }\n\t\tpublic str? Guid { get; set; }\n\t\tpublic bool HasPassword { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic bool InheritsMaxFamilyClients { get; set; }\n\t\tpublic bool IsDefault { get; set; }\n\t\tpublic bool IsMaxClientsUnlimited { get; set; }\n\t\tpublic bool IsMaxFamilyClientsUnlimited { get; set; }\n\t\tpublic bool IsPermanent { get; set; }\n\t\tpublic bool? IsPrivate { get; set; }\n\t\tpublic bool IsSemiPermanent { get; set; }\n\t\tpublic bool IsUnencrypted { get; set; }\n\t\tpublic i32 MaxClients { get; set; }\n\t\tpublic i32 MaxFamilyClients { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 NeededTalkPower { get; set; }\n\t\tpublic ChannelId Order { get; set; }\n\t\tpublic ChannelId ParentId { get; set; }\n\t\tpublic str PhoneticName { get; set; }\n\t\tpublic str Topic { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"channel_banner_gfx_url\": BannerGfxUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_banner_mode\": BannerMode = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_codec\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break;\n\t\t\tcase \"channel_codec_is_unencrypted\": IsUnencrypted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_codec_latency_factor\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecLatencyFactor = (i32)oval; } break;\n\t\t\tcase \"channel_codec_quality\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break;\n\t\t\tcase \"channel_delete_delay\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"channel_flag_default\": IsDefault = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxclients_unlimited\": IsMaxClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": InheritsMaxFamilyClients = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": IsMaxFamilyClientsUnlimited = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_password\": HasPassword = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_permanent\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_private\": IsPrivate = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_semi_permanent\": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_forced_silence\": ForcedSilence = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"channel_maxclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break;\n\t\t\tcase \"channel_maxfamilyclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break;\n\t\t\tcase \"channel_name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_name_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_needed_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break;\n\t\t\tcase \"channel_order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\tcase \"channel_topic\": Topic = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_unique_identifier\": Guid = (str)TsString.Unescape(value); break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"channel_banner_gfx_url\": foreach(var toi in toc) { toi.BannerGfxUrl = BannerGfxUrl; } break;\n\t\t\t\tcase \"channel_banner_mode\": foreach(var toi in toc) { toi.BannerMode = BannerMode; } break;\n\t\t\t\tcase \"channel_codec\": foreach(var toi in toc) { toi.Codec = Codec; } break;\n\t\t\t\tcase \"channel_codec_is_unencrypted\": foreach(var toi in toc) { toi.IsUnencrypted = IsUnencrypted; } break;\n\t\t\t\tcase \"channel_codec_latency_factor\": foreach(var toi in toc) { toi.CodecLatencyFactor = CodecLatencyFactor; } break;\n\t\t\t\tcase \"channel_codec_quality\": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break;\n\t\t\t\tcase \"channel_delete_delay\": foreach(var toi in toc) { toi.DeleteDelay = DeleteDelay; } break;\n\t\t\t\tcase \"channel_flag_default\": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break;\n\t\t\t\tcase \"channel_flag_maxclients_unlimited\": foreach(var toi in toc) { toi.IsMaxClientsUnlimited = IsMaxClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_inherited\": foreach(var toi in toc) { toi.InheritsMaxFamilyClients = InheritsMaxFamilyClients; } break;\n\t\t\t\tcase \"channel_flag_maxfamilyclients_unlimited\": foreach(var toi in toc) { toi.IsMaxFamilyClientsUnlimited = IsMaxFamilyClientsUnlimited; } break;\n\t\t\t\tcase \"channel_flag_password\": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break;\n\t\t\t\tcase \"channel_flag_permanent\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"channel_flag_private\": foreach(var toi in toc) { toi.IsPrivate = IsPrivate; } break;\n\t\t\t\tcase \"channel_flag_semi_permanent\": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break;\n\t\t\t\tcase \"channel_forced_silence\": foreach(var toi in toc) { toi.ForcedSilence = ForcedSilence; } break;\n\t\t\t\tcase \"channel_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"channel_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"channel_maxfamilyclients\": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break;\n\t\t\t\tcase \"channel_name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"channel_name_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"channel_needed_talk_power\": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break;\n\t\t\t\tcase \"channel_order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\tcase \"channel_topic\": foreach(var toi in toc) { toi.Topic = Topic; } break;\n\t\t\t\tcase \"channel_unique_identifier\": foreach(var toi in toc) { toi.Guid = Guid; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpid\": foreach(var toi in toc) { toi.ParentId = ParentId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelListFinished : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelListFinished;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelListResponse : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic Codec? Codec { get; set; }\n\t\tpublic u8? CodecQuality { get; set; }\n\t\tpublic DurationSeconds? DurationEmpty { get; set; }\n\t\tpublic bool? HasPassword { get; set; }\n\t\tpublic IconHash? IconId { get; set; }\n\t\tpublic bool? IsDefault { get; set; }\n\t\tpublic bool? IsPermanent { get; set; }\n\t\tpublic bool? IsSemiPermanent { get; set; }\n\t\tpublic i32? MaxClients { get; set; }\n\t\tpublic i32? MaxFamilyClients { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 NeededSubscribePower { get; set; }\n\t\tpublic i32? NeededTalkPower { get; set; }\n\t\tpublic ChannelId Order { get; set; }\n\t\tpublic ChannelId ParentChannelId { get; set; }\n\t\tpublic str? Topic { get; set; }\n\t\tpublic i32 TotalClients { get; set; }\n\t\tpublic i32? TotalFamilyClients { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"channel_codec\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Codec = (Codec)oval; } break;\n\t\t\tcase \"channel_codec_quality\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) CodecQuality = (u8)oval; } break;\n\t\t\tcase \"channel_flag_default\": IsDefault = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_password\": HasPassword = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_permanent\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_flag_semi_permanent\": IsSemiPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"channel_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"channel_maxclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxClients = (i32)oval; } break;\n\t\t\tcase \"channel_maxfamilyclients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) MaxFamilyClients = (i32)oval; } break;\n\t\t\tcase \"channel_name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"channel_needed_subscribe_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededSubscribePower = (i32)oval; } break;\n\t\t\tcase \"channel_needed_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededTalkPower = (i32)oval; } break;\n\t\t\tcase \"channel_order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\tcase \"channel_topic\": Topic = (str)TsString.Unescape(value); break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"pid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"seconds_empty\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) DurationEmpty = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"total_clients\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalClients = (i32)oval; } break;\n\t\t\tcase \"total_clients_family\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalFamilyClients = (i32)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelListResponse[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"channel_codec\": foreach(var toi in toc) { toi.Codec = Codec; } break;\n\t\t\t\tcase \"channel_codec_quality\": foreach(var toi in toc) { toi.CodecQuality = CodecQuality; } break;\n\t\t\t\tcase \"channel_flag_default\": foreach(var toi in toc) { toi.IsDefault = IsDefault; } break;\n\t\t\t\tcase \"channel_flag_password\": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break;\n\t\t\t\tcase \"channel_flag_permanent\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"channel_flag_semi_permanent\": foreach(var toi in toc) { toi.IsSemiPermanent = IsSemiPermanent; } break;\n\t\t\t\tcase \"channel_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"channel_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"channel_maxfamilyclients\": foreach(var toi in toc) { toi.MaxFamilyClients = MaxFamilyClients; } break;\n\t\t\t\tcase \"channel_name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"channel_needed_subscribe_power\": foreach(var toi in toc) { toi.NeededSubscribePower = NeededSubscribePower; } break;\n\t\t\t\tcase \"channel_needed_talk_power\": foreach(var toi in toc) { toi.NeededTalkPower = NeededTalkPower; } break;\n\t\t\t\tcase \"channel_order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\tcase \"channel_topic\": foreach(var toi in toc) { toi.Topic = Topic; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"pid\": foreach(var toi in toc) { toi.ParentChannelId = ParentChannelId; } break;\n\t\t\t\tcase \"seconds_empty\": foreach(var toi in toc) { toi.DurationEmpty = DurationEmpty; } break;\n\t\t\t\tcase \"total_clients\": foreach(var toi in toc) { toi.TotalClients = TotalClients; } break;\n\t\t\t\tcase \"total_clients_family\": foreach(var toi in toc) { toi.TotalFamilyClients = TotalFamilyClients; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelMove : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelMove;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ChannelId? Order { get; set; }\n\t\tpublic ChannelId ParentId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break;\n\t\t\tcase \"order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelMove[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpid\": foreach(var toi in toc) { toi.ParentId = ParentId; } break;\n\t\t\t\tcase \"order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelMoved : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelMoved;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic ChannelId Order { get; set; }\n\t\tpublic ChannelId ParentId { get; set; }\n\t\tpublic Reason Reason { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ParentId = (ChannelId)oval; } break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"order\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Order = (ChannelId)oval; } break;\n\t\t\tcase \"reasonid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelMoved[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpid\": foreach(var toi in toc) { toi.ParentId = ParentId; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"order\": foreach(var toi in toc) { toi.Order = Order; } break;\n\t\t\t\tcase \"reasonid\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelPasswordChanged : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelPasswordChanged;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelPasswordChanged[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelPermissionHints : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelPermissionHints;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ChannelPermissionHint Flags { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"flags\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Flags = (ChannelPermissionHint)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelPermissionHints[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"flags\": foreach(var toi in toc) { toi.Flags = Flags; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelPermList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelPermList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic Ts3Permission PermissionId { get; set; }\n\t\tpublic bool PermissionNegated { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permnegated\": PermissionNegated = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permskip\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelPermList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permnegated\": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break;\n\t\t\t\tcase \"permskip\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelPermListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelPermListRequest;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelPermListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelSubscribe : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelSubscribe;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelSubscribe[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelSubscribeAll : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelSubscribeAll;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelSubscribed : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelSubscribed;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic DurationSeconds? EmptySince { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"es\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) EmptySince = TimeSpan.FromSeconds(oval); } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelSubscribed[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"es\": foreach(var toi in toc) { toi.EmptySince = EmptySince; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelUnsubscribe : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelUnsubscribe;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelUnsubscribe[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelUnsubscribeAll : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelUnsubscribeAll;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ChannelUnsubscribed : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ChannelUnsubscribed;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ChannelUnsubscribed[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientAddPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientAddPerm;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permskip\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientAddPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permskip\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientChannelGroupChanged : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientChannelGroupChanged;\n\t\t\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic ChannelGroupId ChannelGroupIndex { get; set; }\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgi\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroupIndex = (ChannelGroupId)oval; } break;\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientChannelGroupChanged[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgi\": foreach(var toi in toc) { toi.ChannelGroupIndex = ChannelGroupIndex; } break;\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientChatClose : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientChatClose;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientChatClose[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientChatClosed : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientChatClosed;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientChatClosed[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientChatComposing : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientChatComposing;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientChatComposing[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientConnectionInfo : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientConnectionInfo;\n\t\t\n\n\t\tpublic u64 BandwidthReceivedLastMinuteControl { get; set; }\n\t\tpublic u64 BandwidthReceivedLastMinuteKeepalive { get; set; }\n\t\tpublic u64 BandwidthReceivedLastMinuteSpeech { get; set; }\n\t\tpublic u64 BandwidthReceivedLastSecondControl { get; set; }\n\t\tpublic u64 BandwidthReceivedLastSecondKeepalive { get; set; }\n\t\tpublic u64 BandwidthReceivedLastSecondSpeech { get; set; }\n\t\tpublic u64 BandwidthSentLastMinuteControl { get; set; }\n\t\tpublic u64 BandwidthSentLastMinuteKeepalive { get; set; }\n\t\tpublic u64 BandwidthSentLastMinuteSpeech { get; set; }\n\t\tpublic u64 BandwidthSentLastSecondControl { get; set; }\n\t\tpublic u64 BandwidthSentLastSecondKeepalive { get; set; }\n\t\tpublic u64 BandwidthSentLastSecondSpeech { get; set; }\n\t\tpublic u64 BytesReceivedControl { get; set; }\n\t\tpublic u64 BytesReceivedKeepalive { get; set; }\n\t\tpublic u64 BytesReceivedSpeech { get; set; }\n\t\tpublic u64 BytesSentControl { get; set; }\n\t\tpublic u64 BytesSentKeepalive { get; set; }\n\t\tpublic u64 BytesSentSpeech { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic f32 ClientToServerPacketlossControl { get; set; }\n\t\tpublic f32 ClientToServerPacketlossKeepalive { get; set; }\n\t\tpublic f32 ClientToServerPacketlossSpeech { get; set; }\n\t\tpublic f32 ClientToServerPacketlossTotal { get; set; }\n\t\tpublic DurationMilliseconds ConnectedTime { get; set; }\n\t\tpublic u64 FiletransferBandwidthReceived { get; set; }\n\t\tpublic u64 FiletransferBandwidthSent { get; set; }\n\t\tpublic DurationMilliseconds IdleTime { get; set; }\n\t\tpublic str Ip { get; set; }\n\t\tpublic u64 PacketsReceivedControl { get; set; }\n\t\tpublic u64 PacketsReceivedKeepalive { get; set; }\n\t\tpublic u64 PacketsReceivedSpeech { get; set; }\n\t\tpublic u64 PacketsSentControl { get; set; }\n\t\tpublic u64 PacketsSentKeepalive { get; set; }\n\t\tpublic u64 PacketsSentSpeech { get; set; }\n\t\tpublic DurationMilliseconds Ping { get; set; }\n\t\tpublic DurationMilliseconds PingDeviation { get; set; }\n\t\tpublic u16 Port { get; set; }\n\t\tpublic f32 ServerToClientPacketlossControl { get; set; }\n\t\tpublic f32 ServerToClientPacketlossKeepalive { get; set; }\n\t\tpublic f32 ServerToClientPacketlossSpeech { get; set; }\n\t\tpublic f32 ServerToClientPacketlossTotal { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"connection_bandwidth_received_last_minute_control\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteControl = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_received_last_minute_keepalive\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteKeepalive = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_received_last_minute_speech\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteSpeech = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_received_last_second_control\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondControl = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_received_last_second_keepalive\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondKeepalive = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_received_last_second_speech\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondSpeech = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_minute_control\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteControl = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_minute_keepalive\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteKeepalive = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_minute_speech\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteSpeech = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_second_control\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondControl = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_second_keepalive\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondKeepalive = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_second_speech\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondSpeech = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_received_control\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedControl = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_received_keepalive\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedKeepalive = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_received_speech\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedSpeech = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_sent_control\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentControl = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_sent_keepalive\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentKeepalive = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_sent_speech\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentSpeech = (u64)oval; } break;\n\t\t\tcase \"connection_client_ip\": Ip = (str)TsString.Unescape(value); break;\n\t\t\tcase \"connection_client_port\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) Port = (u16)oval; } break;\n\t\t\tcase \"connection_client2server_packetloss_control\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ClientToServerPacketlossControl = (f32)oval; } break;\n\t\t\tcase \"connection_client2server_packetloss_keepalive\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ClientToServerPacketlossKeepalive = (f32)oval; } break;\n\t\t\tcase \"connection_client2server_packetloss_speech\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ClientToServerPacketlossSpeech = (f32)oval; } break;\n\t\t\tcase \"connection_client2server_packetloss_total\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ClientToServerPacketlossTotal = (f32)oval; } break;\n\t\t\tcase \"connection_connected_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ConnectedTime = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"connection_filetransfer_bandwidth_received\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthReceived = (u64)oval; } break;\n\t\t\tcase \"connection_filetransfer_bandwidth_sent\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthSent = (u64)oval; } break;\n\t\t\tcase \"connection_idle_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) IdleTime = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"connection_packets_received_control\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedControl = (u64)oval; } break;\n\t\t\tcase \"connection_packets_received_keepalive\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedKeepalive = (u64)oval; } break;\n\t\t\tcase \"connection_packets_received_speech\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedSpeech = (u64)oval; } break;\n\t\t\tcase \"connection_packets_sent_control\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentControl = (u64)oval; } break;\n\t\t\tcase \"connection_packets_sent_keepalive\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentKeepalive = (u64)oval; } break;\n\t\t\tcase \"connection_packets_sent_speech\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentSpeech = (u64)oval; } break;\n\t\t\tcase \"connection_ping\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Ping = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"connection_ping_deviation\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) PingDeviation = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"connection_server2client_packetloss_control\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ServerToClientPacketlossControl = (f32)oval; } break;\n\t\t\tcase \"connection_server2client_packetloss_keepalive\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ServerToClientPacketlossKeepalive = (f32)oval; } break;\n\t\t\tcase \"connection_server2client_packetloss_speech\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ServerToClientPacketlossSpeech = (f32)oval; } break;\n\t\t\tcase \"connection_server2client_packetloss_total\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) ServerToClientPacketlossTotal = (f32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientConnectionInfo[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_minute_control\": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteControl = BandwidthReceivedLastMinuteControl; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_minute_keepalive\": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteKeepalive = BandwidthReceivedLastMinuteKeepalive; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_minute_speech\": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteSpeech = BandwidthReceivedLastMinuteSpeech; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_second_control\": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondControl = BandwidthReceivedLastSecondControl; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_second_keepalive\": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondKeepalive = BandwidthReceivedLastSecondKeepalive; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_second_speech\": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondSpeech = BandwidthReceivedLastSecondSpeech; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_minute_control\": foreach(var toi in toc) { toi.BandwidthSentLastMinuteControl = BandwidthSentLastMinuteControl; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_minute_keepalive\": foreach(var toi in toc) { toi.BandwidthSentLastMinuteKeepalive = BandwidthSentLastMinuteKeepalive; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_minute_speech\": foreach(var toi in toc) { toi.BandwidthSentLastMinuteSpeech = BandwidthSentLastMinuteSpeech; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_second_control\": foreach(var toi in toc) { toi.BandwidthSentLastSecondControl = BandwidthSentLastSecondControl; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_second_keepalive\": foreach(var toi in toc) { toi.BandwidthSentLastSecondKeepalive = BandwidthSentLastSecondKeepalive; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_second_speech\": foreach(var toi in toc) { toi.BandwidthSentLastSecondSpeech = BandwidthSentLastSecondSpeech; } break;\n\t\t\t\tcase \"connection_bytes_received_control\": foreach(var toi in toc) { toi.BytesReceivedControl = BytesReceivedControl; } break;\n\t\t\t\tcase \"connection_bytes_received_keepalive\": foreach(var toi in toc) { toi.BytesReceivedKeepalive = BytesReceivedKeepalive; } break;\n\t\t\t\tcase \"connection_bytes_received_speech\": foreach(var toi in toc) { toi.BytesReceivedSpeech = BytesReceivedSpeech; } break;\n\t\t\t\tcase \"connection_bytes_sent_control\": foreach(var toi in toc) { toi.BytesSentControl = BytesSentControl; } break;\n\t\t\t\tcase \"connection_bytes_sent_keepalive\": foreach(var toi in toc) { toi.BytesSentKeepalive = BytesSentKeepalive; } break;\n\t\t\t\tcase \"connection_bytes_sent_speech\": foreach(var toi in toc) { toi.BytesSentSpeech = BytesSentSpeech; } break;\n\t\t\t\tcase \"connection_client_ip\": foreach(var toi in toc) { toi.Ip = Ip; } break;\n\t\t\t\tcase \"connection_client_port\": foreach(var toi in toc) { toi.Port = Port; } break;\n\t\t\t\tcase \"connection_client2server_packetloss_control\": foreach(var toi in toc) { toi.ClientToServerPacketlossControl = ClientToServerPacketlossControl; } break;\n\t\t\t\tcase \"connection_client2server_packetloss_keepalive\": foreach(var toi in toc) { toi.ClientToServerPacketlossKeepalive = ClientToServerPacketlossKeepalive; } break;\n\t\t\t\tcase \"connection_client2server_packetloss_speech\": foreach(var toi in toc) { toi.ClientToServerPacketlossSpeech = ClientToServerPacketlossSpeech; } break;\n\t\t\t\tcase \"connection_client2server_packetloss_total\": foreach(var toi in toc) { toi.ClientToServerPacketlossTotal = ClientToServerPacketlossTotal; } break;\n\t\t\t\tcase \"connection_connected_time\": foreach(var toi in toc) { toi.ConnectedTime = ConnectedTime; } break;\n\t\t\t\tcase \"connection_filetransfer_bandwidth_received\": foreach(var toi in toc) { toi.FiletransferBandwidthReceived = FiletransferBandwidthReceived; } break;\n\t\t\t\tcase \"connection_filetransfer_bandwidth_sent\": foreach(var toi in toc) { toi.FiletransferBandwidthSent = FiletransferBandwidthSent; } break;\n\t\t\t\tcase \"connection_idle_time\": foreach(var toi in toc) { toi.IdleTime = IdleTime; } break;\n\t\t\t\tcase \"connection_packets_received_control\": foreach(var toi in toc) { toi.PacketsReceivedControl = PacketsReceivedControl; } break;\n\t\t\t\tcase \"connection_packets_received_keepalive\": foreach(var toi in toc) { toi.PacketsReceivedKeepalive = PacketsReceivedKeepalive; } break;\n\t\t\t\tcase \"connection_packets_received_speech\": foreach(var toi in toc) { toi.PacketsReceivedSpeech = PacketsReceivedSpeech; } break;\n\t\t\t\tcase \"connection_packets_sent_control\": foreach(var toi in toc) { toi.PacketsSentControl = PacketsSentControl; } break;\n\t\t\t\tcase \"connection_packets_sent_keepalive\": foreach(var toi in toc) { toi.PacketsSentKeepalive = PacketsSentKeepalive; } break;\n\t\t\t\tcase \"connection_packets_sent_speech\": foreach(var toi in toc) { toi.PacketsSentSpeech = PacketsSentSpeech; } break;\n\t\t\t\tcase \"connection_ping\": foreach(var toi in toc) { toi.Ping = Ping; } break;\n\t\t\t\tcase \"connection_ping_deviation\": foreach(var toi in toc) { toi.PingDeviation = PingDeviation; } break;\n\t\t\t\tcase \"connection_server2client_packetloss_control\": foreach(var toi in toc) { toi.ServerToClientPacketlossControl = ServerToClientPacketlossControl; } break;\n\t\t\t\tcase \"connection_server2client_packetloss_keepalive\": foreach(var toi in toc) { toi.ServerToClientPacketlossKeepalive = ServerToClientPacketlossKeepalive; } break;\n\t\t\t\tcase \"connection_server2client_packetloss_speech\": foreach(var toi in toc) { toi.ServerToClientPacketlossSpeech = ServerToClientPacketlossSpeech; } break;\n\t\t\t\tcase \"connection_server2client_packetloss_total\": foreach(var toi in toc) { toi.ServerToClientPacketlossTotal = ServerToClientPacketlossTotal; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientConnectionInfoRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientConnectionInfoRequest;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientConnectionInfoRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientConnectionInfoUpdateRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientConnectionInfoUpdateRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbDelete : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbDelete;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbDelete[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbEdit : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbEdit;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbEdit[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbFind : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbFind;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic DateTime LastConnected { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 TotalConnections { get; set; }\n\t\tpublic Uid Uid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_lastconnected\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_totalconnections\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break;\n\t\t\tcase \"client_unique_identifier\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbFind[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"client_lastconnected\": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_totalconnections\": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break;\n\t\t\t\tcase \"client_unique_identifier\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbFindRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbFindRequest;\n\t\t\n\n\t\tpublic str Pattern { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"pattern\": Pattern = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbFindRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"pattern\": foreach(var toi in toc) { toi.Pattern = Pattern; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbIdFromUid : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbIdFromUid;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbIdFromUid[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbIdFromUidRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbIdFromUidRequest;\n\t\t\n\n\t\tpublic Uid ClientUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbIdFromUidRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbInfo : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic str AvatarHash { get; set; }\n\t\tpublic str Base64HashClientUid { get; set; }\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic ClientType ClientType { get; set; }\n\t\tpublic DateTime CreationDate { get; set; }\n\t\tpublic ClientDbId DatabaseId { get; set; }\n\t\tpublic str Description { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic DateTime LastConnected { get; set; }\n\t\tpublic str LastIp { get; set; }\n\t\tpublic i64 MonthlyDownloadQuota { get; set; }\n\t\tpublic i64 MonthlyUploadQuota { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 TotalConnections { get; set; }\n\t\tpublic i64 TotalDownloadQuota { get; set; }\n\t\tpublic i64 TotalUploadQuota { get; set; }\n\t\tpublic Uid Uid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"client_base64HashClientUID\": Base64HashClientUid = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_created\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_database_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_flag_avatar\": AvatarHash = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"client_lastconnected\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_lastip\": LastIp = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_month_bytes_downloaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyDownloadQuota = (i64)oval; } break;\n\t\t\tcase \"client_month_bytes_uploaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyUploadQuota = (i64)oval; } break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_total_bytes_downloaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalDownloadQuota = (i64)oval; } break;\n\t\t\tcase \"client_total_bytes_uploaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalUploadQuota = (i64)oval; } break;\n\t\t\tcase \"client_totalconnections\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break;\n\t\t\tcase \"client_type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) ClientType = (ClientType)oval; } break;\n\t\t\tcase \"client_unique_identifier\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbInfo[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"client_base64HashClientUID\": foreach(var toi in toc) { toi.Base64HashClientUid = Base64HashClientUid; } break;\n\t\t\t\tcase \"client_created\": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break;\n\t\t\t\tcase \"client_database_id\": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break;\n\t\t\t\tcase \"client_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"client_flag_avatar\": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break;\n\t\t\t\tcase \"client_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"client_lastconnected\": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break;\n\t\t\t\tcase \"client_lastip\": foreach(var toi in toc) { toi.LastIp = LastIp; } break;\n\t\t\t\tcase \"client_month_bytes_downloaded\": foreach(var toi in toc) { toi.MonthlyDownloadQuota = MonthlyDownloadQuota; } break;\n\t\t\t\tcase \"client_month_bytes_uploaded\": foreach(var toi in toc) { toi.MonthlyUploadQuota = MonthlyUploadQuota; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_total_bytes_downloaded\": foreach(var toi in toc) { toi.TotalDownloadQuota = TotalDownloadQuota; } break;\n\t\t\t\tcase \"client_total_bytes_uploaded\": foreach(var toi in toc) { toi.TotalUploadQuota = TotalUploadQuota; } break;\n\t\t\t\tcase \"client_totalconnections\": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break;\n\t\t\t\tcase \"client_type\": foreach(var toi in toc) { toi.ClientType = ClientType; } break;\n\t\t\t\tcase \"client_unique_identifier\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbInfoRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbInfoRequest;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbInfoRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic DateTime CreationDate { get; set; }\n\t\tpublic str Description { get; set; }\n\t\tpublic DateTime LastConnected { get; set; }\n\t\tpublic str LastIp { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 TotalConnections { get; set; }\n\t\tpublic Uid Uid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_created\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_lastconnected\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_lastip\": LastIp = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_totalconnections\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break;\n\t\t\tcase \"client_unique_identifier\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"client_created\": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break;\n\t\t\t\tcase \"client_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"client_lastconnected\": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break;\n\t\t\t\tcase \"client_lastip\": foreach(var toi in toc) { toi.LastIp = LastIp; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_totalconnections\": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break;\n\t\t\t\tcase \"client_unique_identifier\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDbListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDbListRequest;\n\t\t\n\n\t\tpublic u32? Limit { get; set; }\n\t\tpublic u32? Offset { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"duration\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Limit = (u32)oval; } break;\n\t\t\tcase \"start\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Offset = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDbListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"duration\": foreach(var toi in toc) { toi.Limit = Limit; } break;\n\t\t\t\tcase \"start\": foreach(var toi in toc) { toi.Offset = Offset; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientDelPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientDelPerm;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientDelPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientEdit : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientEdit;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic str? Description { get; set; }\n\t\tpublic bool? TalkPowerGranted { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"client_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_is_talker\": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientEdit[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"client_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"client_is_talker\": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientEnterView : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientEnterView;\n\t\t\n\n\t\tpublic str AvatarHash { get; set; }\n\t\tpublic str AwayMessage { get; set; }\n\t\tpublic str Badges { get; set; }\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic ClientType ClientType { get; set; }\n\t\tpublic str CountryCode { get; set; }\n\t\tpublic ClientDbId DatabaseId { get; set; }\n\t\tpublic str Description { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic ChannelId InheritedChannelGroupFromChannel { get; set; }\n\t\tpublic bool InputHardwareEnabled { get; set; }\n\t\tpublic bool InputMuted { get; set; }\n\t\tpublic str Integrations { get; set; }\n\t\tpublic ClientId? InvokerId { get; set; }\n\t\tpublic str? InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic bool IsAway { get; set; }\n\t\tpublic bool IsChannelCommander { get; set; }\n\t\tpublic bool IsPrioritySpeaker { get; set; }\n\t\tpublic bool IsRecording { get; set; }\n\t\tpublic str Metadata { get; set; }\n\t\tpublic str MyTeamSpeakAvatar { get; set; }\n\t\tpublic str MyTeamSpeakId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 NeededServerqueryViewPower { get; set; }\n\t\tpublic bool OutputHardwareEnabled { get; set; }\n\t\tpublic bool OutputMuted { get; set; }\n\t\tpublic bool OutputOnlyMuted { get; set; }\n\t\tpublic str PhoneticName { get; set; }\n\t\tpublic Reason Reason { get; set; }\n\t\tpublic ServerGroupId[] ServerGroups { get; set; }\n\t\tpublic str SignedBadges { get; set; }\n\t\tpublic ChannelId SourceChannelId { get; set; }\n\t\tpublic i32 TalkPower { get; set; }\n\t\tpublic bool TalkPowerGranted { get; set; }\n\t\tpublic str TalkPowerRequestMessage { get; set; }\n\t\tpublic DateTime TalkPowerRequestTime { get; set; }\n\t\tpublic ChannelId TargetChannelId { get; set; }\n\t\tpublic Uid Uid { get; set; }\n\t\tpublic u32 UnreadMessages { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cfid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SourceChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"client_away\": IsAway = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_away_message\": AwayMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_badges\": Badges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_channel_group_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"client_channel_group_inherited_channel_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) InheritedChannelGroupFromChannel = (ChannelId)oval; } break;\n\t\t\tcase \"client_country\": CountryCode = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_database_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_flag_avatar\": AvatarHash = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"client_input_hardware\": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_input_muted\": InputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_integrations\": Integrations = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_is_channel_commander\": IsChannelCommander = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_priority_speaker\": IsPrioritySpeaker = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_recording\": IsRecording = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_talker\": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_meta_data\": Metadata = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_myteamspeak_avatar\": MyTeamSpeakAvatar = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_myteamspeak_id\": MyTeamSpeakId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_needed_serverquery_view_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededServerqueryViewPower = (i32)oval; } break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_output_hardware\": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_output_muted\": OutputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_outputonly_muted\": OutputOnlyMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_servergroups\": { if(value.Length == 0) ServerGroups = Array.Empty<ServerGroupId>(); else { var ss = new SpanSplitter<byte>(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerGroups = new ServerGroupId[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { { if(Utf8Parser.TryParse(ss.Trim(value), out u64 oval, out _)) ServerGroups[i] = (ServerGroupId)oval; } if (i < cnt) value = ss.Next(value); } } } break;\n\t\t\tcase \"client_signed_badges\": SignedBadges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break;\n\t\t\tcase \"client_talk_request\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TalkPowerRequestTime = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_talk_request_msg\": TalkPowerRequestMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) ClientType = (ClientType)oval; } break;\n\t\t\tcase \"client_unique_identifier\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"client_unread_messages\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) UnreadMessages = (u32)oval; } break;\n\t\t\tcase \"ctid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"reasonid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientEnterView[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cfid\": foreach(var toi in toc) { toi.SourceChannelId = SourceChannelId; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"client_away\": foreach(var toi in toc) { toi.IsAway = IsAway; } break;\n\t\t\t\tcase \"client_away_message\": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break;\n\t\t\t\tcase \"client_badges\": foreach(var toi in toc) { toi.Badges = Badges; } break;\n\t\t\t\tcase \"client_channel_group_id\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"client_channel_group_inherited_channel_id\": foreach(var toi in toc) { toi.InheritedChannelGroupFromChannel = InheritedChannelGroupFromChannel; } break;\n\t\t\t\tcase \"client_country\": foreach(var toi in toc) { toi.CountryCode = CountryCode; } break;\n\t\t\t\tcase \"client_database_id\": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break;\n\t\t\t\tcase \"client_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"client_flag_avatar\": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break;\n\t\t\t\tcase \"client_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"client_input_hardware\": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break;\n\t\t\t\tcase \"client_input_muted\": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break;\n\t\t\t\tcase \"client_integrations\": foreach(var toi in toc) { toi.Integrations = Integrations; } break;\n\t\t\t\tcase \"client_is_channel_commander\": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break;\n\t\t\t\tcase \"client_is_priority_speaker\": foreach(var toi in toc) { toi.IsPrioritySpeaker = IsPrioritySpeaker; } break;\n\t\t\t\tcase \"client_is_recording\": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break;\n\t\t\t\tcase \"client_is_talker\": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break;\n\t\t\t\tcase \"client_meta_data\": foreach(var toi in toc) { toi.Metadata = Metadata; } break;\n\t\t\t\tcase \"client_myteamspeak_avatar\": foreach(var toi in toc) { toi.MyTeamSpeakAvatar = MyTeamSpeakAvatar; } break;\n\t\t\t\tcase \"client_myteamspeak_id\": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break;\n\t\t\t\tcase \"client_needed_serverquery_view_power\": foreach(var toi in toc) { toi.NeededServerqueryViewPower = NeededServerqueryViewPower; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_nickname_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"client_output_hardware\": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break;\n\t\t\t\tcase \"client_output_muted\": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break;\n\t\t\t\tcase \"client_outputonly_muted\": foreach(var toi in toc) { toi.OutputOnlyMuted = OutputOnlyMuted; } break;\n\t\t\t\tcase \"client_servergroups\": foreach(var toi in toc) { toi.ServerGroups = ServerGroups; } break;\n\t\t\t\tcase \"client_signed_badges\": foreach(var toi in toc) { toi.SignedBadges = SignedBadges; } break;\n\t\t\t\tcase \"client_talk_power\": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break;\n\t\t\t\tcase \"client_talk_request\": foreach(var toi in toc) { toi.TalkPowerRequestTime = TalkPowerRequestTime; } break;\n\t\t\t\tcase \"client_talk_request_msg\": foreach(var toi in toc) { toi.TalkPowerRequestMessage = TalkPowerRequestMessage; } break;\n\t\t\t\tcase \"client_type\": foreach(var toi in toc) { toi.ClientType = ClientType; } break;\n\t\t\t\tcase \"client_unique_identifier\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\tcase \"client_unread_messages\": foreach(var toi in toc) { toi.UnreadMessages = UnreadMessages; } break;\n\t\t\t\tcase \"ctid\": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"reasonid\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientFindRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientFindRequest;\n\t\t\n\n\t\tpublic str Pattern { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"pattern\": Pattern = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientFindRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"pattern\": foreach(var toi in toc) { toi.Pattern = Pattern; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientIds : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientIds;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientIds[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientIdsRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientIdsRequest;\n\t\t\n\n\t\tpublic Uid ClientUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientIdsRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientInfo : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic str AvatarHash { get; set; }\n\t\tpublic str AwayMessage { get; set; }\n\t\tpublic str Badges { get; set; }\n\t\tpublic u64 BandwidthReceivedLastMinuteTotal { get; set; }\n\t\tpublic u64 BandwidthReceivedLastSecondTotal { get; set; }\n\t\tpublic u64 BandwidthSentLastMinuteTotal { get; set; }\n\t\tpublic u64 BandwidthSentLastSecondTotal { get; set; }\n\t\tpublic str Base64HashClientUid { get; set; }\n\t\tpublic u64 BytesReceivedTotal { get; set; }\n\t\tpublic u64 BytesSentTotal { get; set; }\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic DurationMilliseconds ClientIdleTime { get; set; }\n\t\tpublic str ClientPlatform { get; set; }\n\t\tpublic ClientType ClientType { get; set; }\n\t\tpublic str ClientVersion { get; set; }\n\t\tpublic str ClientVersionSign { get; set; }\n\t\tpublic DurationMilliseconds ConnectedTime { get; set; }\n\t\tpublic str CountryCode { get; set; }\n\t\tpublic DateTime CreationDate { get; set; }\n\t\tpublic ClientDbId DatabaseId { get; set; }\n\t\tpublic str DefaultChannel { get; set; }\n\t\tpublic str DefaultToken { get; set; }\n\t\tpublic str Description { get; set; }\n\t\tpublic u64 FiletransferBandwidthReceived { get; set; }\n\t\tpublic u64 FiletransferBandwidthSent { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic ChannelId InheritedChannelGroupFromChannel { get; set; }\n\t\tpublic bool InputHardwareEnabled { get; set; }\n\t\tpublic bool InputMuted { get; set; }\n\t\tpublic str? Integrations { get; set; }\n\t\tpublic str Ip { get; set; }\n\t\tpublic bool IsAway { get; set; }\n\t\tpublic bool IsChannelCommander { get; set; }\n\t\tpublic bool IsPrioritySpeaker { get; set; }\n\t\tpublic bool IsRecording { get; set; }\n\t\tpublic DateTime LastConnected { get; set; }\n\t\tpublic str LoginName { get; set; }\n\t\tpublic str Metadata { get; set; }\n\t\tpublic i64 MonthlyDownloadQuota { get; set; }\n\t\tpublic i64 MonthlyUploadQuota { get; set; }\n\t\tpublic str? MyTeamSpeakId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 NeededServerqueryViewPower { get; set; }\n\t\tpublic bool OutputHardwareEnabled { get; set; }\n\t\tpublic bool OutputMuted { get; set; }\n\t\tpublic bool OutputOnlyMuted { get; set; }\n\t\tpublic u64 PacketsReceivedTotal { get; set; }\n\t\tpublic u64 PacketsSentTotal { get; set; }\n\t\tpublic str PhoneticName { get; set; }\n\t\tpublic str SecurityHash { get; set; }\n\t\tpublic ServerGroupId[] ServerGroups { get; set; }\n\t\tpublic i32 TalkPower { get; set; }\n\t\tpublic bool TalkPowerGranted { get; set; }\n\t\tpublic str TalkPowerRequestMessage { get; set; }\n\t\tpublic DateTime TalkPowerRequestTime { get; set; }\n\t\tpublic i32 TotalConnections { get; set; }\n\t\tpublic i64 TotalDownloadQuota { get; set; }\n\t\tpublic i64 TotalUploadQuota { get; set; }\n\t\tpublic Uid Uid { get; set; }\n\t\tpublic u32 UnreadMessages { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"client_away\": IsAway = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_away_message\": AwayMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_badges\": Badges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_base64HashClientUID\": Base64HashClientUid = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_channel_group_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"client_channel_group_inherited_channel_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) InheritedChannelGroupFromChannel = (ChannelId)oval; } break;\n\t\t\tcase \"client_country\": CountryCode = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_created\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_database_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_default_channel\": DefaultChannel = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_default_token\": DefaultToken = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_flag_avatar\": AvatarHash = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"client_idle_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ClientIdleTime = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"client_input_hardware\": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_input_muted\": InputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_integrations\": Integrations = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_is_channel_commander\": IsChannelCommander = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_priority_speaker\": IsPrioritySpeaker = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_recording\": IsRecording = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_talker\": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_lastconnected\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_login_name\": LoginName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_meta_data\": Metadata = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_month_bytes_downloaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyDownloadQuota = (i64)oval; } break;\n\t\t\tcase \"client_month_bytes_uploaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyUploadQuota = (i64)oval; } break;\n\t\t\tcase \"client_myteamspeak_id\": MyTeamSpeakId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_needed_serverquery_view_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededServerqueryViewPower = (i32)oval; } break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_output_hardware\": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_output_muted\": OutputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_outputonly_muted\": OutputOnlyMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_platform\": ClientPlatform = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_security_hash\": SecurityHash = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_servergroups\": { if(value.Length == 0) ServerGroups = Array.Empty<ServerGroupId>(); else { var ss = new SpanSplitter<byte>(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerGroups = new ServerGroupId[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { { if(Utf8Parser.TryParse(ss.Trim(value), out u64 oval, out _)) ServerGroups[i] = (ServerGroupId)oval; } if (i < cnt) value = ss.Next(value); } } } break;\n\t\t\tcase \"client_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break;\n\t\t\tcase \"client_talk_request\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TalkPowerRequestTime = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_talk_request_msg\": TalkPowerRequestMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_total_bytes_downloaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalDownloadQuota = (i64)oval; } break;\n\t\t\tcase \"client_total_bytes_uploaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalUploadQuota = (i64)oval; } break;\n\t\t\tcase \"client_totalconnections\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break;\n\t\t\tcase \"client_type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) ClientType = (ClientType)oval; } break;\n\t\t\tcase \"client_unique_identifier\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"client_unread_messages\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) UnreadMessages = (u32)oval; } break;\n\t\t\tcase \"client_version\": ClientVersion = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_version_sign\": ClientVersionSign = (str)TsString.Unescape(value); break;\n\t\t\tcase \"connection_bandwidth_received_last_minute_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_received_last_second_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_minute_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_second_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_received_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_sent_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentTotal = (u64)oval; } break;\n\t\t\tcase \"connection_client_ip\": Ip = (str)TsString.Unescape(value); break;\n\t\t\tcase \"connection_connected_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ConnectedTime = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"connection_filetransfer_bandwidth_received\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthReceived = (u64)oval; } break;\n\t\t\tcase \"connection_filetransfer_bandwidth_sent\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthSent = (u64)oval; } break;\n\t\t\tcase \"connection_packets_received_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedTotal = (u64)oval; } break;\n\t\t\tcase \"connection_packets_sent_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentTotal = (u64)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientInfo[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"client_away\": foreach(var toi in toc) { toi.IsAway = IsAway; } break;\n\t\t\t\tcase \"client_away_message\": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break;\n\t\t\t\tcase \"client_badges\": foreach(var toi in toc) { toi.Badges = Badges; } break;\n\t\t\t\tcase \"client_base64HashClientUID\": foreach(var toi in toc) { toi.Base64HashClientUid = Base64HashClientUid; } break;\n\t\t\t\tcase \"client_channel_group_id\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"client_channel_group_inherited_channel_id\": foreach(var toi in toc) { toi.InheritedChannelGroupFromChannel = InheritedChannelGroupFromChannel; } break;\n\t\t\t\tcase \"client_country\": foreach(var toi in toc) { toi.CountryCode = CountryCode; } break;\n\t\t\t\tcase \"client_created\": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break;\n\t\t\t\tcase \"client_database_id\": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break;\n\t\t\t\tcase \"client_default_channel\": foreach(var toi in toc) { toi.DefaultChannel = DefaultChannel; } break;\n\t\t\t\tcase \"client_default_token\": foreach(var toi in toc) { toi.DefaultToken = DefaultToken; } break;\n\t\t\t\tcase \"client_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"client_flag_avatar\": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break;\n\t\t\t\tcase \"client_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"client_idle_time\": foreach(var toi in toc) { toi.ClientIdleTime = ClientIdleTime; } break;\n\t\t\t\tcase \"client_input_hardware\": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break;\n\t\t\t\tcase \"client_input_muted\": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break;\n\t\t\t\tcase \"client_integrations\": foreach(var toi in toc) { toi.Integrations = Integrations; } break;\n\t\t\t\tcase \"client_is_channel_commander\": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break;\n\t\t\t\tcase \"client_is_priority_speaker\": foreach(var toi in toc) { toi.IsPrioritySpeaker = IsPrioritySpeaker; } break;\n\t\t\t\tcase \"client_is_recording\": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break;\n\t\t\t\tcase \"client_is_talker\": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break;\n\t\t\t\tcase \"client_lastconnected\": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break;\n\t\t\t\tcase \"client_login_name\": foreach(var toi in toc) { toi.LoginName = LoginName; } break;\n\t\t\t\tcase \"client_meta_data\": foreach(var toi in toc) { toi.Metadata = Metadata; } break;\n\t\t\t\tcase \"client_month_bytes_downloaded\": foreach(var toi in toc) { toi.MonthlyDownloadQuota = MonthlyDownloadQuota; } break;\n\t\t\t\tcase \"client_month_bytes_uploaded\": foreach(var toi in toc) { toi.MonthlyUploadQuota = MonthlyUploadQuota; } break;\n\t\t\t\tcase \"client_myteamspeak_id\": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break;\n\t\t\t\tcase \"client_needed_serverquery_view_power\": foreach(var toi in toc) { toi.NeededServerqueryViewPower = NeededServerqueryViewPower; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_nickname_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"client_output_hardware\": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break;\n\t\t\t\tcase \"client_output_muted\": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break;\n\t\t\t\tcase \"client_outputonly_muted\": foreach(var toi in toc) { toi.OutputOnlyMuted = OutputOnlyMuted; } break;\n\t\t\t\tcase \"client_platform\": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break;\n\t\t\t\tcase \"client_security_hash\": foreach(var toi in toc) { toi.SecurityHash = SecurityHash; } break;\n\t\t\t\tcase \"client_servergroups\": foreach(var toi in toc) { toi.ServerGroups = ServerGroups; } break;\n\t\t\t\tcase \"client_talk_power\": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break;\n\t\t\t\tcase \"client_talk_request\": foreach(var toi in toc) { toi.TalkPowerRequestTime = TalkPowerRequestTime; } break;\n\t\t\t\tcase \"client_talk_request_msg\": foreach(var toi in toc) { toi.TalkPowerRequestMessage = TalkPowerRequestMessage; } break;\n\t\t\t\tcase \"client_total_bytes_downloaded\": foreach(var toi in toc) { toi.TotalDownloadQuota = TotalDownloadQuota; } break;\n\t\t\t\tcase \"client_total_bytes_uploaded\": foreach(var toi in toc) { toi.TotalUploadQuota = TotalUploadQuota; } break;\n\t\t\t\tcase \"client_totalconnections\": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break;\n\t\t\t\tcase \"client_type\": foreach(var toi in toc) { toi.ClientType = ClientType; } break;\n\t\t\t\tcase \"client_unique_identifier\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\tcase \"client_unread_messages\": foreach(var toi in toc) { toi.UnreadMessages = UnreadMessages; } break;\n\t\t\t\tcase \"client_version\": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break;\n\t\t\t\tcase \"client_version_sign\": foreach(var toi in toc) { toi.ClientVersionSign = ClientVersionSign; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_minute_total\": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteTotal = BandwidthReceivedLastMinuteTotal; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_second_total\": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondTotal = BandwidthReceivedLastSecondTotal; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_minute_total\": foreach(var toi in toc) { toi.BandwidthSentLastMinuteTotal = BandwidthSentLastMinuteTotal; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_second_total\": foreach(var toi in toc) { toi.BandwidthSentLastSecondTotal = BandwidthSentLastSecondTotal; } break;\n\t\t\t\tcase \"connection_bytes_received_total\": foreach(var toi in toc) { toi.BytesReceivedTotal = BytesReceivedTotal; } break;\n\t\t\t\tcase \"connection_bytes_sent_total\": foreach(var toi in toc) { toi.BytesSentTotal = BytesSentTotal; } break;\n\t\t\t\tcase \"connection_client_ip\": foreach(var toi in toc) { toi.Ip = Ip; } break;\n\t\t\t\tcase \"connection_connected_time\": foreach(var toi in toc) { toi.ConnectedTime = ConnectedTime; } break;\n\t\t\t\tcase \"connection_filetransfer_bandwidth_received\": foreach(var toi in toc) { toi.FiletransferBandwidthReceived = FiletransferBandwidthReceived; } break;\n\t\t\t\tcase \"connection_filetransfer_bandwidth_sent\": foreach(var toi in toc) { toi.FiletransferBandwidthSent = FiletransferBandwidthSent; } break;\n\t\t\t\tcase \"connection_packets_received_total\": foreach(var toi in toc) { toi.PacketsReceivedTotal = PacketsReceivedTotal; } break;\n\t\t\t\tcase \"connection_packets_sent_total\": foreach(var toi in toc) { toi.PacketsSentTotal = PacketsSentTotal; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientInfoRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientInfoRequest;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientInfoRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientInit : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientInit;\n\t\t\n\n\t\tpublic str? ActiveIntegrationsInfo { get; set; }\n\t\tpublic str? Badges { get; set; }\n\t\tpublic u64 ClientKeyOffset { get; set; }\n\t\tpublic str ClientPlatform { get; set; }\n\t\tpublic str ClientVersion { get; set; }\n\t\tpublic str ClientVersionSign { get; set; }\n\t\tpublic str DefaultChannel { get; set; }\n\t\tpublic str DefaultChannelPassword { get; set; }\n\t\tpublic str DefaultToken { get; set; }\n\t\tpublic str HardwareId { get; set; }\n\t\tpublic bool InputHardwareEnabled { get; set; }\n\t\tpublic str? Integrations { get; set; }\n\t\tpublic str Metadata { get; set; }\n\t\tpublic str? MyTeamSpeakAvatar { get; set; }\n\t\tpublic str? MyTeamSpeakId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic bool OutputHardwareEnabled { get; set; }\n\t\tpublic str Password { get; set; }\n\t\tpublic str PhoneticName { get; set; }\n\t\tpublic str? SecurityHash { get; set; }\n\t\tpublic str? SignedBadges { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"client_active_integrations_info\": ActiveIntegrationsInfo = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_badges\": Badges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_default_channel\": DefaultChannel = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_default_channel_password\": DefaultChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_default_token\": DefaultToken = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_input_hardware\": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_integrations\": Integrations = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_key_offset\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientKeyOffset = (u64)oval; } break;\n\t\t\tcase \"client_meta_data\": Metadata = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_myteamspeak_avatar\": MyTeamSpeakAvatar = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_myteamspeak_id\": MyTeamSpeakId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_output_hardware\": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_platform\": ClientPlatform = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_security_hash\": SecurityHash = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_server_password\": Password = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_signed_badges\": SignedBadges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_version\": ClientVersion = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_version_sign\": ClientVersionSign = (str)TsString.Unescape(value); break;\n\t\t\tcase \"hwid\": HardwareId = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientInit[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"client_active_integrations_info\": foreach(var toi in toc) { toi.ActiveIntegrationsInfo = ActiveIntegrationsInfo; } break;\n\t\t\t\tcase \"client_badges\": foreach(var toi in toc) { toi.Badges = Badges; } break;\n\t\t\t\tcase \"client_default_channel\": foreach(var toi in toc) { toi.DefaultChannel = DefaultChannel; } break;\n\t\t\t\tcase \"client_default_channel_password\": foreach(var toi in toc) { toi.DefaultChannelPassword = DefaultChannelPassword; } break;\n\t\t\t\tcase \"client_default_token\": foreach(var toi in toc) { toi.DefaultToken = DefaultToken; } break;\n\t\t\t\tcase \"client_input_hardware\": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break;\n\t\t\t\tcase \"client_integrations\": foreach(var toi in toc) { toi.Integrations = Integrations; } break;\n\t\t\t\tcase \"client_key_offset\": foreach(var toi in toc) { toi.ClientKeyOffset = ClientKeyOffset; } break;\n\t\t\t\tcase \"client_meta_data\": foreach(var toi in toc) { toi.Metadata = Metadata; } break;\n\t\t\t\tcase \"client_myteamspeak_avatar\": foreach(var toi in toc) { toi.MyTeamSpeakAvatar = MyTeamSpeakAvatar; } break;\n\t\t\t\tcase \"client_myteamspeak_id\": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_nickname_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"client_output_hardware\": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break;\n\t\t\t\tcase \"client_platform\": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break;\n\t\t\t\tcase \"client_security_hash\": foreach(var toi in toc) { toi.SecurityHash = SecurityHash; } break;\n\t\t\t\tcase \"client_server_password\": foreach(var toi in toc) { toi.Password = Password; } break;\n\t\t\t\tcase \"client_signed_badges\": foreach(var toi in toc) { toi.SignedBadges = SignedBadges; } break;\n\t\t\t\tcase \"client_version\": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break;\n\t\t\t\tcase \"client_version_sign\": foreach(var toi in toc) { toi.ClientVersionSign = ClientVersionSign; } break;\n\t\t\t\tcase \"hwid\": foreach(var toi in toc) { toi.HardwareId = HardwareId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientInitIv : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientInitIv;\n\t\t\n\n\t\tpublic str Alpha { get; set; }\n\t\tpublic IpAddr Ip { get; set; }\n\t\tpublic str Omega { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"alpha\": Alpha = (str)TsString.Unescape(value); break;\n\t\t\tcase \"ip\": Ip = (IpAddr)TsString.Unescape(value); break;\n\t\t\tcase \"omega\": Omega = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientInitIv[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"alpha\": foreach(var toi in toc) { toi.Alpha = Alpha; } break;\n\t\t\t\tcase \"ip\": foreach(var toi in toc) { toi.Ip = Ip; } break;\n\t\t\t\tcase \"omega\": foreach(var toi in toc) { toi.Omega = Omega; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientKick : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientKick;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Reason Reason { get; set; }\n\t\tpublic str? ReasonMessage { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"reasonid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break;\n\t\t\tcase \"reasonmsg\": ReasonMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientKick[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"reasonid\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\tcase \"reasonmsg\": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientLeftView : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientLeftView;\n\t\t\n\n\t\tpublic DurationSeconds? BanTime { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic ClientId? InvokerId { get; set; }\n\t\tpublic str? InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic Reason? Reason { get; set; }\n\t\tpublic str? ReasonMessage { get; set; }\n\t\tpublic ChannelId SourceChannelId { get; set; }\n\t\tpublic ChannelId TargetChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"bantime\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) BanTime = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"cfid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SourceChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"ctid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"reasonid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break;\n\t\t\tcase \"reasonmsg\": ReasonMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientLeftView[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"bantime\": foreach(var toi in toc) { toi.BanTime = BanTime; } break;\n\t\t\t\tcase \"cfid\": foreach(var toi in toc) { toi.SourceChannelId = SourceChannelId; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"ctid\": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"reasonid\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\tcase \"reasonmsg\": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientList : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic str? AwayMessage { get; set; }\n\t\tpublic str? Badges { get; set; }\n\t\tpublic ChannelGroupId? ChannelGroup { get; set; }\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic DurationMilliseconds? ClientIdleTime { get; set; }\n\t\tpublic str? ClientPlatform { get; set; }\n\t\tpublic ClientType ClientType { get; set; }\n\t\tpublic str? ClientVersion { get; set; }\n\t\tpublic str? CountryCode { get; set; }\n\t\tpublic DateTime? CreationDate { get; set; }\n\t\tpublic ClientDbId DatabaseId { get; set; }\n\t\tpublic ChannelId? InheritedChannelGroupFromChannel { get; set; }\n\t\tpublic bool? InputHardwareEnabled { get; set; }\n\t\tpublic bool? InputMuted { get; set; }\n\t\tpublic str? Ip { get; set; }\n\t\tpublic bool? IsAway { get; set; }\n\t\tpublic bool? IsChannelCommander { get; set; }\n\t\tpublic bool? IsPrioritySpeaker { get; set; }\n\t\tpublic bool? IsRecording { get; set; }\n\t\tpublic bool? IsTalking { get; set; }\n\t\tpublic DateTime? LastConnected { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic bool? OutputHardwareEnabled { get; set; }\n\t\tpublic bool? OutputMuted { get; set; }\n\t\tpublic ServerGroupId[]? ServerGroups { get; set; }\n\t\tpublic i32? TalkPower { get; set; }\n\t\tpublic bool? TalkPowerGranted { get; set; }\n\t\tpublic Uid? Uid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"client_away\": IsAway = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_away_message\": AwayMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_badges\": Badges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_channel_group_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"client_channel_group_inherited_channel_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) InheritedChannelGroupFromChannel = (ChannelId)oval; } break;\n\t\t\tcase \"client_country\": CountryCode = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_created\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_database_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_flag_talking\": IsTalking = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_idle_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ClientIdleTime = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"client_input_hardware\": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_input_muted\": InputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_channel_commander\": IsChannelCommander = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_priority_speaker\": IsPrioritySpeaker = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_recording\": IsRecording = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_talker\": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_lastconnected\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_output_hardware\": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_output_muted\": OutputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_platform\": ClientPlatform = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_servergroups\": { if(value.Length == 0) ServerGroups = Array.Empty<ServerGroupId>(); else { var ss = new SpanSplitter<byte>(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerGroups = new ServerGroupId[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { { if(Utf8Parser.TryParse(ss.Trim(value), out u64 oval, out _)) ServerGroups[i] = (ServerGroupId)oval; } if (i < cnt) value = ss.Next(value); } } } break;\n\t\t\tcase \"client_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break;\n\t\t\tcase \"client_type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) ClientType = (ClientType)oval; } break;\n\t\t\tcase \"client_unique_identifier\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"client_version\": ClientVersion = (str)TsString.Unescape(value); break;\n\t\t\tcase \"connection_client_ip\": Ip = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"client_away\": foreach(var toi in toc) { toi.IsAway = IsAway; } break;\n\t\t\t\tcase \"client_away_message\": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break;\n\t\t\t\tcase \"client_badges\": foreach(var toi in toc) { toi.Badges = Badges; } break;\n\t\t\t\tcase \"client_channel_group_id\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"client_channel_group_inherited_channel_id\": foreach(var toi in toc) { toi.InheritedChannelGroupFromChannel = InheritedChannelGroupFromChannel; } break;\n\t\t\t\tcase \"client_country\": foreach(var toi in toc) { toi.CountryCode = CountryCode; } break;\n\t\t\t\tcase \"client_created\": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break;\n\t\t\t\tcase \"client_database_id\": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break;\n\t\t\t\tcase \"client_flag_talking\": foreach(var toi in toc) { toi.IsTalking = IsTalking; } break;\n\t\t\t\tcase \"client_idle_time\": foreach(var toi in toc) { toi.ClientIdleTime = ClientIdleTime; } break;\n\t\t\t\tcase \"client_input_hardware\": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break;\n\t\t\t\tcase \"client_input_muted\": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break;\n\t\t\t\tcase \"client_is_channel_commander\": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break;\n\t\t\t\tcase \"client_is_priority_speaker\": foreach(var toi in toc) { toi.IsPrioritySpeaker = IsPrioritySpeaker; } break;\n\t\t\t\tcase \"client_is_recording\": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break;\n\t\t\t\tcase \"client_is_talker\": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break;\n\t\t\t\tcase \"client_lastconnected\": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_output_hardware\": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break;\n\t\t\t\tcase \"client_output_muted\": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break;\n\t\t\t\tcase \"client_platform\": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break;\n\t\t\t\tcase \"client_servergroups\": foreach(var toi in toc) { toi.ServerGroups = ServerGroups; } break;\n\t\t\t\tcase \"client_talk_power\": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break;\n\t\t\t\tcase \"client_type\": foreach(var toi in toc) { toi.ClientType = ClientType; } break;\n\t\t\t\tcase \"client_unique_identifier\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\tcase \"client_version\": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break;\n\t\t\t\tcase \"connection_client_ip\": foreach(var toi in toc) { toi.Ip = Ip; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientMove : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientMove;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str? ChannelPassword { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cpw\": ChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientMove[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cpw\": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientMoved : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientMoved;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic ClientId? InvokerId { get; set; }\n\t\tpublic str? InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic Reason Reason { get; set; }\n\t\tpublic str? ReasonMessage { get; set; }\n\t\tpublic ChannelId TargetChannelId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"ctid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"reasonid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break;\n\t\t\tcase \"reasonmsg\": ReasonMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientMoved[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"ctid\": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"reasonid\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\tcase \"reasonmsg\": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientNameFromDbId : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientNameFromDbId;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientNameFromDbId[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientNameFromDbIdRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientNameFromDbIdRequest;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientNameFromDbIdRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientNameFromUid : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientNameFromUid;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientNameFromUid[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientNameFromUidRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientNameFromUidRequest;\n\t\t\n\n\t\tpublic Uid ClientUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientNameFromUidRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientNeededPermissions : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientNeededPermissions;\n\t\t\n\n\t\tpublic Ts3Permission PermissionId { get; set; }\n\t\tpublic i32? PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientNeededPermissions[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientPermissionHints : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientPermissionHints;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic ClientPermissionHint Flags { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"flags\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Flags = (ClientPermissionHint)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientPermissionHints[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"flags\": foreach(var toi in toc) { toi.Flags = Flags; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientPermList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientPermList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic bool PermissionNegated { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permnegated\": PermissionNegated = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permskip\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientPermList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permnegated\": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permskip\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientPermListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientPermListRequest;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientPermListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientPoke : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientPoke;\n\t\t\n\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic str Message { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"msg\": Message = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientPoke[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"msg\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientPokeRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientPokeRequest;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic str Message { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"msg\": Message = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientPokeRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"msg\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientServerGroupAdded : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientServerGroupAdded;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientServerGroupAdded[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientServerGroupRemoved : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientServerGroupRemoved;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientServerGroupRemoved[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientSetServerQueryLogin : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientSetServerQueryLogin;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic str LoginPassword { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"client_login_password\": LoginPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientSetServerQueryLogin[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"client_login_password\": foreach(var toi in toc) { toi.LoginPassword = LoginPassword; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientSetServerQueryLoginRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientSetServerQueryLoginRequest;\n\t\t\n\n\t\tpublic ClientDbId? ClientDbId { get; set; }\n\t\tpublic str LoginName { get; set; }\n\t\tpublic str? LoginPassword { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_login_name\": LoginName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_login_password\": LoginPassword = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientSetServerQueryLoginRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"client_login_name\": foreach(var toi in toc) { toi.LoginName = LoginName; } break;\n\t\t\t\tcase \"client_login_password\": foreach(var toi in toc) { toi.LoginPassword = LoginPassword; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientUidFromClid : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientUidFromClid;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic str Nickname { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"nickname\": Nickname = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientUidFromClid[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"nickname\": foreach(var toi in toc) { toi.Nickname = Nickname; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientUidFromClidRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientUidFromClidRequest;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientUidFromClidRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientUpdate : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientUpdate;\n\t\t\n\n\t\tpublic str? AvatarHash { get; set; }\n\t\tpublic str? AwayMessage { get; set; }\n\t\tpublic str? Badges { get; set; }\n\t\tpublic bool? InputHardwareEnabled { get; set; }\n\t\tpublic bool? InputMuted { get; set; }\n\t\tpublic bool? IsAway { get; set; }\n\t\tpublic bool? IsChannelCommander { get; set; }\n\t\tpublic bool? IsRecording { get; set; }\n\t\tpublic str? Name { get; set; }\n\t\tpublic bool? OutputHardwareEnabled { get; set; }\n\t\tpublic bool? OutputMuted { get; set; }\n\t\tpublic str? PhoneticName { get; set; }\n\t\tpublic str? TalkPowerRequestMessage { get; set; }\n\t\tpublic DateTime? TalkPowerRequestTime { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"client_away\": IsAway = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_away_message\": AwayMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_badges\": Badges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_flag_avatar\": AvatarHash = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_input_hardware\": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_input_muted\": InputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_channel_commander\": IsChannelCommander = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_recording\": IsRecording = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_output_hardware\": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_output_muted\": OutputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_talk_request\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TalkPowerRequestTime = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_talk_request_msg\": TalkPowerRequestMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientUpdate[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"client_away\": foreach(var toi in toc) { toi.IsAway = IsAway; } break;\n\t\t\t\tcase \"client_away_message\": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break;\n\t\t\t\tcase \"client_badges\": foreach(var toi in toc) { toi.Badges = Badges; } break;\n\t\t\t\tcase \"client_flag_avatar\": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break;\n\t\t\t\tcase \"client_input_hardware\": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break;\n\t\t\t\tcase \"client_input_muted\": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break;\n\t\t\t\tcase \"client_is_channel_commander\": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break;\n\t\t\t\tcase \"client_is_recording\": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_nickname_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"client_output_hardware\": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break;\n\t\t\t\tcase \"client_output_muted\": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break;\n\t\t\t\tcase \"client_talk_request\": foreach(var toi in toc) { toi.TalkPowerRequestTime = TalkPowerRequestTime; } break;\n\t\t\t\tcase \"client_talk_request_msg\": foreach(var toi in toc) { toi.TalkPowerRequestMessage = TalkPowerRequestMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientUpdated : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientUpdated;\n\t\t\n\n\t\tpublic str? AvatarHash { get; set; }\n\t\tpublic str? AwayMessage { get; set; }\n\t\tpublic str? Badges { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic str? ClientPlatform { get; set; }\n\t\tpublic str? ClientVersion { get; set; }\n\t\tpublic DateTime? CreationDate { get; set; }\n\t\tpublic str? Description { get; set; }\n\t\tpublic IconHash? IconId { get; set; }\n\t\tpublic bool? InputHardwareEnabled { get; set; }\n\t\tpublic bool? InputMuted { get; set; }\n\t\tpublic bool? IsAway { get; set; }\n\t\tpublic bool? IsChannelCommander { get; set; }\n\t\tpublic bool? IsPrioritySpeaker { get; set; }\n\t\tpublic bool? IsRecording { get; set; }\n\t\tpublic DateTime? LastConnected { get; set; }\n\t\tpublic str? LoginName { get; set; }\n\t\tpublic i64? MonthlyDownloadQuota { get; set; }\n\t\tpublic i64? MonthlyUploadQuota { get; set; }\n\t\tpublic str? MyTeamSpeakId { get; set; }\n\t\tpublic str? Name { get; set; }\n\t\tpublic bool? OutputHardwareEnabled { get; set; }\n\t\tpublic bool? OutputMuted { get; set; }\n\t\tpublic str? PhoneticName { get; set; }\n\t\tpublic ServerGroupId[]? ServerGroups { get; set; }\n\t\tpublic i32? TalkPower { get; set; }\n\t\tpublic bool? TalkPowerGranted { get; set; }\n\t\tpublic str? TalkPowerRequestMessage { get; set; }\n\t\tpublic DateTime? TalkPowerRequestTime { get; set; }\n\t\tpublic i32? TotalConnections { get; set; }\n\t\tpublic i64? TotalDownloadQuota { get; set; }\n\t\tpublic i64? TotalUploadQuota { get; set; }\n\t\tpublic u32? UnreadMessages { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"client_away\": IsAway = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_away_message\": AwayMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_badges\": Badges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_created\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) CreationDate = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_description\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_flag_avatar\": AvatarHash = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"client_input_hardware\": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_input_muted\": InputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_channel_commander\": IsChannelCommander = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_priority_speaker\": IsPrioritySpeaker = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_recording\": IsRecording = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_is_talker\": TalkPowerGranted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_lastconnected\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) LastConnected = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_login_name\": LoginName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_month_bytes_downloaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyDownloadQuota = (i64)oval; } break;\n\t\t\tcase \"client_month_bytes_uploaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) MonthlyUploadQuota = (i64)oval; } break;\n\t\t\tcase \"client_myteamspeak_id\": MyTeamSpeakId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_output_hardware\": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_output_muted\": OutputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_platform\": ClientPlatform = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_servergroups\": { if(value.Length == 0) ServerGroups = Array.Empty<ServerGroupId>(); else { var ss = new SpanSplitter<byte>(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerGroups = new ServerGroupId[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { { if(Utf8Parser.TryParse(ss.Trim(value), out u64 oval, out _)) ServerGroups[i] = (ServerGroupId)oval; } if (i < cnt) value = ss.Next(value); } } } break;\n\t\t\tcase \"client_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break;\n\t\t\tcase \"client_talk_request\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TalkPowerRequestTime = Tools.FromUnix(oval); } break;\n\t\t\tcase \"client_talk_request_msg\": TalkPowerRequestMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_total_bytes_downloaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalDownloadQuota = (i64)oval; } break;\n\t\t\tcase \"client_total_bytes_uploaded\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) TotalUploadQuota = (i64)oval; } break;\n\t\t\tcase \"client_totalconnections\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TotalConnections = (i32)oval; } break;\n\t\t\tcase \"client_unread_messages\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) UnreadMessages = (u32)oval; } break;\n\t\t\tcase \"client_version\": ClientVersion = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientUpdated[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"client_away\": foreach(var toi in toc) { toi.IsAway = IsAway; } break;\n\t\t\t\tcase \"client_away_message\": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break;\n\t\t\t\tcase \"client_badges\": foreach(var toi in toc) { toi.Badges = Badges; } break;\n\t\t\t\tcase \"client_created\": foreach(var toi in toc) { toi.CreationDate = CreationDate; } break;\n\t\t\t\tcase \"client_description\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"client_flag_avatar\": foreach(var toi in toc) { toi.AvatarHash = AvatarHash; } break;\n\t\t\t\tcase \"client_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"client_input_hardware\": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break;\n\t\t\t\tcase \"client_input_muted\": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break;\n\t\t\t\tcase \"client_is_channel_commander\": foreach(var toi in toc) { toi.IsChannelCommander = IsChannelCommander; } break;\n\t\t\t\tcase \"client_is_priority_speaker\": foreach(var toi in toc) { toi.IsPrioritySpeaker = IsPrioritySpeaker; } break;\n\t\t\t\tcase \"client_is_recording\": foreach(var toi in toc) { toi.IsRecording = IsRecording; } break;\n\t\t\t\tcase \"client_is_talker\": foreach(var toi in toc) { toi.TalkPowerGranted = TalkPowerGranted; } break;\n\t\t\t\tcase \"client_lastconnected\": foreach(var toi in toc) { toi.LastConnected = LastConnected; } break;\n\t\t\t\tcase \"client_login_name\": foreach(var toi in toc) { toi.LoginName = LoginName; } break;\n\t\t\t\tcase \"client_month_bytes_downloaded\": foreach(var toi in toc) { toi.MonthlyDownloadQuota = MonthlyDownloadQuota; } break;\n\t\t\t\tcase \"client_month_bytes_uploaded\": foreach(var toi in toc) { toi.MonthlyUploadQuota = MonthlyUploadQuota; } break;\n\t\t\t\tcase \"client_myteamspeak_id\": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_nickname_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"client_output_hardware\": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break;\n\t\t\t\tcase \"client_output_muted\": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break;\n\t\t\t\tcase \"client_platform\": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break;\n\t\t\t\tcase \"client_servergroups\": foreach(var toi in toc) { toi.ServerGroups = ServerGroups; } break;\n\t\t\t\tcase \"client_talk_power\": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break;\n\t\t\t\tcase \"client_talk_request\": foreach(var toi in toc) { toi.TalkPowerRequestTime = TalkPowerRequestTime; } break;\n\t\t\t\tcase \"client_talk_request_msg\": foreach(var toi in toc) { toi.TalkPowerRequestMessage = TalkPowerRequestMessage; } break;\n\t\t\t\tcase \"client_total_bytes_downloaded\": foreach(var toi in toc) { toi.TotalDownloadQuota = TotalDownloadQuota; } break;\n\t\t\t\tcase \"client_total_bytes_uploaded\": foreach(var toi in toc) { toi.TotalUploadQuota = TotalUploadQuota; } break;\n\t\t\t\tcase \"client_totalconnections\": foreach(var toi in toc) { toi.TotalConnections = TotalConnections; } break;\n\t\t\t\tcase \"client_unread_messages\": foreach(var toi in toc) { toi.UnreadMessages = UnreadMessages; } break;\n\t\t\t\tcase \"client_version\": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ClientVariablesRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ClientVariablesRequest;\n\t\t\n\n\t\tpublic ClientId ClientId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ClientVariablesRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class CommandError : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.CommandError;\n\t\t\n\n\t\tpublic str? ExtraMessage { get; set; }\n\t\tpublic Ts3ErrorCode Id { get; set; }\n\t\tpublic str Message { get; set; }\n\t\tpublic Ts3Permission? MissingPermissionId { get; set; }\n\t\tpublic str? ReturnCode { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"extra_msg\": ExtraMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"failed_permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MissingPermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"id\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Id = (Ts3ErrorCode)oval; } break;\n\t\t\tcase \"msg\": Message = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (CommandError[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"extra_msg\": foreach(var toi in toc) { toi.ExtraMessage = ExtraMessage; } break;\n\t\t\t\tcase \"failed_permid\": foreach(var toi in toc) { toi.MissingPermissionId = MissingPermissionId; } break;\n\t\t\t\tcase \"id\": foreach(var toi in toc) { toi.Id = Id; } break;\n\t\t\t\tcase \"msg\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\tcase \"return_code\": foreach(var toi in toc) { toi.ReturnCode = ReturnCode; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ComplainAdd : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ComplainAdd;\n\t\t\n\n\t\tpublic str Message { get; set; }\n\t\tpublic ClientDbId TargetClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"message\": Message = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tcldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ComplainAdd[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"message\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\tcase \"tcldbid\": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ComplainDel : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ComplainDel;\n\t\t\n\n\t\tpublic ClientDbId FromClientDbId { get; set; }\n\t\tpublic ClientDbId TargetClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"fcldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FromClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"tcldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ComplainDel[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"fcldbid\": foreach(var toi in toc) { toi.FromClientDbId = FromClientDbId; } break;\n\t\t\t\tcase \"tcldbid\": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ComplainDelAll : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ComplainDelAll;\n\t\t\n\n\t\tpublic ClientDbId TargetClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"tcldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ComplainDelAll[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"tcldbid\": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ComplainList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ComplainList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId FromClientDbId { get; set; }\n\t\tpublic str FromName { get; set; }\n\t\tpublic str Message { get; set; }\n\t\tpublic ClientDbId TargetClientDbId { get; set; }\n\t\tpublic str TargetName { get; set; }\n\t\tpublic DateTime Timestamp { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"fcldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FromClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"fname\": FromName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"message\": Message = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tcldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"timestamp\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Timestamp = Tools.FromUnix(oval); } break;\n\t\t\tcase \"tname\": TargetName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ComplainList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"fcldbid\": foreach(var toi in toc) { toi.FromClientDbId = FromClientDbId; } break;\n\t\t\t\tcase \"fname\": foreach(var toi in toc) { toi.FromName = FromName; } break;\n\t\t\t\tcase \"message\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\tcase \"tcldbid\": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break;\n\t\t\t\tcase \"timestamp\": foreach(var toi in toc) { toi.Timestamp = Timestamp; } break;\n\t\t\t\tcase \"tname\": foreach(var toi in toc) { toi.TargetName = TargetName; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ComplainListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ComplainListRequest;\n\t\t\n\n\t\tpublic ClientDbId? TargetClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"tcldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ComplainListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"tcldbid\": foreach(var toi in toc) { toi.TargetClientDbId = TargetClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class CustomDelete : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.CustomDelete;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic str ExternalIdentity { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"ident\": ExternalIdentity = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (CustomDelete[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"ident\": foreach(var toi in toc) { toi.ExternalIdentity = ExternalIdentity; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class CustomInfoRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.CustomInfoRequest;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (CustomInfoRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class CustomSearch : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.CustomSearch;\n\t\t\n\n\t\tpublic str ExternalIdentity { get; set; }\n\t\tpublic str Pattern { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"ident\": ExternalIdentity = (str)TsString.Unescape(value); break;\n\t\t\tcase \"pattern\": Pattern = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (CustomSearch[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"ident\": foreach(var toi in toc) { toi.ExternalIdentity = ExternalIdentity; } break;\n\t\t\t\tcase \"pattern\": foreach(var toi in toc) { toi.Pattern = Pattern; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class CustomSet : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.CustomSet;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic str ExternalIdentity { get; set; }\n\t\tpublic str Value { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"ident\": ExternalIdentity = (str)TsString.Unescape(value); break;\n\t\t\tcase \"value\": Value = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (CustomSet[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"ident\": foreach(var toi in toc) { toi.ExternalIdentity = ExternalIdentity; } break;\n\t\t\t\tcase \"value\": foreach(var toi in toc) { toi.Value = Value; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class Disconnect : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.Disconnect;\n\t\t\n\n\t\tpublic Reason? Reason { get; set; }\n\t\tpublic str? ReasonMessage { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"reasonid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break;\n\t\t\tcase \"reasonmsg\": ReasonMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (Disconnect[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"reasonid\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\tcase \"reasonmsg\": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FileDownload : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FileDownload;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic u16 ClientFileTransferId { get; set; }\n\t\tpublic str FileTransferKey { get; set; }\n\t\tpublic IpAddr? Ip { get; set; }\n\t\tpublic u16 Port { get; set; }\n\t\tpublic u8 Protocol { get; set; }\n\t\tpublic u16 ServerFileTransferId { get; set; }\n\t\tpublic u64 Size { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clientftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break;\n\t\t\tcase \"ftkey\": FileTransferKey = (str)TsString.Unescape(value); break;\n\t\t\tcase \"ip\": Ip = (IpAddr)TsString.Unescape(value); break;\n\t\t\tcase \"port\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) Port = (u16)oval; } break;\n\t\t\tcase \"proto\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Protocol = (u8)oval; } break;\n\t\t\tcase \"serverftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ServerFileTransferId = (u16)oval; } break;\n\t\t\tcase \"size\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FileDownload[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clientftfid\": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break;\n\t\t\t\tcase \"ftkey\": foreach(var toi in toc) { toi.FileTransferKey = FileTransferKey; } break;\n\t\t\t\tcase \"ip\": foreach(var toi in toc) { toi.Ip = Ip; } break;\n\t\t\t\tcase \"port\": foreach(var toi in toc) { toi.Port = Port; } break;\n\t\t\t\tcase \"proto\": foreach(var toi in toc) { toi.Protocol = Protocol; } break;\n\t\t\t\tcase \"serverftfid\": foreach(var toi in toc) { toi.ServerFileTransferId = ServerFileTransferId; } break;\n\t\t\t\tcase \"size\": foreach(var toi in toc) { toi.Size = Size; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FileInfo : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FileInfo;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic DateTime DateTime { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic str Path { get; set; }\n\t\tpublic u64 Size { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"datetime\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) DateTime = Tools.FromUnix(oval); } break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"path\": Path = (str)TsString.Unescape(value); break;\n\t\t\tcase \"size\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FileInfo[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"datetime\": foreach(var toi in toc) { toi.DateTime = DateTime; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"path\": foreach(var toi in toc) { toi.Path = Path; } break;\n\t\t\t\tcase \"size\": foreach(var toi in toc) { toi.Size = Size; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FileList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FileList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic DateTime DateTime { get; set; }\n\t\tpublic bool IsFile { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic str Path { get; set; }\n\t\tpublic u64 Size { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"datetime\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) DateTime = Tools.FromUnix(oval); } break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"path\": Path = (str)TsString.Unescape(value); break;\n\t\t\tcase \"size\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break;\n\t\t\tcase \"type\": IsFile = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FileList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"datetime\": foreach(var toi in toc) { toi.DateTime = DateTime; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"path\": foreach(var toi in toc) { toi.Path = Path; } break;\n\t\t\t\tcase \"size\": foreach(var toi in toc) { toi.Size = Size; } break;\n\t\t\t\tcase \"type\": foreach(var toi in toc) { toi.IsFile = IsFile; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FileListFinished : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FileListFinished;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str Path { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"path\": Path = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FileListFinished[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"path\": foreach(var toi in toc) { toi.Path = Path; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FileTransfer : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FileTransfer;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic f32 AverageSpeed { get; set; }\n\t\tpublic u16 ClientFileTransferId { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic f32 CurrentSpeed { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic str Path { get; set; }\n\t\tpublic DurationSeconds Runtime { get; set; }\n\t\tpublic u64 Sender { get; set; }\n\t\tpublic u16 ServerFileTransferId { get; set; }\n\t\tpublic u64 Size { get; set; }\n\t\tpublic i64 SizeDone { get; set; }\n\t\tpublic i32 Status { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"average_speed\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) AverageSpeed = (f32)oval; } break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"clientftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break;\n\t\t\tcase \"current_speed\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) CurrentSpeed = (f32)oval; } break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"path\": Path = (str)TsString.Unescape(value); break;\n\t\t\tcase \"runtime\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Runtime = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"sender\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Sender = (u64)oval; } break;\n\t\t\tcase \"serverftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ServerFileTransferId = (u16)oval; } break;\n\t\t\tcase \"size\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break;\n\t\t\tcase \"sizedone\": { if(Utf8Parser.TryParse(value, out i64 oval, out _)) SizeDone = (i64)oval; } break;\n\t\t\tcase \"status\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Status = (i32)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FileTransfer[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"average_speed\": foreach(var toi in toc) { toi.AverageSpeed = AverageSpeed; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"clientftfid\": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break;\n\t\t\t\tcase \"current_speed\": foreach(var toi in toc) { toi.CurrentSpeed = CurrentSpeed; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"path\": foreach(var toi in toc) { toi.Path = Path; } break;\n\t\t\t\tcase \"runtime\": foreach(var toi in toc) { toi.Runtime = Runtime; } break;\n\t\t\t\tcase \"sender\": foreach(var toi in toc) { toi.Sender = Sender; } break;\n\t\t\t\tcase \"serverftfid\": foreach(var toi in toc) { toi.ServerFileTransferId = ServerFileTransferId; } break;\n\t\t\t\tcase \"size\": foreach(var toi in toc) { toi.Size = Size; } break;\n\t\t\t\tcase \"sizedone\": foreach(var toi in toc) { toi.SizeDone = SizeDone; } break;\n\t\t\t\tcase \"status\": foreach(var toi in toc) { toi.Status = Status; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FileTransferStatus : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FileTransferStatus;\n\t\t\n\n\t\tpublic u16 ClientFileTransferId { get; set; }\n\t\tpublic str Message { get; set; }\n\t\tpublic u64 Size { get; set; }\n\t\tpublic Ts3ErrorCode Status { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clientftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break;\n\t\t\tcase \"msg\": Message = (str)TsString.Unescape(value); break;\n\t\t\tcase \"size\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break;\n\t\t\tcase \"status\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Status = (Ts3ErrorCode)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FileTransferStatus[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clientftfid\": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break;\n\t\t\t\tcase \"msg\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\tcase \"size\": foreach(var toi in toc) { toi.Size = Size; } break;\n\t\t\t\tcase \"status\": foreach(var toi in toc) { toi.Status = Status; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FileUpload : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FileUpload;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic u16 ClientFileTransferId { get; set; }\n\t\tpublic str FileTransferKey { get; set; }\n\t\tpublic IpAddr? Ip { get; set; }\n\t\tpublic u16 Port { get; set; }\n\t\tpublic u8 Protocol { get; set; }\n\t\tpublic u64 SeekPosition { get; set; }\n\t\tpublic u16 ServerFileTransferId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"clientftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break;\n\t\t\tcase \"ftkey\": FileTransferKey = (str)TsString.Unescape(value); break;\n\t\t\tcase \"ip\": Ip = (IpAddr)TsString.Unescape(value); break;\n\t\t\tcase \"port\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) Port = (u16)oval; } break;\n\t\t\tcase \"proto\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Protocol = (u8)oval; } break;\n\t\t\tcase \"seekpos\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SeekPosition = (u64)oval; } break;\n\t\t\tcase \"serverftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ServerFileTransferId = (u16)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FileUpload[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"clientftfid\": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break;\n\t\t\t\tcase \"ftkey\": foreach(var toi in toc) { toi.FileTransferKey = FileTransferKey; } break;\n\t\t\t\tcase \"ip\": foreach(var toi in toc) { toi.Ip = Ip; } break;\n\t\t\t\tcase \"port\": foreach(var toi in toc) { toi.Port = Port; } break;\n\t\t\t\tcase \"proto\": foreach(var toi in toc) { toi.Protocol = Protocol; } break;\n\t\t\t\tcase \"seekpos\": foreach(var toi in toc) { toi.SeekPosition = SeekPosition; } break;\n\t\t\t\tcase \"serverftfid\": foreach(var toi in toc) { toi.ServerFileTransferId = ServerFileTransferId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FtCreateDir : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtCreateDir;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str ChannelPassword { get; set; }\n\t\tpublic str DirectoryName { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpw\": ChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"dirname\": DirectoryName = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FtCreateDir[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpw\": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break;\n\t\t\t\tcase \"dirname\": foreach(var toi in toc) { toi.DirectoryName = DirectoryName; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FtDeleteFile : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtDeleteFile;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str ChannelPassword { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpw\": ChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FtDeleteFile[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpw\": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FtFileInfoRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtFileInfoRequest;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str ChannelPassword { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpw\": ChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FtFileInfoRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpw\": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FtFileListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtFileListRequest;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str ChannelPassword { get; set; }\n\t\tpublic str Path { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpw\": ChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"path\": Path = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FtFileListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpw\": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break;\n\t\t\t\tcase \"path\": foreach(var toi in toc) { toi.Path = Path; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FtInitDownload : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtInitDownload;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str ChannelPassword { get; set; }\n\t\tpublic u16 ClientFileTransferId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic u8 Protocol { get; set; }\n\t\tpublic u64 SeekPosition { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"clientftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break;\n\t\t\tcase \"cpw\": ChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"proto\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Protocol = (u8)oval; } break;\n\t\t\tcase \"seekpos\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SeekPosition = (u64)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FtInitDownload[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"clientftfid\": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break;\n\t\t\t\tcase \"cpw\": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"proto\": foreach(var toi in toc) { toi.Protocol = Protocol; } break;\n\t\t\t\tcase \"seekpos\": foreach(var toi in toc) { toi.SeekPosition = SeekPosition; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FtInitUpload : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtInitUpload;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str ChannelPassword { get; set; }\n\t\tpublic u16 ClientFileTransferId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic bool Overwrite { get; set; }\n\t\tpublic u8 Protocol { get; set; }\n\t\tpublic bool Resume { get; set; }\n\t\tpublic u64 Size { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"clientftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientFileTransferId = (u16)oval; } break;\n\t\t\tcase \"cpw\": ChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"overwrite\": Overwrite = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"proto\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) Protocol = (u8)oval; } break;\n\t\t\tcase \"resume\": Resume = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"size\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Size = (u64)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FtInitUpload[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"clientftfid\": foreach(var toi in toc) { toi.ClientFileTransferId = ClientFileTransferId; } break;\n\t\t\t\tcase \"cpw\": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"overwrite\": foreach(var toi in toc) { toi.Overwrite = Overwrite; } break;\n\t\t\t\tcase \"proto\": foreach(var toi in toc) { toi.Protocol = Protocol; } break;\n\t\t\t\tcase \"resume\": foreach(var toi in toc) { toi.Resume = Resume; } break;\n\t\t\t\tcase \"size\": foreach(var toi in toc) { toi.Size = Size; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FtList : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtList;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class FtRenameFile : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtRenameFile;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic str ChannelPassword { get; set; }\n\t\tpublic str NewName { get; set; }\n\t\tpublic str OldName { get; set; }\n\t\tpublic ChannelId? TargetChannelId { get; set; }\n\t\tpublic str? TargetChannelPassword { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cpw\": ChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"newname\": NewName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"oldname\": OldName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tcid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"tcpw\": TargetChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FtRenameFile[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cpw\": foreach(var toi in toc) { toi.ChannelPassword = ChannelPassword; } break;\n\t\t\t\tcase \"newname\": foreach(var toi in toc) { toi.NewName = NewName; } break;\n\t\t\t\tcase \"oldname\": foreach(var toi in toc) { toi.OldName = OldName; } break;\n\t\t\t\tcase \"tcid\": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break;\n\t\t\t\tcase \"tcpw\": foreach(var toi in toc) { toi.TargetChannelPassword = TargetChannelPassword; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class FtStop : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.FtStop;\n\t\t\n\n\t\tpublic bool Delete { get; set; }\n\t\tpublic u16 ServerFileTransferId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"delete\": Delete = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"serverftfid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ServerFileTransferId = (u16)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (FtStop[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"delete\": foreach(var toi in toc) { toi.Delete = Delete; } break;\n\t\t\t\tcase \"serverftfid\": foreach(var toi in toc) { toi.ServerFileTransferId = ServerFileTransferId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class GlobalMessage : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.GlobalMessage;\n\t\t\n\n\t\tpublic str Message { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"msg\": Message = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (GlobalMessage[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"msg\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class HostInfoRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.HostInfoRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class InitIvExpand : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.InitIvExpand;\n\t\t\n\n\t\tpublic str Alpha { get; set; }\n\t\tpublic str Beta { get; set; }\n\t\tpublic str Omega { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"alpha\": Alpha = (str)TsString.Unescape(value); break;\n\t\t\tcase \"beta\": Beta = (str)TsString.Unescape(value); break;\n\t\t\tcase \"omega\": Omega = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (InitIvExpand[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"alpha\": foreach(var toi in toc) { toi.Alpha = Alpha; } break;\n\t\t\t\tcase \"beta\": foreach(var toi in toc) { toi.Beta = Beta; } break;\n\t\t\t\tcase \"omega\": foreach(var toi in toc) { toi.Omega = Omega; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class InitIvExpand2 : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.InitIvExpand2;\n\t\t\n\n\t\tpublic str Beta { get; set; }\n\t\tpublic str License { get; set; }\n\t\tpublic str Omega { get; set; }\n\t\tpublic bool Ot { get; set; }\n\t\tpublic str Proof { get; set; }\n\t\tpublic str Tvd { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"beta\": Beta = (str)TsString.Unescape(value); break;\n\t\t\tcase \"l\": License = (str)TsString.Unescape(value); break;\n\t\t\tcase \"omega\": Omega = (str)TsString.Unescape(value); break;\n\t\t\tcase \"ot\": Ot = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"proof\": Proof = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tvd\": Tvd = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (InitIvExpand2[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"beta\": foreach(var toi in toc) { toi.Beta = Beta; } break;\n\t\t\t\tcase \"l\": foreach(var toi in toc) { toi.License = License; } break;\n\t\t\t\tcase \"omega\": foreach(var toi in toc) { toi.Omega = Omega; } break;\n\t\t\t\tcase \"ot\": foreach(var toi in toc) { toi.Ot = Ot; } break;\n\t\t\t\tcase \"proof\": foreach(var toi in toc) { toi.Proof = Proof; } break;\n\t\t\t\tcase \"tvd\": foreach(var toi in toc) { toi.Tvd = Tvd; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class InitServer : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.InitServer;\n\t\t\n\n\t\tpublic str ActiveIntegrationsInfo { get; set; }\n\t\tpublic bool AskForPrivilegekey { get; set; }\n\t\tpublic str AwayMessage { get; set; }\n\t\tpublic str Badges { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic u64 ClientKeyOffset { get; set; }\n\t\tpublic str ClientName { get; set; }\n\t\tpublic str ClientPlatform { get; set; }\n\t\tpublic str ClientVersion { get; set; }\n\t\tpublic str ClientVersionSign { get; set; }\n\t\tpublic CodecEncryptionMode CodecEncryptionMode { get; set; }\n\t\tpublic str DefaultChannel { get; set; }\n\t\tpublic ChannelGroupId DefaultChannelGroup { get; set; }\n\t\tpublic str DefaultChannelPassword { get; set; }\n\t\tpublic ServerGroupId DefaultServerGroup { get; set; }\n\t\tpublic str DefaultToken { get; set; }\n\t\tpublic DurationSeconds HostbannerGfxInterval { get; set; }\n\t\tpublic str HostbannerGfxUrl { get; set; }\n\t\tpublic HostBannerMode HostbannerMode { get; set; }\n\t\tpublic str HostbannerUrl { get; set; }\n\t\tpublic str HostbuttonGfxUrl { get; set; }\n\t\tpublic str HostbuttonTooltip { get; set; }\n\t\tpublic str HostbuttonUrl { get; set; }\n\t\tpublic str Hostmessage { get; set; }\n\t\tpublic HostMessageMode HostmessageMode { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic bool InputHardwareEnabled { get; set; }\n\t\tpublic bool InputMuted { get; set; }\n\t\tpublic str Integrations { get; set; }\n\t\tpublic bool IsAway { get; set; }\n\t\tpublic LicenseType? LicenseType { get; set; }\n\t\tpublic u16 MaxClients { get; set; }\n\t\tpublic str Metadata { get; set; }\n\t\tpublic str MyTeamSpeakAvatar { get; set; }\n\t\tpublic str MyTeamSpeakId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic i32 NeededServerqueryViewPower { get; set; }\n\t\tpublic str Nickname { get; set; }\n\t\tpublic bool OutputHardwareEnabled { get; set; }\n\t\tpublic bool OutputMuted { get; set; }\n\t\tpublic bool OutputOnlyMuted { get; set; }\n\t\tpublic str Password { get; set; }\n\t\tpublic str PhoneticName { get; set; }\n\t\tpublic f32 PrioritySpeakerDimmModificator { get; set; }\n\t\tpublic u16 ProtocolVersion { get; set; }\n\t\tpublic str SecurityHash { get; set; }\n\t\tpublic DateTime ServerCreated { get; set; }\n\t\tpublic IpAddr[] ServerIp { get; set; }\n\t\tpublic str ServerName { get; set; }\n\t\tpublic str ServerPhoneticName { get; set; }\n\t\tpublic str ServerPlatform { get; set; }\n\t\tpublic str ServerVersion { get; set; }\n\t\tpublic str SignedBadges { get; set; }\n\t\tpublic i32 TalkPower { get; set; }\n\t\tpublic DurationSeconds TempChannelDefaultDeleteDelay { get; set; }\n\t\tpublic u64 VirtualServerId { get; set; }\n\t\tpublic str WelcomeMessage { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"aclid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"acn\": ClientName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_active_integrations_info\": ActiveIntegrationsInfo = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_away\": IsAway = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_away_message\": AwayMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_badges\": Badges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_default_channel\": DefaultChannel = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_default_channel_password\": DefaultChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_default_token\": DefaultToken = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_input_hardware\": InputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_input_muted\": InputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_integrations\": Integrations = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_key_offset\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientKeyOffset = (u64)oval; } break;\n\t\t\tcase \"client_meta_data\": Metadata = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_myteamspeak_avatar\": MyTeamSpeakAvatar = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_myteamspeak_id\": MyTeamSpeakId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_needed_serverquery_view_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededServerqueryViewPower = (i32)oval; } break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname_phonetic\": PhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_output_hardware\": OutputHardwareEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_output_muted\": OutputMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_outputonly_muted\": OutputOnlyMuted = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"client_platform\": ClientPlatform = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_security_hash\": SecurityHash = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_server_password\": Password = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_signed_badges\": SignedBadges = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_talk_power\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TalkPower = (i32)oval; } break;\n\t\t\tcase \"client_version\": ClientVersion = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_version_sign\": ClientVersionSign = (str)TsString.Unescape(value); break;\n\t\t\tcase \"lt\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) LicenseType = (LicenseType)oval; } break;\n\t\t\tcase \"pv\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ProtocolVersion = (u16)oval; } break;\n\t\t\tcase \"virtualserver_ask_for_privilegekey\": AskForPrivilegekey = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_channel_temp_delete_delay_default\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) TempChannelDefaultDeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_codec_encryption_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecEncryptionMode = (CodecEncryptionMode)oval; } break;\n\t\t\tcase \"virtualserver_created\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerCreated = Tools.FromUnix(oval); } break;\n\t\t\tcase \"virtualserver_default_channel_group\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"virtualserver_default_server_group\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultServerGroup = (ServerGroupId)oval; } break;\n\t\t\tcase \"virtualserver_hostbanner_gfx_interval\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) HostbannerGfxInterval = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_hostbanner_gfx_url\": HostbannerGfxUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbanner_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostbannerMode = (HostBannerMode)oval; } break;\n\t\t\tcase \"virtualserver_hostbanner_url\": HostbannerUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_gfx_url\": HostbuttonGfxUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_tooltip\": HostbuttonTooltip = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_url\": HostbuttonUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostmessage\": Hostmessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostmessage_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostmessageMode = (HostMessageMode)oval; } break;\n\t\t\tcase \"virtualserver_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"virtualserver_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) VirtualServerId = (u64)oval; } break;\n\t\t\tcase \"virtualserver_ip\": { if(value.Length == 0) ServerIp = Array.Empty<IpAddr>(); else { var ss = new SpanSplitter<byte>(); ss.First(value, (byte)','); int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++; ServerIp = new IpAddr[cnt + 1]; for(int i = 0; i < cnt + 1; i++) { ServerIp[i] = (IpAddr)TsString.Unescape(ss.Trim(value)); if (i < cnt) value = ss.Next(value); } } } break;\n\t\t\tcase \"virtualserver_maxclients\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MaxClients = (u16)oval; } break;\n\t\t\tcase \"virtualserver_name\": ServerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_name_phonetic\": ServerPhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_nickname\": Nickname = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_platform\": ServerPlatform = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_priority_speaker_dimm_modificator\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PrioritySpeakerDimmModificator = (f32)oval; } break;\n\t\t\tcase \"virtualserver_version\": ServerVersion = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_welcomemessage\": WelcomeMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (InitServer[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"aclid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"acn\": foreach(var toi in toc) { toi.ClientName = ClientName; } break;\n\t\t\t\tcase \"client_active_integrations_info\": foreach(var toi in toc) { toi.ActiveIntegrationsInfo = ActiveIntegrationsInfo; } break;\n\t\t\t\tcase \"client_away\": foreach(var toi in toc) { toi.IsAway = IsAway; } break;\n\t\t\t\tcase \"client_away_message\": foreach(var toi in toc) { toi.AwayMessage = AwayMessage; } break;\n\t\t\t\tcase \"client_badges\": foreach(var toi in toc) { toi.Badges = Badges; } break;\n\t\t\t\tcase \"client_default_channel\": foreach(var toi in toc) { toi.DefaultChannel = DefaultChannel; } break;\n\t\t\t\tcase \"client_default_channel_password\": foreach(var toi in toc) { toi.DefaultChannelPassword = DefaultChannelPassword; } break;\n\t\t\t\tcase \"client_default_token\": foreach(var toi in toc) { toi.DefaultToken = DefaultToken; } break;\n\t\t\t\tcase \"client_input_hardware\": foreach(var toi in toc) { toi.InputHardwareEnabled = InputHardwareEnabled; } break;\n\t\t\t\tcase \"client_input_muted\": foreach(var toi in toc) { toi.InputMuted = InputMuted; } break;\n\t\t\t\tcase \"client_integrations\": foreach(var toi in toc) { toi.Integrations = Integrations; } break;\n\t\t\t\tcase \"client_key_offset\": foreach(var toi in toc) { toi.ClientKeyOffset = ClientKeyOffset; } break;\n\t\t\t\tcase \"client_meta_data\": foreach(var toi in toc) { toi.Metadata = Metadata; } break;\n\t\t\t\tcase \"client_myteamspeak_avatar\": foreach(var toi in toc) { toi.MyTeamSpeakAvatar = MyTeamSpeakAvatar; } break;\n\t\t\t\tcase \"client_myteamspeak_id\": foreach(var toi in toc) { toi.MyTeamSpeakId = MyTeamSpeakId; } break;\n\t\t\t\tcase \"client_needed_serverquery_view_power\": foreach(var toi in toc) { toi.NeededServerqueryViewPower = NeededServerqueryViewPower; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_nickname_phonetic\": foreach(var toi in toc) { toi.PhoneticName = PhoneticName; } break;\n\t\t\t\tcase \"client_output_hardware\": foreach(var toi in toc) { toi.OutputHardwareEnabled = OutputHardwareEnabled; } break;\n\t\t\t\tcase \"client_output_muted\": foreach(var toi in toc) { toi.OutputMuted = OutputMuted; } break;\n\t\t\t\tcase \"client_outputonly_muted\": foreach(var toi in toc) { toi.OutputOnlyMuted = OutputOnlyMuted; } break;\n\t\t\t\tcase \"client_platform\": foreach(var toi in toc) { toi.ClientPlatform = ClientPlatform; } break;\n\t\t\t\tcase \"client_security_hash\": foreach(var toi in toc) { toi.SecurityHash = SecurityHash; } break;\n\t\t\t\tcase \"client_server_password\": foreach(var toi in toc) { toi.Password = Password; } break;\n\t\t\t\tcase \"client_signed_badges\": foreach(var toi in toc) { toi.SignedBadges = SignedBadges; } break;\n\t\t\t\tcase \"client_talk_power\": foreach(var toi in toc) { toi.TalkPower = TalkPower; } break;\n\t\t\t\tcase \"client_version\": foreach(var toi in toc) { toi.ClientVersion = ClientVersion; } break;\n\t\t\t\tcase \"client_version_sign\": foreach(var toi in toc) { toi.ClientVersionSign = ClientVersionSign; } break;\n\t\t\t\tcase \"lt\": foreach(var toi in toc) { toi.LicenseType = LicenseType; } break;\n\t\t\t\tcase \"pv\": foreach(var toi in toc) { toi.ProtocolVersion = ProtocolVersion; } break;\n\t\t\t\tcase \"virtualserver_ask_for_privilegekey\": foreach(var toi in toc) { toi.AskForPrivilegekey = AskForPrivilegekey; } break;\n\t\t\t\tcase \"virtualserver_channel_temp_delete_delay_default\": foreach(var toi in toc) { toi.TempChannelDefaultDeleteDelay = TempChannelDefaultDeleteDelay; } break;\n\t\t\t\tcase \"virtualserver_codec_encryption_mode\": foreach(var toi in toc) { toi.CodecEncryptionMode = CodecEncryptionMode; } break;\n\t\t\t\tcase \"virtualserver_created\": foreach(var toi in toc) { toi.ServerCreated = ServerCreated; } break;\n\t\t\t\tcase \"virtualserver_default_channel_group\": foreach(var toi in toc) { toi.DefaultChannelGroup = DefaultChannelGroup; } break;\n\t\t\t\tcase \"virtualserver_default_server_group\": foreach(var toi in toc) { toi.DefaultServerGroup = DefaultServerGroup; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_gfx_interval\": foreach(var toi in toc) { toi.HostbannerGfxInterval = HostbannerGfxInterval; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_gfx_url\": foreach(var toi in toc) { toi.HostbannerGfxUrl = HostbannerGfxUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_mode\": foreach(var toi in toc) { toi.HostbannerMode = HostbannerMode; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_url\": foreach(var toi in toc) { toi.HostbannerUrl = HostbannerUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_gfx_url\": foreach(var toi in toc) { toi.HostbuttonGfxUrl = HostbuttonGfxUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_tooltip\": foreach(var toi in toc) { toi.HostbuttonTooltip = HostbuttonTooltip; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_url\": foreach(var toi in toc) { toi.HostbuttonUrl = HostbuttonUrl; } break;\n\t\t\t\tcase \"virtualserver_hostmessage\": foreach(var toi in toc) { toi.Hostmessage = Hostmessage; } break;\n\t\t\t\tcase \"virtualserver_hostmessage_mode\": foreach(var toi in toc) { toi.HostmessageMode = HostmessageMode; } break;\n\t\t\t\tcase \"virtualserver_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"virtualserver_id\": foreach(var toi in toc) { toi.VirtualServerId = VirtualServerId; } break;\n\t\t\t\tcase \"virtualserver_ip\": foreach(var toi in toc) { toi.ServerIp = ServerIp; } break;\n\t\t\t\tcase \"virtualserver_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"virtualserver_name\": foreach(var toi in toc) { toi.ServerName = ServerName; } break;\n\t\t\t\tcase \"virtualserver_name_phonetic\": foreach(var toi in toc) { toi.ServerPhoneticName = ServerPhoneticName; } break;\n\t\t\t\tcase \"virtualserver_nickname\": foreach(var toi in toc) { toi.Nickname = Nickname; } break;\n\t\t\t\tcase \"virtualserver_platform\": foreach(var toi in toc) { toi.ServerPlatform = ServerPlatform; } break;\n\t\t\t\tcase \"virtualserver_priority_speaker_dimm_modificator\": foreach(var toi in toc) { toi.PrioritySpeakerDimmModificator = PrioritySpeakerDimmModificator; } break;\n\t\t\t\tcase \"virtualserver_version\": foreach(var toi in toc) { toi.ServerVersion = ServerVersion; } break;\n\t\t\t\tcase \"virtualserver_welcomemessage\": foreach(var toi in toc) { toi.WelcomeMessage = WelcomeMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class InstanceEdit : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.InstanceEdit;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class InstanceInfo : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.InstanceInfo;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class LogAdd : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.LogAdd;\n\t\t\n\n\t\tpublic LogLevel LogLevel { get; set; }\n\t\tpublic str LogMessage { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"loglevel\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) LogLevel = (LogLevel)oval; } break;\n\t\t\tcase \"logmsg\": LogMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (LogAdd[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"loglevel\": foreach(var toi in toc) { toi.LogLevel = LogLevel; } break;\n\t\t\t\tcase \"logmsg\": foreach(var toi in toc) { toi.LogMessage = LogMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class Login : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.Login;\n\t\t\n\n\t\tpublic str LoginName { get; set; }\n\t\tpublic str LoginPassword { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"client_login_name\": LoginName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_login_password\": LoginPassword = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (Login[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"client_login_name\": foreach(var toi in toc) { toi.LoginName = LoginName; } break;\n\t\t\t\tcase \"client_login_password\": foreach(var toi in toc) { toi.LoginPassword = LoginPassword; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class Logout : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.Logout;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class LogView : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.LogView;\n\t\t\n\n\t\tpublic bool? InstanceLog { get; set; }\n\t\tpublic u32? Lines { get; set; }\n\t\tpublic u64? Offset { get; set; }\n\t\tpublic bool? Reverse { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"begin_pos\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Offset = (u64)oval; } break;\n\t\t\tcase \"instance\": InstanceLog = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"lines\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Lines = (u32)oval; } break;\n\t\t\tcase \"reverse\": Reverse = value.Length > 0 && value[0] != '0'; break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (LogView[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"begin_pos\": foreach(var toi in toc) { toi.Offset = Offset; } break;\n\t\t\t\tcase \"instance\": foreach(var toi in toc) { toi.InstanceLog = InstanceLog; } break;\n\t\t\t\tcase \"lines\": foreach(var toi in toc) { toi.Lines = Lines; } break;\n\t\t\t\tcase \"reverse\": foreach(var toi in toc) { toi.Reverse = Reverse; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class OfflineMessage : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.OfflineMessage;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic str Message { get; set; }\n\t\tpublic u32 MessageId { get; set; }\n\t\tpublic str Subject { get; set; }\n\t\tpublic DateTime Timestamp { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"message\": Message = (str)TsString.Unescape(value); break;\n\t\t\tcase \"msgid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break;\n\t\t\tcase \"subject\": Subject = (str)TsString.Unescape(value); break;\n\t\t\tcase \"timestamp\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Timestamp = Tools.FromUnix(oval); } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (OfflineMessage[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"message\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\tcase \"msgid\": foreach(var toi in toc) { toi.MessageId = MessageId; } break;\n\t\t\t\tcase \"subject\": foreach(var toi in toc) { toi.Subject = Subject; } break;\n\t\t\t\tcase \"timestamp\": foreach(var toi in toc) { toi.Timestamp = Timestamp; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class OfflineMessageAdd : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.OfflineMessageAdd;\n\t\t\n\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic str Message { get; set; }\n\t\tpublic str Subject { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"message\": Message = (str)TsString.Unescape(value); break;\n\t\t\tcase \"subject\": Subject = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (OfflineMessageAdd[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"message\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\tcase \"subject\": foreach(var toi in toc) { toi.Subject = Subject; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class OfflineMessageDel : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.OfflineMessageDel;\n\t\t\n\n\t\tpublic u32 MessageId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"msgid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (OfflineMessageDel[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"msgid\": foreach(var toi in toc) { toi.MessageId = MessageId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class OfflineMessageGet : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.OfflineMessageGet;\n\t\t\n\n\t\tpublic u32 MessageId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"msgid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (OfflineMessageGet[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"msgid\": foreach(var toi in toc) { toi.MessageId = MessageId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class OfflineMessageList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.OfflineMessageList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic bool IsRead { get; set; }\n\t\tpublic u32 MessageId { get; set; }\n\t\tpublic str Subject { get; set; }\n\t\tpublic DateTime Timestamp { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"flag_read\": IsRead = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"msgid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break;\n\t\t\tcase \"subject\": Subject = (str)TsString.Unescape(value); break;\n\t\t\tcase \"timestamp\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Timestamp = Tools.FromUnix(oval); } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (OfflineMessageList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"flag_read\": foreach(var toi in toc) { toi.IsRead = IsRead; } break;\n\t\t\t\tcase \"msgid\": foreach(var toi in toc) { toi.MessageId = MessageId; } break;\n\t\t\t\tcase \"subject\": foreach(var toi in toc) { toi.Subject = Subject; } break;\n\t\t\t\tcase \"timestamp\": foreach(var toi in toc) { toi.Timestamp = Timestamp; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class OfflineMessageListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.OfflineMessageListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class OfflineMessageUpdateFlag : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.OfflineMessageUpdateFlag;\n\t\t\n\n\t\tpublic bool IsRead { get; set; }\n\t\tpublic u32 MessageId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"flag\": IsRead = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"msgid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MessageId = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (OfflineMessageUpdateFlag[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"flag\": foreach(var toi in toc) { toi.IsRead = IsRead; } break;\n\t\t\t\tcase \"msgid\": foreach(var toi in toc) { toi.MessageId = MessageId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PermFind : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermFind;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic u64 Id1 { get; set; }\n\t\tpublic u64 Id2 { get; set; }\n\t\tpublic Ts3Permission PermissionId { get; set; }\n\t\tpublic PermissionType PermissionType { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"id1\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id1 = (u64)oval; } break;\n\t\t\tcase \"id2\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id2 = (u64)oval; } break;\n\t\t\tcase \"p\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"t\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionType = (PermissionType)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PermFind[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"id1\": foreach(var toi in toc) { toi.Id1 = Id1; } break;\n\t\t\t\tcase \"id2\": foreach(var toi in toc) { toi.Id2 = Id2; } break;\n\t\t\t\tcase \"p\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"t\": foreach(var toi in toc) { toi.PermissionType = PermissionType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PermFindRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermFindRequest;\n\t\t\n\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PermFindRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PermIdByNameRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermIdByNameRequest;\n\t\t\n\n\t\tpublic str PermissionNameId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PermIdByNameRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PermList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic Ts3Permission GroupIdEnd { get; set; }\n\t\tpublic str PermissionDescription { get; set; }\n\t\tpublic Ts3Permission PermissionId { get; set; }\n\t\tpublic str PermissionName { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"group_id_end\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) GroupIdEnd = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permdesc\": PermissionDescription = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permname\": PermissionName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PermList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"group_id_end\": foreach(var toi in toc) { toi.GroupIdEnd = GroupIdEnd; } break;\n\t\t\t\tcase \"permdesc\": foreach(var toi in toc) { toi.PermissionDescription = PermissionDescription; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permname\": foreach(var toi in toc) { toi.PermissionName = PermissionName; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PermListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class PermOverview : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermOverview;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic u64 Id1 { get; set; }\n\t\tpublic u64 Id2 { get; set; }\n\t\tpublic Ts3Permission PermissionId { get; set; }\n\t\tpublic bool PermissionNegated { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic PermissionType PermissionType { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"id1\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id1 = (u64)oval; } break;\n\t\t\tcase \"id2\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id2 = (u64)oval; } break;\n\t\t\tcase \"n\": PermissionNegated = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"p\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"s\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"t\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionType = (PermissionType)oval; } break;\n\t\t\tcase \"v\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PermOverview[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"id1\": foreach(var toi in toc) { toi.Id1 = Id1; } break;\n\t\t\t\tcase \"id2\": foreach(var toi in toc) { toi.Id2 = Id2; } break;\n\t\t\t\tcase \"n\": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break;\n\t\t\t\tcase \"p\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"s\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"t\": foreach(var toi in toc) { toi.PermissionType = PermissionType; } break;\n\t\t\t\tcase \"v\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PermOverviewRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermOverviewRequest;\n\t\t\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PermOverviewRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PermRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermRequest;\n\t\t\n\n\t\tpublic Ts3Permission PermissionId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PermRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PermReset : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PermReset;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class PluginCommand : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PluginCommand;\n\t\t\n\n\t\tpublic str Data { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"data\": Data = (str)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PluginCommand[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"data\": foreach(var toi in toc) { toi.Data = Data; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PluginCommandRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PluginCommandRequest;\n\t\t\n\n\t\tpublic str Data { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic PluginTargetMode Target { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"data\": Data = (str)TsString.Unescape(value); break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"targetmode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Target = (PluginTargetMode)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PluginCommandRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"data\": foreach(var toi in toc) { toi.Data = Data; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"targetmode\": foreach(var toi in toc) { toi.Target = Target; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PrivilegeKeyAddRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PrivilegeKeyAddRequest;\n\t\t\n\n\t\tpublic str? TokenCustomSet { get; set; }\n\t\tpublic str? TokenDescription { get; set; }\n\t\tpublic u64 TokenId1 { get; set; }\n\t\tpublic ChannelId TokenId2 { get; set; }\n\t\tpublic TokenType TokenType { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"tokencustomset\": TokenCustomSet = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tokendescription\": TokenDescription = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tokenid1\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId1 = (u64)oval; } break;\n\t\t\tcase \"tokenid2\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId2 = (ChannelId)oval; } break;\n\t\t\tcase \"tokentype\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TokenType = (TokenType)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PrivilegeKeyAddRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"tokencustomset\": foreach(var toi in toc) { toi.TokenCustomSet = TokenCustomSet; } break;\n\t\t\t\tcase \"tokendescription\": foreach(var toi in toc) { toi.TokenDescription = TokenDescription; } break;\n\t\t\t\tcase \"tokenid1\": foreach(var toi in toc) { toi.TokenId1 = TokenId1; } break;\n\t\t\t\tcase \"tokenid2\": foreach(var toi in toc) { toi.TokenId2 = TokenId2; } break;\n\t\t\t\tcase \"tokentype\": foreach(var toi in toc) { toi.TokenType = TokenType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PrivilegeKeyDelete : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PrivilegeKeyDelete;\n\t\t\n\n\t\tpublic str Token { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"token\": Token = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PrivilegeKeyDelete[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"token\": foreach(var toi in toc) { toi.Token = Token; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class PrivilegeKeyListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PrivilegeKeyListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class PrivilegeKeyUse : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.PrivilegeKeyUse;\n\t\t\n\n\t\tpublic str Token { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"token\": Token = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (PrivilegeKeyUse[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"token\": foreach(var toi in toc) { toi.Token = Token; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class Quit : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.Quit;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class SendTextMessage : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.SendTextMessage;\n\t\t\n\n\t\tpublic str Message { get; set; }\n\t\tpublic TextMessageTargetMode Target { get; set; }\n\t\tpublic ClientId? TargetClientId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"msg\": Message = (str)TsString.Unescape(value); break;\n\t\t\tcase \"target\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) TargetClientId = (ClientId)oval; } break;\n\t\t\tcase \"targetmode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Target = (TextMessageTargetMode)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (SendTextMessage[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"msg\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\tcase \"target\": foreach(var toi in toc) { toi.TargetClientId = TargetClientId; } break;\n\t\t\t\tcase \"targetmode\": foreach(var toi in toc) { toi.Target = Target; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerConnectionInfo : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerConnectionInfo;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic u64 BandwidthReceivedLastMinuteTotal { get; set; }\n\t\tpublic u64 BandwidthReceivedLastSecondTotal { get; set; }\n\t\tpublic u64 BandwidthSentLastMinuteTotal { get; set; }\n\t\tpublic u64 BandwidthSentLastSecondTotal { get; set; }\n\t\tpublic u64 BytesReceivedTotal { get; set; }\n\t\tpublic u64 BytesSentTotal { get; set; }\n\t\tpublic DurationMilliseconds ConnectedTime { get; set; }\n\t\tpublic u64 FiletransferBandwidthReceived { get; set; }\n\t\tpublic u64 FiletransferBandwidthSent { get; set; }\n\t\tpublic u64 FiletransferBytesReceivedTotal { get; set; }\n\t\tpublic u64 FiletransferBytesSentTotal { get; set; }\n\t\tpublic f32 PacketlossTotal { get; set; }\n\t\tpublic u64 PacketsReceivedTotal { get; set; }\n\t\tpublic u64 PacketsSentTotal { get; set; }\n\t\tpublic DurationMilliseconds Ping { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"connection_bandwidth_received_last_minute_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastMinuteTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_received_last_second_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthReceivedLastSecondTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_minute_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastMinuteTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bandwidth_sent_last_second_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BandwidthSentLastSecondTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_received_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesReceivedTotal = (u64)oval; } break;\n\t\t\tcase \"connection_bytes_sent_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesSentTotal = (u64)oval; } break;\n\t\t\tcase \"connection_connected_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ConnectedTime = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"connection_filetransfer_bandwidth_received\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthReceived = (u64)oval; } break;\n\t\t\tcase \"connection_filetransfer_bandwidth_sent\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBandwidthSent = (u64)oval; } break;\n\t\t\tcase \"connection_filetransfer_bytes_received_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBytesReceivedTotal = (u64)oval; } break;\n\t\t\tcase \"connection_filetransfer_bytes_sent_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FiletransferBytesSentTotal = (u64)oval; } break;\n\t\t\tcase \"connection_packetloss_total\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotal = (f32)oval; } break;\n\t\t\tcase \"connection_packets_received_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsReceivedTotal = (u64)oval; } break;\n\t\t\tcase \"connection_packets_sent_total\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) PacketsSentTotal = (u64)oval; } break;\n\t\t\tcase \"connection_ping\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Ping = TimeSpan.FromMilliseconds(oval); } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerConnectionInfo[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"connection_bandwidth_received_last_minute_total\": foreach(var toi in toc) { toi.BandwidthReceivedLastMinuteTotal = BandwidthReceivedLastMinuteTotal; } break;\n\t\t\t\tcase \"connection_bandwidth_received_last_second_total\": foreach(var toi in toc) { toi.BandwidthReceivedLastSecondTotal = BandwidthReceivedLastSecondTotal; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_minute_total\": foreach(var toi in toc) { toi.BandwidthSentLastMinuteTotal = BandwidthSentLastMinuteTotal; } break;\n\t\t\t\tcase \"connection_bandwidth_sent_last_second_total\": foreach(var toi in toc) { toi.BandwidthSentLastSecondTotal = BandwidthSentLastSecondTotal; } break;\n\t\t\t\tcase \"connection_bytes_received_total\": foreach(var toi in toc) { toi.BytesReceivedTotal = BytesReceivedTotal; } break;\n\t\t\t\tcase \"connection_bytes_sent_total\": foreach(var toi in toc) { toi.BytesSentTotal = BytesSentTotal; } break;\n\t\t\t\tcase \"connection_connected_time\": foreach(var toi in toc) { toi.ConnectedTime = ConnectedTime; } break;\n\t\t\t\tcase \"connection_filetransfer_bandwidth_received\": foreach(var toi in toc) { toi.FiletransferBandwidthReceived = FiletransferBandwidthReceived; } break;\n\t\t\t\tcase \"connection_filetransfer_bandwidth_sent\": foreach(var toi in toc) { toi.FiletransferBandwidthSent = FiletransferBandwidthSent; } break;\n\t\t\t\tcase \"connection_filetransfer_bytes_received_total\": foreach(var toi in toc) { toi.FiletransferBytesReceivedTotal = FiletransferBytesReceivedTotal; } break;\n\t\t\t\tcase \"connection_filetransfer_bytes_sent_total\": foreach(var toi in toc) { toi.FiletransferBytesSentTotal = FiletransferBytesSentTotal; } break;\n\t\t\t\tcase \"connection_packetloss_total\": foreach(var toi in toc) { toi.PacketlossTotal = PacketlossTotal; } break;\n\t\t\t\tcase \"connection_packets_received_total\": foreach(var toi in toc) { toi.PacketsReceivedTotal = PacketsReceivedTotal; } break;\n\t\t\t\tcase \"connection_packets_sent_total\": foreach(var toi in toc) { toi.PacketsSentTotal = PacketsSentTotal; } break;\n\t\t\t\tcase \"connection_ping\": foreach(var toi in toc) { toi.Ping = Ping; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerConnectionInfoRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerConnectionInfoRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerCreate : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerCreate;\n\t\t\n\n\t\tpublic str ServerName { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"virtualserver_name\": ServerName = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerCreate[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"virtualserver_name\": foreach(var toi in toc) { toi.ServerName = ServerName; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerDelete : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerDelete;\n\t\t\n\n\t\tpublic u32 ServerId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"sid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerDelete[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"sid\": foreach(var toi in toc) { toi.ServerId = ServerId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerEdit : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerEdit;\n\t\t\n\n\t\tpublic u32? AntifloodPointsTickReduce { get; set; }\n\t\tpublic u32? AntifloodPointsToCommandBlock { get; set; }\n\t\tpublic u32? AntifloodPointsToIpBlock { get; set; }\n\t\tpublic CodecEncryptionMode? CodecEncryptionMode { get; set; }\n\t\tpublic u32? ComplainAutobanCount { get; set; }\n\t\tpublic DurationSeconds? ComplainAutobanTime { get; set; }\n\t\tpublic DurationSeconds? ComplainRemoveTime { get; set; }\n\t\tpublic ChannelGroupId? DefaultChannelAdminGroup { get; set; }\n\t\tpublic ChannelGroupId? DefaultChannelGroup { get; set; }\n\t\tpublic ServerGroupId? DefaultServerGroup { get; set; }\n\t\tpublic u64? DownloadQuota { get; set; }\n\t\tpublic DurationSeconds? HostbannerGfxInterval { get; set; }\n\t\tpublic str? HostbannerGfxUrl { get; set; }\n\t\tpublic HostBannerMode? HostbannerMode { get; set; }\n\t\tpublic str? HostbannerUrl { get; set; }\n\t\tpublic str? HostbuttonGfxUrl { get; set; }\n\t\tpublic str? HostbuttonTooltip { get; set; }\n\t\tpublic str? HostbuttonUrl { get; set; }\n\t\tpublic str? Hostmessage { get; set; }\n\t\tpublic HostMessageMode? HostmessageMode { get; set; }\n\t\tpublic IconHash? IconId { get; set; }\n\t\tpublic u8? IdentitySecurityLevel { get; set; }\n\t\tpublic bool? LogChannel { get; set; }\n\t\tpublic bool? LogClient { get; set; }\n\t\tpublic bool? LogFileTransfer { get; set; }\n\t\tpublic bool? LogPermissions { get; set; }\n\t\tpublic bool? LogQuery { get; set; }\n\t\tpublic bool? LogServer { get; set; }\n\t\tpublic u16? MaxClients { get; set; }\n\t\tpublic u64? MaxDownloadTotalBandwidth { get; set; }\n\t\tpublic u64? MaxUploadTotalBandwidth { get; set; }\n\t\tpublic u32? MinClientsInChannelBeforeForcedSilence { get; set; }\n\t\tpublic str? Nickname { get; set; }\n\t\tpublic f32? PrioritySpeakerDimmModificator { get; set; }\n\t\tpublic u16? ReservedSlots { get; set; }\n\t\tpublic u32 ServerId { get; set; }\n\t\tpublic str? ServerName { get; set; }\n\t\tpublic str? ServerPassword { get; set; }\n\t\tpublic str? ServerPhoneticName { get; set; }\n\t\tpublic DurationSeconds? TempChannelDefaultDeleteDelay { get; set; }\n\t\tpublic u64? UploadQuota { get; set; }\n\t\tpublic bool? WeblistEnabled { get; set; }\n\t\tpublic str? WelcomeMessage { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"sid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break;\n\t\t\tcase \"virtualserver_antiflood_points_needed_command_block\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToCommandBlock = (u32)oval; } break;\n\t\t\tcase \"virtualserver_antiflood_points_needed_ip_block\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToIpBlock = (u32)oval; } break;\n\t\t\tcase \"virtualserver_antiflood_points_tick_reduce\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsTickReduce = (u32)oval; } break;\n\t\t\tcase \"virtualserver_channel_temp_delete_delay_default\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) TempChannelDefaultDeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_codec_encryption_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecEncryptionMode = (CodecEncryptionMode)oval; } break;\n\t\t\tcase \"virtualserver_complain_autoban_count\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ComplainAutobanCount = (u32)oval; } break;\n\t\t\tcase \"virtualserver_complain_autoban_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ComplainAutobanTime = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_complain_remove_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ComplainRemoveTime = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_default_channel_admin_group\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelAdminGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"virtualserver_default_channel_group\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"virtualserver_default_server_group\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultServerGroup = (ServerGroupId)oval; } break;\n\t\t\tcase \"virtualserver_download_quota\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DownloadQuota = (u64)oval; } break;\n\t\t\tcase \"virtualserver_hostbanner_gfx_interval\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) HostbannerGfxInterval = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_hostbanner_gfx_url\": HostbannerGfxUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbanner_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostbannerMode = (HostBannerMode)oval; } break;\n\t\t\tcase \"virtualserver_hostbanner_url\": HostbannerUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_gfx_url\": HostbuttonGfxUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_tooltip\": HostbuttonTooltip = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_url\": HostbuttonUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostmessage\": Hostmessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostmessage_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostmessageMode = (HostMessageMode)oval; } break;\n\t\t\tcase \"virtualserver_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"virtualserver_log_channel\": LogChannel = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_client\": LogClient = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_filetransfer\": LogFileTransfer = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_permissions\": LogPermissions = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_query\": LogQuery = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_server\": LogServer = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_max_download_total_bandwidth\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) MaxDownloadTotalBandwidth = (u64)oval; } break;\n\t\t\tcase \"virtualserver_max_upload_total_bandwidth\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) MaxUploadTotalBandwidth = (u64)oval; } break;\n\t\t\tcase \"virtualserver_maxclients\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MaxClients = (u16)oval; } break;\n\t\t\tcase \"virtualserver_min_clients_in_channel_before_forced_silence\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinClientsInChannelBeforeForcedSilence = (u32)oval; } break;\n\t\t\tcase \"virtualserver_name\": ServerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_name_phonetic\": ServerPhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_needed_identity_security_level\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) IdentitySecurityLevel = (u8)oval; } break;\n\t\t\tcase \"virtualserver_nickname\": Nickname = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_password\": ServerPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_priority_speaker_dimm_modificator\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PrioritySpeakerDimmModificator = (f32)oval; } break;\n\t\t\tcase \"virtualserver_reserved_slots\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ReservedSlots = (u16)oval; } break;\n\t\t\tcase \"virtualserver_upload_quota\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) UploadQuota = (u64)oval; } break;\n\t\t\tcase \"virtualserver_weblist_enabled\": WeblistEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_welcomemessage\": WelcomeMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerEdit[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"sid\": foreach(var toi in toc) { toi.ServerId = ServerId; } break;\n\t\t\t\tcase \"virtualserver_antiflood_points_needed_command_block\": foreach(var toi in toc) { toi.AntifloodPointsToCommandBlock = AntifloodPointsToCommandBlock; } break;\n\t\t\t\tcase \"virtualserver_antiflood_points_needed_ip_block\": foreach(var toi in toc) { toi.AntifloodPointsToIpBlock = AntifloodPointsToIpBlock; } break;\n\t\t\t\tcase \"virtualserver_antiflood_points_tick_reduce\": foreach(var toi in toc) { toi.AntifloodPointsTickReduce = AntifloodPointsTickReduce; } break;\n\t\t\t\tcase \"virtualserver_channel_temp_delete_delay_default\": foreach(var toi in toc) { toi.TempChannelDefaultDeleteDelay = TempChannelDefaultDeleteDelay; } break;\n\t\t\t\tcase \"virtualserver_codec_encryption_mode\": foreach(var toi in toc) { toi.CodecEncryptionMode = CodecEncryptionMode; } break;\n\t\t\t\tcase \"virtualserver_complain_autoban_count\": foreach(var toi in toc) { toi.ComplainAutobanCount = ComplainAutobanCount; } break;\n\t\t\t\tcase \"virtualserver_complain_autoban_time\": foreach(var toi in toc) { toi.ComplainAutobanTime = ComplainAutobanTime; } break;\n\t\t\t\tcase \"virtualserver_complain_remove_time\": foreach(var toi in toc) { toi.ComplainRemoveTime = ComplainRemoveTime; } break;\n\t\t\t\tcase \"virtualserver_default_channel_admin_group\": foreach(var toi in toc) { toi.DefaultChannelAdminGroup = DefaultChannelAdminGroup; } break;\n\t\t\t\tcase \"virtualserver_default_channel_group\": foreach(var toi in toc) { toi.DefaultChannelGroup = DefaultChannelGroup; } break;\n\t\t\t\tcase \"virtualserver_default_server_group\": foreach(var toi in toc) { toi.DefaultServerGroup = DefaultServerGroup; } break;\n\t\t\t\tcase \"virtualserver_download_quota\": foreach(var toi in toc) { toi.DownloadQuota = DownloadQuota; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_gfx_interval\": foreach(var toi in toc) { toi.HostbannerGfxInterval = HostbannerGfxInterval; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_gfx_url\": foreach(var toi in toc) { toi.HostbannerGfxUrl = HostbannerGfxUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_mode\": foreach(var toi in toc) { toi.HostbannerMode = HostbannerMode; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_url\": foreach(var toi in toc) { toi.HostbannerUrl = HostbannerUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_gfx_url\": foreach(var toi in toc) { toi.HostbuttonGfxUrl = HostbuttonGfxUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_tooltip\": foreach(var toi in toc) { toi.HostbuttonTooltip = HostbuttonTooltip; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_url\": foreach(var toi in toc) { toi.HostbuttonUrl = HostbuttonUrl; } break;\n\t\t\t\tcase \"virtualserver_hostmessage\": foreach(var toi in toc) { toi.Hostmessage = Hostmessage; } break;\n\t\t\t\tcase \"virtualserver_hostmessage_mode\": foreach(var toi in toc) { toi.HostmessageMode = HostmessageMode; } break;\n\t\t\t\tcase \"virtualserver_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"virtualserver_log_channel\": foreach(var toi in toc) { toi.LogChannel = LogChannel; } break;\n\t\t\t\tcase \"virtualserver_log_client\": foreach(var toi in toc) { toi.LogClient = LogClient; } break;\n\t\t\t\tcase \"virtualserver_log_filetransfer\": foreach(var toi in toc) { toi.LogFileTransfer = LogFileTransfer; } break;\n\t\t\t\tcase \"virtualserver_log_permissions\": foreach(var toi in toc) { toi.LogPermissions = LogPermissions; } break;\n\t\t\t\tcase \"virtualserver_log_query\": foreach(var toi in toc) { toi.LogQuery = LogQuery; } break;\n\t\t\t\tcase \"virtualserver_log_server\": foreach(var toi in toc) { toi.LogServer = LogServer; } break;\n\t\t\t\tcase \"virtualserver_max_download_total_bandwidth\": foreach(var toi in toc) { toi.MaxDownloadTotalBandwidth = MaxDownloadTotalBandwidth; } break;\n\t\t\t\tcase \"virtualserver_max_upload_total_bandwidth\": foreach(var toi in toc) { toi.MaxUploadTotalBandwidth = MaxUploadTotalBandwidth; } break;\n\t\t\t\tcase \"virtualserver_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"virtualserver_min_clients_in_channel_before_forced_silence\": foreach(var toi in toc) { toi.MinClientsInChannelBeforeForcedSilence = MinClientsInChannelBeforeForcedSilence; } break;\n\t\t\t\tcase \"virtualserver_name\": foreach(var toi in toc) { toi.ServerName = ServerName; } break;\n\t\t\t\tcase \"virtualserver_name_phonetic\": foreach(var toi in toc) { toi.ServerPhoneticName = ServerPhoneticName; } break;\n\t\t\t\tcase \"virtualserver_needed_identity_security_level\": foreach(var toi in toc) { toi.IdentitySecurityLevel = IdentitySecurityLevel; } break;\n\t\t\t\tcase \"virtualserver_nickname\": foreach(var toi in toc) { toi.Nickname = Nickname; } break;\n\t\t\t\tcase \"virtualserver_password\": foreach(var toi in toc) { toi.ServerPassword = ServerPassword; } break;\n\t\t\t\tcase \"virtualserver_priority_speaker_dimm_modificator\": foreach(var toi in toc) { toi.PrioritySpeakerDimmModificator = PrioritySpeakerDimmModificator; } break;\n\t\t\t\tcase \"virtualserver_reserved_slots\": foreach(var toi in toc) { toi.ReservedSlots = ReservedSlots; } break;\n\t\t\t\tcase \"virtualserver_upload_quota\": foreach(var toi in toc) { toi.UploadQuota = UploadQuota; } break;\n\t\t\t\tcase \"virtualserver_weblist_enabled\": foreach(var toi in toc) { toi.WeblistEnabled = WeblistEnabled; } break;\n\t\t\t\tcase \"virtualserver_welcomemessage\": foreach(var toi in toc) { toi.WelcomeMessage = WelcomeMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerEdited : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerEdited;\n\t\t\n\n\t\tpublic CodecEncryptionMode? CodecEncryptionMode { get; set; }\n\t\tpublic ChannelGroupId? DefaultChannelGroup { get; set; }\n\t\tpublic ServerGroupId? DefaultServerGroup { get; set; }\n\t\tpublic DurationSeconds? HostbannerGfxInterval { get; set; }\n\t\tpublic str? HostbannerGfxUrl { get; set; }\n\t\tpublic HostBannerMode? HostbannerMode { get; set; }\n\t\tpublic str? HostbannerUrl { get; set; }\n\t\tpublic str? HostbuttonGfxUrl { get; set; }\n\t\tpublic str? HostbuttonTooltip { get; set; }\n\t\tpublic str? HostbuttonUrl { get; set; }\n\t\tpublic IconHash? IconId { get; set; }\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic str? Nickname { get; set; }\n\t\tpublic f32? PrioritySpeakerDimmModificator { get; set; }\n\t\tpublic Reason Reason { get; set; }\n\t\tpublic str? ServerName { get; set; }\n\t\tpublic str? ServerPhoneticName { get; set; }\n\t\tpublic DurationSeconds? TempChannelDefaultDeleteDelay { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"reasonid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Reason = (Reason)oval; } break;\n\t\t\tcase \"virtualserver_channel_temp_delete_delay_default\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) TempChannelDefaultDeleteDelay = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_codec_encryption_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) CodecEncryptionMode = (CodecEncryptionMode)oval; } break;\n\t\t\tcase \"virtualserver_default_channel_group\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"virtualserver_default_server_group\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultServerGroup = (ServerGroupId)oval; } break;\n\t\t\tcase \"virtualserver_hostbanner_gfx_interval\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) HostbannerGfxInterval = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_hostbanner_gfx_url\": HostbannerGfxUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbanner_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostbannerMode = (HostBannerMode)oval; } break;\n\t\t\tcase \"virtualserver_hostbanner_url\": HostbannerUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_gfx_url\": HostbuttonGfxUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_tooltip\": HostbuttonTooltip = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostbutton_url\": HostbuttonUrl = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_icon_id\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"virtualserver_name\": ServerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_name_phonetic\": ServerPhoneticName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_nickname\": Nickname = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_priority_speaker_dimm_modificator\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PrioritySpeakerDimmModificator = (f32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerEdited[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"reasonid\": foreach(var toi in toc) { toi.Reason = Reason; } break;\n\t\t\t\tcase \"virtualserver_channel_temp_delete_delay_default\": foreach(var toi in toc) { toi.TempChannelDefaultDeleteDelay = TempChannelDefaultDeleteDelay; } break;\n\t\t\t\tcase \"virtualserver_codec_encryption_mode\": foreach(var toi in toc) { toi.CodecEncryptionMode = CodecEncryptionMode; } break;\n\t\t\t\tcase \"virtualserver_default_channel_group\": foreach(var toi in toc) { toi.DefaultChannelGroup = DefaultChannelGroup; } break;\n\t\t\t\tcase \"virtualserver_default_server_group\": foreach(var toi in toc) { toi.DefaultServerGroup = DefaultServerGroup; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_gfx_interval\": foreach(var toi in toc) { toi.HostbannerGfxInterval = HostbannerGfxInterval; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_gfx_url\": foreach(var toi in toc) { toi.HostbannerGfxUrl = HostbannerGfxUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_mode\": foreach(var toi in toc) { toi.HostbannerMode = HostbannerMode; } break;\n\t\t\t\tcase \"virtualserver_hostbanner_url\": foreach(var toi in toc) { toi.HostbannerUrl = HostbannerUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_gfx_url\": foreach(var toi in toc) { toi.HostbuttonGfxUrl = HostbuttonGfxUrl; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_tooltip\": foreach(var toi in toc) { toi.HostbuttonTooltip = HostbuttonTooltip; } break;\n\t\t\t\tcase \"virtualserver_hostbutton_url\": foreach(var toi in toc) { toi.HostbuttonUrl = HostbuttonUrl; } break;\n\t\t\t\tcase \"virtualserver_icon_id\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"virtualserver_name\": foreach(var toi in toc) { toi.ServerName = ServerName; } break;\n\t\t\t\tcase \"virtualserver_name_phonetic\": foreach(var toi in toc) { toi.ServerPhoneticName = ServerPhoneticName; } break;\n\t\t\t\tcase \"virtualserver_nickname\": foreach(var toi in toc) { toi.Nickname = Nickname; } break;\n\t\t\t\tcase \"virtualserver_priority_speaker_dimm_modificator\": foreach(var toi in toc) { toi.PrioritySpeakerDimmModificator = PrioritySpeakerDimmModificator; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupAdd : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupAdd;\n\t\t\n\n\t\tpublic GroupType? GroupType { get; set; }\n\t\tpublic str Name { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupAdd[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"type\": foreach(var toi in toc) { toi.GroupType = GroupType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupAddClient : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupAddClient;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupAddClient[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupAddPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupAddPerm;\n\t\t\n\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic bool PermissionNegated { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permnegated\": PermissionNegated = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permskip\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupAddPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permnegated\": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permskip\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupAddResponse : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupAddResponse[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupAutoAddPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupAutoAddPerm;\n\t\t\n\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic bool PermissionNegated { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\tpublic u32 ServerGroupType { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permnegated\": PermissionNegated = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permskip\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\tcase \"sgtype\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerGroupType = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupAutoAddPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permnegated\": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permskip\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\tcase \"sgtype\": foreach(var toi in toc) { toi.ServerGroupType = ServerGroupType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupAutoDelPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupAutoDelPerm;\n\t\t\n\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic u32 ServerGroupType { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"sgtype\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerGroupType = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupAutoDelPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"sgtype\": foreach(var toi in toc) { toi.ServerGroupType = ServerGroupType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupClientList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupClientList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic str? Name { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\tpublic Uid? Uid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_unique_identifier\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupClientList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_unique_identifier\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupClientListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupClientListRequest;\n\t\t\n\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupClientListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupCopy : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupCopy;\n\t\t\n\n\t\tpublic GroupType GroupType { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic ServerGroupId SourceServerGroupId { get; set; }\n\t\tpublic ServerGroupId TargetServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"ssgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) SourceServerGroupId = (ServerGroupId)oval; } break;\n\t\t\tcase \"tsgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetServerGroupId = (ServerGroupId)oval; } break;\n\t\t\tcase \"type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupCopy[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"ssgid\": foreach(var toi in toc) { toi.SourceServerGroupId = SourceServerGroupId; } break;\n\t\t\t\tcase \"tsgid\": foreach(var toi in toc) { toi.TargetServerGroupId = TargetServerGroupId; } break;\n\t\t\t\tcase \"type\": foreach(var toi in toc) { toi.GroupType = GroupType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupDel : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupDel;\n\t\t\n\n\t\tpublic bool Force { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"force\": Force = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupDel[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"force\": foreach(var toi in toc) { toi.Force = Force; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupDelClient : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupDelClient;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupDelClient[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupDelPerm : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupDelPerm;\n\t\t\n\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupDelPerm[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic GroupType GroupType { get; set; }\n\t\tpublic IconHash IconId { get; set; }\n\t\tpublic bool IsPermanent { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic GroupNamingMode NamingMode { get; set; }\n\t\tpublic i32 NeededMemberAddPower { get; set; }\n\t\tpublic i32? NeededMemberRemovePower { get; set; }\n\t\tpublic i32 NeededModifyPower { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\tpublic i32 SortId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"iconid\": { if(!value.IsEmpty && value[0] == (u8)'-') { if(Utf8Parser.TryParse(value, out i32 oval, out _)) IconId = oval; } else { if(Utf8Parser.TryParse(value, out u64 oval, out _)) IconId = unchecked((i32)oval); } } break;\n\t\t\tcase \"n_member_addp\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededMemberAddPower = (i32)oval; } break;\n\t\t\tcase \"n_member_removep\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededMemberRemovePower = (i32)oval; } break;\n\t\t\tcase \"n_modifyp\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NeededModifyPower = (i32)oval; } break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"namemode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) NamingMode = (GroupNamingMode)oval; } break;\n\t\t\tcase \"savedb\": IsPermanent = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\tcase \"sortid\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) SortId = (i32)oval; } break;\n\t\t\tcase \"type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) GroupType = (GroupType)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"iconid\": foreach(var toi in toc) { toi.IconId = IconId; } break;\n\t\t\t\tcase \"n_member_addp\": foreach(var toi in toc) { toi.NeededMemberAddPower = NeededMemberAddPower; } break;\n\t\t\t\tcase \"n_member_removep\": foreach(var toi in toc) { toi.NeededMemberRemovePower = NeededMemberRemovePower; } break;\n\t\t\t\tcase \"n_modifyp\": foreach(var toi in toc) { toi.NeededModifyPower = NeededModifyPower; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"namemode\": foreach(var toi in toc) { toi.NamingMode = NamingMode; } break;\n\t\t\t\tcase \"savedb\": foreach(var toi in toc) { toi.IsPermanent = IsPermanent; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\tcase \"sortid\": foreach(var toi in toc) { toi.SortId = SortId; } break;\n\t\t\t\tcase \"type\": foreach(var toi in toc) { toi.GroupType = GroupType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupPermList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupPermList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic Ts3Permission? PermissionId { get; set; }\n\t\tpublic str? PermissionNameId { get; set; }\n\t\tpublic bool PermissionNegated { get; set; }\n\t\tpublic bool PermissionSkip { get; set; }\n\t\tpublic i32 PermissionValue { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"permid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) PermissionId = ser.PermissionTransform.GetName(oval); } break;\n\t\t\tcase \"permnegated\": PermissionNegated = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permsid\": PermissionNameId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"permskip\": PermissionSkip = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"permvalue\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) PermissionValue = (i32)oval; } break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupPermList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"permid\": foreach(var toi in toc) { toi.PermissionId = PermissionId; } break;\n\t\t\t\tcase \"permnegated\": foreach(var toi in toc) { toi.PermissionNegated = PermissionNegated; } break;\n\t\t\t\tcase \"permsid\": foreach(var toi in toc) { toi.PermissionNameId = PermissionNameId; } break;\n\t\t\t\tcase \"permskip\": foreach(var toi in toc) { toi.PermissionSkip = PermissionSkip; } break;\n\t\t\t\tcase \"permvalue\": foreach(var toi in toc) { toi.PermissionValue = PermissionValue; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupPermListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupPermListRequest;\n\t\t\n\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupPermListRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupRename : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupRename;\n\t\t\n\n\t\tpublic str Name { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupRename[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupsByClientId : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupsByClientId;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic ServerGroupId ServerGroupId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"name\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"sgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ServerGroupId = (ServerGroupId)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupsByClientId[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"name\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"sgid\": foreach(var toi in toc) { toi.ServerGroupId = ServerGroupId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerGroupsByClientIdRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerGroupsByClientIdRequest;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerGroupsByClientIdRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerIdGetByPort : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerIdGetByPort;\n\t\t\n\n\t\tpublic u16 VirtualServerPort { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"virtualserver_port\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) VirtualServerPort = (u16)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerIdGetByPort[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"virtualserver_port\": foreach(var toi in toc) { toi.VirtualServerPort = VirtualServerPort; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerInfo : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerInfo;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerListResponse : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic bool? Autostart { get; set; }\n\t\tpublic u16? ClientsOnline { get; set; }\n\t\tpublic str? MachineId { get; set; }\n\t\tpublic u16? MaxClients { get; set; }\n\t\tpublic u16? QueriesOnline { get; set; }\n\t\tpublic str? ServerName { get; set; }\n\t\tpublic DurationSeconds? Uptime { get; set; }\n\t\tpublic u64 VirtualServerId { get; set; }\n\t\tpublic u16 VirtualServerPort { get; set; }\n\t\tpublic str VirtualServerStatus { get; set; }\n\t\tpublic Uid? VirtualServerUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"virtualserver_autostart\": Autostart = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_clientsonline\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientsOnline = (u16)oval; } break;\n\t\t\tcase \"virtualserver_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) VirtualServerId = (u64)oval; } break;\n\t\t\tcase \"virtualserver_machine_id\": MachineId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_maxclients\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MaxClients = (u16)oval; } break;\n\t\t\tcase \"virtualserver_name\": ServerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_port\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) VirtualServerPort = (u16)oval; } break;\n\t\t\tcase \"virtualserver_queryclientsonline\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) QueriesOnline = (u16)oval; } break;\n\t\t\tcase \"virtualserver_status\": VirtualServerStatus = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_unique_identifier\": VirtualServerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_uptime\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Uptime = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerListResponse[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"virtualserver_autostart\": foreach(var toi in toc) { toi.Autostart = Autostart; } break;\n\t\t\t\tcase \"virtualserver_clientsonline\": foreach(var toi in toc) { toi.ClientsOnline = ClientsOnline; } break;\n\t\t\t\tcase \"virtualserver_id\": foreach(var toi in toc) { toi.VirtualServerId = VirtualServerId; } break;\n\t\t\t\tcase \"virtualserver_machine_id\": foreach(var toi in toc) { toi.MachineId = MachineId; } break;\n\t\t\t\tcase \"virtualserver_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"virtualserver_name\": foreach(var toi in toc) { toi.ServerName = ServerName; } break;\n\t\t\t\tcase \"virtualserver_port\": foreach(var toi in toc) { toi.VirtualServerPort = VirtualServerPort; } break;\n\t\t\t\tcase \"virtualserver_queryclientsonline\": foreach(var toi in toc) { toi.QueriesOnline = QueriesOnline; } break;\n\t\t\t\tcase \"virtualserver_status\": foreach(var toi in toc) { toi.VirtualServerStatus = VirtualServerStatus; } break;\n\t\t\t\tcase \"virtualserver_unique_identifier\": foreach(var toi in toc) { toi.VirtualServerUid = VirtualServerUid; } break;\n\t\t\t\tcase \"virtualserver_uptime\": foreach(var toi in toc) { toi.Uptime = Uptime; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerLog : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerLog;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic u64 FileSize { get; set; }\n\t\tpublic u64 LastOffset { get; set; }\n\t\tpublic str License { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"file_size\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) FileSize = (u64)oval; } break;\n\t\t\tcase \"l\": License = (str)TsString.Unescape(value); break;\n\t\t\tcase \"last_pos\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) LastOffset = (u64)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerLog[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"file_size\": foreach(var toi in toc) { toi.FileSize = FileSize; } break;\n\t\t\t\tcase \"l\": foreach(var toi in toc) { toi.License = License; } break;\n\t\t\t\tcase \"last_pos\": foreach(var toi in toc) { toi.LastOffset = LastOffset; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerNotifyRegister : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerNotifyRegister;\n\t\t\n\n\t\tpublic str EventType { get; set; }\n\t\tpublic ChannelId? Id { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"event\": EventType = (str)TsString.Unescape(value); break;\n\t\t\tcase \"id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) Id = (ChannelId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerNotifyRegister[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"event\": foreach(var toi in toc) { toi.EventType = EventType; } break;\n\t\t\t\tcase \"id\": foreach(var toi in toc) { toi.Id = Id; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerNotifyUnregister : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerNotifyUnregister;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerProcessStop : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerProcessStop;\n\t\t\n\n\t\tpublic str? ReasonMessage { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"reasonmsg\": ReasonMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerProcessStop[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"reasonmsg\": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerSnapshotCreate : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerSnapshotCreate;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerSnapshotDeploy : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerSnapshotDeploy;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerStart : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerStart;\n\t\t\n\n\t\tpublic u32 ServerId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"sid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerStart[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"sid\": foreach(var toi in toc) { toi.ServerId = ServerId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerStop : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerStop;\n\t\t\n\n\t\tpublic str? ReasonMessage { get; set; }\n\t\tpublic u32 ServerId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"reasonmsg\": ReasonMessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"sid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerStop[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"reasonmsg\": foreach(var toi in toc) { toi.ReasonMessage = ReasonMessage; } break;\n\t\t\t\tcase \"sid\": foreach(var toi in toc) { toi.ServerId = ServerId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerTempPasswordAdd : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerTempPasswordAdd;\n\t\t\n\n\t\tpublic str Description { get; set; }\n\t\tpublic DurationSeconds Duration { get; set; }\n\t\tpublic str Password { get; set; }\n\t\tpublic ChannelId TargetChannelId { get; set; }\n\t\tpublic str TargetChannelPassword { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"desc\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"duration\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Duration = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"pw\": Password = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tcid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"tcpw\": TargetChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerTempPasswordAdd[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"desc\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"duration\": foreach(var toi in toc) { toi.Duration = Duration; } break;\n\t\t\t\tcase \"pw\": foreach(var toi in toc) { toi.Password = Password; } break;\n\t\t\t\tcase \"tcid\": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break;\n\t\t\t\tcase \"tcpw\": foreach(var toi in toc) { toi.TargetChannelPassword = TargetChannelPassword; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerTempPasswordDel : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerTempPasswordDel;\n\t\t\n\n\t\tpublic str Password { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"pw\": Password = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerTempPasswordDel[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"pw\": foreach(var toi in toc) { toi.Password = Password; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerTempPasswordList : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerTempPasswordList;\n\t\t\n\n\t\tpublic str Description { get; set; }\n\t\tpublic DateTime End { get; set; }\n\t\tpublic str Nickname { get; set; }\n\t\tpublic str PasswordClear { get; set; }\n\t\tpublic DateTime Start { get; set; }\n\t\tpublic ChannelId TargetChannelId { get; set; }\n\t\tpublic str TargetChannelPassword { get; set; }\n\t\tpublic Uid Uid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"desc\": Description = (str)TsString.Unescape(value); break;\n\t\t\tcase \"end\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) End = Tools.FromUnix(oval); } break;\n\t\t\tcase \"nickname\": Nickname = (str)TsString.Unescape(value); break;\n\t\t\tcase \"pw_clear\": PasswordClear = (str)TsString.Unescape(value); break;\n\t\t\tcase \"start\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) Start = Tools.FromUnix(oval); } break;\n\t\t\tcase \"tcid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TargetChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"tcpw\": TargetChannelPassword = (str)TsString.Unescape(value); break;\n\t\t\tcase \"uid\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerTempPasswordList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"desc\": foreach(var toi in toc) { toi.Description = Description; } break;\n\t\t\t\tcase \"end\": foreach(var toi in toc) { toi.End = End; } break;\n\t\t\t\tcase \"nickname\": foreach(var toi in toc) { toi.Nickname = Nickname; } break;\n\t\t\t\tcase \"pw_clear\": foreach(var toi in toc) { toi.PasswordClear = PasswordClear; } break;\n\t\t\t\tcase \"start\": foreach(var toi in toc) { toi.Start = Start; } break;\n\t\t\t\tcase \"tcid\": foreach(var toi in toc) { toi.TargetChannelId = TargetChannelId; } break;\n\t\t\t\tcase \"tcpw\": foreach(var toi in toc) { toi.TargetChannelPassword = TargetChannelPassword; } break;\n\t\t\t\tcase \"uid\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerTempPasswordListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerTempPasswordListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerUpdated : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerUpdated;\n\t\t\n\n\t\tpublic u32 AntifloodPointsTickReduce { get; set; }\n\t\tpublic u32 AntifloodPointsToCommandBlock { get; set; }\n\t\tpublic u32 AntifloodPointsToIpBlock { get; set; }\n\t\tpublic u32 AntifloodPointsToPluginBlock { get; set; }\n\t\tpublic bool Autostart { get; set; }\n\t\tpublic u64 BytesDownloadedMonth { get; set; }\n\t\tpublic u64 BytesDownloadedTotal { get; set; }\n\t\tpublic u64 BytesUploadedMonth { get; set; }\n\t\tpublic u64 BytesUploadedTotal { get; set; }\n\t\tpublic u64 ChannelsOnline { get; set; }\n\t\tpublic u64 ClientConnections { get; set; }\n\t\tpublic u16 ClientsOnline { get; set; }\n\t\tpublic u32 ComplainAutobanCount { get; set; }\n\t\tpublic DurationSeconds ComplainAutobanTime { get; set; }\n\t\tpublic DurationSeconds ComplainRemoveTime { get; set; }\n\t\tpublic ChannelGroupId DefaultChannelAdminGroup { get; set; }\n\t\tpublic u64 DownloadQuota { get; set; }\n\t\tpublic bool HasPassword { get; set; }\n\t\tpublic str Hostmessage { get; set; }\n\t\tpublic HostMessageMode HostmessageMode { get; set; }\n\t\tpublic u8 IdentitySecurityLevel { get; set; }\n\t\tpublic bool LogChannel { get; set; }\n\t\tpublic bool LogClient { get; set; }\n\t\tpublic bool LogFileTransfer { get; set; }\n\t\tpublic bool LogPermissions { get; set; }\n\t\tpublic bool LogQuery { get; set; }\n\t\tpublic bool LogServer { get; set; }\n\t\tpublic str MachineId { get; set; }\n\t\tpublic u16 MaxClients { get; set; }\n\t\tpublic u64 MaxDownloadTotalBandwidth { get; set; }\n\t\tpublic u64 MaxUploadTotalBandwidth { get; set; }\n\t\tpublic u32 MinAndroidVersion { get; set; }\n\t\tpublic u32 MinClientsInChannelBeforeForcedSilence { get; set; }\n\t\tpublic u32 MinClientVersion { get; set; }\n\t\tpublic u32 MinIosVersion { get; set; }\n\t\tpublic f32 PacketlossTotal { get; set; }\n\t\tpublic f32 PacketlossTotalControl { get; set; }\n\t\tpublic f32 PacketlossTotalKeepalive { get; set; }\n\t\tpublic f32 PacketlossTotalSpeech { get; set; }\n\t\tpublic f32 PingTotal { get; set; }\n\t\tpublic u16 QueriesOnline { get; set; }\n\t\tpublic u64 QueryConnections { get; set; }\n\t\tpublic u16 ReservedSlots { get; set; }\n\t\tpublic u64 UploadQuota { get; set; }\n\t\tpublic DurationSeconds Uptime { get; set; }\n\t\tpublic u16 VirtualServerPort { get; set; }\n\t\tpublic bool WeblistEnabled { get; set; }\n\t\tpublic str WelcomeMessage { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"virtualserver_antiflood_points_needed_command_block\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToCommandBlock = (u32)oval; } break;\n\t\t\tcase \"virtualserver_antiflood_points_needed_ip_block\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToIpBlock = (u32)oval; } break;\n\t\t\tcase \"virtualserver_antiflood_points_needed_plugin_block\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsToPluginBlock = (u32)oval; } break;\n\t\t\tcase \"virtualserver_antiflood_points_tick_reduce\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) AntifloodPointsTickReduce = (u32)oval; } break;\n\t\t\tcase \"virtualserver_autostart\": Autostart = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_channelsonline\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelsOnline = (u64)oval; } break;\n\t\t\tcase \"virtualserver_client_connections\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientConnections = (u64)oval; } break;\n\t\t\tcase \"virtualserver_clientsonline\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientsOnline = (u16)oval; } break;\n\t\t\tcase \"virtualserver_complain_autoban_count\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ComplainAutobanCount = (u32)oval; } break;\n\t\t\tcase \"virtualserver_complain_autoban_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ComplainAutobanTime = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_complain_remove_time\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) ComplainRemoveTime = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_default_channel_admin_group\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DefaultChannelAdminGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"virtualserver_download_quota\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DownloadQuota = (u64)oval; } break;\n\t\t\tcase \"virtualserver_flag_password\": HasPassword = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_hostmessage\": Hostmessage = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_hostmessage_mode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) HostmessageMode = (HostMessageMode)oval; } break;\n\t\t\tcase \"virtualserver_log_channel\": LogChannel = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_client\": LogClient = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_filetransfer\": LogFileTransfer = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_permissions\": LogPermissions = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_query\": LogQuery = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_log_server\": LogServer = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_machine_id\": MachineId = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_max_download_total_bandwidth\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) MaxDownloadTotalBandwidth = (u64)oval; } break;\n\t\t\tcase \"virtualserver_max_upload_total_bandwidth\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) MaxUploadTotalBandwidth = (u64)oval; } break;\n\t\t\tcase \"virtualserver_maxclients\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) MaxClients = (u16)oval; } break;\n\t\t\tcase \"virtualserver_min_android_version\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinAndroidVersion = (u32)oval; } break;\n\t\t\tcase \"virtualserver_min_client_version\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinClientVersion = (u32)oval; } break;\n\t\t\tcase \"virtualserver_min_clients_in_channel_before_forced_silence\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinClientsInChannelBeforeForcedSilence = (u32)oval; } break;\n\t\t\tcase \"virtualserver_min_ios_version\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) MinIosVersion = (u32)oval; } break;\n\t\t\tcase \"virtualserver_month_bytes_downloaded\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesDownloadedMonth = (u64)oval; } break;\n\t\t\tcase \"virtualserver_month_bytes_uploaded\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesUploadedMonth = (u64)oval; } break;\n\t\t\tcase \"virtualserver_needed_identity_security_level\": { if(Utf8Parser.TryParse(value, out u8 oval, out _)) IdentitySecurityLevel = (u8)oval; } break;\n\t\t\tcase \"virtualserver_port\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) VirtualServerPort = (u16)oval; } break;\n\t\t\tcase \"virtualserver_query_client_connections\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) QueryConnections = (u64)oval; } break;\n\t\t\tcase \"virtualserver_queryclientsonline\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) QueriesOnline = (u16)oval; } break;\n\t\t\tcase \"virtualserver_reserved_slots\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ReservedSlots = (u16)oval; } break;\n\t\t\tcase \"virtualserver_total_bytes_downloaded\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesDownloadedTotal = (u64)oval; } break;\n\t\t\tcase \"virtualserver_total_bytes_uploaded\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) BytesUploadedTotal = (u64)oval; } break;\n\t\t\tcase \"virtualserver_total_packetloss_control\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotalControl = (f32)oval; } break;\n\t\t\tcase \"virtualserver_total_packetloss_keepalive\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotalKeepalive = (f32)oval; } break;\n\t\t\tcase \"virtualserver_total_packetloss_speech\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotalSpeech = (f32)oval; } break;\n\t\t\tcase \"virtualserver_total_packetloss_total\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PacketlossTotal = (f32)oval; } break;\n\t\t\tcase \"virtualserver_total_ping\": { if(Utf8Parser.TryParse(value, out f32 oval, out _)) PingTotal = (f32)oval; } break;\n\t\t\tcase \"virtualserver_upload_quota\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) UploadQuota = (u64)oval; } break;\n\t\t\tcase \"virtualserver_uptime\": { if(Utf8Parser.TryParse(value, out f64 oval, out _)) Uptime = TimeSpan.FromSeconds(oval); } break;\n\t\t\tcase \"virtualserver_weblist_enabled\": WeblistEnabled = value.Length > 0 && value[0] != '0'; break;\n\t\t\tcase \"virtualserver_welcomemessage\": WelcomeMessage = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (ServerUpdated[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"virtualserver_antiflood_points_needed_command_block\": foreach(var toi in toc) { toi.AntifloodPointsToCommandBlock = AntifloodPointsToCommandBlock; } break;\n\t\t\t\tcase \"virtualserver_antiflood_points_needed_ip_block\": foreach(var toi in toc) { toi.AntifloodPointsToIpBlock = AntifloodPointsToIpBlock; } break;\n\t\t\t\tcase \"virtualserver_antiflood_points_needed_plugin_block\": foreach(var toi in toc) { toi.AntifloodPointsToPluginBlock = AntifloodPointsToPluginBlock; } break;\n\t\t\t\tcase \"virtualserver_antiflood_points_tick_reduce\": foreach(var toi in toc) { toi.AntifloodPointsTickReduce = AntifloodPointsTickReduce; } break;\n\t\t\t\tcase \"virtualserver_autostart\": foreach(var toi in toc) { toi.Autostart = Autostart; } break;\n\t\t\t\tcase \"virtualserver_channelsonline\": foreach(var toi in toc) { toi.ChannelsOnline = ChannelsOnline; } break;\n\t\t\t\tcase \"virtualserver_client_connections\": foreach(var toi in toc) { toi.ClientConnections = ClientConnections; } break;\n\t\t\t\tcase \"virtualserver_clientsonline\": foreach(var toi in toc) { toi.ClientsOnline = ClientsOnline; } break;\n\t\t\t\tcase \"virtualserver_complain_autoban_count\": foreach(var toi in toc) { toi.ComplainAutobanCount = ComplainAutobanCount; } break;\n\t\t\t\tcase \"virtualserver_complain_autoban_time\": foreach(var toi in toc) { toi.ComplainAutobanTime = ComplainAutobanTime; } break;\n\t\t\t\tcase \"virtualserver_complain_remove_time\": foreach(var toi in toc) { toi.ComplainRemoveTime = ComplainRemoveTime; } break;\n\t\t\t\tcase \"virtualserver_default_channel_admin_group\": foreach(var toi in toc) { toi.DefaultChannelAdminGroup = DefaultChannelAdminGroup; } break;\n\t\t\t\tcase \"virtualserver_download_quota\": foreach(var toi in toc) { toi.DownloadQuota = DownloadQuota; } break;\n\t\t\t\tcase \"virtualserver_flag_password\": foreach(var toi in toc) { toi.HasPassword = HasPassword; } break;\n\t\t\t\tcase \"virtualserver_hostmessage\": foreach(var toi in toc) { toi.Hostmessage = Hostmessage; } break;\n\t\t\t\tcase \"virtualserver_hostmessage_mode\": foreach(var toi in toc) { toi.HostmessageMode = HostmessageMode; } break;\n\t\t\t\tcase \"virtualserver_log_channel\": foreach(var toi in toc) { toi.LogChannel = LogChannel; } break;\n\t\t\t\tcase \"virtualserver_log_client\": foreach(var toi in toc) { toi.LogClient = LogClient; } break;\n\t\t\t\tcase \"virtualserver_log_filetransfer\": foreach(var toi in toc) { toi.LogFileTransfer = LogFileTransfer; } break;\n\t\t\t\tcase \"virtualserver_log_permissions\": foreach(var toi in toc) { toi.LogPermissions = LogPermissions; } break;\n\t\t\t\tcase \"virtualserver_log_query\": foreach(var toi in toc) { toi.LogQuery = LogQuery; } break;\n\t\t\t\tcase \"virtualserver_log_server\": foreach(var toi in toc) { toi.LogServer = LogServer; } break;\n\t\t\t\tcase \"virtualserver_machine_id\": foreach(var toi in toc) { toi.MachineId = MachineId; } break;\n\t\t\t\tcase \"virtualserver_max_download_total_bandwidth\": foreach(var toi in toc) { toi.MaxDownloadTotalBandwidth = MaxDownloadTotalBandwidth; } break;\n\t\t\t\tcase \"virtualserver_max_upload_total_bandwidth\": foreach(var toi in toc) { toi.MaxUploadTotalBandwidth = MaxUploadTotalBandwidth; } break;\n\t\t\t\tcase \"virtualserver_maxclients\": foreach(var toi in toc) { toi.MaxClients = MaxClients; } break;\n\t\t\t\tcase \"virtualserver_min_android_version\": foreach(var toi in toc) { toi.MinAndroidVersion = MinAndroidVersion; } break;\n\t\t\t\tcase \"virtualserver_min_client_version\": foreach(var toi in toc) { toi.MinClientVersion = MinClientVersion; } break;\n\t\t\t\tcase \"virtualserver_min_clients_in_channel_before_forced_silence\": foreach(var toi in toc) { toi.MinClientsInChannelBeforeForcedSilence = MinClientsInChannelBeforeForcedSilence; } break;\n\t\t\t\tcase \"virtualserver_min_ios_version\": foreach(var toi in toc) { toi.MinIosVersion = MinIosVersion; } break;\n\t\t\t\tcase \"virtualserver_month_bytes_downloaded\": foreach(var toi in toc) { toi.BytesDownloadedMonth = BytesDownloadedMonth; } break;\n\t\t\t\tcase \"virtualserver_month_bytes_uploaded\": foreach(var toi in toc) { toi.BytesUploadedMonth = BytesUploadedMonth; } break;\n\t\t\t\tcase \"virtualserver_needed_identity_security_level\": foreach(var toi in toc) { toi.IdentitySecurityLevel = IdentitySecurityLevel; } break;\n\t\t\t\tcase \"virtualserver_port\": foreach(var toi in toc) { toi.VirtualServerPort = VirtualServerPort; } break;\n\t\t\t\tcase \"virtualserver_query_client_connections\": foreach(var toi in toc) { toi.QueryConnections = QueryConnections; } break;\n\t\t\t\tcase \"virtualserver_queryclientsonline\": foreach(var toi in toc) { toi.QueriesOnline = QueriesOnline; } break;\n\t\t\t\tcase \"virtualserver_reserved_slots\": foreach(var toi in toc) { toi.ReservedSlots = ReservedSlots; } break;\n\t\t\t\tcase \"virtualserver_total_bytes_downloaded\": foreach(var toi in toc) { toi.BytesDownloadedTotal = BytesDownloadedTotal; } break;\n\t\t\t\tcase \"virtualserver_total_bytes_uploaded\": foreach(var toi in toc) { toi.BytesUploadedTotal = BytesUploadedTotal; } break;\n\t\t\t\tcase \"virtualserver_total_packetloss_control\": foreach(var toi in toc) { toi.PacketlossTotalControl = PacketlossTotalControl; } break;\n\t\t\t\tcase \"virtualserver_total_packetloss_keepalive\": foreach(var toi in toc) { toi.PacketlossTotalKeepalive = PacketlossTotalKeepalive; } break;\n\t\t\t\tcase \"virtualserver_total_packetloss_speech\": foreach(var toi in toc) { toi.PacketlossTotalSpeech = PacketlossTotalSpeech; } break;\n\t\t\t\tcase \"virtualserver_total_packetloss_total\": foreach(var toi in toc) { toi.PacketlossTotal = PacketlossTotal; } break;\n\t\t\t\tcase \"virtualserver_total_ping\": foreach(var toi in toc) { toi.PingTotal = PingTotal; } break;\n\t\t\t\tcase \"virtualserver_upload_quota\": foreach(var toi in toc) { toi.UploadQuota = UploadQuota; } break;\n\t\t\t\tcase \"virtualserver_uptime\": foreach(var toi in toc) { toi.Uptime = Uptime; } break;\n\t\t\t\tcase \"virtualserver_weblist_enabled\": foreach(var toi in toc) { toi.WeblistEnabled = WeblistEnabled; } break;\n\t\t\t\tcase \"virtualserver_welcomemessage\": foreach(var toi in toc) { toi.WelcomeMessage = WelcomeMessage; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class ServerVariablesRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.ServerVariablesRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class SetClientChannelGroup : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.SetClientChannelGroup;\n\t\t\n\n\t\tpublic ChannelGroupId ChannelGroup { get; set; }\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cgid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelGroup = (ChannelGroupId)oval; } break;\n\t\t\tcase \"cid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (SetClientChannelGroup[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cgid\": foreach(var toi in toc) { toi.ChannelGroup = ChannelGroup; } break;\n\t\t\t\tcase \"cid\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class TextMessage : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.TextMessage;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ClientId InvokerId { get; set; }\n\t\tpublic str InvokerName { get; set; }\n\t\tpublic Uid? InvokerUid { get; set; }\n\t\tpublic str Message { get; set; }\n\t\tpublic TextMessageTargetMode Target { get; set; }\n\t\tpublic ClientId? TargetClientId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"invokerid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) InvokerId = (ClientId)oval; } break;\n\t\t\tcase \"invokername\": InvokerName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"invokeruid\": InvokerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"msg\": Message = (str)TsString.Unescape(value); break;\n\t\t\tcase \"target\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) TargetClientId = (ClientId)oval; } break;\n\t\t\tcase \"targetmode\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) Target = (TextMessageTargetMode)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (TextMessage[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"invokerid\": foreach(var toi in toc) { toi.InvokerId = InvokerId; } break;\n\t\t\t\tcase \"invokername\": foreach(var toi in toc) { toi.InvokerName = InvokerName; } break;\n\t\t\t\tcase \"invokeruid\": foreach(var toi in toc) { toi.InvokerUid = InvokerUid; } break;\n\t\t\t\tcase \"msg\": foreach(var toi in toc) { toi.Message = Message; } break;\n\t\t\t\tcase \"target\": foreach(var toi in toc) { toi.TargetClientId = TargetClientId; } break;\n\t\t\t\tcase \"targetmode\": foreach(var toi in toc) { toi.Target = Target; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class TokenAdd : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.TokenAdd;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic str Token { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"token\": Token = (str)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (TokenAdd[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"token\": foreach(var toi in toc) { toi.Token = Token; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class TokenAddRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.TokenAddRequest;\n\t\t\n\n\t\tpublic str? TokenCustomSet { get; set; }\n\t\tpublic str? TokenDescription { get; set; }\n\t\tpublic u64 TokenId1 { get; set; }\n\t\tpublic ChannelId TokenId2 { get; set; }\n\t\tpublic TokenType TokenType { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"tokencustomset\": TokenCustomSet = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tokendescription\": TokenDescription = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tokenid1\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId1 = (u64)oval; } break;\n\t\t\tcase \"tokenid2\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId2 = (ChannelId)oval; } break;\n\t\t\tcase \"tokentype\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TokenType = (TokenType)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (TokenAddRequest[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"tokencustomset\": foreach(var toi in toc) { toi.TokenCustomSet = TokenCustomSet; } break;\n\t\t\t\tcase \"tokendescription\": foreach(var toi in toc) { toi.TokenDescription = TokenDescription; } break;\n\t\t\t\tcase \"tokenid1\": foreach(var toi in toc) { toi.TokenId1 = TokenId1; } break;\n\t\t\t\tcase \"tokenid2\": foreach(var toi in toc) { toi.TokenId2 = TokenId2; } break;\n\t\t\t\tcase \"tokentype\": foreach(var toi in toc) { toi.TokenType = TokenType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class TokenDelete : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.TokenDelete;\n\t\t\n\n\t\tpublic str Token { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"token\": Token = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (TokenDelete[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"token\": foreach(var toi in toc) { toi.Token = Token; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class TokenList : INotification, IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.TokenList;\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic str Token { get; set; }\n\t\tpublic DateTime TokenCreateTime { get; set; }\n\t\tpublic str TokenDescription { get; set; }\n\t\tpublic u64 TokenId1 { get; set; }\n\t\tpublic ChannelId TokenId2 { get; set; }\n\t\tpublic TokenType TokenType { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"token\": Token = (str)TsString.Unescape(value); break;\n\t\t\tcase \"token_created\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) TokenCreateTime = Tools.FromUnix(oval); } break;\n\t\t\tcase \"token_description\": TokenDescription = (str)TsString.Unescape(value); break;\n\t\t\tcase \"token_id1\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId1 = (u64)oval; } break;\n\t\t\tcase \"token_id2\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) TokenId2 = (ChannelId)oval; } break;\n\t\t\tcase \"token_type\": { if(Utf8Parser.TryParse(value, out i32 oval, out _)) TokenType = (TokenType)oval; } break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (TokenList[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"token\": foreach(var toi in toc) { toi.Token = Token; } break;\n\t\t\t\tcase \"token_created\": foreach(var toi in toc) { toi.TokenCreateTime = TokenCreateTime; } break;\n\t\t\t\tcase \"token_description\": foreach(var toi in toc) { toi.TokenDescription = TokenDescription; } break;\n\t\t\t\tcase \"token_id1\": foreach(var toi in toc) { toi.TokenId1 = TokenId1; } break;\n\t\t\t\tcase \"token_id2\": foreach(var toi in toc) { toi.TokenId2 = TokenId2; } break;\n\t\t\t\tcase \"token_type\": foreach(var toi in toc) { toi.TokenType = TokenType; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class TokenListRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.TokenListRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class TokenUse : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.TokenUse;\n\t\t\n\n\t\tpublic str Token { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"token\": Token = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (TokenUse[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"token\": foreach(var toi in toc) { toi.Token = Token; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class TokenUsed : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.TokenUsed;\n\t\t\n\n\t\tpublic ClientDbId ClientDbId { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic Uid ClientUid { get; set; }\n\t\tpublic str Token { get; set; }\n\t\tpublic str Token1 { get; set; }\n\t\tpublic str Token2 { get; set; }\n\t\tpublic str TokenCustomSet { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"cldbid\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ClientDbId = (ClientDbId)oval; } break;\n\t\t\tcase \"clid\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"cluid\": ClientUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"token\": Token = (str)TsString.Unescape(value); break;\n\t\t\tcase \"token1\": Token1 = (str)TsString.Unescape(value); break;\n\t\t\tcase \"token2\": Token2 = (str)TsString.Unescape(value); break;\n\t\t\tcase \"tokencustomset\": TokenCustomSet = (str)TsString.Unescape(value); break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (TokenUsed[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"cldbid\": foreach(var toi in toc) { toi.ClientDbId = ClientDbId; } break;\n\t\t\t\tcase \"clid\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"cluid\": foreach(var toi in toc) { toi.ClientUid = ClientUid; } break;\n\t\t\t\tcase \"token\": foreach(var toi in toc) { toi.Token = Token; } break;\n\t\t\t\tcase \"token1\": foreach(var toi in toc) { toi.Token1 = Token1; } break;\n\t\t\t\tcase \"token2\": foreach(var toi in toc) { toi.Token2 = Token2; } break;\n\t\t\t\tcase \"tokencustomset\": foreach(var toi in toc) { toi.TokenCustomSet = TokenCustomSet; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class Use : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.Use;\n\t\t\n\n\t\tpublic u16? Port { get; set; }\n\t\tpublic u32? ServerId { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"port\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) Port = (u16)oval; } break;\n\t\t\tcase \"sid\": { if(Utf8Parser.TryParse(value, out u32 oval, out _)) ServerId = (u32)oval; } break;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (Use[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"port\": foreach(var toi in toc) { toi.Port = Port; } break;\n\t\t\t\tcase \"sid\": foreach(var toi in toc) { toi.ServerId = ServerId; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class VersionRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.VersionRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic sealed partial class WhoAmI : IResponse\n\t{\n\t\t#pragma warning disable CS8618\n\t\t\n\t\tpublic string? ReturnCode { get; set; }\n\n\t\tpublic ChannelId ChannelId { get; set; }\n\t\tpublic ClientId ClientId { get; set; }\n\t\tpublic ClientDbId DatabaseId { get; set; }\n\t\tpublic str LoginName { get; set; }\n\t\tpublic str Name { get; set; }\n\t\tpublic u64 OriginServerId { get; set; }\n\t\tpublic Uid Uid { get; set; }\n\t\tpublic u64 VirtualServerId { get; set; }\n\t\tpublic u16 VirtualServerPort { get; set; }\n\t\tpublic str VirtualServerStatus { get; set; }\n\t\tpublic Uid VirtualServerUid { get; set; }\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\n\t\t\tcase \"client_channel_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) ChannelId = (ChannelId)oval; } break;\n\t\t\tcase \"client_database_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) DatabaseId = (ClientDbId)oval; } break;\n\t\t\tcase \"client_id\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) ClientId = (ClientId)oval; } break;\n\t\t\tcase \"client_login_name\": LoginName = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_nickname\": Name = (str)TsString.Unescape(value); break;\n\t\t\tcase \"client_origin_server_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) OriginServerId = (u64)oval; } break;\n\t\t\tcase \"client_unique_identifier\": Uid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_id\": { if(Utf8Parser.TryParse(value, out u64 oval, out _)) VirtualServerId = (u64)oval; } break;\n\t\t\tcase \"virtualserver_port\": { if(Utf8Parser.TryParse(value, out u16 oval, out _)) VirtualServerPort = (u16)oval; } break;\n\t\t\tcase \"virtualserver_status\": VirtualServerStatus = (str)TsString.Unescape(value); break;\n\t\t\tcase \"virtualserver_unique_identifier\": VirtualServerUid = (Uid)TsString.Unescape(value); break;\n\t\t\tcase \"return_code\": ReturnCode = (str)TsString.Unescape(value); break;\n\t\t\t}\n\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tvar toc = (WhoAmI[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n\n\t\t\t\tcase \"client_channel_id\": foreach(var toi in toc) { toi.ChannelId = ChannelId; } break;\n\t\t\t\tcase \"client_database_id\": foreach(var toi in toc) { toi.DatabaseId = DatabaseId; } break;\n\t\t\t\tcase \"client_id\": foreach(var toi in toc) { toi.ClientId = ClientId; } break;\n\t\t\t\tcase \"client_login_name\": foreach(var toi in toc) { toi.LoginName = LoginName; } break;\n\t\t\t\tcase \"client_nickname\": foreach(var toi in toc) { toi.Name = Name; } break;\n\t\t\t\tcase \"client_origin_server_id\": foreach(var toi in toc) { toi.OriginServerId = OriginServerId; } break;\n\t\t\t\tcase \"client_unique_identifier\": foreach(var toi in toc) { toi.Uid = Uid; } break;\n\t\t\t\tcase \"virtualserver_id\": foreach(var toi in toc) { toi.VirtualServerId = VirtualServerId; } break;\n\t\t\t\tcase \"virtualserver_port\": foreach(var toi in toc) { toi.VirtualServerPort = VirtualServerPort; } break;\n\t\t\t\tcase \"virtualserver_status\": foreach(var toi in toc) { toi.VirtualServerStatus = VirtualServerStatus; } break;\n\t\t\t\tcase \"virtualserver_unique_identifier\": foreach(var toi in toc) { toi.VirtualServerUid = VirtualServerUid; } break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tpublic sealed partial class WhoAmIRequest : INotification\n\t{\n\t\t#pragma warning disable CS8618\n\t\tpublic NotificationType NotifyType { get; } = NotificationType.WhoAmIRequest;\n\t\t\n\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t}\n\t}\n\n\tpublic enum NotificationType\n\t{\n\t\tUnknown,\n\t\t///<summary>[C2S] ntfy:banadd</summary>\n\t\tBanAdd,\n\t\t///<summary>[C2S] ntfy:banclient</summary>\n\t\tBanClient,\n\t\t///<summary>[C2S] ntfy:bandel</summary>\n\t\tBanDel,\n\t\t///<summary>[C2S] ntfy:bandelall</summary>\n\t\tBanDelAll,\n\t\t///<summary>[S2C] ntfy:notifybanlist</summary>\n\t\tBanList,\n\t\t///<summary>[C2S] ntfy:banlist</summary>\n\t\tBanListRequest,\n\t\t///<summary>[C2S] ntfy:bindinglist</summary>\n\t\tBindingList,\n\t\t///<summary>[C2S] ntfy:channeladdperm</summary>\n\t\tChannelAddPerm,\n\t\t///<summary>[S2C] ntfy:notifychannelchanged</summary>\n\t\tChannelChanged,\n\t\t///<summary>[C2S] ntfy:channelclientaddperm</summary>\n\t\tChannelClientAddPerm,\n\t\t///<summary>[C2S] ntfy:channelclientdelperm</summary>\n\t\tChannelClientDelPerm,\n\t\t///<summary>[S2C] ntfy:notifychannelclientpermlist</summary>\n\t\tChannelClientPermList,\n\t\t///<summary>[C2S] ntfy:channelclientpermlist</summary>\n\t\tChannelClientPermListRequest,\n\t\t///<summary>[C2S] ntfy:channelcreate</summary>\n\t\tChannelCreate,\n\t\t///<summary>[S2C] ntfy:notifychannelcreated</summary>\n\t\tChannelCreated,\n\t\t///<summary>[C2S] ntfy:channeldelete</summary>\n\t\tChannelDelete,\n\t\t///<summary>[S2C] ntfy:notifychanneldeleted</summary>\n\t\tChannelDeleted,\n\t\t///<summary>[C2S] ntfy:channeldelperm</summary>\n\t\tChannelDelPerm,\n\t\t///<summary>[S2C] ntfy:notifychanneldescriptionchanged</summary>\n\t\tChannelDescriptionChanged,\n\t\t///<summary>[C2S] ntfy:channelgetdescription</summary>\n\t\tChannelDescriptionRequest,\n\t\t///<summary>[C2S] ntfy:channeledit</summary>\n\t\tChannelEdit,\n\t\t///<summary>[S2C] ntfy:notifychanneledited</summary>\n\t\tChannelEdited,\n\t\t///<summary>[C2S] ntfy:channelfind</summary>\n\t\tChannelFindRequest,\n\t\t///<summary>[C2S] ntfy:channelgroupadd</summary>\n\t\tChannelGroupAdd,\n\t\t///<summary>[C2S] ntfy:channelgroupaddperm</summary>\n\t\tChannelGroupAddPerm,\n\t\t///<summary>[S2C] ntfy:notifychannelgroupclientlist</summary>\n\t\tChannelGroupClientList,\n\t\t///<summary>[C2S] ntfy:channelgroupclientlist</summary>\n\t\tChannelGroupClientListRequest,\n\t\t///<summary>[C2S] ntfy:channelgroupcopy</summary>\n\t\tChannelGroupCopy,\n\t\t///<summary>[C2S] ntfy:channelgroupdel</summary>\n\t\tChannelGroupDel,\n\t\t///<summary>[C2S] ntfy:channelgroupdelperm</summary>\n\t\tChannelGroupDelPerm,\n\t\t///<summary>[S2C] ntfy:notifychannelgrouplist</summary>\n\t\tChannelGroupList,\n\t\t///<summary>[C2S] ntfy:channelgrouplist</summary>\n\t\tChannelGroupListRequest,\n\t\t///<summary>[S2C] ntfy:notifychannelgrouppermlist</summary>\n\t\tChannelGroupPermList,\n\t\t///<summary>[C2S] ntfy:channelgrouppermlist</summary>\n\t\tChannelGroupPermListRequest,\n\t\t///<summary>[C2S] ntfy:channelgrouprename</summary>\n\t\tChannelGroupRename,\n\t\t///<summary>[C2S] ntfy:channelinfo</summary>\n\t\tChannelInfoRequest,\n\t\t///<summary>[S2C] ntfy:channellist</summary>\n\t\tChannelList,\n\t\t///<summary>[S2C] ntfy:channellistfinished</summary>\n\t\tChannelListFinished,\n\t\t///<summary>[C2S] ntfy:channellist</summary>\n\t\tChannelListRequest,\n\t\t///<summary>[C2S] ntfy:channelmove</summary>\n\t\tChannelMove,\n\t\t///<summary>[S2C] ntfy:notifychannelmoved</summary>\n\t\tChannelMoved,\n\t\t///<summary>[S2C] ntfy:notifychannelpasswordchanged</summary>\n\t\tChannelPasswordChanged,\n\t\t///<summary>[S2C] ntfy:notifychannelpermhints</summary>\n\t\tChannelPermissionHints,\n\t\t///<summary>[S2C] ntfy:notifychannelpermlist</summary>\n\t\tChannelPermList,\n\t\t///<summary>[C2S] ntfy:channelpermlist</summary>\n\t\tChannelPermListRequest,\n\t\t///<summary>[C2S] ntfy:channelsubscribe</summary>\n\t\tChannelSubscribe,\n\t\t///<summary>[C2S] ntfy:channelsubscribeall</summary>\n\t\tChannelSubscribeAll,\n\t\t///<summary>[S2C] ntfy:notifychannelsubscribed</summary>\n\t\tChannelSubscribed,\n\t\t///<summary>[C2S] ntfy:channelunsubscribe</summary>\n\t\tChannelUnsubscribe,\n\t\t///<summary>[C2S] ntfy:channelunsubscribeall</summary>\n\t\tChannelUnsubscribeAll,\n\t\t///<summary>[S2C] ntfy:notifychannelunsubscribed</summary>\n\t\tChannelUnsubscribed,\n\t\t///<summary>[C2S] ntfy:clientaddperm</summary>\n\t\tClientAddPerm,\n\t\t///<summary>[S2C] ntfy:notifyclientchannelgroupchanged</summary>\n\t\tClientChannelGroupChanged,\n\t\t///<summary>[C2S] ntfy:clientchatclosed</summary>\n\t\tClientChatClose,\n\t\t///<summary>[S2C] ntfy:notifyclientchatclosed</summary>\n\t\tClientChatClosed,\n\t\t///<summary>[S2C] ntfy:notifyclientchatcomposing</summary>\n\t\tClientChatComposing,\n\t\t///<summary>[S2C] ntfy:notifyconnectioninfo</summary>\n\t\tClientConnectionInfo,\n\t\t///<summary>[C2S] ntfy:getconnectioninfo</summary>\n\t\tClientConnectionInfoRequest,\n\t\t///<summary>[S2C] ntfy:notifyconnectioninforequest</summary>\n\t\tClientConnectionInfoUpdateRequest,\n\t\t///<summary>[C2S] ntfy:clientdbdelete</summary>\n\t\tClientDbDelete,\n\t\t///<summary>[C2S] ntfy:clientdbedit</summary>\n\t\tClientDbEdit,\n\t\t///<summary>[S2C] ntfy:notifyclientdbfind</summary>\n\t\tClientDbFind,\n\t\t///<summary>[C2S] ntfy:clientdbfind</summary>\n\t\tClientDbFindRequest,\n\t\t///<summary>[S2C] ntfy:notifyclientdbidfromuid</summary>\n\t\tClientDbIdFromUid,\n\t\t///<summary>[C2S] ntfy:clientgetdbidfromuid</summary>\n\t\tClientDbIdFromUidRequest,\n\t\t///<summary>[C2S] ntfy:clientdbinfo</summary>\n\t\tClientDbInfoRequest,\n\t\t///<summary>[S2C] ntfy:notifyclientdblist</summary>\n\t\tClientDbList,\n\t\t///<summary>[C2S] ntfy:clientdblist</summary>\n\t\tClientDbListRequest,\n\t\t///<summary>[C2S] ntfy:clientdelperm</summary>\n\t\tClientDelPerm,\n\t\t///<summary>[C2S] ntfy:clientedit</summary>\n\t\tClientEdit,\n\t\t///<summary>[S2C] ntfy:notifycliententerview</summary>\n\t\tClientEnterView,\n\t\t///<summary>[C2S] ntfy:clientfind</summary>\n\t\tClientFindRequest,\n\t\t///<summary>[S2C] ntfy:notifyclientids</summary>\n\t\tClientIds,\n\t\t///<summary>[C2S] ntfy:clientgetids</summary>\n\t\tClientIdsRequest,\n\t\t///<summary>[C2S] ntfy:clientinfo</summary>\n\t\tClientInfoRequest,\n\t\t///<summary>[C2S] ntfy:clientinit</summary>\n\t\tClientInit,\n\t\t///<summary>[C2S] ntfy:clientinitiv</summary>\n\t\tClientInitIv,\n\t\t///<summary>[C2S] ntfy:clientkick</summary>\n\t\tClientKick,\n\t\t///<summary>[S2C] ntfy:notifyclientleftview</summary>\n\t\tClientLeftView,\n\t\t///<summary>[C2S] ntfy:clientlist</summary>\n\t\tClientListRequest,\n\t\t///<summary>[C2S] ntfy:clientmove</summary>\n\t\tClientMove,\n\t\t///<summary>[S2C] ntfy:notifyclientmoved</summary>\n\t\tClientMoved,\n\t\t///<summary>[S2C] ntfy:notifyclientnamefromdbid</summary>\n\t\tClientNameFromDbId,\n\t\t///<summary>[C2S] ntfy:clientgetnamefromdbid</summary>\n\t\tClientNameFromDbIdRequest,\n\t\t///<summary>[S2C] ntfy:notifyclientnamefromuid</summary>\n\t\tClientNameFromUid,\n\t\t///<summary>[C2S] ntfy:clientgetnamefromuid</summary>\n\t\tClientNameFromUidRequest,\n\t\t///<summary>[S2C] ntfy:notifyclientneededpermissions</summary>\n\t\tClientNeededPermissions,\n\t\t///<summary>[S2C] ntfy:notifyclientpermhints</summary>\n\t\tClientPermissionHints,\n\t\t///<summary>[S2C] ntfy:notifyclientpermlist</summary>\n\t\tClientPermList,\n\t\t///<summary>[C2S] ntfy:clientpermlist</summary>\n\t\tClientPermListRequest,\n\t\t///<summary>[S2C] ntfy:notifyclientpoke</summary>\n\t\tClientPoke,\n\t\t///<summary>[C2S] ntfy:clientpoke</summary>\n\t\tClientPokeRequest,\n\t\t///<summary>[S2C] ntfy:notifyservergroupclientadded</summary>\n\t\tClientServerGroupAdded,\n\t\t///<summary>[S2C] ntfy:notifyservergroupclientdeleted</summary>\n\t\tClientServerGroupRemoved,\n\t\t///<summary>[S2C] ntfy:notifyclientserverqueryloginpassword</summary>\n\t\tClientSetServerQueryLogin,\n\t\t///<summary>[C2S] ntfy:clientsetserverquerylogin</summary>\n\t\tClientSetServerQueryLoginRequest,\n\t\t///<summary>[S2C] ntfy:notifyclientuidfromclid</summary>\n\t\tClientUidFromClid,\n\t\t///<summary>[C2S] ntfy:clientgetuidfromclid</summary>\n\t\tClientUidFromClidRequest,\n\t\t///<summary>[C2S] ntfy:clientupdate</summary>\n\t\tClientUpdate,\n\t\t///<summary>[S2C] ntfy:notifyclientupdated</summary>\n\t\tClientUpdated,\n\t\t///<summary>[C2S] ntfy:clientgetvariables</summary>\n\t\tClientVariablesRequest,\n\t\t///<summary>[S2C] ntfy:error</summary>\n\t\tCommandError,\n\t\t///<summary>[C2S] ntfy:complainadd</summary>\n\t\tComplainAdd,\n\t\t///<summary>[C2S] ntfy:complaindel</summary>\n\t\tComplainDel,\n\t\t///<summary>[C2S] ntfy:complaindelall</summary>\n\t\tComplainDelAll,\n\t\t///<summary>[S2C] ntfy:notifycomplainlist</summary>\n\t\tComplainList,\n\t\t///<summary>[C2S] ntfy:complainlist</summary>\n\t\tComplainListRequest,\n\t\t///<summary>[C2S] ntfy:customdelete</summary>\n\t\tCustomDelete,\n\t\t///<summary>[C2S] ntfy:custominfo</summary>\n\t\tCustomInfoRequest,\n\t\t///<summary>[C2S] ntfy:customsearch</summary>\n\t\tCustomSearch,\n\t\t///<summary>[C2S] ntfy:customset</summary>\n\t\tCustomSet,\n\t\t///<summary>[C2S] ntfy:clientdisconnect</summary>\n\t\tDisconnect,\n\t\t///<summary>[S2C] ntfy:notifystartdownload</summary>\n\t\tFileDownload,\n\t\t///<summary>[S2C] ntfy:notifyfileinfo</summary>\n\t\tFileInfo,\n\t\t///<summary>[S2C] ntfy:notifyfilelist</summary>\n\t\tFileList,\n\t\t///<summary>[S2C] ntfy:notifyfilelistfinished</summary>\n\t\tFileListFinished,\n\t\t///<summary>[S2C] ntfy:notifyfiletransferlist</summary>\n\t\tFileTransfer,\n\t\t///<summary>[S2C] ntfy:notifystatusfiletransfer</summary>\n\t\tFileTransferStatus,\n\t\t///<summary>[S2C] ntfy:notifystartupload</summary>\n\t\tFileUpload,\n\t\t///<summary>[C2S] ntfy:ftcreatedir</summary>\n\t\tFtCreateDir,\n\t\t///<summary>[C2S] ntfy:ftdeletefile</summary>\n\t\tFtDeleteFile,\n\t\t///<summary>[C2S] ntfy:ftgetfileinfo</summary>\n\t\tFtFileInfoRequest,\n\t\t///<summary>[C2S] ntfy:ftgetfilelist</summary>\n\t\tFtFileListRequest,\n\t\t///<summary>[C2S] ntfy:ftinitdownload</summary>\n\t\tFtInitDownload,\n\t\t///<summary>[C2S] ntfy:ftinitupload</summary>\n\t\tFtInitUpload,\n\t\t///<summary>[C2S] ntfy:ftlist</summary>\n\t\tFtList,\n\t\t///<summary>[C2S] ntfy:ftrenamefile</summary>\n\t\tFtRenameFile,\n\t\t///<summary>[C2S] ntfy:ftstop</summary>\n\t\tFtStop,\n\t\t///<summary>[C2S] ntfy:gm</summary>\n\t\tGlobalMessage,\n\t\t///<summary>[C2S] ntfy:hostinfo</summary>\n\t\tHostInfoRequest,\n\t\t///<summary>[S2C] ntfy:initivexpand</summary>\n\t\tInitIvExpand,\n\t\t///<summary>[S2C] ntfy:initivexpand2</summary>\n\t\tInitIvExpand2,\n\t\t///<summary>[S2C] ntfy:initserver</summary>\n\t\tInitServer,\n\t\t///<summary>[C2S] ntfy:instanceedit</summary>\n\t\tInstanceEdit,\n\t\t///<summary>[C2S] ntfy:instanceinfo</summary>\n\t\tInstanceInfo,\n\t\t///<summary>[C2S] ntfy:logadd</summary>\n\t\tLogAdd,\n\t\t///<summary>[C2S] ntfy:login</summary>\n\t\tLogin,\n\t\t///<summary>[C2S] ntfy:logout</summary>\n\t\tLogout,\n\t\t///<summary>[C2S] ntfy:logview</summary>\n\t\tLogView,\n\t\t///<summary>[S2C] ntfy:notifymessage</summary>\n\t\tOfflineMessage,\n\t\t///<summary>[C2S] ntfy:messageadd</summary>\n\t\tOfflineMessageAdd,\n\t\t///<summary>[C2S] ntfy:messagedel</summary>\n\t\tOfflineMessageDel,\n\t\t///<summary>[C2S] ntfy:messageget</summary>\n\t\tOfflineMessageGet,\n\t\t///<summary>[S2C] ntfy:notifymessagelist</summary>\n\t\tOfflineMessageList,\n\t\t///<summary>[C2S] ntfy:messagelist</summary>\n\t\tOfflineMessageListRequest,\n\t\t///<summary>[C2S] ntfy:messageupdateflag</summary>\n\t\tOfflineMessageUpdateFlag,\n\t\t///<summary>[S2C] ntfy:notifypermfind</summary>\n\t\tPermFind,\n\t\t///<summary>[C2S] ntfy:permfind</summary>\n\t\tPermFindRequest,\n\t\t///<summary>[C2S] ntfy:permidgetbyname</summary>\n\t\tPermIdByNameRequest,\n\t\t///<summary>[S2C] ntfy:notifypermissionlist</summary>\n\t\tPermList,\n\t\t///<summary>[C2S] ntfy:permissionlist</summary>\n\t\tPermListRequest,\n\t\t///<summary>[S2C] ntfy:notifypermoverview</summary>\n\t\tPermOverview,\n\t\t///<summary>[C2S] ntfy:permoverview</summary>\n\t\tPermOverviewRequest,\n\t\t///<summary>[C2S] ntfy:permget</summary>\n\t\tPermRequest,\n\t\t///<summary>[C2S] ntfy:permreset</summary>\n\t\tPermReset,\n\t\t///<summary>[S2C] ntfy:notifyplugincmd</summary>\n\t\tPluginCommand,\n\t\t///<summary>[C2S] ntfy:plugincmd</summary>\n\t\tPluginCommandRequest,\n\t\t///<summary>[C2S] ntfy:privilegekeyadd</summary>\n\t\tPrivilegeKeyAddRequest,\n\t\t///<summary>[C2S] ntfy:privilegekeydelete</summary>\n\t\tPrivilegeKeyDelete,\n\t\t///<summary>[C2S] ntfy:privilegekeylist</summary>\n\t\tPrivilegeKeyListRequest,\n\t\t///<summary>[C2S] ntfy:privilegekeyuse</summary>\n\t\tPrivilegeKeyUse,\n\t\t///<summary>[C2S] ntfy:quit</summary>\n\t\tQuit,\n\t\t///<summary>[C2S] ntfy:sendtextmessage</summary>\n\t\tSendTextMessage,\n\t\t///<summary>[S2C] ntfy:notifyserverconnectioninfo</summary>\n\t\tServerConnectionInfo,\n\t\t///<summary>[C2S] ntfy:serverrequestconnectioninfo</summary>\n\t\tServerConnectionInfoRequest,\n\t\t///<summary>[C2S] ntfy:servercreate</summary>\n\t\tServerCreate,\n\t\t///<summary>[C2S] ntfy:serverdelete</summary>\n\t\tServerDelete,\n\t\t///<summary>[C2S] ntfy:serveredit</summary>\n\t\tServerEdit,\n\t\t///<summary>[S2C] ntfy:notifyserveredited</summary>\n\t\tServerEdited,\n\t\t///<summary>[C2S] ntfy:servergroupadd</summary>\n\t\tServerGroupAdd,\n\t\t///<summary>[C2S] ntfy:servergroupaddclient</summary>\n\t\tServerGroupAddClient,\n\t\t///<summary>[C2S] ntfy:servergroupaddperm</summary>\n\t\tServerGroupAddPerm,\n\t\t///<summary>[C2S] ntfy:servergroupautoaddperm</summary>\n\t\tServerGroupAutoAddPerm,\n\t\t///<summary>[C2S] ntfy:servergroupautodelperm</summary>\n\t\tServerGroupAutoDelPerm,\n\t\t///<summary>[S2C] ntfy:notifyservergroupclientlist</summary>\n\t\tServerGroupClientList,\n\t\t///<summary>[C2S] ntfy:servergroupclientlist</summary>\n\t\tServerGroupClientListRequest,\n\t\t///<summary>[C2S] ntfy:servergroupcopy</summary>\n\t\tServerGroupCopy,\n\t\t///<summary>[C2S] ntfy:servergroupdel</summary>\n\t\tServerGroupDel,\n\t\t///<summary>[C2S] ntfy:servergroupdelclient</summary>\n\t\tServerGroupDelClient,\n\t\t///<summary>[C2S] ntfy:servergroupdelperm</summary>\n\t\tServerGroupDelPerm,\n\t\t///<summary>[S2C] ntfy:notifyservergrouplist</summary>\n\t\tServerGroupList,\n\t\t///<summary>[C2S] ntfy:servergrouplist</summary>\n\t\tServerGroupListRequest,\n\t\t///<summary>[S2C] ntfy:notifyservergrouppermlist</summary>\n\t\tServerGroupPermList,\n\t\t///<summary>[C2S] ntfy:servergrouppermlist</summary>\n\t\tServerGroupPermListRequest,\n\t\t///<summary>[C2S] ntfy:servergrouprename</summary>\n\t\tServerGroupRename,\n\t\t///<summary>[S2C] ntfy:notifyservergroupsbyclientid</summary>\n\t\tServerGroupsByClientId,\n\t\t///<summary>[C2S] ntfy:servergroupsbyclientid</summary>\n\t\tServerGroupsByClientIdRequest,\n\t\t///<summary>[C2S] ntfy:serveridgetbyport</summary>\n\t\tServerIdGetByPort,\n\t\t///<summary>[C2S] ntfy:serverinfo</summary>\n\t\tServerInfo,\n\t\t///<summary>[C2S] ntfy:serverlist</summary>\n\t\tServerListRequest,\n\t\t///<summary>[S2C] ntfy:notifyserverlog</summary>\n\t\tServerLog,\n\t\t///<summary>[C2S] ntfy:servernotifyregister</summary>\n\t\tServerNotifyRegister,\n\t\t///<summary>[C2S] ntfy:servernotifyunregister</summary>\n\t\tServerNotifyUnregister,\n\t\t///<summary>[C2S] ntfy:serverprocessstop</summary>\n\t\tServerProcessStop,\n\t\t///<summary>[C2S] ntfy:serversnapshotcreate</summary>\n\t\tServerSnapshotCreate,\n\t\t///<summary>[C2S] ntfy:serversnapshotdeploy</summary>\n\t\tServerSnapshotDeploy,\n\t\t///<summary>[C2S] ntfy:serverstart</summary>\n\t\tServerStart,\n\t\t///<summary>[C2S] ntfy:serverstop</summary>\n\t\tServerStop,\n\t\t///<summary>[C2S] ntfy:servertemppasswordadd</summary>\n\t\tServerTempPasswordAdd,\n\t\t///<summary>[C2S] ntfy:servertemppassworddel</summary>\n\t\tServerTempPasswordDel,\n\t\t///<summary>[S2C] ntfy:notifyservertemppasswordlist</summary>\n\t\tServerTempPasswordList,\n\t\t///<summary>[C2S] ntfy:servertemppasswordlist</summary>\n\t\tServerTempPasswordListRequest,\n\t\t///<summary>[S2C] ntfy:notifyserverupdated</summary>\n\t\tServerUpdated,\n\t\t///<summary>[C2S] ntfy:servergetvariables</summary>\n\t\tServerVariablesRequest,\n\t\t///<summary>[C2S] ntfy:setclientchannelgroup</summary>\n\t\tSetClientChannelGroup,\n\t\t///<summary>[S2C] ntfy:notifytextmessage</summary>\n\t\tTextMessage,\n\t\t///<summary>[S2C] ntfy:notifytokenadd</summary>\n\t\tTokenAdd,\n\t\t///<summary>[C2S] ntfy:tokenadd</summary>\n\t\tTokenAddRequest,\n\t\t///<summary>[C2S] ntfy:tokendelete</summary>\n\t\tTokenDelete,\n\t\t///<summary>[S2C] ntfy:notifytokenlist</summary>\n\t\tTokenList,\n\t\t///<summary>[C2S] ntfy:tokenlist</summary>\n\t\tTokenListRequest,\n\t\t///<summary>[C2S] ntfy:tokenuse</summary>\n\t\tTokenUse,\n\t\t///<summary>[S2C] ntfy:notifytokenused</summary>\n\t\tTokenUsed,\n\t\t///<summary>[C2S] ntfy:use</summary>\n\t\tUse,\n\t\t///<summary>[C2S] ntfy:version</summary>\n\t\tVersionRequest,\n\t\t///<summary>[C2S] ntfy:whoami</summary>\n\t\tWhoAmIRequest,\n\t}\n\n\tpublic static class MessageHelper\n\t{\n\t\tpublic static NotificationType GetToClientNotificationType(string name)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\t\t\tcase \"notifybanlist\": return NotificationType.BanList;\n\t\t\tcase \"notifychannelchanged\": return NotificationType.ChannelChanged;\n\t\t\tcase \"notifychannelclientpermlist\": return NotificationType.ChannelClientPermList;\n\t\t\tcase \"notifychannelcreated\": return NotificationType.ChannelCreated;\n\t\t\tcase \"notifychanneldeleted\": return NotificationType.ChannelDeleted;\n\t\t\tcase \"notifychanneldescriptionchanged\": return NotificationType.ChannelDescriptionChanged;\n\t\t\tcase \"notifychanneledited\": return NotificationType.ChannelEdited;\n\t\t\tcase \"notifychannelgroupclientlist\": return NotificationType.ChannelGroupClientList;\n\t\t\tcase \"notifychannelgrouplist\": return NotificationType.ChannelGroupList;\n\t\t\tcase \"notifychannelgrouppermlist\": return NotificationType.ChannelGroupPermList;\n\t\t\tcase \"channellist\": return NotificationType.ChannelList;\n\t\t\tcase \"channellistfinished\": return NotificationType.ChannelListFinished;\n\t\t\tcase \"notifychannelmoved\": return NotificationType.ChannelMoved;\n\t\t\tcase \"notifychannelpasswordchanged\": return NotificationType.ChannelPasswordChanged;\n\t\t\tcase \"notifychannelpermhints\": return NotificationType.ChannelPermissionHints;\n\t\t\tcase \"notifychannelpermlist\": return NotificationType.ChannelPermList;\n\t\t\tcase \"notifychannelsubscribed\": return NotificationType.ChannelSubscribed;\n\t\t\tcase \"notifychannelunsubscribed\": return NotificationType.ChannelUnsubscribed;\n\t\t\tcase \"notifyclientchannelgroupchanged\": return NotificationType.ClientChannelGroupChanged;\n\t\t\tcase \"notifyclientchatclosed\": return NotificationType.ClientChatClosed;\n\t\t\tcase \"notifyclientchatcomposing\": return NotificationType.ClientChatComposing;\n\t\t\tcase \"notifyconnectioninfo\": return NotificationType.ClientConnectionInfo;\n\t\t\tcase \"notifyconnectioninforequest\": return NotificationType.ClientConnectionInfoUpdateRequest;\n\t\t\tcase \"notifyclientdbfind\": return NotificationType.ClientDbFind;\n\t\t\tcase \"notifyclientdbidfromuid\": return NotificationType.ClientDbIdFromUid;\n\t\t\tcase \"notifyclientdblist\": return NotificationType.ClientDbList;\n\t\t\tcase \"notifycliententerview\": return NotificationType.ClientEnterView;\n\t\t\tcase \"notifyclientids\": return NotificationType.ClientIds;\n\t\t\tcase \"notifyclientleftview\": return NotificationType.ClientLeftView;\n\t\t\tcase \"notifyclientmoved\": return NotificationType.ClientMoved;\n\t\t\tcase \"notifyclientnamefromdbid\": return NotificationType.ClientNameFromDbId;\n\t\t\tcase \"notifyclientnamefromuid\": return NotificationType.ClientNameFromUid;\n\t\t\tcase \"notifyclientneededpermissions\": return NotificationType.ClientNeededPermissions;\n\t\t\tcase \"notifyclientpermhints\": return NotificationType.ClientPermissionHints;\n\t\t\tcase \"notifyclientpermlist\": return NotificationType.ClientPermList;\n\t\t\tcase \"notifyclientpoke\": return NotificationType.ClientPoke;\n\t\t\tcase \"notifyservergroupclientadded\": return NotificationType.ClientServerGroupAdded;\n\t\t\tcase \"notifyservergroupclientdeleted\": return NotificationType.ClientServerGroupRemoved;\n\t\t\tcase \"notifyclientserverqueryloginpassword\": return NotificationType.ClientSetServerQueryLogin;\n\t\t\tcase \"notifyclientuidfromclid\": return NotificationType.ClientUidFromClid;\n\t\t\tcase \"notifyclientupdated\": return NotificationType.ClientUpdated;\n\t\t\tcase \"error\": return NotificationType.CommandError;\n\t\t\tcase \"notifycomplainlist\": return NotificationType.ComplainList;\n\t\t\tcase \"notifystartdownload\": return NotificationType.FileDownload;\n\t\t\tcase \"notifyfileinfo\": return NotificationType.FileInfo;\n\t\t\tcase \"notifyfilelist\": return NotificationType.FileList;\n\t\t\tcase \"notifyfilelistfinished\": return NotificationType.FileListFinished;\n\t\t\tcase \"notifyfiletransferlist\": return NotificationType.FileTransfer;\n\t\t\tcase \"notifystatusfiletransfer\": return NotificationType.FileTransferStatus;\n\t\t\tcase \"notifystartupload\": return NotificationType.FileUpload;\n\t\t\tcase \"initivexpand\": return NotificationType.InitIvExpand;\n\t\t\tcase \"initivexpand2\": return NotificationType.InitIvExpand2;\n\t\t\tcase \"initserver\": return NotificationType.InitServer;\n\t\t\tcase \"notifymessage\": return NotificationType.OfflineMessage;\n\t\t\tcase \"notifymessagelist\": return NotificationType.OfflineMessageList;\n\t\t\tcase \"notifypermfind\": return NotificationType.PermFind;\n\t\t\tcase \"notifypermissionlist\": return NotificationType.PermList;\n\t\t\tcase \"notifypermoverview\": return NotificationType.PermOverview;\n\t\t\tcase \"notifyplugincmd\": return NotificationType.PluginCommand;\n\t\t\tcase \"notifyserverconnectioninfo\": return NotificationType.ServerConnectionInfo;\n\t\t\tcase \"notifyserveredited\": return NotificationType.ServerEdited;\n\t\t\tcase \"notifyservergroupclientlist\": return NotificationType.ServerGroupClientList;\n\t\t\tcase \"notifyservergrouplist\": return NotificationType.ServerGroupList;\n\t\t\tcase \"notifyservergrouppermlist\": return NotificationType.ServerGroupPermList;\n\t\t\tcase \"notifyservergroupsbyclientid\": return NotificationType.ServerGroupsByClientId;\n\t\t\tcase \"notifyserverlog\": return NotificationType.ServerLog;\n\t\t\tcase \"notifyservertemppasswordlist\": return NotificationType.ServerTempPasswordList;\n\t\t\tcase \"notifyserverupdated\": return NotificationType.ServerUpdated;\n\t\t\tcase \"notifytextmessage\": return NotificationType.TextMessage;\n\t\t\tcase \"notifytokenadd\": return NotificationType.TokenAdd;\n\t\t\tcase \"notifytokenlist\": return NotificationType.TokenList;\n\t\t\tcase \"notifytokenused\": return NotificationType.TokenUsed;\n\t\t\tdefault: return NotificationType.Unknown;\n\t\t\t}\n\t\t}\n\n\t\tpublic static NotificationType GetToServerNotificationType(string name)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\t\t\tcase \"banadd\": return NotificationType.BanAdd;\n\t\t\tcase \"banclient\": return NotificationType.BanClient;\n\t\t\tcase \"bandel\": return NotificationType.BanDel;\n\t\t\tcase \"bandelall\": return NotificationType.BanDelAll;\n\t\t\tcase \"banlist\": return NotificationType.BanListRequest;\n\t\t\tcase \"bindinglist\": return NotificationType.BindingList;\n\t\t\tcase \"channeladdperm\": return NotificationType.ChannelAddPerm;\n\t\t\tcase \"channelclientaddperm\": return NotificationType.ChannelClientAddPerm;\n\t\t\tcase \"channelclientdelperm\": return NotificationType.ChannelClientDelPerm;\n\t\t\tcase \"channelclientpermlist\": return NotificationType.ChannelClientPermListRequest;\n\t\t\tcase \"channelcreate\": return NotificationType.ChannelCreate;\n\t\t\tcase \"channeldelete\": return NotificationType.ChannelDelete;\n\t\t\tcase \"channeldelperm\": return NotificationType.ChannelDelPerm;\n\t\t\tcase \"channelgetdescription\": return NotificationType.ChannelDescriptionRequest;\n\t\t\tcase \"channeledit\": return NotificationType.ChannelEdit;\n\t\t\tcase \"channelfind\": return NotificationType.ChannelFindRequest;\n\t\t\tcase \"channelgroupadd\": return NotificationType.ChannelGroupAdd;\n\t\t\tcase \"channelgroupaddperm\": return NotificationType.ChannelGroupAddPerm;\n\t\t\tcase \"channelgroupclientlist\": return NotificationType.ChannelGroupClientListRequest;\n\t\t\tcase \"channelgroupcopy\": return NotificationType.ChannelGroupCopy;\n\t\t\tcase \"channelgroupdel\": return NotificationType.ChannelGroupDel;\n\t\t\tcase \"channelgroupdelperm\": return NotificationType.ChannelGroupDelPerm;\n\t\t\tcase \"channelgrouplist\": return NotificationType.ChannelGroupListRequest;\n\t\t\tcase \"channelgrouppermlist\": return NotificationType.ChannelGroupPermListRequest;\n\t\t\tcase \"channelgrouprename\": return NotificationType.ChannelGroupRename;\n\t\t\tcase \"channelinfo\": return NotificationType.ChannelInfoRequest;\n\t\t\tcase \"channellist\": return NotificationType.ChannelListRequest;\n\t\t\tcase \"channelmove\": return NotificationType.ChannelMove;\n\t\t\tcase \"channelpermlist\": return NotificationType.ChannelPermListRequest;\n\t\t\tcase \"channelsubscribe\": return NotificationType.ChannelSubscribe;\n\t\t\tcase \"channelsubscribeall\": return NotificationType.ChannelSubscribeAll;\n\t\t\tcase \"channelunsubscribe\": return NotificationType.ChannelUnsubscribe;\n\t\t\tcase \"channelunsubscribeall\": return NotificationType.ChannelUnsubscribeAll;\n\t\t\tcase \"clientaddperm\": return NotificationType.ClientAddPerm;\n\t\t\tcase \"clientchatclosed\": return NotificationType.ClientChatClose;\n\t\t\tcase \"getconnectioninfo\": return NotificationType.ClientConnectionInfoRequest;\n\t\t\tcase \"clientdbdelete\": return NotificationType.ClientDbDelete;\n\t\t\tcase \"clientdbedit\": return NotificationType.ClientDbEdit;\n\t\t\tcase \"clientdbfind\": return NotificationType.ClientDbFindRequest;\n\t\t\tcase \"clientgetdbidfromuid\": return NotificationType.ClientDbIdFromUidRequest;\n\t\t\tcase \"clientdbinfo\": return NotificationType.ClientDbInfoRequest;\n\t\t\tcase \"clientdblist\": return NotificationType.ClientDbListRequest;\n\t\t\tcase \"clientdelperm\": return NotificationType.ClientDelPerm;\n\t\t\tcase \"clientedit\": return NotificationType.ClientEdit;\n\t\t\tcase \"clientfind\": return NotificationType.ClientFindRequest;\n\t\t\tcase \"clientgetids\": return NotificationType.ClientIdsRequest;\n\t\t\tcase \"clientinfo\": return NotificationType.ClientInfoRequest;\n\t\t\tcase \"clientinit\": return NotificationType.ClientInit;\n\t\t\tcase \"clientinitiv\": return NotificationType.ClientInitIv;\n\t\t\tcase \"clientkick\": return NotificationType.ClientKick;\n\t\t\tcase \"clientlist\": return NotificationType.ClientListRequest;\n\t\t\tcase \"clientmove\": return NotificationType.ClientMove;\n\t\t\tcase \"clientgetnamefromdbid\": return NotificationType.ClientNameFromDbIdRequest;\n\t\t\tcase \"clientgetnamefromuid\": return NotificationType.ClientNameFromUidRequest;\n\t\t\tcase \"clientpermlist\": return NotificationType.ClientPermListRequest;\n\t\t\tcase \"clientpoke\": return NotificationType.ClientPokeRequest;\n\t\t\tcase \"clientsetserverquerylogin\": return NotificationType.ClientSetServerQueryLoginRequest;\n\t\t\tcase \"clientgetuidfromclid\": return NotificationType.ClientUidFromClidRequest;\n\t\t\tcase \"clientupdate\": return NotificationType.ClientUpdate;\n\t\t\tcase \"clientgetvariables\": return NotificationType.ClientVariablesRequest;\n\t\t\tcase \"complainadd\": return NotificationType.ComplainAdd;\n\t\t\tcase \"complaindel\": return NotificationType.ComplainDel;\n\t\t\tcase \"complaindelall\": return NotificationType.ComplainDelAll;\n\t\t\tcase \"complainlist\": return NotificationType.ComplainListRequest;\n\t\t\tcase \"customdelete\": return NotificationType.CustomDelete;\n\t\t\tcase \"custominfo\": return NotificationType.CustomInfoRequest;\n\t\t\tcase \"customsearch\": return NotificationType.CustomSearch;\n\t\t\tcase \"customset\": return NotificationType.CustomSet;\n\t\t\tcase \"clientdisconnect\": return NotificationType.Disconnect;\n\t\t\tcase \"ftcreatedir\": return NotificationType.FtCreateDir;\n\t\t\tcase \"ftdeletefile\": return NotificationType.FtDeleteFile;\n\t\t\tcase \"ftgetfileinfo\": return NotificationType.FtFileInfoRequest;\n\t\t\tcase \"ftgetfilelist\": return NotificationType.FtFileListRequest;\n\t\t\tcase \"ftinitdownload\": return NotificationType.FtInitDownload;\n\t\t\tcase \"ftinitupload\": return NotificationType.FtInitUpload;\n\t\t\tcase \"ftlist\": return NotificationType.FtList;\n\t\t\tcase \"ftrenamefile\": return NotificationType.FtRenameFile;\n\t\t\tcase \"ftstop\": return NotificationType.FtStop;\n\t\t\tcase \"gm\": return NotificationType.GlobalMessage;\n\t\t\tcase \"hostinfo\": return NotificationType.HostInfoRequest;\n\t\t\tcase \"instanceedit\": return NotificationType.InstanceEdit;\n\t\t\tcase \"instanceinfo\": return NotificationType.InstanceInfo;\n\t\t\tcase \"logadd\": return NotificationType.LogAdd;\n\t\t\tcase \"login\": return NotificationType.Login;\n\t\t\tcase \"logout\": return NotificationType.Logout;\n\t\t\tcase \"logview\": return NotificationType.LogView;\n\t\t\tcase \"messageadd\": return NotificationType.OfflineMessageAdd;\n\t\t\tcase \"messagedel\": return NotificationType.OfflineMessageDel;\n\t\t\tcase \"messageget\": return NotificationType.OfflineMessageGet;\n\t\t\tcase \"messagelist\": return NotificationType.OfflineMessageListRequest;\n\t\t\tcase \"messageupdateflag\": return NotificationType.OfflineMessageUpdateFlag;\n\t\t\tcase \"permfind\": return NotificationType.PermFindRequest;\n\t\t\tcase \"permidgetbyname\": return NotificationType.PermIdByNameRequest;\n\t\t\tcase \"permissionlist\": return NotificationType.PermListRequest;\n\t\t\tcase \"permoverview\": return NotificationType.PermOverviewRequest;\n\t\t\tcase \"permget\": return NotificationType.PermRequest;\n\t\t\tcase \"permreset\": return NotificationType.PermReset;\n\t\t\tcase \"plugincmd\": return NotificationType.PluginCommandRequest;\n\t\t\tcase \"privilegekeyadd\": return NotificationType.PrivilegeKeyAddRequest;\n\t\t\tcase \"privilegekeydelete\": return NotificationType.PrivilegeKeyDelete;\n\t\t\tcase \"privilegekeylist\": return NotificationType.PrivilegeKeyListRequest;\n\t\t\tcase \"privilegekeyuse\": return NotificationType.PrivilegeKeyUse;\n\t\t\tcase \"quit\": return NotificationType.Quit;\n\t\t\tcase \"sendtextmessage\": return NotificationType.SendTextMessage;\n\t\t\tcase \"serverrequestconnectioninfo\": return NotificationType.ServerConnectionInfoRequest;\n\t\t\tcase \"servercreate\": return NotificationType.ServerCreate;\n\t\t\tcase \"serverdelete\": return NotificationType.ServerDelete;\n\t\t\tcase \"serveredit\": return NotificationType.ServerEdit;\n\t\t\tcase \"servergroupadd\": return NotificationType.ServerGroupAdd;\n\t\t\tcase \"servergroupaddclient\": return NotificationType.ServerGroupAddClient;\n\t\t\tcase \"servergroupaddperm\": return NotificationType.ServerGroupAddPerm;\n\t\t\tcase \"servergroupautoaddperm\": return NotificationType.ServerGroupAutoAddPerm;\n\t\t\tcase \"servergroupautodelperm\": return NotificationType.ServerGroupAutoDelPerm;\n\t\t\tcase \"servergroupclientlist\": return NotificationType.ServerGroupClientListRequest;\n\t\t\tcase \"servergroupcopy\": return NotificationType.ServerGroupCopy;\n\t\t\tcase \"servergroupdel\": return NotificationType.ServerGroupDel;\n\t\t\tcase \"servergroupdelclient\": return NotificationType.ServerGroupDelClient;\n\t\t\tcase \"servergroupdelperm\": return NotificationType.ServerGroupDelPerm;\n\t\t\tcase \"servergrouplist\": return NotificationType.ServerGroupListRequest;\n\t\t\tcase \"servergrouppermlist\": return NotificationType.ServerGroupPermListRequest;\n\t\t\tcase \"servergrouprename\": return NotificationType.ServerGroupRename;\n\t\t\tcase \"servergroupsbyclientid\": return NotificationType.ServerGroupsByClientIdRequest;\n\t\t\tcase \"serveridgetbyport\": return NotificationType.ServerIdGetByPort;\n\t\t\tcase \"serverinfo\": return NotificationType.ServerInfo;\n\t\t\tcase \"serverlist\": return NotificationType.ServerListRequest;\n\t\t\tcase \"servernotifyregister\": return NotificationType.ServerNotifyRegister;\n\t\t\tcase \"servernotifyunregister\": return NotificationType.ServerNotifyUnregister;\n\t\t\tcase \"serverprocessstop\": return NotificationType.ServerProcessStop;\n\t\t\tcase \"serversnapshotcreate\": return NotificationType.ServerSnapshotCreate;\n\t\t\tcase \"serversnapshotdeploy\": return NotificationType.ServerSnapshotDeploy;\n\t\t\tcase \"serverstart\": return NotificationType.ServerStart;\n\t\t\tcase \"serverstop\": return NotificationType.ServerStop;\n\t\t\tcase \"servertemppasswordadd\": return NotificationType.ServerTempPasswordAdd;\n\t\t\tcase \"servertemppassworddel\": return NotificationType.ServerTempPasswordDel;\n\t\t\tcase \"servertemppasswordlist\": return NotificationType.ServerTempPasswordListRequest;\n\t\t\tcase \"servergetvariables\": return NotificationType.ServerVariablesRequest;\n\t\t\tcase \"setclientchannelgroup\": return NotificationType.SetClientChannelGroup;\n\t\t\tcase \"tokenadd\": return NotificationType.TokenAddRequest;\n\t\t\tcase \"tokendelete\": return NotificationType.TokenDelete;\n\t\t\tcase \"tokenlist\": return NotificationType.TokenListRequest;\n\t\t\tcase \"tokenuse\": return NotificationType.TokenUse;\n\t\t\tcase \"use\": return NotificationType.Use;\n\t\t\tcase \"version\": return NotificationType.VersionRequest;\n\t\t\tcase \"whoami\": return NotificationType.WhoAmIRequest;\n\t\t\tdefault: return NotificationType.Unknown;\n\t\t\t}\n\t\t}\n\n\t\tpublic static INotification GenerateNotificationType(NotificationType name)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\t\t\tcase NotificationType.BanAdd: return new BanAdd();\n\t\t\tcase NotificationType.BanClient: return new BanClient();\n\t\t\tcase NotificationType.BanDel: return new BanDel();\n\t\t\tcase NotificationType.BanDelAll: return new BanDelAll();\n\t\t\tcase NotificationType.BanList: return new BanList();\n\t\t\tcase NotificationType.BanListRequest: return new BanListRequest();\n\t\t\tcase NotificationType.BindingList: return new BindingList();\n\t\t\tcase NotificationType.ChannelAddPerm: return new ChannelAddPerm();\n\t\t\tcase NotificationType.ChannelChanged: return new ChannelChanged();\n\t\t\tcase NotificationType.ChannelClientAddPerm: return new ChannelClientAddPerm();\n\t\t\tcase NotificationType.ChannelClientDelPerm: return new ChannelClientDelPerm();\n\t\t\tcase NotificationType.ChannelClientPermList: return new ChannelClientPermList();\n\t\t\tcase NotificationType.ChannelClientPermListRequest: return new ChannelClientPermListRequest();\n\t\t\tcase NotificationType.ChannelCreate: return new ChannelCreate();\n\t\t\tcase NotificationType.ChannelCreated: return new ChannelCreated();\n\t\t\tcase NotificationType.ChannelDelete: return new ChannelDelete();\n\t\t\tcase NotificationType.ChannelDeleted: return new ChannelDeleted();\n\t\t\tcase NotificationType.ChannelDelPerm: return new ChannelDelPerm();\n\t\t\tcase NotificationType.ChannelDescriptionChanged: return new ChannelDescriptionChanged();\n\t\t\tcase NotificationType.ChannelDescriptionRequest: return new ChannelDescriptionRequest();\n\t\t\tcase NotificationType.ChannelEdit: return new ChannelEdit();\n\t\t\tcase NotificationType.ChannelEdited: return new ChannelEdited();\n\t\t\tcase NotificationType.ChannelFindRequest: return new ChannelFindRequest();\n\t\t\tcase NotificationType.ChannelGroupAdd: return new ChannelGroupAdd();\n\t\t\tcase NotificationType.ChannelGroupAddPerm: return new ChannelGroupAddPerm();\n\t\t\tcase NotificationType.ChannelGroupClientList: return new ChannelGroupClientList();\n\t\t\tcase NotificationType.ChannelGroupClientListRequest: return new ChannelGroupClientListRequest();\n\t\t\tcase NotificationType.ChannelGroupCopy: return new ChannelGroupCopy();\n\t\t\tcase NotificationType.ChannelGroupDel: return new ChannelGroupDel();\n\t\t\tcase NotificationType.ChannelGroupDelPerm: return new ChannelGroupDelPerm();\n\t\t\tcase NotificationType.ChannelGroupList: return new ChannelGroupList();\n\t\t\tcase NotificationType.ChannelGroupListRequest: return new ChannelGroupListRequest();\n\t\t\tcase NotificationType.ChannelGroupPermList: return new ChannelGroupPermList();\n\t\t\tcase NotificationType.ChannelGroupPermListRequest: return new ChannelGroupPermListRequest();\n\t\t\tcase NotificationType.ChannelGroupRename: return new ChannelGroupRename();\n\t\t\tcase NotificationType.ChannelInfoRequest: return new ChannelInfoRequest();\n\t\t\tcase NotificationType.ChannelList: return new ChannelList();\n\t\t\tcase NotificationType.ChannelListFinished: return new ChannelListFinished();\n\t\t\tcase NotificationType.ChannelListRequest: return new ChannelListRequest();\n\t\t\tcase NotificationType.ChannelMove: return new ChannelMove();\n\t\t\tcase NotificationType.ChannelMoved: return new ChannelMoved();\n\t\t\tcase NotificationType.ChannelPasswordChanged: return new ChannelPasswordChanged();\n\t\t\tcase NotificationType.ChannelPermissionHints: return new ChannelPermissionHints();\n\t\t\tcase NotificationType.ChannelPermList: return new ChannelPermList();\n\t\t\tcase NotificationType.ChannelPermListRequest: return new ChannelPermListRequest();\n\t\t\tcase NotificationType.ChannelSubscribe: return new ChannelSubscribe();\n\t\t\tcase NotificationType.ChannelSubscribeAll: return new ChannelSubscribeAll();\n\t\t\tcase NotificationType.ChannelSubscribed: return new ChannelSubscribed();\n\t\t\tcase NotificationType.ChannelUnsubscribe: return new ChannelUnsubscribe();\n\t\t\tcase NotificationType.ChannelUnsubscribeAll: return new ChannelUnsubscribeAll();\n\t\t\tcase NotificationType.ChannelUnsubscribed: return new ChannelUnsubscribed();\n\t\t\tcase NotificationType.ClientAddPerm: return new ClientAddPerm();\n\t\t\tcase NotificationType.ClientChannelGroupChanged: return new ClientChannelGroupChanged();\n\t\t\tcase NotificationType.ClientChatClose: return new ClientChatClose();\n\t\t\tcase NotificationType.ClientChatClosed: return new ClientChatClosed();\n\t\t\tcase NotificationType.ClientChatComposing: return new ClientChatComposing();\n\t\t\tcase NotificationType.ClientConnectionInfo: return new ClientConnectionInfo();\n\t\t\tcase NotificationType.ClientConnectionInfoRequest: return new ClientConnectionInfoRequest();\n\t\t\tcase NotificationType.ClientConnectionInfoUpdateRequest: return new ClientConnectionInfoUpdateRequest();\n\t\t\tcase NotificationType.ClientDbDelete: return new ClientDbDelete();\n\t\t\tcase NotificationType.ClientDbEdit: return new ClientDbEdit();\n\t\t\tcase NotificationType.ClientDbFind: return new ClientDbFind();\n\t\t\tcase NotificationType.ClientDbFindRequest: return new ClientDbFindRequest();\n\t\t\tcase NotificationType.ClientDbIdFromUid: return new ClientDbIdFromUid();\n\t\t\tcase NotificationType.ClientDbIdFromUidRequest: return new ClientDbIdFromUidRequest();\n\t\t\tcase NotificationType.ClientDbInfoRequest: return new ClientDbInfoRequest();\n\t\t\tcase NotificationType.ClientDbList: return new ClientDbList();\n\t\t\tcase NotificationType.ClientDbListRequest: return new ClientDbListRequest();\n\t\t\tcase NotificationType.ClientDelPerm: return new ClientDelPerm();\n\t\t\tcase NotificationType.ClientEdit: return new ClientEdit();\n\t\t\tcase NotificationType.ClientEnterView: return new ClientEnterView();\n\t\t\tcase NotificationType.ClientFindRequest: return new ClientFindRequest();\n\t\t\tcase NotificationType.ClientIds: return new ClientIds();\n\t\t\tcase NotificationType.ClientIdsRequest: return new ClientIdsRequest();\n\t\t\tcase NotificationType.ClientInfoRequest: return new ClientInfoRequest();\n\t\t\tcase NotificationType.ClientInit: return new ClientInit();\n\t\t\tcase NotificationType.ClientInitIv: return new ClientInitIv();\n\t\t\tcase NotificationType.ClientKick: return new ClientKick();\n\t\t\tcase NotificationType.ClientLeftView: return new ClientLeftView();\n\t\t\tcase NotificationType.ClientListRequest: return new ClientListRequest();\n\t\t\tcase NotificationType.ClientMove: return new ClientMove();\n\t\t\tcase NotificationType.ClientMoved: return new ClientMoved();\n\t\t\tcase NotificationType.ClientNameFromDbId: return new ClientNameFromDbId();\n\t\t\tcase NotificationType.ClientNameFromDbIdRequest: return new ClientNameFromDbIdRequest();\n\t\t\tcase NotificationType.ClientNameFromUid: return new ClientNameFromUid();\n\t\t\tcase NotificationType.ClientNameFromUidRequest: return new ClientNameFromUidRequest();\n\t\t\tcase NotificationType.ClientNeededPermissions: return new ClientNeededPermissions();\n\t\t\tcase NotificationType.ClientPermissionHints: return new ClientPermissionHints();\n\t\t\tcase NotificationType.ClientPermList: return new ClientPermList();\n\t\t\tcase NotificationType.ClientPermListRequest: return new ClientPermListRequest();\n\t\t\tcase NotificationType.ClientPoke: return new ClientPoke();\n\t\t\tcase NotificationType.ClientPokeRequest: return new ClientPokeRequest();\n\t\t\tcase NotificationType.ClientServerGroupAdded: return new ClientServerGroupAdded();\n\t\t\tcase NotificationType.ClientServerGroupRemoved: return new ClientServerGroupRemoved();\n\t\t\tcase NotificationType.ClientSetServerQueryLogin: return new ClientSetServerQueryLogin();\n\t\t\tcase NotificationType.ClientSetServerQueryLoginRequest: return new ClientSetServerQueryLoginRequest();\n\t\t\tcase NotificationType.ClientUidFromClid: return new ClientUidFromClid();\n\t\t\tcase NotificationType.ClientUidFromClidRequest: return new ClientUidFromClidRequest();\n\t\t\tcase NotificationType.ClientUpdate: return new ClientUpdate();\n\t\t\tcase NotificationType.ClientUpdated: return new ClientUpdated();\n\t\t\tcase NotificationType.ClientVariablesRequest: return new ClientVariablesRequest();\n\t\t\tcase NotificationType.CommandError: return new CommandError();\n\t\t\tcase NotificationType.ComplainAdd: return new ComplainAdd();\n\t\t\tcase NotificationType.ComplainDel: return new ComplainDel();\n\t\t\tcase NotificationType.ComplainDelAll: return new ComplainDelAll();\n\t\t\tcase NotificationType.ComplainList: return new ComplainList();\n\t\t\tcase NotificationType.ComplainListRequest: return new ComplainListRequest();\n\t\t\tcase NotificationType.CustomDelete: return new CustomDelete();\n\t\t\tcase NotificationType.CustomInfoRequest: return new CustomInfoRequest();\n\t\t\tcase NotificationType.CustomSearch: return new CustomSearch();\n\t\t\tcase NotificationType.CustomSet: return new CustomSet();\n\t\t\tcase NotificationType.Disconnect: return new Disconnect();\n\t\t\tcase NotificationType.FileDownload: return new FileDownload();\n\t\t\tcase NotificationType.FileInfo: return new FileInfo();\n\t\t\tcase NotificationType.FileList: return new FileList();\n\t\t\tcase NotificationType.FileListFinished: return new FileListFinished();\n\t\t\tcase NotificationType.FileTransfer: return new FileTransfer();\n\t\t\tcase NotificationType.FileTransferStatus: return new FileTransferStatus();\n\t\t\tcase NotificationType.FileUpload: return new FileUpload();\n\t\t\tcase NotificationType.FtCreateDir: return new FtCreateDir();\n\t\t\tcase NotificationType.FtDeleteFile: return new FtDeleteFile();\n\t\t\tcase NotificationType.FtFileInfoRequest: return new FtFileInfoRequest();\n\t\t\tcase NotificationType.FtFileListRequest: return new FtFileListRequest();\n\t\t\tcase NotificationType.FtInitDownload: return new FtInitDownload();\n\t\t\tcase NotificationType.FtInitUpload: return new FtInitUpload();\n\t\t\tcase NotificationType.FtList: return new FtList();\n\t\t\tcase NotificationType.FtRenameFile: return new FtRenameFile();\n\t\t\tcase NotificationType.FtStop: return new FtStop();\n\t\t\tcase NotificationType.GlobalMessage: return new GlobalMessage();\n\t\t\tcase NotificationType.HostInfoRequest: return new HostInfoRequest();\n\t\t\tcase NotificationType.InitIvExpand: return new InitIvExpand();\n\t\t\tcase NotificationType.InitIvExpand2: return new InitIvExpand2();\n\t\t\tcase NotificationType.InitServer: return new InitServer();\n\t\t\tcase NotificationType.InstanceEdit: return new InstanceEdit();\n\t\t\tcase NotificationType.InstanceInfo: return new InstanceInfo();\n\t\t\tcase NotificationType.LogAdd: return new LogAdd();\n\t\t\tcase NotificationType.Login: return new Login();\n\t\t\tcase NotificationType.Logout: return new Logout();\n\t\t\tcase NotificationType.LogView: return new LogView();\n\t\t\tcase NotificationType.OfflineMessage: return new OfflineMessage();\n\t\t\tcase NotificationType.OfflineMessageAdd: return new OfflineMessageAdd();\n\t\t\tcase NotificationType.OfflineMessageDel: return new OfflineMessageDel();\n\t\t\tcase NotificationType.OfflineMessageGet: return new OfflineMessageGet();\n\t\t\tcase NotificationType.OfflineMessageList: return new OfflineMessageList();\n\t\t\tcase NotificationType.OfflineMessageListRequest: return new OfflineMessageListRequest();\n\t\t\tcase NotificationType.OfflineMessageUpdateFlag: return new OfflineMessageUpdateFlag();\n\t\t\tcase NotificationType.PermFind: return new PermFind();\n\t\t\tcase NotificationType.PermFindRequest: return new PermFindRequest();\n\t\t\tcase NotificationType.PermIdByNameRequest: return new PermIdByNameRequest();\n\t\t\tcase NotificationType.PermList: return new PermList();\n\t\t\tcase NotificationType.PermListRequest: return new PermListRequest();\n\t\t\tcase NotificationType.PermOverview: return new PermOverview();\n\t\t\tcase NotificationType.PermOverviewRequest: return new PermOverviewRequest();\n\t\t\tcase NotificationType.PermRequest: return new PermRequest();\n\t\t\tcase NotificationType.PermReset: return new PermReset();\n\t\t\tcase NotificationType.PluginCommand: return new PluginCommand();\n\t\t\tcase NotificationType.PluginCommandRequest: return new PluginCommandRequest();\n\t\t\tcase NotificationType.PrivilegeKeyAddRequest: return new PrivilegeKeyAddRequest();\n\t\t\tcase NotificationType.PrivilegeKeyDelete: return new PrivilegeKeyDelete();\n\t\t\tcase NotificationType.PrivilegeKeyListRequest: return new PrivilegeKeyListRequest();\n\t\t\tcase NotificationType.PrivilegeKeyUse: return new PrivilegeKeyUse();\n\t\t\tcase NotificationType.Quit: return new Quit();\n\t\t\tcase NotificationType.SendTextMessage: return new SendTextMessage();\n\t\t\tcase NotificationType.ServerConnectionInfo: return new ServerConnectionInfo();\n\t\t\tcase NotificationType.ServerConnectionInfoRequest: return new ServerConnectionInfoRequest();\n\t\t\tcase NotificationType.ServerCreate: return new ServerCreate();\n\t\t\tcase NotificationType.ServerDelete: return new ServerDelete();\n\t\t\tcase NotificationType.ServerEdit: return new ServerEdit();\n\t\t\tcase NotificationType.ServerEdited: return new ServerEdited();\n\t\t\tcase NotificationType.ServerGroupAdd: return new ServerGroupAdd();\n\t\t\tcase NotificationType.ServerGroupAddClient: return new ServerGroupAddClient();\n\t\t\tcase NotificationType.ServerGroupAddPerm: return new ServerGroupAddPerm();\n\t\t\tcase NotificationType.ServerGroupAutoAddPerm: return new ServerGroupAutoAddPerm();\n\t\t\tcase NotificationType.ServerGroupAutoDelPerm: return new ServerGroupAutoDelPerm();\n\t\t\tcase NotificationType.ServerGroupClientList: return new ServerGroupClientList();\n\t\t\tcase NotificationType.ServerGroupClientListRequest: return new ServerGroupClientListRequest();\n\t\t\tcase NotificationType.ServerGroupCopy: return new ServerGroupCopy();\n\t\t\tcase NotificationType.ServerGroupDel: return new ServerGroupDel();\n\t\t\tcase NotificationType.ServerGroupDelClient: return new ServerGroupDelClient();\n\t\t\tcase NotificationType.ServerGroupDelPerm: return new ServerGroupDelPerm();\n\t\t\tcase NotificationType.ServerGroupList: return new ServerGroupList();\n\t\t\tcase NotificationType.ServerGroupListRequest: return new ServerGroupListRequest();\n\t\t\tcase NotificationType.ServerGroupPermList: return new ServerGroupPermList();\n\t\t\tcase NotificationType.ServerGroupPermListRequest: return new ServerGroupPermListRequest();\n\t\t\tcase NotificationType.ServerGroupRename: return new ServerGroupRename();\n\t\t\tcase NotificationType.ServerGroupsByClientId: return new ServerGroupsByClientId();\n\t\t\tcase NotificationType.ServerGroupsByClientIdRequest: return new ServerGroupsByClientIdRequest();\n\t\t\tcase NotificationType.ServerIdGetByPort: return new ServerIdGetByPort();\n\t\t\tcase NotificationType.ServerInfo: return new ServerInfo();\n\t\t\tcase NotificationType.ServerListRequest: return new ServerListRequest();\n\t\t\tcase NotificationType.ServerLog: return new ServerLog();\n\t\t\tcase NotificationType.ServerNotifyRegister: return new ServerNotifyRegister();\n\t\t\tcase NotificationType.ServerNotifyUnregister: return new ServerNotifyUnregister();\n\t\t\tcase NotificationType.ServerProcessStop: return new ServerProcessStop();\n\t\t\tcase NotificationType.ServerSnapshotCreate: return new ServerSnapshotCreate();\n\t\t\tcase NotificationType.ServerSnapshotDeploy: return new ServerSnapshotDeploy();\n\t\t\tcase NotificationType.ServerStart: return new ServerStart();\n\t\t\tcase NotificationType.ServerStop: return new ServerStop();\n\t\t\tcase NotificationType.ServerTempPasswordAdd: return new ServerTempPasswordAdd();\n\t\t\tcase NotificationType.ServerTempPasswordDel: return new ServerTempPasswordDel();\n\t\t\tcase NotificationType.ServerTempPasswordList: return new ServerTempPasswordList();\n\t\t\tcase NotificationType.ServerTempPasswordListRequest: return new ServerTempPasswordListRequest();\n\t\t\tcase NotificationType.ServerUpdated: return new ServerUpdated();\n\t\t\tcase NotificationType.ServerVariablesRequest: return new ServerVariablesRequest();\n\t\t\tcase NotificationType.SetClientChannelGroup: return new SetClientChannelGroup();\n\t\t\tcase NotificationType.TextMessage: return new TextMessage();\n\t\t\tcase NotificationType.TokenAdd: return new TokenAdd();\n\t\t\tcase NotificationType.TokenAddRequest: return new TokenAddRequest();\n\t\t\tcase NotificationType.TokenDelete: return new TokenDelete();\n\t\t\tcase NotificationType.TokenList: return new TokenList();\n\t\t\tcase NotificationType.TokenListRequest: return new TokenListRequest();\n\t\t\tcase NotificationType.TokenUse: return new TokenUse();\n\t\t\tcase NotificationType.TokenUsed: return new TokenUsed();\n\t\t\tcase NotificationType.Use: return new Use();\n\t\t\tcase NotificationType.VersionRequest: return new VersionRequest();\n\t\t\tcase NotificationType.WhoAmIRequest: return new WhoAmIRequest();\n\t\t\tcase NotificationType.Unknown:\n\t\t\tdefault: throw Tools.UnhandledDefault(name);\n\t\t\t}\n\t\t}\n\n\t\tpublic static INotification[] InstatiateNotificationArray(NotificationType name, int len)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{\n\t\t\tcase NotificationType.BanAdd: { var arr = new BanAdd[len]; for (int i = 0; i < len; i++) arr[i] = new BanAdd(); return arr; }\n\t\t\tcase NotificationType.BanClient: { var arr = new BanClient[len]; for (int i = 0; i < len; i++) arr[i] = new BanClient(); return arr; }\n\t\t\tcase NotificationType.BanDel: { var arr = new BanDel[len]; for (int i = 0; i < len; i++) arr[i] = new BanDel(); return arr; }\n\t\t\tcase NotificationType.BanDelAll: { var arr = new BanDelAll[len]; for (int i = 0; i < len; i++) arr[i] = new BanDelAll(); return arr; }\n\t\t\tcase NotificationType.BanList: { var arr = new BanList[len]; for (int i = 0; i < len; i++) arr[i] = new BanList(); return arr; }\n\t\t\tcase NotificationType.BanListRequest: { var arr = new BanListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new BanListRequest(); return arr; }\n\t\t\tcase NotificationType.BindingList: { var arr = new BindingList[len]; for (int i = 0; i < len; i++) arr[i] = new BindingList(); return arr; }\n\t\t\tcase NotificationType.ChannelAddPerm: { var arr = new ChannelAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelAddPerm(); return arr; }\n\t\t\tcase NotificationType.ChannelChanged: { var arr = new ChannelChanged[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelChanged(); return arr; }\n\t\t\tcase NotificationType.ChannelClientAddPerm: { var arr = new ChannelClientAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelClientAddPerm(); return arr; }\n\t\t\tcase NotificationType.ChannelClientDelPerm: { var arr = new ChannelClientDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelClientDelPerm(); return arr; }\n\t\t\tcase NotificationType.ChannelClientPermList: { var arr = new ChannelClientPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelClientPermList(); return arr; }\n\t\t\tcase NotificationType.ChannelClientPermListRequest: { var arr = new ChannelClientPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelClientPermListRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelCreate: { var arr = new ChannelCreate[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelCreate(); return arr; }\n\t\t\tcase NotificationType.ChannelCreated: { var arr = new ChannelCreated[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelCreated(); return arr; }\n\t\t\tcase NotificationType.ChannelDelete: { var arr = new ChannelDelete[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDelete(); return arr; }\n\t\t\tcase NotificationType.ChannelDeleted: { var arr = new ChannelDeleted[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDeleted(); return arr; }\n\t\t\tcase NotificationType.ChannelDelPerm: { var arr = new ChannelDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDelPerm(); return arr; }\n\t\t\tcase NotificationType.ChannelDescriptionChanged: { var arr = new ChannelDescriptionChanged[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDescriptionChanged(); return arr; }\n\t\t\tcase NotificationType.ChannelDescriptionRequest: { var arr = new ChannelDescriptionRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelDescriptionRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelEdit: { var arr = new ChannelEdit[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelEdit(); return arr; }\n\t\t\tcase NotificationType.ChannelEdited: { var arr = new ChannelEdited[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelEdited(); return arr; }\n\t\t\tcase NotificationType.ChannelFindRequest: { var arr = new ChannelFindRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelFindRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupAdd: { var arr = new ChannelGroupAdd[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupAdd(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupAddPerm: { var arr = new ChannelGroupAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupAddPerm(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupClientList: { var arr = new ChannelGroupClientList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupClientList(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupClientListRequest: { var arr = new ChannelGroupClientListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupClientListRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupCopy: { var arr = new ChannelGroupCopy[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupCopy(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupDel: { var arr = new ChannelGroupDel[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupDel(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupDelPerm: { var arr = new ChannelGroupDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupDelPerm(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupList: { var arr = new ChannelGroupList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupList(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupListRequest: { var arr = new ChannelGroupListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupListRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupPermList: { var arr = new ChannelGroupPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupPermList(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupPermListRequest: { var arr = new ChannelGroupPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupPermListRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelGroupRename: { var arr = new ChannelGroupRename[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelGroupRename(); return arr; }\n\t\t\tcase NotificationType.ChannelInfoRequest: { var arr = new ChannelInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelInfoRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelList: { var arr = new ChannelList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelList(); return arr; }\n\t\t\tcase NotificationType.ChannelListFinished: { var arr = new ChannelListFinished[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelListFinished(); return arr; }\n\t\t\tcase NotificationType.ChannelListRequest: { var arr = new ChannelListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelListRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelMove: { var arr = new ChannelMove[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelMove(); return arr; }\n\t\t\tcase NotificationType.ChannelMoved: { var arr = new ChannelMoved[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelMoved(); return arr; }\n\t\t\tcase NotificationType.ChannelPasswordChanged: { var arr = new ChannelPasswordChanged[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelPasswordChanged(); return arr; }\n\t\t\tcase NotificationType.ChannelPermissionHints: { var arr = new ChannelPermissionHints[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelPermissionHints(); return arr; }\n\t\t\tcase NotificationType.ChannelPermList: { var arr = new ChannelPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelPermList(); return arr; }\n\t\t\tcase NotificationType.ChannelPermListRequest: { var arr = new ChannelPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelPermListRequest(); return arr; }\n\t\t\tcase NotificationType.ChannelSubscribe: { var arr = new ChannelSubscribe[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelSubscribe(); return arr; }\n\t\t\tcase NotificationType.ChannelSubscribeAll: { var arr = new ChannelSubscribeAll[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelSubscribeAll(); return arr; }\n\t\t\tcase NotificationType.ChannelSubscribed: { var arr = new ChannelSubscribed[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelSubscribed(); return arr; }\n\t\t\tcase NotificationType.ChannelUnsubscribe: { var arr = new ChannelUnsubscribe[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelUnsubscribe(); return arr; }\n\t\t\tcase NotificationType.ChannelUnsubscribeAll: { var arr = new ChannelUnsubscribeAll[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelUnsubscribeAll(); return arr; }\n\t\t\tcase NotificationType.ChannelUnsubscribed: { var arr = new ChannelUnsubscribed[len]; for (int i = 0; i < len; i++) arr[i] = new ChannelUnsubscribed(); return arr; }\n\t\t\tcase NotificationType.ClientAddPerm: { var arr = new ClientAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ClientAddPerm(); return arr; }\n\t\t\tcase NotificationType.ClientChannelGroupChanged: { var arr = new ClientChannelGroupChanged[len]; for (int i = 0; i < len; i++) arr[i] = new ClientChannelGroupChanged(); return arr; }\n\t\t\tcase NotificationType.ClientChatClose: { var arr = new ClientChatClose[len]; for (int i = 0; i < len; i++) arr[i] = new ClientChatClose(); return arr; }\n\t\t\tcase NotificationType.ClientChatClosed: { var arr = new ClientChatClosed[len]; for (int i = 0; i < len; i++) arr[i] = new ClientChatClosed(); return arr; }\n\t\t\tcase NotificationType.ClientChatComposing: { var arr = new ClientChatComposing[len]; for (int i = 0; i < len; i++) arr[i] = new ClientChatComposing(); return arr; }\n\t\t\tcase NotificationType.ClientConnectionInfo: { var arr = new ClientConnectionInfo[len]; for (int i = 0; i < len; i++) arr[i] = new ClientConnectionInfo(); return arr; }\n\t\t\tcase NotificationType.ClientConnectionInfoRequest: { var arr = new ClientConnectionInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientConnectionInfoRequest(); return arr; }\n\t\t\tcase NotificationType.ClientConnectionInfoUpdateRequest: { var arr = new ClientConnectionInfoUpdateRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientConnectionInfoUpdateRequest(); return arr; }\n\t\t\tcase NotificationType.ClientDbDelete: { var arr = new ClientDbDelete[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbDelete(); return arr; }\n\t\t\tcase NotificationType.ClientDbEdit: { var arr = new ClientDbEdit[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbEdit(); return arr; }\n\t\t\tcase NotificationType.ClientDbFind: { var arr = new ClientDbFind[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbFind(); return arr; }\n\t\t\tcase NotificationType.ClientDbFindRequest: { var arr = new ClientDbFindRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbFindRequest(); return arr; }\n\t\t\tcase NotificationType.ClientDbIdFromUid: { var arr = new ClientDbIdFromUid[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbIdFromUid(); return arr; }\n\t\t\tcase NotificationType.ClientDbIdFromUidRequest: { var arr = new ClientDbIdFromUidRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbIdFromUidRequest(); return arr; }\n\t\t\tcase NotificationType.ClientDbInfoRequest: { var arr = new ClientDbInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbInfoRequest(); return arr; }\n\t\t\tcase NotificationType.ClientDbList: { var arr = new ClientDbList[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbList(); return arr; }\n\t\t\tcase NotificationType.ClientDbListRequest: { var arr = new ClientDbListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDbListRequest(); return arr; }\n\t\t\tcase NotificationType.ClientDelPerm: { var arr = new ClientDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ClientDelPerm(); return arr; }\n\t\t\tcase NotificationType.ClientEdit: { var arr = new ClientEdit[len]; for (int i = 0; i < len; i++) arr[i] = new ClientEdit(); return arr; }\n\t\t\tcase NotificationType.ClientEnterView: { var arr = new ClientEnterView[len]; for (int i = 0; i < len; i++) arr[i] = new ClientEnterView(); return arr; }\n\t\t\tcase NotificationType.ClientFindRequest: { var arr = new ClientFindRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientFindRequest(); return arr; }\n\t\t\tcase NotificationType.ClientIds: { var arr = new ClientIds[len]; for (int i = 0; i < len; i++) arr[i] = new ClientIds(); return arr; }\n\t\t\tcase NotificationType.ClientIdsRequest: { var arr = new ClientIdsRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientIdsRequest(); return arr; }\n\t\t\tcase NotificationType.ClientInfoRequest: { var arr = new ClientInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientInfoRequest(); return arr; }\n\t\t\tcase NotificationType.ClientInit: { var arr = new ClientInit[len]; for (int i = 0; i < len; i++) arr[i] = new ClientInit(); return arr; }\n\t\t\tcase NotificationType.ClientInitIv: { var arr = new ClientInitIv[len]; for (int i = 0; i < len; i++) arr[i] = new ClientInitIv(); return arr; }\n\t\t\tcase NotificationType.ClientKick: { var arr = new ClientKick[len]; for (int i = 0; i < len; i++) arr[i] = new ClientKick(); return arr; }\n\t\t\tcase NotificationType.ClientLeftView: { var arr = new ClientLeftView[len]; for (int i = 0; i < len; i++) arr[i] = new ClientLeftView(); return arr; }\n\t\t\tcase NotificationType.ClientListRequest: { var arr = new ClientListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientListRequest(); return arr; }\n\t\t\tcase NotificationType.ClientMove: { var arr = new ClientMove[len]; for (int i = 0; i < len; i++) arr[i] = new ClientMove(); return arr; }\n\t\t\tcase NotificationType.ClientMoved: { var arr = new ClientMoved[len]; for (int i = 0; i < len; i++) arr[i] = new ClientMoved(); return arr; }\n\t\t\tcase NotificationType.ClientNameFromDbId: { var arr = new ClientNameFromDbId[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNameFromDbId(); return arr; }\n\t\t\tcase NotificationType.ClientNameFromDbIdRequest: { var arr = new ClientNameFromDbIdRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNameFromDbIdRequest(); return arr; }\n\t\t\tcase NotificationType.ClientNameFromUid: { var arr = new ClientNameFromUid[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNameFromUid(); return arr; }\n\t\t\tcase NotificationType.ClientNameFromUidRequest: { var arr = new ClientNameFromUidRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNameFromUidRequest(); return arr; }\n\t\t\tcase NotificationType.ClientNeededPermissions: { var arr = new ClientNeededPermissions[len]; for (int i = 0; i < len; i++) arr[i] = new ClientNeededPermissions(); return arr; }\n\t\t\tcase NotificationType.ClientPermissionHints: { var arr = new ClientPermissionHints[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPermissionHints(); return arr; }\n\t\t\tcase NotificationType.ClientPermList: { var arr = new ClientPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPermList(); return arr; }\n\t\t\tcase NotificationType.ClientPermListRequest: { var arr = new ClientPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPermListRequest(); return arr; }\n\t\t\tcase NotificationType.ClientPoke: { var arr = new ClientPoke[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPoke(); return arr; }\n\t\t\tcase NotificationType.ClientPokeRequest: { var arr = new ClientPokeRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientPokeRequest(); return arr; }\n\t\t\tcase NotificationType.ClientServerGroupAdded: { var arr = new ClientServerGroupAdded[len]; for (int i = 0; i < len; i++) arr[i] = new ClientServerGroupAdded(); return arr; }\n\t\t\tcase NotificationType.ClientServerGroupRemoved: { var arr = new ClientServerGroupRemoved[len]; for (int i = 0; i < len; i++) arr[i] = new ClientServerGroupRemoved(); return arr; }\n\t\t\tcase NotificationType.ClientSetServerQueryLogin: { var arr = new ClientSetServerQueryLogin[len]; for (int i = 0; i < len; i++) arr[i] = new ClientSetServerQueryLogin(); return arr; }\n\t\t\tcase NotificationType.ClientSetServerQueryLoginRequest: { var arr = new ClientSetServerQueryLoginRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientSetServerQueryLoginRequest(); return arr; }\n\t\t\tcase NotificationType.ClientUidFromClid: { var arr = new ClientUidFromClid[len]; for (int i = 0; i < len; i++) arr[i] = new ClientUidFromClid(); return arr; }\n\t\t\tcase NotificationType.ClientUidFromClidRequest: { var arr = new ClientUidFromClidRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientUidFromClidRequest(); return arr; }\n\t\t\tcase NotificationType.ClientUpdate: { var arr = new ClientUpdate[len]; for (int i = 0; i < len; i++) arr[i] = new ClientUpdate(); return arr; }\n\t\t\tcase NotificationType.ClientUpdated: { var arr = new ClientUpdated[len]; for (int i = 0; i < len; i++) arr[i] = new ClientUpdated(); return arr; }\n\t\t\tcase NotificationType.ClientVariablesRequest: { var arr = new ClientVariablesRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ClientVariablesRequest(); return arr; }\n\t\t\tcase NotificationType.CommandError: { var arr = new CommandError[len]; for (int i = 0; i < len; i++) arr[i] = new CommandError(); return arr; }\n\t\t\tcase NotificationType.ComplainAdd: { var arr = new ComplainAdd[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainAdd(); return arr; }\n\t\t\tcase NotificationType.ComplainDel: { var arr = new ComplainDel[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainDel(); return arr; }\n\t\t\tcase NotificationType.ComplainDelAll: { var arr = new ComplainDelAll[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainDelAll(); return arr; }\n\t\t\tcase NotificationType.ComplainList: { var arr = new ComplainList[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainList(); return arr; }\n\t\t\tcase NotificationType.ComplainListRequest: { var arr = new ComplainListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ComplainListRequest(); return arr; }\n\t\t\tcase NotificationType.CustomDelete: { var arr = new CustomDelete[len]; for (int i = 0; i < len; i++) arr[i] = new CustomDelete(); return arr; }\n\t\t\tcase NotificationType.CustomInfoRequest: { var arr = new CustomInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new CustomInfoRequest(); return arr; }\n\t\t\tcase NotificationType.CustomSearch: { var arr = new CustomSearch[len]; for (int i = 0; i < len; i++) arr[i] = new CustomSearch(); return arr; }\n\t\t\tcase NotificationType.CustomSet: { var arr = new CustomSet[len]; for (int i = 0; i < len; i++) arr[i] = new CustomSet(); return arr; }\n\t\t\tcase NotificationType.Disconnect: { var arr = new Disconnect[len]; for (int i = 0; i < len; i++) arr[i] = new Disconnect(); return arr; }\n\t\t\tcase NotificationType.FileDownload: { var arr = new FileDownload[len]; for (int i = 0; i < len; i++) arr[i] = new FileDownload(); return arr; }\n\t\t\tcase NotificationType.FileInfo: { var arr = new FileInfo[len]; for (int i = 0; i < len; i++) arr[i] = new FileInfo(); return arr; }\n\t\t\tcase NotificationType.FileList: { var arr = new FileList[len]; for (int i = 0; i < len; i++) arr[i] = new FileList(); return arr; }\n\t\t\tcase NotificationType.FileListFinished: { var arr = new FileListFinished[len]; for (int i = 0; i < len; i++) arr[i] = new FileListFinished(); return arr; }\n\t\t\tcase NotificationType.FileTransfer: { var arr = new FileTransfer[len]; for (int i = 0; i < len; i++) arr[i] = new FileTransfer(); return arr; }\n\t\t\tcase NotificationType.FileTransferStatus: { var arr = new FileTransferStatus[len]; for (int i = 0; i < len; i++) arr[i] = new FileTransferStatus(); return arr; }\n\t\t\tcase NotificationType.FileUpload: { var arr = new FileUpload[len]; for (int i = 0; i < len; i++) arr[i] = new FileUpload(); return arr; }\n\t\t\tcase NotificationType.FtCreateDir: { var arr = new FtCreateDir[len]; for (int i = 0; i < len; i++) arr[i] = new FtCreateDir(); return arr; }\n\t\t\tcase NotificationType.FtDeleteFile: { var arr = new FtDeleteFile[len]; for (int i = 0; i < len; i++) arr[i] = new FtDeleteFile(); return arr; }\n\t\t\tcase NotificationType.FtFileInfoRequest: { var arr = new FtFileInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new FtFileInfoRequest(); return arr; }\n\t\t\tcase NotificationType.FtFileListRequest: { var arr = new FtFileListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new FtFileListRequest(); return arr; }\n\t\t\tcase NotificationType.FtInitDownload: { var arr = new FtInitDownload[len]; for (int i = 0; i < len; i++) arr[i] = new FtInitDownload(); return arr; }\n\t\t\tcase NotificationType.FtInitUpload: { var arr = new FtInitUpload[len]; for (int i = 0; i < len; i++) arr[i] = new FtInitUpload(); return arr; }\n\t\t\tcase NotificationType.FtList: { var arr = new FtList[len]; for (int i = 0; i < len; i++) arr[i] = new FtList(); return arr; }\n\t\t\tcase NotificationType.FtRenameFile: { var arr = new FtRenameFile[len]; for (int i = 0; i < len; i++) arr[i] = new FtRenameFile(); return arr; }\n\t\t\tcase NotificationType.FtStop: { var arr = new FtStop[len]; for (int i = 0; i < len; i++) arr[i] = new FtStop(); return arr; }\n\t\t\tcase NotificationType.GlobalMessage: { var arr = new GlobalMessage[len]; for (int i = 0; i < len; i++) arr[i] = new GlobalMessage(); return arr; }\n\t\t\tcase NotificationType.HostInfoRequest: { var arr = new HostInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new HostInfoRequest(); return arr; }\n\t\t\tcase NotificationType.InitIvExpand: { var arr = new InitIvExpand[len]; for (int i = 0; i < len; i++) arr[i] = new InitIvExpand(); return arr; }\n\t\t\tcase NotificationType.InitIvExpand2: { var arr = new InitIvExpand2[len]; for (int i = 0; i < len; i++) arr[i] = new InitIvExpand2(); return arr; }\n\t\t\tcase NotificationType.InitServer: { var arr = new InitServer[len]; for (int i = 0; i < len; i++) arr[i] = new InitServer(); return arr; }\n\t\t\tcase NotificationType.InstanceEdit: { var arr = new InstanceEdit[len]; for (int i = 0; i < len; i++) arr[i] = new InstanceEdit(); return arr; }\n\t\t\tcase NotificationType.InstanceInfo: { var arr = new InstanceInfo[len]; for (int i = 0; i < len; i++) arr[i] = new InstanceInfo(); return arr; }\n\t\t\tcase NotificationType.LogAdd: { var arr = new LogAdd[len]; for (int i = 0; i < len; i++) arr[i] = new LogAdd(); return arr; }\n\t\t\tcase NotificationType.Login: { var arr = new Login[len]; for (int i = 0; i < len; i++) arr[i] = new Login(); return arr; }\n\t\t\tcase NotificationType.Logout: { var arr = new Logout[len]; for (int i = 0; i < len; i++) arr[i] = new Logout(); return arr; }\n\t\t\tcase NotificationType.LogView: { var arr = new LogView[len]; for (int i = 0; i < len; i++) arr[i] = new LogView(); return arr; }\n\t\t\tcase NotificationType.OfflineMessage: { var arr = new OfflineMessage[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessage(); return arr; }\n\t\t\tcase NotificationType.OfflineMessageAdd: { var arr = new OfflineMessageAdd[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageAdd(); return arr; }\n\t\t\tcase NotificationType.OfflineMessageDel: { var arr = new OfflineMessageDel[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageDel(); return arr; }\n\t\t\tcase NotificationType.OfflineMessageGet: { var arr = new OfflineMessageGet[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageGet(); return arr; }\n\t\t\tcase NotificationType.OfflineMessageList: { var arr = new OfflineMessageList[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageList(); return arr; }\n\t\t\tcase NotificationType.OfflineMessageListRequest: { var arr = new OfflineMessageListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageListRequest(); return arr; }\n\t\t\tcase NotificationType.OfflineMessageUpdateFlag: { var arr = new OfflineMessageUpdateFlag[len]; for (int i = 0; i < len; i++) arr[i] = new OfflineMessageUpdateFlag(); return arr; }\n\t\t\tcase NotificationType.PermFind: { var arr = new PermFind[len]; for (int i = 0; i < len; i++) arr[i] = new PermFind(); return arr; }\n\t\t\tcase NotificationType.PermFindRequest: { var arr = new PermFindRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermFindRequest(); return arr; }\n\t\t\tcase NotificationType.PermIdByNameRequest: { var arr = new PermIdByNameRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermIdByNameRequest(); return arr; }\n\t\t\tcase NotificationType.PermList: { var arr = new PermList[len]; for (int i = 0; i < len; i++) arr[i] = new PermList(); return arr; }\n\t\t\tcase NotificationType.PermListRequest: { var arr = new PermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermListRequest(); return arr; }\n\t\t\tcase NotificationType.PermOverview: { var arr = new PermOverview[len]; for (int i = 0; i < len; i++) arr[i] = new PermOverview(); return arr; }\n\t\t\tcase NotificationType.PermOverviewRequest: { var arr = new PermOverviewRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermOverviewRequest(); return arr; }\n\t\t\tcase NotificationType.PermRequest: { var arr = new PermRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PermRequest(); return arr; }\n\t\t\tcase NotificationType.PermReset: { var arr = new PermReset[len]; for (int i = 0; i < len; i++) arr[i] = new PermReset(); return arr; }\n\t\t\tcase NotificationType.PluginCommand: { var arr = new PluginCommand[len]; for (int i = 0; i < len; i++) arr[i] = new PluginCommand(); return arr; }\n\t\t\tcase NotificationType.PluginCommandRequest: { var arr = new PluginCommandRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PluginCommandRequest(); return arr; }\n\t\t\tcase NotificationType.PrivilegeKeyAddRequest: { var arr = new PrivilegeKeyAddRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PrivilegeKeyAddRequest(); return arr; }\n\t\t\tcase NotificationType.PrivilegeKeyDelete: { var arr = new PrivilegeKeyDelete[len]; for (int i = 0; i < len; i++) arr[i] = new PrivilegeKeyDelete(); return arr; }\n\t\t\tcase NotificationType.PrivilegeKeyListRequest: { var arr = new PrivilegeKeyListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new PrivilegeKeyListRequest(); return arr; }\n\t\t\tcase NotificationType.PrivilegeKeyUse: { var arr = new PrivilegeKeyUse[len]; for (int i = 0; i < len; i++) arr[i] = new PrivilegeKeyUse(); return arr; }\n\t\t\tcase NotificationType.Quit: { var arr = new Quit[len]; for (int i = 0; i < len; i++) arr[i] = new Quit(); return arr; }\n\t\t\tcase NotificationType.SendTextMessage: { var arr = new SendTextMessage[len]; for (int i = 0; i < len; i++) arr[i] = new SendTextMessage(); return arr; }\n\t\t\tcase NotificationType.ServerConnectionInfo: { var arr = new ServerConnectionInfo[len]; for (int i = 0; i < len; i++) arr[i] = new ServerConnectionInfo(); return arr; }\n\t\t\tcase NotificationType.ServerConnectionInfoRequest: { var arr = new ServerConnectionInfoRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerConnectionInfoRequest(); return arr; }\n\t\t\tcase NotificationType.ServerCreate: { var arr = new ServerCreate[len]; for (int i = 0; i < len; i++) arr[i] = new ServerCreate(); return arr; }\n\t\t\tcase NotificationType.ServerDelete: { var arr = new ServerDelete[len]; for (int i = 0; i < len; i++) arr[i] = new ServerDelete(); return arr; }\n\t\t\tcase NotificationType.ServerEdit: { var arr = new ServerEdit[len]; for (int i = 0; i < len; i++) arr[i] = new ServerEdit(); return arr; }\n\t\t\tcase NotificationType.ServerEdited: { var arr = new ServerEdited[len]; for (int i = 0; i < len; i++) arr[i] = new ServerEdited(); return arr; }\n\t\t\tcase NotificationType.ServerGroupAdd: { var arr = new ServerGroupAdd[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAdd(); return arr; }\n\t\t\tcase NotificationType.ServerGroupAddClient: { var arr = new ServerGroupAddClient[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAddClient(); return arr; }\n\t\t\tcase NotificationType.ServerGroupAddPerm: { var arr = new ServerGroupAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAddPerm(); return arr; }\n\t\t\tcase NotificationType.ServerGroupAutoAddPerm: { var arr = new ServerGroupAutoAddPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAutoAddPerm(); return arr; }\n\t\t\tcase NotificationType.ServerGroupAutoDelPerm: { var arr = new ServerGroupAutoDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupAutoDelPerm(); return arr; }\n\t\t\tcase NotificationType.ServerGroupClientList: { var arr = new ServerGroupClientList[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupClientList(); return arr; }\n\t\t\tcase NotificationType.ServerGroupClientListRequest: { var arr = new ServerGroupClientListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupClientListRequest(); return arr; }\n\t\t\tcase NotificationType.ServerGroupCopy: { var arr = new ServerGroupCopy[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupCopy(); return arr; }\n\t\t\tcase NotificationType.ServerGroupDel: { var arr = new ServerGroupDel[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupDel(); return arr; }\n\t\t\tcase NotificationType.ServerGroupDelClient: { var arr = new ServerGroupDelClient[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupDelClient(); return arr; }\n\t\t\tcase NotificationType.ServerGroupDelPerm: { var arr = new ServerGroupDelPerm[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupDelPerm(); return arr; }\n\t\t\tcase NotificationType.ServerGroupList: { var arr = new ServerGroupList[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupList(); return arr; }\n\t\t\tcase NotificationType.ServerGroupListRequest: { var arr = new ServerGroupListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupListRequest(); return arr; }\n\t\t\tcase NotificationType.ServerGroupPermList: { var arr = new ServerGroupPermList[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupPermList(); return arr; }\n\t\t\tcase NotificationType.ServerGroupPermListRequest: { var arr = new ServerGroupPermListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupPermListRequest(); return arr; }\n\t\t\tcase NotificationType.ServerGroupRename: { var arr = new ServerGroupRename[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupRename(); return arr; }\n\t\t\tcase NotificationType.ServerGroupsByClientId: { var arr = new ServerGroupsByClientId[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupsByClientId(); return arr; }\n\t\t\tcase NotificationType.ServerGroupsByClientIdRequest: { var arr = new ServerGroupsByClientIdRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerGroupsByClientIdRequest(); return arr; }\n\t\t\tcase NotificationType.ServerIdGetByPort: { var arr = new ServerIdGetByPort[len]; for (int i = 0; i < len; i++) arr[i] = new ServerIdGetByPort(); return arr; }\n\t\t\tcase NotificationType.ServerInfo: { var arr = new ServerInfo[len]; for (int i = 0; i < len; i++) arr[i] = new ServerInfo(); return arr; }\n\t\t\tcase NotificationType.ServerListRequest: { var arr = new ServerListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerListRequest(); return arr; }\n\t\t\tcase NotificationType.ServerLog: { var arr = new ServerLog[len]; for (int i = 0; i < len; i++) arr[i] = new ServerLog(); return arr; }\n\t\t\tcase NotificationType.ServerNotifyRegister: { var arr = new ServerNotifyRegister[len]; for (int i = 0; i < len; i++) arr[i] = new ServerNotifyRegister(); return arr; }\n\t\t\tcase NotificationType.ServerNotifyUnregister: { var arr = new ServerNotifyUnregister[len]; for (int i = 0; i < len; i++) arr[i] = new ServerNotifyUnregister(); return arr; }\n\t\t\tcase NotificationType.ServerProcessStop: { var arr = new ServerProcessStop[len]; for (int i = 0; i < len; i++) arr[i] = new ServerProcessStop(); return arr; }\n\t\t\tcase NotificationType.ServerSnapshotCreate: { var arr = new ServerSnapshotCreate[len]; for (int i = 0; i < len; i++) arr[i] = new ServerSnapshotCreate(); return arr; }\n\t\t\tcase NotificationType.ServerSnapshotDeploy: { var arr = new ServerSnapshotDeploy[len]; for (int i = 0; i < len; i++) arr[i] = new ServerSnapshotDeploy(); return arr; }\n\t\t\tcase NotificationType.ServerStart: { var arr = new ServerStart[len]; for (int i = 0; i < len; i++) arr[i] = new ServerStart(); return arr; }\n\t\t\tcase NotificationType.ServerStop: { var arr = new ServerStop[len]; for (int i = 0; i < len; i++) arr[i] = new ServerStop(); return arr; }\n\t\t\tcase NotificationType.ServerTempPasswordAdd: { var arr = new ServerTempPasswordAdd[len]; for (int i = 0; i < len; i++) arr[i] = new ServerTempPasswordAdd(); return arr; }\n\t\t\tcase NotificationType.ServerTempPasswordDel: { var arr = new ServerTempPasswordDel[len]; for (int i = 0; i < len; i++) arr[i] = new ServerTempPasswordDel(); return arr; }\n\t\t\tcase NotificationType.ServerTempPasswordList: { var arr = new ServerTempPasswordList[len]; for (int i = 0; i < len; i++) arr[i] = new ServerTempPasswordList(); return arr; }\n\t\t\tcase NotificationType.ServerTempPasswordListRequest: { var arr = new ServerTempPasswordListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerTempPasswordListRequest(); return arr; }\n\t\t\tcase NotificationType.ServerUpdated: { var arr = new ServerUpdated[len]; for (int i = 0; i < len; i++) arr[i] = new ServerUpdated(); return arr; }\n\t\t\tcase NotificationType.ServerVariablesRequest: { var arr = new ServerVariablesRequest[len]; for (int i = 0; i < len; i++) arr[i] = new ServerVariablesRequest(); return arr; }\n\t\t\tcase NotificationType.SetClientChannelGroup: { var arr = new SetClientChannelGroup[len]; for (int i = 0; i < len; i++) arr[i] = new SetClientChannelGroup(); return arr; }\n\t\t\tcase NotificationType.TextMessage: { var arr = new TextMessage[len]; for (int i = 0; i < len; i++) arr[i] = new TextMessage(); return arr; }\n\t\t\tcase NotificationType.TokenAdd: { var arr = new TokenAdd[len]; for (int i = 0; i < len; i++) arr[i] = new TokenAdd(); return arr; }\n\t\t\tcase NotificationType.TokenAddRequest: { var arr = new TokenAddRequest[len]; for (int i = 0; i < len; i++) arr[i] = new TokenAddRequest(); return arr; }\n\t\t\tcase NotificationType.TokenDelete: { var arr = new TokenDelete[len]; for (int i = 0; i < len; i++) arr[i] = new TokenDelete(); return arr; }\n\t\t\tcase NotificationType.TokenList: { var arr = new TokenList[len]; for (int i = 0; i < len; i++) arr[i] = new TokenList(); return arr; }\n\t\t\tcase NotificationType.TokenListRequest: { var arr = new TokenListRequest[len]; for (int i = 0; i < len; i++) arr[i] = new TokenListRequest(); return arr; }\n\t\t\tcase NotificationType.TokenUse: { var arr = new TokenUse[len]; for (int i = 0; i < len; i++) arr[i] = new TokenUse(); return arr; }\n\t\t\tcase NotificationType.TokenUsed: { var arr = new TokenUsed[len]; for (int i = 0; i < len; i++) arr[i] = new TokenUsed(); return arr; }\n\t\t\tcase NotificationType.Use: { var arr = new Use[len]; for (int i = 0; i < len; i++) arr[i] = new Use(); return arr; }\n\t\t\tcase NotificationType.VersionRequest: { var arr = new VersionRequest[len]; for (int i = 0; i < len; i++) arr[i] = new VersionRequest(); return arr; }\n\t\t\tcase NotificationType.WhoAmIRequest: { var arr = new WhoAmIRequest[len]; for (int i = 0; i < len; i++) arr[i] = new WhoAmIRequest(); return arr; }\n\t\t\tcase NotificationType.Unknown:\n\t\t\tdefault: throw Tools.UnhandledDefault(name);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "TSLib/Generated/Messages.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"true\" hostSpecific=\"true\" language=\"C#\" #>\n<#@ include file=\"MessageParser.ttinclude\" once=\"true\" #>\n<#@ output extension=\".cs\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.IO\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\nusing System;\nusing System.Collections.Generic;\nusing System.Buffers.Text;\nusing TSLib.Commands;\nusing TSLib.Helper;\n\n<#= ConversionSet #>\n\n#nullable enable\nnamespace TSLib.Messages\n{\n<#\nvar gen = Messages.Parse(Host.ResolvePath(\"../Declarations/Messages.toml\"));\n\nstring GenerateDeserializer(Messages.Field fld)\n{\n\tif(fld.isArray)\n\t\treturn $\"{{ if(value.Length == 0) {fld.pretty} = Array.Empty<{fld.type}>(); else {{\"\n\t\t\t + $\" var ss = new SpanSplitter<byte>(); ss.First(value, (byte)',');\"\n\t\t\t + $\" int cnt = 0; for (int i = 0; i < value.Length; i++) if (value[i] == ',') cnt++;\"\n\t\t\t + $\" {fld.pretty} = new {fld.type}[cnt + 1];\"\n\t\t\t + $\" for(int i = 0; i < cnt + 1; i++) {{ {GenerateSingleDeserializer(fld, \"ss.Trim(value)\", fld.pretty + \"[i]\")} if (i < cnt) value = ss.Next(value); }} }} }}\";\n\telse\n\t\treturn GenerateSingleDeserializer(fld, \"value\", fld.pretty);\n}\n\nDictionary<string, string> BackingTypes = new Dictionary<string, string>() {\n\t{ \"Uid\", \"str\" },\n\t{ \"ClientDbId\", \"u64\" },\n\t{ \"ClientId\", \"u16\" },\n\t{ \"ChannelId\", \"u64\" },\n\t{ \"ServerGroupId\", \"u64\" },\n\t{ \"ChannelGroupId\", \"u64\" },\n\t{ \"Codec\", \"u8\" },\n\t{ \"Ts3ErrorCode\", \"u32\" },\n\t{ \"LicenseType\", \"u16\" },\n\t{ \"PermissionId\", \"u32\" },\n};\n\nstring GenerateSingleDeserializer(Messages.Field fld, string input, string output)\n{\n\tswitch (fld.type)\n\t{\n\tcase \"bool\":\n\t\treturn $\"{output} = {input}.Length > 0 && {input}[0] != '0';\";\n\tcase \"i8\":\n\tcase \"u8\":\n\tcase \"i16\":\n\tcase \"u16\":\n\tcase \"i32\":\n\tcase \"u32\":\n\tcase \"i64\":\n\tcase \"u64\":\n\tcase \"f32\":\n\tcase \"f64\":\n\tcase \"ClientDbId\":\n\tcase \"ClientId\":\n\tcase \"ChannelId\":\n\tcase \"ServerGroupId\":\n\tcase \"ChannelGroupId\":\n\t\tif(!BackingTypes.TryGetValue(fld.type, out var backType))\n\t\t\tbackType = fld.type;\n\t\treturn $\"{{ if(Utf8Parser.TryParse({input}, out {backType} oval, out _)) {output} = ({fld.type})oval; }}\";\n\tcase \"DurationSeconds\":\n\t\treturn $\"{{ if(Utf8Parser.TryParse({input}, out f64 oval, out _)) {output} = TimeSpan.FromSeconds(oval); }}\";\n\tcase \"DurationMilliseconds\":\n\t\treturn $\"{{ if(Utf8Parser.TryParse({input}, out f64 oval, out _)) {output} = TimeSpan.FromMilliseconds(oval); }}\";\n\tcase \"DateTime\":\n\t\treturn $\"{{ if(Utf8Parser.TryParse({input}, out u32 oval, out _)) {output} = Tools.FromUnix(oval); }}\";\n\tcase \"str\":\n\tcase \"Uid\":\n\tcase \"IpAddr\":\n\t\treturn $\"{output} = ({fld.type})TsString.Unescape({input});\";\n\tcase \"HostMessageMode\":\n\tcase \"CodecEncryptionMode\":\n\tcase \"HostBannerMode\":\n\tcase \"Reason\":\n\tcase \"ClientType\":\n\tcase \"TextMessageTargetMode\":\n\tcase \"GroupType\":\n\tcase \"GroupNamingMode\":\n\tcase \"Codec\":\n\tcase \"Ts3ErrorCode\":\n\tcase \"LicenseType\":\n\tcase \"TokenType\":\n\tcase \"LogLevel\":\n\tcase \"PluginTargetMode\":\n\tcase \"PermissionType\":\n\tcase \"ChannelPermissionHint\":\n\tcase \"ClientPermissionHint\":\n\t\tif(!BackingTypes.TryGetValue(fld.type, out backType))\n\t\t\tbackType = \"i32\";\n\t\treturn $\"{{ if(Utf8Parser.TryParse({input}, out {backType} oval, out _)) {output} = ({fld.type})oval; }}\";\n\tcase \"IconHash\":\n\t\treturn $\"{{ if(!{input}.IsEmpty && {input}[0] == (u8)'-') {{ if(Utf8Parser.TryParse({input}, out i32 oval, out _)) {output} = oval; }} else {{ if(Utf8Parser.TryParse({input}, out u64 oval, out _)) {output} = unchecked((i32)oval); }} }}\";\n\tcase \"PermissionId\":\n\t\treturn $\"{{ if(Utf8Parser.TryParse({input}, out u16 oval, out _)) {output} = ser.PermissionTransform.GetName(oval); }}\";\n\tdefault:\n\t\tWarn($\"Missing deserializer for {fld.type}\");\n\t\treturn \"\";\n\t}\n}\n\nforeach(var msg in gen.GetOrderedMsg())\n{\n\t//if(!msg.s2c.Value) continue;\n#>\n\tpublic sealed partial class <#= msg.name #><#\n\t\tbool isNotify = msg.notify != null;\n\t\tbool isResponse = msg.response.Value;\n\t\tif (isNotify && isResponse) Write(\" : INotification, IResponse\");\n\t\telse if (isNotify) Write(\" : INotification\");\n\t\telse if (isResponse) Write(\" : IResponse\");\n\t#>\n\t{\n\t\t#pragma warning disable CS8618\n\t\t<#= isNotify ? \"public NotificationType NotifyType { get; } = NotificationType.\" + msg.name + \";\" : \"\" #>\n\t\t<#= isResponse ? \"public string? ReturnCode { get; set; }\" : \"\" #>\n<#\n\tforeach (var (genField, optional) in msg.attributes.Select(f => gen.GetField(f)).OrderBy(x => x.fld.pretty)) { #>\n\t\tpublic <#= genField.TypeFin(optional) #> <#= genField.pretty #> { get; set; }<# } #>\n\t\t#pragma warning restore CS8618\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser)\n\t\t{<#\n\t\tif (msg.attributes.Length > 0) { #>\n\t\t\tswitch(name)\n\t\t\t{\n<#\n\t\tforeach (var (genField, optional) in msg.attributes.Select(f => gen.GetField(f)).OrderBy(x => x.fld.ts)) {\n#>\n\t\t\tcase \"<#= genField.ts #>\": <#= GenerateDeserializer(genField) #> break;<#\n\t\t\t}\n#>\n\t\t\t<#= isResponse ? (\"case \\\"return_code\\\": \" + GenerateDeserializer(gen.GetField(\"return_code\").fld) + \" break;\") : \"\" #>\n\t\t\t}\n<#\n\t\t\t} #>\n\t\t}\n\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{<#\n\t\tif (msg.attributes.Length > 0) { #>\n\t\t\tvar toc = (<#= msg.name #>[])to;\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tswitch(fld)\n\t\t\t\t{\n<#\n\t\tforeach (var (genField, optional) in msg.attributes.Select(f => gen.GetField(f)).OrderBy(x => x.fld.ts)) {\n#>\n\t\t\t\tcase \"<#= genField.ts #>\": foreach(var toi in toc) { toi.<#= genField.pretty #> = <#= genField.pretty #>; } break;<#\n\t\t\t\t}\n#>\n\t\t\t\t}\n\t\t\t}\n<#\n\t\t\t} #>\n\t\t}\n\t}\n<# } #>\n\tpublic enum NotificationType\n\t{\n\t\tUnknown,<#\n\tforeach(var ntfy in gen.NotifiesSorted) {\n\t\t/*if(!ntfy.s2c.Value) continue;*/ #>\n\t\t///<summary><#= ntfy.s2c.Value ? \"[S2C] \" : \"\" #><#= ntfy.c2s.Value ? \"[C2S] \" : \"\" #>ntfy:<#= ntfy.notify #></summary>\n\t\t<#= ntfy.name #>,<#\n\t}\n#>\n\t}\n\n\tpublic static class MessageHelper\n\t{\n\t\tpublic static NotificationType GetToClientNotificationType(string name)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{<#\n\tforeach(var ntfy in gen.NotifiesSorted.Where(x => x.s2c.Value)) {#>\n\t\t\tcase \"<#= ntfy.notify #>\": return NotificationType.<#= ntfy.name #>;<#\n\t}\n#>\n\t\t\tdefault: return NotificationType.Unknown;\n\t\t\t}\n\t\t}\n\n\t\tpublic static NotificationType GetToServerNotificationType(string name)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{<#\n\tforeach(var ntfy in gen.NotifiesSorted.Where(x => x.c2s.Value)) {#>\n\t\t\tcase \"<#= ntfy.notify #>\": return NotificationType.<#= ntfy.name #>;<#\n\t}\n#>\n\t\t\tdefault: return NotificationType.Unknown;\n\t\t\t}\n\t\t}\n\n\t\tpublic static INotification GenerateNotificationType(NotificationType name)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{<#\n\tforeach(var ntfy in gen.NotifiesSorted)\n\t{\n\t\t/*if(!ntfy.s2c.Value) continue;*/\n#>\n\t\t\tcase NotificationType.<#= ntfy.name #>: return new <#= ntfy.name #>();<#\n\t}\n#>\n\t\t\tcase NotificationType.Unknown:\n\t\t\tdefault: throw Tools.UnhandledDefault(name);\n\t\t\t}\n\t\t}\n\n\t\tpublic static INotification[] InstatiateNotificationArray(NotificationType name, int len)\n\t\t{\n\t\t\tswitch(name)\n\t\t\t{<#\n\tforeach(var ntfy in gen.NotifiesSorted)\n\t{\n\t\t/*if(!ntfy.s2c.Value) continue;*/\n#>\n\t\t\tcase NotificationType.<#= ntfy.name #>: { var arr = new <#= ntfy.name #>[len]; for (int i = 0; i < len; i++) arr[i] = new <#= ntfy.name #>(); return arr; }<#\n\t}\n#>\n\t\t\tcase NotificationType.Unknown:\n\t\t\tdefault: throw Tools.UnhandledDefault(name);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "TSLib/Generated/NotificationUtil.ttinclude",
    "content": "<#+\nHashSet<string> sharedNotifications = new HashSet<string> {\n\t\"ChannelCreated\",\n\t\"ChannelDeleted\",\n\t\"ChannelChanged\",\n\t\"ChannelEdited\",\n\t\"ChannelMoved\",\n\t\"ChannelPasswordChanged\",\n\t\"ClientEnterView\",\n\t\"ClientLeftView\",\n\t\"ClientMoved\",\n\t\"ServerEdited\",\n\t\"TextMessage\",\n\t\"TokenUsed\",\n};\n\npublic void GenNtfyDecls(IEnumerable<Messages.Msg> enu, bool root = false) {\n\tPushIndent(\"\\t\\t\");\n\tWriteLine(\"\");\n\tvar modifier = root ? \" abstract\" : \" override\";\n\n\tforeach(var ntfy in enu)\n\t{\n\t\tWrite(\"public\");\n\t\tif(sharedNotifications.Contains(ntfy.name))\n\t\t\tWrite(modifier);\n\t\tWriteLine($\" event NotifyEventHandler<{ntfy.name}>? On{ntfy.name};\");\n\n\t\tWrite(\"public\");\n\t\tif(sharedNotifications.Contains(ntfy.name))\n\t\t\tWrite(modifier);\n\t\tWriteLine($\" event EventHandler<{ntfy.name}>? OnEach{ntfy.name};\");\n\t}\n\n\tPopIndent();\n}\n#>"
  },
  {
    "path": "TSLib/Generated/TsErrorCode.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\n\n\nnamespace TSLib\n{\n\t// Source: http://forum.teamspeak.com/threads/102276-Server-query-error-id-list\n\tpublic enum TsErrorCode : uint\n\t{\n\t\t// ReSharper disable InconsistentNaming, UnusedMember.Global\n\t\t/// <summary>unknown error code</summary>\n\t\tok = 0x0000,\n\t\t/// <summary>undefined error</summary>\n\t\tundefined = 0x0001,\n\t\t/// <summary>not implemented</summary>\n\t\tnot_implemented = 0x0002,\n\t\t/// <summary></summary>\n\t\tok_no_update = 0x0003,\n\t\t/// <summary></summary>\n\t\tdont_notify = 0x0004,\n\t\t/// <summary>library time limit reached</summary>\n\t\tlib_time_limit_reached = 0x0005,\n\t\t/// <summary>command not found</summary>\n\t\tcommand_not_found = 0x0100,\n\t\t/// <summary>unable to bind network port</summary>\n\t\tunable_to_bind_network_port = 0x0101,\n\t\t/// <summary>no network port available</summary>\n\t\tno_network_port_available = 0x0102,\n\t\t/// <summary>invalid clientID</summary>\n\t\tclient_invalid_id = 0x0200,\n\t\t/// <summary>nickname is already in use</summary>\n\t\tclient_nickname_inuse = 0x0201,\n\t\t/// <summary>invalid error code</summary>\n\t\tclient_invalid_error_code = 0x0202,\n\t\t/// <summary>max clients protocol limit reached</summary>\n\t\tclient_protocol_limit_reached = 0x0203,\n\t\t/// <summary>invalid client type</summary>\n\t\tclient_invalid_type = 0x0204,\n\t\t/// <summary>already subscribed</summary>\n\t\tclient_already_subscribed = 0x0205,\n\t\t/// <summary>not logged in</summary>\n\t\tclient_not_logged_in = 0x0206,\n\t\t/// <summary>could not validate client identity</summary>\n\t\tclient_could_not_validate_identity = 0x0207,\n\t\t/// <summary>invalid loginname or password</summary>\n\t\tclient_invalid_password = 0x0208,\n\t\t/// <summary>too many clones already connected</summary>\n\t\tclient_too_many_clones_connected = 0x0209,\n\t\t/// <summary>client version outdated, please update</summary>\n\t\tclient_version_outdated = 0x020a,\n\t\t/// <summary>client is online</summary>\n\t\tclient_is_online = 0x020b,\n\t\t/// <summary>client is flooding</summary>\n\t\tclient_is_flooding = 0x020c,\n\t\t/// <summary>client is modified</summary>\n\t\tclient_hacked = 0x020d,\n\t\t/// <summary>can not verify client at this moment</summary>\n\t\tclient_cannot_verify_now = 0x020e,\n\t\t/// <summary>client is not permitted to log in</summary>\n\t\tclient_login_not_permitted = 0x020f,\n\t\t/// <summary>client is not subscribed to the channel</summary>\n\t\tclient_not_subscribed = 0x0210,\n\t\t/// <summary>invalid channelID</summary>\n\t\tchannel_invalid_id = 0x0300,\n\t\t/// <summary>max channels protocol limit reached</summary>\n\t\tchannel_protocol_limit_reached = 0x0301,\n\t\t/// <summary>already member of channel</summary>\n\t\tchannel_already_in = 0x0302,\n\t\t/// <summary>channel name is already in use</summary>\n\t\tchannel_name_inuse = 0x0303,\n\t\t/// <summary>channel not empty</summary>\n\t\tchannel_not_empty = 0x0304,\n\t\t/// <summary>can not delete default channel</summary>\n\t\tchannel_can_not_delete_default = 0x0305,\n\t\t/// <summary>default channel requires permanent</summary>\n\t\tchannel_default_require_permanent = 0x0306,\n\t\t/// <summary>invalid channel flags</summary>\n\t\tchannel_invalid_flags = 0x0307,\n\t\t/// <summary>permanent channel can not be child of non permanent channel</summary>\n\t\tchannel_parent_not_permanent = 0x0308,\n\t\t/// <summary>channel maxclient reached</summary>\n\t\tchannel_maxclients_reached = 0x0309,\n\t\t/// <summary>channel maxfamily reached</summary>\n\t\tchannel_maxfamily_reached = 0x030a,\n\t\t/// <summary>invalid channel order</summary>\n\t\tchannel_invalid_order = 0x030b,\n\t\t/// <summary>channel does not support filetransfers</summary>\n\t\tchannel_no_filetransfer_supported = 0x030c,\n\t\t/// <summary>invalid channel password</summary>\n\t\tchannel_invalid_password = 0x030d,\n\t\t/// <summary>channel is private channel</summary>\n\t\tchannel_is_private_channel = 0x030e,\n\t\t/// <summary>invalid security hash supplied by client</summary>\n\t\tchannel_invalid_security_hash = 0x030f,\n\t\t/// <summary>invalid serverID</summary>\n\t\tserver_invalid_id = 0x0400,\n\t\t/// <summary>server is running</summary>\n\t\tserver_running = 0x0401,\n\t\t/// <summary>server is shutting down</summary>\n\t\tserver_is_shutting_down = 0x0402,\n\t\t/// <summary>server maxclient reached</summary>\n\t\tserver_maxclients_reached = 0x0403,\n\t\t/// <summary>invalid server password</summary>\n\t\tserver_invalid_password = 0x0404,\n\t\t/// <summary>deployment active</summary>\n\t\tserver_deployment_active = 0x0405,\n\t\t/// <summary>unable to stop own server in your connection class</summary>\n\t\tserver_unable_to_stop_own_server = 0x0406,\n\t\t/// <summary>server is virtual</summary>\n\t\tserver_is_virtual = 0x0407,\n\t\t/// <summary>server wrong machineID</summary>\n\t\tserver_wrong_machineid = 0x0408,\n\t\t/// <summary>server is not running</summary>\n\t\tserver_is_not_running = 0x0409,\n\t\t/// <summary>server is booting up</summary>\n\t\tserver_is_booting = 0x040a,\n\t\t/// <summary>server got an invalid status for this operation</summary>\n\t\tserver_status_invalid = 0x040b,\n\t\t/// <summary>server modal quit</summary>\n\t\tserver_modal_quit = 0x040c,\n\t\t/// <summary>server version is too old for command</summary>\n\t\tserver_version_outdated = 0x040d,\n\t\t/// <summary>database error</summary>\n\t\tdatabase = 0x0500,\n\t\t/// <summary>database empty result set</summary>\n\t\tdatabase_empty_result = 0x0501,\n\t\t/// <summary>database duplicate entry</summary>\n\t\tdatabase_duplicate_entry = 0x0502,\n\t\t/// <summary>database no modifications</summary>\n\t\tdatabase_no_modifications = 0x0503,\n\t\t/// <summary>database invalid constraint</summary>\n\t\tdatabase_constraint = 0x0504,\n\t\t/// <summary>database reinvoke command</summary>\n\t\tdatabase_reinvoke = 0x0505,\n\t\t/// <summary>invalid quote</summary>\n\t\tparameter_quote = 0x0600,\n\t\t/// <summary>invalid parameter count</summary>\n\t\tparameter_invalid_count = 0x0601,\n\t\t/// <summary>invalid parameter</summary>\n\t\tparameter_invalid = 0x0602,\n\t\t/// <summary>parameter not found</summary>\n\t\tparameter_not_found = 0x0603,\n\t\t/// <summary>convert error</summary>\n\t\tparameter_convert = 0x0604,\n\t\t/// <summary>invalid parameter size</summary>\n\t\tparameter_invalid_size = 0x0605,\n\t\t/// <summary>missing required parameter</summary>\n\t\tparameter_missing = 0x0606,\n\t\t/// <summary>invalid checksum</summary>\n\t\tparameter_checksum = 0x0607,\n\t\t/// <summary>virtual server got a critical error</summary>\n\t\tvs_critical = 0x0700,\n\t\t/// <summary>Connection lost</summary>\n\t\tconnection_lost = 0x0701,\n\t\t/// <summary>not connected</summary>\n\t\tnot_connected = 0x0702,\n\t\t/// <summary>no cached connection info</summary>\n\t\tno_cached_connection_info = 0x0703,\n\t\t/// <summary>currently not possible</summary>\n\t\tcurrently_not_possible = 0x0704,\n\t\t/// <summary>failed connection initialization</summary>\n\t\tfailed_connection_initialisation = 0x0705,\n\t\t/// <summary>could not resolve hostname</summary>\n\t\tcould_not_resolve_hostname = 0x0706,\n\t\t/// <summary>invalid server connection handler ID</summary>\n\t\tinvalid_server_connection_handler_id = 0x0707,\n\t\t/// <summary>could not initialize Input Manager</summary>\n\t\tcould_not_initialise_input_manager = 0x0708,\n\t\t/// <summary>client library not initialized</summary>\n\t\tclientlibrary_not_initialised = 0x0709,\n\t\t/// <summary>server library not initialized</summary>\n\t\tserverlibrary_not_initialised = 0x070a,\n\t\t/// <summary>too many whisper targets</summary>\n\t\twhisper_too_many_targets = 0x070b,\n\t\t/// <summary>no whisper targets found</summary>\n\t\twhisper_no_targets = 0x070c,\n\t\t/// <summary>invalid file name</summary>\n\t\tfile_invalid_name = 0x0800,\n\t\t/// <summary>invalid file permissions</summary>\n\t\tfile_invalid_permissions = 0x0801,\n\t\t/// <summary>file already exists</summary>\n\t\tfile_already_exists = 0x0802,\n\t\t/// <summary>file not found</summary>\n\t\tfile_not_found = 0x0803,\n\t\t/// <summary>file input/output error</summary>\n\t\tfile_io_error = 0x0804,\n\t\t/// <summary>invalid file transfer ID</summary>\n\t\tfile_invalid_transfer_id = 0x0805,\n\t\t/// <summary>invalid file path</summary>\n\t\tfile_invalid_path = 0x0806,\n\t\t/// <summary>no files available</summary>\n\t\tfile_no_files_available = 0x0807,\n\t\t/// <summary>overwrite excludes resume</summary>\n\t\tfile_overwrite_excludes_resume = 0x0808,\n\t\t/// <summary>invalid file size</summary>\n\t\tfile_invalid_size = 0x0809,\n\t\t/// <summary>file already in use</summary>\n\t\tfile_already_in_use = 0x080a,\n\t\t/// <summary>could not open file transfer connection</summary>\n\t\tfile_could_not_open_connection = 0x080b,\n\t\t/// <summary>no space left on device (disk full?)</summary>\n\t\tfile_no_space_left_on_device = 0x080c,\n\t\t/// <summary>file exceeds file system's maximum file size</summary>\n\t\tfile_exceeds_file_system_maximum_size = 0x080d,\n\t\t/// <summary>file transfer connection timeout</summary>\n\t\tfile_transfer_connection_timeout = 0x080e,\n\t\t/// <summary>lost file transfer connection</summary>\n\t\tfile_connection_lost = 0x080f,\n\t\t/// <summary>file exceeds supplied file size</summary>\n\t\tfile_exceeds_supplied_size = 0x0810,\n\t\t/// <summary>file transfer complete</summary>\n\t\tfile_transfer_complete = 0x0811,\n\t\t/// <summary>file transfer canceled</summary>\n\t\tfile_transfer_canceled = 0x0812,\n\t\t/// <summary>file transfer interrupted</summary>\n\t\tfile_transfer_interrupted = 0x0813,\n\t\t/// <summary>file transfer server quota exceeded</summary>\n\t\tfile_transfer_server_quota_exceeded = 0x0814,\n\t\t/// <summary>file transfer client quota exceeded</summary>\n\t\tfile_transfer_client_quota_exceeded = 0x0815,\n\t\t/// <summary>file transfer reset</summary>\n\t\tfile_transfer_reset = 0x0816,\n\t\t/// <summary>file transfer limit reached</summary>\n\t\tfile_transfer_limit_reached = 0x0817,\n\t\t/// <summary>preprocessor disabled</summary>\n\t\tsound_preprocessor_disabled = 0x0900,\n\t\t/// <summary>internal preprocessor</summary>\n\t\tsound_internal_preprocessor = 0x0901,\n\t\t/// <summary>internal encoder</summary>\n\t\tsound_internal_encoder = 0x0902,\n\t\t/// <summary>internal playback</summary>\n\t\tsound_internal_playback = 0x0903,\n\t\t/// <summary>no capture device available</summary>\n\t\tsound_no_capture_device_available = 0x0904,\n\t\t/// <summary>no playback device available</summary>\n\t\tsound_no_playback_device_available = 0x0905,\n\t\t/// <summary>could not open capture device</summary>\n\t\tsound_could_not_open_capture_device = 0x0906,\n\t\t/// <summary>could not open playback device</summary>\n\t\tsound_could_not_open_playback_device = 0x0907,\n\t\t/// <summary>ServerConnectionHandler has a device registered</summary>\n\t\tsound_handler_has_device = 0x0908,\n\t\t/// <summary>invalid capture device</summary>\n\t\tsound_invalid_capture_device = 0x0909,\n\t\t/// <summary>invalid clayback device</summary>\n\t\tsound_invalid_playback_device = 0x090a,\n\t\t/// <summary>invalid wave file</summary>\n\t\tsound_invalid_wave = 0x090b,\n\t\t/// <summary>wave file type not supported</summary>\n\t\tsound_unsupported_wave = 0x090c,\n\t\t/// <summary>could not open wave file</summary>\n\t\tsound_open_wave = 0x090d,\n\t\t/// <summary>internal capture</summary>\n\t\tsound_internal_capture = 0x090e,\n\t\t/// <summary>device still in use</summary>\n\t\tsound_device_in_use = 0x090f,\n\t\t/// <summary>device already registerred</summary>\n\t\tsound_device_already_registerred = 0x0910,\n\t\t/// <summary>device not registered/known</summary>\n\t\tsound_unknown_device = 0x0911,\n\t\t/// <summary>unsupported frequency</summary>\n\t\tsound_unsupported_frequency = 0x0912,\n\t\t/// <summary>invalid channel count</summary>\n\t\tsound_invalid_channel_count = 0x0913,\n\t\t/// <summary>read error in wave</summary>\n\t\tsound_read_wave = 0x0914,\n\t\t/// <summary>sound need more data</summary>\n\t\tsound_need_more_data = 0x0915,\n\t\t/// <summary>sound device was busy</summary>\n\t\tsound_device_busy = 0x0916,\n\t\t/// <summary>there is no sound data for this period</summary>\n\t\tsound_no_data = 0x0917,\n\t\t/// <summary>Channelmask set bits count (speakers) is not the same as (count)</summary>\n\t\tsound_channel_mask_mismatch = 0x0918,\n\t\t/// <summary>invalid group ID</summary>\n\t\tpermission_invalid_group_id = 0x0a00,\n\t\t/// <summary>duplicate entry</summary>\n\t\tpermission_duplicate_entry = 0x0a01,\n\t\t/// <summary>invalid permission ID</summary>\n\t\tpermission_invalid_perm_id = 0x0a02,\n\t\t/// <summary>empty result set</summary>\n\t\tpermission_empty_result = 0x0a03,\n\t\t/// <summary>access to default group is forbidden</summary>\n\t\tpermission_default_group_forbidden = 0x0a04,\n\t\t/// <summary>invalid size</summary>\n\t\tpermission_invalid_size = 0x0a05,\n\t\t/// <summary>invalid value</summary>\n\t\tpermission_invalid_value = 0x0a06,\n\t\t/// <summary>group is not empty</summary>\n\t\tpermissions_group_not_empty = 0x0a07,\n\t\t/// <summary>insufficient client permissions</summary>\n\t\tpermissions_client_insufficient = 0x0a08,\n\t\t/// <summary>insufficient group modify power</summary>\n\t\tpermissions_insufficient_group_power = 0x0a09,\n\t\t/// <summary>insufficient permission modify power</summary>\n\t\tpermissions_insufficient_permission_power = 0x0a0a,\n\t\t/// <summary>template group is currently used</summary>\n\t\tpermission_template_group_is_used = 0x0a0b,\n\t\t/// <summary>permission error</summary>\n\t\tpermissions = 0x0a0c,\n\t\t/// <summary>virtualserver limit reached</summary>\n\t\taccounting_virtualserver_limit_reached = 0x0b00,\n\t\t/// <summary>max slot limit reached</summary>\n\t\taccounting_slot_limit_reached = 0x0b01,\n\t\t/// <summary>license file not found</summary>\n\t\taccounting_license_file_not_found = 0x0b02,\n\t\t/// <summary>license date not ok</summary>\n\t\taccounting_license_date_not_ok = 0x0b03,\n\t\t/// <summary>unable to connect to accounting server</summary>\n\t\taccounting_unable_to_connect_to_server = 0x0b04,\n\t\t/// <summary>unknown accounting error</summary>\n\t\taccounting_unknown_error = 0x0b05,\n\t\t/// <summary>accounting server error</summary>\n\t\taccounting_server_error = 0x0b06,\n\t\t/// <summary>instance limit reached</summary>\n\t\taccounting_instance_limit_reached = 0x0b07,\n\t\t/// <summary>instance check error</summary>\n\t\taccounting_instance_check_error = 0x0b08,\n\t\t/// <summary>license file invalid</summary>\n\t\taccounting_license_file_invalid = 0x0b09,\n\t\t/// <summary>virtualserver is running elsewhere</summary>\n\t\taccounting_running_elsewhere = 0x0b0a,\n\t\t/// <summary>virtualserver running in same instance already</summary>\n\t\taccounting_instance_duplicated = 0x0b0b,\n\t\t/// <summary>virtualserver already started</summary>\n\t\taccounting_already_started = 0x0b0c,\n\t\t/// <summary>virtualserver not started</summary>\n\t\taccounting_not_started = 0x0b0d,\n\t\t/// <summary></summary>\n\t\taccounting_to_many_starts = 0x0b0e,\n\t\t/// <summary>invalid message id</summary>\n\t\tmessage_invalid_id = 0x0c00,\n\t\t/// <summary>invalid ban id</summary>\n\t\tban_invalid_id = 0x0d00,\n\t\t/// <summary>connection failed, you are banned</summary>\n\t\tconnect_failed_banned = 0x0d01,\n\t\t/// <summary>rename failed, new name is banned</summary>\n\t\trename_failed_banned = 0x0d02,\n\t\t/// <summary>flood ban</summary>\n\t\tban_flooding = 0x0d03,\n\t\t/// <summary>unable to initialize tts</summary>\n\t\ttts_unable_to_initialize = 0x0e00,\n\t\t/// <summary>invalid privilege key</summary>\n\t\tprivilege_key_invalid = 0x0f00,\n\t\t/// <summary></summary>\n\t\tvoip_pjsua = 0x1000,\n\t\t/// <summary></summary>\n\t\tvoip_already_initialized = 0x1001,\n\t\t/// <summary></summary>\n\t\tvoip_too_many_accounts = 0x1002,\n\t\t/// <summary></summary>\n\t\tvoip_invalid_account = 0x1003,\n\t\t/// <summary></summary>\n\t\tvoip_internal_error = 0x1004,\n\t\t/// <summary></summary>\n\t\tvoip_invalid_connectionId = 0x1005,\n\t\t/// <summary></summary>\n\t\tvoip_cannot_answer_initiated_call = 0x1006,\n\t\t/// <summary></summary>\n\t\tvoip_not_initialized = 0x1007,\n\t\t/// <summary>invalid password</summary>\n\t\tprovisioning_invalid_password = 0x1100,\n\t\t/// <summary>invalid request</summary>\n\t\tprovisioning_invalid_request = 0x1101,\n\t\t/// <summary>no(more) slots available</summary>\n\t\tprovisioning_no_slots_available = 0x1102,\n\t\t/// <summary>pool missing</summary>\n\t\tprovisioning_pool_missing = 0x1103,\n\t\t/// <summary>pool unknown</summary>\n\t\tprovisioning_pool_unknown = 0x1104,\n\t\t/// <summary>unknown ip location(perhaps LAN ip?)</summary>\n\t\tprovisioning_unknown_ip_location = 0x1105,\n\t\t/// <summary>internal error(tried exceeded)</summary>\n\t\tprovisioning_internal_tries_exceeded = 0x1106,\n\t\t/// <summary>too many slots requested</summary>\n\t\tprovisioning_too_many_slots_requested = 0x1107,\n\t\t/// <summary>too many reserved</summary>\n\t\tprovisioning_too_many_reserved = 0x1108,\n\t\t/// <summary>could not connect to provisioning server</summary>\n\t\tprovisioning_could_not_connect = 0x1109,\n\t\t/// <summary>authentication server not connected</summary>\n\t\tprovisioning_auth_server_not_connected = 0x1110,\n\t\t/// <summary>authentication data too large</summary>\n\t\tprovisioning_auth_data_too_large = 0x1111,\n\t\t/// <summary>already initialized</summary>\n\t\tprovisioning_already_initialized = 0x1112,\n\t\t/// <summary>not initialized</summary>\n\t\tprovisioning_not_initialized = 0x1113,\n\t\t/// <summary>already connecting</summary>\n\t\tprovisioning_connecting = 0x1114,\n\t\t/// <summary>already connected</summary>\n\t\tprovisioning_already_connected = 0x1115,\n\t\t/// <summary></summary>\n\t\tprovisioning_not_connected = 0x1116,\n\t\t/// <summary>io_error</summary>\n\t\tprovisioning_io_error = 0x1117,\n\t\t/// <summary></summary>\n\t\tprovisioning_invalid_timeout = 0x1118,\n\t\t/// <summary></summary>\n\t\tprovisioning_ts3server_not_found = 0x1119,\n\t\t/// <summary>unknown permissionID</summary>\n\t\tprovisioning_no_permission = 0x111A,\n\t\t/// <summary>For own custom errors</summary>\n\t\tcustom_error = 0xFFFF,\n\t\t// ReSharper enable InconsistentNaming, UnusedMember.Global\n\t}\n}"
  },
  {
    "path": "TSLib/Generated/TsErrorCode.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"false\" hostspecific=\"true\" language=\"C#\" #>\n<#@ include file=\"ErrorParser.ttinclude\" once=\"true\" #>\n<#@ output extension=\".cs\" #>\n<# var errors = ParseErrors(); #>\n\nnamespace TSLib\n{\n\t// Source: http://forum.teamspeak.com/threads/102276-Server-query-error-id-list\n\tpublic enum TsErrorCode : uint\n\t{\n\t\t// ReSharper disable InconsistentNaming, UnusedMember.Global<# foreach (var line in errors) { #>\n\t\t/// <summary><#= line.Doc #></summary>\n\t\t<#= line.Name #> = <#= line.Value #>,<# } #>\n\t\t/// <summary>For own custom errors</summary>\n\t\tcustom_error = 0xFFFF,\n\t\t// ReSharper enable InconsistentNaming, UnusedMember.Global\n\t}\n}"
  },
  {
    "path": "TSLib/Generated/TsPermission.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\nusing TSLib.Helper;\n\nnamespace TSLib\n{\n\t// Source: https://www.tsviewer.com/index.php?page=faq&id=12&newlanguage=en\n\tpublic enum TsPermission\n\t{\n\t\t// ReSharper disable InconsistentNaming, UnusedMember.Global\n\t\tundefined,\n\t\t/// <summary>May occour on error returns with no associated permission</summary>\n\t\tunknown,\n\t\t/// <summary>Retrieve information about ServerQuery commands</summary>\n\t\tb_serverinstance_help_view,\n\t\t/// <summary>Retrieve global server version (including platform and build number)</summary>\n\t\tb_serverinstance_version_view,\n\t\t/// <summary>Retrieve global server information</summary>\n\t\tb_serverinstance_info_view,\n\t\t/// <summary>List virtual servers stored in the database</summary>\n\t\tb_serverinstance_virtualserver_list,\n\t\t/// <summary>List active IP bindings on multi-homed machines</summary>\n\t\tb_serverinstance_binding_list,\n\t\t/// <summary>List permissions available available on the server instance</summary>\n\t\tb_serverinstance_permission_list,\n\t\t/// <summary>Search permission assignments by name or ID</summary>\n\t\tb_serverinstance_permission_find,\n\t\t/// <summary>Create virtual servers</summary>\n\t\tb_virtualserver_create,\n\t\t/// <summary>Delete virtual servers</summary>\n\t\tb_virtualserver_delete,\n\t\t/// <summary>Start any virtual server in the server instance</summary>\n\t\tb_virtualserver_start_any,\n\t\t/// <summary>Stop any virtual server in the server instance</summary>\n\t\tb_virtualserver_stop_any,\n\t\t/// <summary>Change a virtual servers machine ID</summary>\n\t\tb_virtualserver_change_machine_id,\n\t\t/// <summary>Edit virtual server default template values</summary>\n\t\tb_virtualserver_change_template,\n\t\t/// <summary>Login to ServerQuery</summary>\n\t\tb_serverquery_login,\n\t\t/// <summary>Send text messages to all virtual servers at once</summary>\n\t\tb_serverinstance_textmessage_send,\n\t\t/// <summary>Retrieve global server log</summary>\n\t\tb_serverinstance_log_view,\n\t\t/// <summary>Write to global server log</summary>\n\t\tb_serverinstance_log_add,\n\t\t/// <summary>Shutdown the server process</summary>\n\t\tb_serverinstance_stop,\n\t\t/// <summary>Edit global settings</summary>\n\t\tb_serverinstance_modify_settings,\n\t\t/// <summary>Edit global ServerQuery groups</summary>\n\t\tb_serverinstance_modify_querygroup,\n\t\t/// <summary>Edit global template groups</summary>\n\t\tb_serverinstance_modify_templates,\n\t\t/// <summary>Select a virtual server</summary>\n\t\tb_virtualserver_select,\n\t\t/// <summary>Retrieve virtual server information</summary>\n\t\tb_virtualserver_info_view,\n\t\t/// <summary>Retrieve virtual server connection information</summary>\n\t\tb_virtualserver_connectioninfo_view,\n\t\t/// <summary>List channels on a virtual server</summary>\n\t\tb_virtualserver_channel_list,\n\t\t/// <summary>Search for channels on a virtual server</summary>\n\t\tb_virtualserver_channel_search,\n\t\t/// <summary>List clients online on a virtual server</summary>\n\t\tb_virtualserver_client_list,\n\t\t/// <summary>Search for clients online on a virtual server</summary>\n\t\tb_virtualserver_client_search,\n\t\t/// <summary>List client identities known by the virtual server</summary>\n\t\tb_virtualserver_client_dblist,\n\t\t/// <summary>Search for client identities known by the virtual server</summary>\n\t\tb_virtualserver_client_dbsearch,\n\t\t/// <summary>Retrieve client information</summary>\n\t\tb_virtualserver_client_dbinfo,\n\t\t/// <summary>Find permissions</summary>\n\t\tb_virtualserver_permission_find,\n\t\t/// <summary>Find custom fields</summary>\n\t\tb_virtualserver_custom_search,\n\t\t/// <summary>Start own virtual server</summary>\n\t\tb_virtualserver_start,\n\t\t/// <summary>Stop own virtual server</summary>\n\t\tb_virtualserver_stop,\n\t\t/// <summary>List privilege keys available</summary>\n\t\tb_virtualserver_token_list,\n\t\t/// <summary>Create new privilege keys</summary>\n\t\tb_virtualserver_token_add,\n\t\t/// <summary>Use a privilege keys to gain access to groups</summary>\n\t\tb_virtualserver_token_use,\n\t\t/// <summary>Delete a privilege key</summary>\n\t\tb_virtualserver_token_delete,\n\t\t/// <summary>Retrieve virtual server log</summary>\n\t\tb_virtualserver_log_view,\n\t\t/// <summary>Write to virtual server log</summary>\n\t\tb_virtualserver_log_add,\n\t\t/// <summary>Join virtual server ignoring its password</summary>\n\t\tb_virtualserver_join_ignore_password,\n\t\t/// <summary>Register for server notifications</summary>\n\t\tb_virtualserver_notify_register,\n\t\t/// <summary>Unregister from server notifications</summary>\n\t\tb_virtualserver_notify_unregister,\n\t\t/// <summary>Create server snapshots</summary>\n\t\tb_virtualserver_snapshot_create,\n\t\t/// <summary>Deploy server snapshots</summary>\n\t\tb_virtualserver_snapshot_deploy,\n\t\t/// <summary>Reset the server permission settings to default values</summary>\n\t\tb_virtualserver_permission_reset,\n\t\t/// <summary>Modify server name</summary>\n\t\tb_virtualserver_modify_name,\n\t\t/// <summary>Modify welcome message</summary>\n\t\tb_virtualserver_modify_welcomemessage,\n\t\t/// <summary>Modify servers max clients</summary>\n\t\tb_virtualserver_modify_maxclients,\n\t\t/// <summary>Modify reserved slots</summary>\n\t\tb_virtualserver_modify_reserved_slots,\n\t\t/// <summary>Modify server password</summary>\n\t\tb_virtualserver_modify_password,\n\t\t/// <summary>Modify default Server Group</summary>\n\t\tb_virtualserver_modify_default_servergroup,\n\t\t/// <summary>Modify default Channel Group</summary>\n\t\tb_virtualserver_modify_default_channelgroup,\n\t\t/// <summary>Modify default Channel Admin Group</summary>\n\t\tb_virtualserver_modify_default_channeladmingroup,\n\t\t/// <summary>Modify channel force silence value</summary>\n\t\tb_virtualserver_modify_channel_forced_silence,\n\t\t/// <summary>Modify individual complain settings</summary>\n\t\tb_virtualserver_modify_complain,\n\t\t/// <summary>Modify individual antiflood settings</summary>\n\t\tb_virtualserver_modify_antiflood,\n\t\t/// <summary>Modify file transfer settings</summary>\n\t\tb_virtualserver_modify_ft_settings,\n\t\t/// <summary>Modify file transfer quotas</summary>\n\t\tb_virtualserver_modify_ft_quotas,\n\t\t/// <summary>Modify individual hostmessage settings</summary>\n\t\tb_virtualserver_modify_hostmessage,\n\t\t/// <summary>Modify individual hostbanner settings</summary>\n\t\tb_virtualserver_modify_hostbanner,\n\t\t/// <summary>Modify individual hostbutton settings</summary>\n\t\tb_virtualserver_modify_hostbutton,\n\t\t/// <summary>Modify server port</summary>\n\t\tb_virtualserver_modify_port,\n\t\t/// <summary>Modify server autostart</summary>\n\t\tb_virtualserver_modify_autostart,\n\t\t/// <summary>Modify required identity security level</summary>\n\t\tb_virtualserver_modify_needed_identity_security_level,\n\t\t/// <summary>Modify priority speaker dimm modificator</summary>\n\t\tb_virtualserver_modify_priority_speaker_dimm_modificator,\n\t\t/// <summary>Modify log settings</summary>\n\t\tb_virtualserver_modify_log_settings,\n\t\t/// <summary>Modify min client version</summary>\n\t\tb_virtualserver_modify_min_client_version,\n\t\t/// <summary>Modify server icon</summary>\n\t\tb_virtualserver_modify_icon_id,\n\t\t/// <summary>Modify web server list reporting settings</summary>\n\t\tb_virtualserver_modify_weblist,\n\t\t/// <summary>Modify codec encryption mode</summary>\n\t\tb_virtualserver_modify_codec_encryption_mode,\n\t\t/// <summary>Modify temporary serverpasswords</summary>\n\t\tb_virtualserver_modify_temporary_passwords,\n\t\t/// <summary>Modify own temporary serverpasswords</summary>\n\t\tb_virtualserver_modify_temporary_passwords_own,\n\t\t/// <summary>Modify default temporary channel delete delay</summary>\n\t\tb_virtualserver_modify_channel_temp_delete_delay_default,\n\t\t/// <summary>Modify server nicknames</summary>\n\t\tb_virtualserver_modify_nickname,\n\t\t/// <summary>Modify integrations</summary>\n\t\tb_virtualserver_modify_integrations,\n\t\t/// <summary>Min channel creation depth in hierarchy</summary>\n\t\ti_channel_min_depth,\n\t\t/// <summary>Max channel creation depth in hierarchy</summary>\n\t\ti_channel_max_depth,\n\t\t/// <summary>Stop inheritance of channel group permissions</summary>\n\t\tb_channel_group_inheritance_end,\n\t\t/// <summary>Modify channel permission power</summary>\n\t\ti_channel_permission_modify_power,\n\t\t/// <summary>Needed modify channel permission power</summary>\n\t\ti_channel_needed_permission_modify_power,\n\t\t/// <summary>Retrieve channel information</summary>\n\t\tb_channel_info_view,\n\t\t/// <summary>Create sub-channels</summary>\n\t\tb_channel_create_child,\n\t\t/// <summary>Create permanent channels</summary>\n\t\tb_channel_create_permanent,\n\t\t/// <summary>Create semi-permanent channels</summary>\n\t\tb_channel_create_semi_permanent,\n\t\t/// <summary>Create temporary channels</summary>\n\t\tb_channel_create_temporary,\n\t\t/// <summary>Create private channel</summary>\n\t\tb_channel_create_private,\n\t\t/// <summary>Create channels with a topic</summary>\n\t\tb_channel_create_with_topic,\n\t\t/// <summary>Create channels with a description</summary>\n\t\tb_channel_create_with_description,\n\t\t/// <summary>Create password protected channels</summary>\n\t\tb_channel_create_with_password,\n\t\t/// <summary>Create channels using Speex Narrowband (8 kHz) codecs</summary>\n\t\tb_channel_create_modify_with_codec_speex8,\n\t\t/// <summary>Create channels using Speex Wideband (16 kHz) codecs</summary>\n\t\tb_channel_create_modify_with_codec_speex16,\n\t\t/// <summary>Create channels using Speex Ultra-Wideband (32 kHz) codecs</summary>\n\t\tb_channel_create_modify_with_codec_speex32,\n\t\t/// <summary>Create channels using the CELT Mono (48 kHz) codec</summary>\n\t\tb_channel_create_modify_with_codec_celtmono48,\n\t\t/// <summary>Create channels using OPUS (voice) codec</summary>\n\t\tb_channel_create_modify_with_codec_opusvoice,\n\t\t/// <summary>Create channels using OPUS (music) codec</summary>\n\t\tb_channel_create_modify_with_codec_opusmusic,\n\t\t/// <summary>Create channels with custom codec quality</summary>\n\t\ti_channel_create_modify_with_codec_maxquality,\n\t\t/// <summary>Create channels with minimal custom codec latency factor</summary>\n\t\ti_channel_create_modify_with_codec_latency_factor_min,\n\t\t/// <summary>Create channels with custom max clients</summary>\n\t\tb_channel_create_with_maxclients,\n\t\t/// <summary>Create channels with custom max family clients</summary>\n\t\tb_channel_create_with_maxfamilyclients,\n\t\t/// <summary>Create channels with custom sort order</summary>\n\t\tb_channel_create_with_sortorder,\n\t\t/// <summary>Create default channels</summary>\n\t\tb_channel_create_with_default,\n\t\t/// <summary>Create channels with needed talk power</summary>\n\t\tb_channel_create_with_needed_talk_power,\n\t\t/// <summary>Create new channels only with password</summary>\n\t\tb_channel_create_modify_with_force_password,\n\t\t/// <summary>Max delete delay for temporary channels</summary>\n\t\ti_channel_create_modify_with_temp_delete_delay,\n\t\t/// <summary>Move channels</summary>\n\t\tb_channel_modify_parent,\n\t\t/// <summary>Make channel default</summary>\n\t\tb_channel_modify_make_default,\n\t\t/// <summary>Make channel permanent</summary>\n\t\tb_channel_modify_make_permanent,\n\t\t/// <summary>Make channel semi-permanent</summary>\n\t\tb_channel_modify_make_semi_permanent,\n\t\t/// <summary>Make channel temporary</summary>\n\t\tb_channel_modify_make_temporary,\n\t\t/// <summary>Modify channel name</summary>\n\t\tb_channel_modify_name,\n\t\t/// <summary>Modify channel topic</summary>\n\t\tb_channel_modify_topic,\n\t\t/// <summary>Modify channel description</summary>\n\t\tb_channel_modify_description,\n\t\t/// <summary>Modify channel password</summary>\n\t\tb_channel_modify_password,\n\t\t/// <summary>Modify channel codec</summary>\n\t\tb_channel_modify_codec,\n\t\t/// <summary>Modify channel codec quality</summary>\n\t\tb_channel_modify_codec_quality,\n\t\t/// <summary>Modify channel codec latency factor</summary>\n\t\tb_channel_modify_codec_latency_factor,\n\t\t/// <summary>Modify channels max clients</summary>\n\t\tb_channel_modify_maxclients,\n\t\t/// <summary>Modify channels max family clients</summary>\n\t\tb_channel_modify_maxfamilyclients,\n\t\t/// <summary>Modify channel sort order</summary>\n\t\tb_channel_modify_sortorder,\n\t\t/// <summary>Change needed channel talk power</summary>\n\t\tb_channel_modify_needed_talk_power,\n\t\t/// <summary>Channel modify power</summary>\n\t\ti_channel_modify_power,\n\t\t/// <summary>Needed channel modify power</summary>\n\t\ti_channel_needed_modify_power,\n\t\t/// <summary>Make channel codec encrypted</summary>\n\t\tb_channel_modify_make_codec_encrypted,\n\t\t/// <summary>Modify temporary channel delete delay</summary>\n\t\tb_channel_modify_temp_delete_delay,\n\t\t/// <summary>Delete permanent channels</summary>\n\t\tb_channel_delete_permanent,\n\t\t/// <summary>Delete semi-permanent channels</summary>\n\t\tb_channel_delete_semi_permanent,\n\t\t/// <summary>Delete temporary channels</summary>\n\t\tb_channel_delete_temporary,\n\t\t/// <summary>Force channel delete</summary>\n\t\tb_channel_delete_flag_force,\n\t\t/// <summary>Delete channel power</summary>\n\t\ti_channel_delete_power,\n\t\t/// <summary>Needed delete channel power</summary>\n\t\ti_channel_needed_delete_power,\n\t\t/// <summary>Join permanent channels</summary>\n\t\tb_channel_join_permanent,\n\t\t/// <summary>Join semi-permanent channels</summary>\n\t\tb_channel_join_semi_permanent,\n\t\t/// <summary>Join temporary channels</summary>\n\t\tb_channel_join_temporary,\n\t\t/// <summary>Join channel ignoring its password</summary>\n\t\tb_channel_join_ignore_password,\n\t\t/// <summary>Ignore channels max clients limit</summary>\n\t\tb_channel_join_ignore_maxclients,\n\t\t/// <summary>Channel join power</summary>\n\t\ti_channel_join_power,\n\t\t/// <summary>Needed channel join power</summary>\n\t\ti_channel_needed_join_power,\n\t\t/// <summary>Channel subscribe power</summary>\n\t\ti_channel_subscribe_power,\n\t\t/// <summary>Needed channel subscribe power</summary>\n\t\ti_channel_needed_subscribe_power,\n\t\t/// <summary>Channel description view power</summary>\n\t\ti_channel_description_view_power,\n\t\t/// <summary>Needed channel needed description view power</summary>\n\t\ti_channel_needed_description_view_power,\n\t\t/// <summary>Group icon identifier</summary>\n\t\ti_icon_id,\n\t\t/// <summary>Max icon filesize in bytes</summary>\n\t\ti_max_icon_filesize,\n\t\t/// <summary>Enables icon management</summary>\n\t\tb_icon_manage,\n\t\t/// <summary>Group is permanent</summary>\n\t\tb_group_is_permanent,\n\t\t/// <summary>Group auto-update type</summary>\n\t\ti_group_auto_update_type,\n\t\t/// <summary>Group auto-update max value</summary>\n\t\ti_group_auto_update_max_value,\n\t\t/// <summary>Group sort id</summary>\n\t\ti_group_sort_id,\n\t\t/// <summary>Show group name in tree depending on selected mode</summary>\n\t\ti_group_show_name_in_tree,\n\t\t/// <summary>List server groups</summary>\n\t\tb_virtualserver_servergroup_list,\n\t\t/// <summary>List server group permissions</summary>\n\t\tb_virtualserver_servergroup_permission_list,\n\t\t/// <summary>List clients from a server group</summary>\n\t\tb_virtualserver_servergroup_client_list,\n\t\t/// <summary>List channel groups</summary>\n\t\tb_virtualserver_channelgroup_list,\n\t\t/// <summary>List channel group permissions</summary>\n\t\tb_virtualserver_channelgroup_permission_list,\n\t\t/// <summary>List clients from a channel group</summary>\n\t\tb_virtualserver_channelgroup_client_list,\n\t\t/// <summary>List client permissions</summary>\n\t\tb_virtualserver_client_permission_list,\n\t\t/// <summary>List channel permissions</summary>\n\t\tb_virtualserver_channel_permission_list,\n\t\t/// <summary>List channel client permissions</summary>\n\t\tb_virtualserver_channelclient_permission_list,\n\t\t/// <summary>Create server groups</summary>\n\t\tb_virtualserver_servergroup_create,\n\t\t/// <summary>Create channel groups</summary>\n\t\tb_virtualserver_channelgroup_create,\n\t\t/// <summary>Group modify power</summary>\n\t\ti_group_modify_power,\n\t\t/// <summary>Needed group modify power</summary>\n\t\ti_group_needed_modify_power,\n\t\t/// <summary>Group member add power</summary>\n\t\ti_group_member_add_power,\n\t\t/// <summary>Needed group member add power</summary>\n\t\ti_group_needed_member_add_power,\n\t\t/// <summary>Group member delete power</summary>\n\t\ti_group_member_remove_power,\n\t\t/// <summary>Needed group member delete power</summary>\n\t\ti_group_needed_member_remove_power,\n\t\t/// <summary>Permission modify power</summary>\n\t\ti_permission_modify_power,\n\t\t/// <summary>Ignore needed permission modify power</summary>\n\t\tb_permission_modify_power_ignore,\n\t\t/// <summary>Delete server groups</summary>\n\t\tb_virtualserver_servergroup_delete,\n\t\t/// <summary>Delete channel groups</summary>\n\t\tb_virtualserver_channelgroup_delete,\n\t\t/// <summary>Client permission modify power</summary>\n\t\ti_client_permission_modify_power,\n\t\t/// <summary>Needed client permission modify power</summary>\n\t\ti_client_needed_permission_modify_power,\n\t\t/// <summary>Max additional connections per client identity</summary>\n\t\ti_client_max_clones_uid,\n\t\t/// <summary>Max idle time in seconds</summary>\n\t\ti_client_max_idletime,\n\t\t/// <summary>Max avatar filesize in bytes</summary>\n\t\ti_client_max_avatar_filesize,\n\t\t/// <summary>Max channel subscriptions</summary>\n\t\ti_client_max_channel_subscriptions,\n\t\t/// <summary>Client is priority speaker</summary>\n\t\tb_client_is_priority_speaker,\n\t\t/// <summary>Ignore channel group permissions</summary>\n\t\tb_client_skip_channelgroup_permissions,\n\t\t/// <summary>Force Push-To-Talk capture mode</summary>\n\t\tb_client_force_push_to_talk,\n\t\t/// <summary>Ignore bans</summary>\n\t\tb_client_ignore_bans,\n\t\t/// <summary>Ignore antiflood measurements</summary>\n\t\tb_client_ignore_antiflood,\n\t\t/// <summary>Issue query commands from client</summary>\n\t\tb_client_issue_client_query_command,\n\t\t/// <summary>Use an reserved slot</summary>\n\t\tb_client_use_reserved_slot,\n\t\t/// <summary>Use channel commander</summary>\n\t\tb_client_use_channel_commander,\n\t\t/// <summary>Allow to request talk power</summary>\n\t\tb_client_request_talker,\n\t\t/// <summary>Allow deletion of avatars from other clients</summary>\n\t\tb_client_avatar_delete_other,\n\t\t/// <summary>Client will be sticked to current channel</summary>\n\t\tb_client_is_sticky,\n\t\t/// <summary>Client ignores sticky flag</summary>\n\t\tb_client_ignore_sticky,\n\t\t/// <summary>Retrieve client information</summary>\n\t\tb_client_info_view,\n\t\t/// <summary>Retrieve client permissions overview</summary>\n\t\tb_client_permissionoverview_view,\n\t\t/// <summary>Retrieve clients own permissions overview</summary>\n\t\tb_client_permissionoverview_own,\n\t\t/// <summary>View client IP address and port</summary>\n\t\tb_client_remoteaddress_view,\n\t\t/// <summary>ServerQuery view power</summary>\n\t\ti_client_serverquery_view_power,\n\t\t/// <summary>Needed ServerQuery view power</summary>\n\t\ti_client_needed_serverquery_view_power,\n\t\t/// <summary>View custom fields</summary>\n\t\tb_client_custom_info_view,\n\t\t/// <summary>Client kick power from server</summary>\n\t\ti_client_kick_from_server_power,\n\t\t/// <summary>Needed client kick power from server</summary>\n\t\ti_client_needed_kick_from_server_power,\n\t\t/// <summary>Client kick power from channel</summary>\n\t\ti_client_kick_from_channel_power,\n\t\t/// <summary>Needed client kick power from channel</summary>\n\t\ti_client_needed_kick_from_channel_power,\n\t\t/// <summary>Client ban power</summary>\n\t\ti_client_ban_power,\n\t\t/// <summary>Needed client ban power</summary>\n\t\ti_client_needed_ban_power,\n\t\t/// <summary>Client move power</summary>\n\t\ti_client_move_power,\n\t\t/// <summary>Needed client move power</summary>\n\t\ti_client_needed_move_power,\n\t\t/// <summary>Complain power</summary>\n\t\ti_client_complain_power,\n\t\t/// <summary>Needed complain power</summary>\n\t\ti_client_needed_complain_power,\n\t\t/// <summary>Show complain list</summary>\n\t\tb_client_complain_list,\n\t\t/// <summary>Delete own complains</summary>\n\t\tb_client_complain_delete_own,\n\t\t/// <summary>Delete complains</summary>\n\t\tb_client_complain_delete,\n\t\t/// <summary>Show banlist</summary>\n\t\tb_client_ban_list,\n\t\t/// <summary>Add a ban</summary>\n\t\tb_client_ban_create,\n\t\t/// <summary>Delete own bans</summary>\n\t\tb_client_ban_delete_own,\n\t\t/// <summary>Delete bans</summary>\n\t\tb_client_ban_delete,\n\t\t/// <summary>Max bantime</summary>\n\t\ti_client_ban_max_bantime,\n\t\t/// <summary>Client private message power</summary>\n\t\ti_client_private_textmessage_power,\n\t\t/// <summary>Needed client private message power</summary>\n\t\ti_client_needed_private_textmessage_power,\n\t\t/// <summary>Send text messages to virtual server</summary>\n\t\tb_client_server_textmessage_send,\n\t\t/// <summary>Send text messages to channel</summary>\n\t\tb_client_channel_textmessage_send,\n\t\t/// <summary>Send offline messages to clients</summary>\n\t\tb_client_offline_textmessage_send,\n\t\t/// <summary>Client talk power</summary>\n\t\ti_client_talk_power,\n\t\t/// <summary>Needed client talk power</summary>\n\t\ti_client_needed_talk_power,\n\t\t/// <summary>Client poke power</summary>\n\t\ti_client_poke_power,\n\t\t/// <summary>Needed client poke power</summary>\n\t\ti_client_needed_poke_power,\n\t\t/// <summary>Set the talker flag for clients and allow them to speak</summary>\n\t\tb_client_set_flag_talker,\n\t\t/// <summary>Client whisper power</summary>\n\t\ti_client_whisper_power,\n\t\t/// <summary>Client needed whisper power</summary>\n\t\ti_client_needed_whisper_power,\n\t\t/// <summary>Edit a clients description</summary>\n\t\tb_client_modify_description,\n\t\t/// <summary>Allow client to edit own description</summary>\n\t\tb_client_modify_own_description,\n\t\t/// <summary>Edit a clients properties in the database</summary>\n\t\tb_client_modify_dbproperties,\n\t\t/// <summary>Delete a clients properties in the database</summary>\n\t\tb_client_delete_dbproperties,\n\t\t/// <summary>Create or modify own ServerQuery account</summary>\n\t\tb_client_create_modify_serverquery_login,\n\t\t/// <summary>Browse files without channel password</summary>\n\t\tb_ft_ignore_password,\n\t\t/// <summary>Retrieve list of running filetransfers</summary>\n\t\tb_ft_transfer_list,\n\t\t/// <summary>File upload power</summary>\n\t\ti_ft_file_upload_power,\n\t\t/// <summary>Needed file upload power</summary>\n\t\ti_ft_needed_file_upload_power,\n\t\t/// <summary>File download power</summary>\n\t\ti_ft_file_download_power,\n\t\t/// <summary>Needed file download power</summary>\n\t\ti_ft_needed_file_download_power,\n\t\t/// <summary>File delete power</summary>\n\t\ti_ft_file_delete_power,\n\t\t/// <summary>Needed file delete power</summary>\n\t\ti_ft_needed_file_delete_power,\n\t\t/// <summary>File rename power</summary>\n\t\ti_ft_file_rename_power,\n\t\t/// <summary>Needed file rename power</summary>\n\t\ti_ft_needed_file_rename_power,\n\t\t/// <summary>File browse power</summary>\n\t\ti_ft_file_browse_power,\n\t\t/// <summary>Needed file browse power</summary>\n\t\ti_ft_needed_file_browse_power,\n\t\t/// <summary>Create directory power</summary>\n\t\ti_ft_directory_create_power,\n\t\t/// <summary>Needed create directory power</summary>\n\t\ti_ft_needed_directory_create_power,\n\t\t/// <summary>Download quota per client in MByte</summary>\n\t\ti_ft_quota_mb_download_per_client,\n\t\t/// <summary>Upload quota per client in MByte</summary>\n\t\ti_ft_quota_mb_upload_per_client,\n\t\t// ReSharper restore InconsistentNaming, UnusedMember.Global\n\t}\n\n\tpublic static partial class TsPermissionHelper\n\t{\n\t\tpublic static string GetDescription(TsPermission permid)\n\t\t{\n\t\t\tswitch (permid)\n\t\t\t{\n\t\t\tcase TsPermission.undefined: return \"Undefined permission\";\n\t\t\tcase TsPermission.unknown: return \"May occour on error returns with no associated permission\";\n\t\t\tcase TsPermission.b_serverinstance_help_view: return \"Retrieve information about ServerQuery commands\";\n\t\t\tcase TsPermission.b_serverinstance_version_view: return \"Retrieve global server version (including platform and build number)\";\n\t\t\tcase TsPermission.b_serverinstance_info_view: return \"Retrieve global server information\";\n\t\t\tcase TsPermission.b_serverinstance_virtualserver_list: return \"List virtual servers stored in the database\";\n\t\t\tcase TsPermission.b_serverinstance_binding_list: return \"List active IP bindings on multi-homed machines\";\n\t\t\tcase TsPermission.b_serverinstance_permission_list: return \"List permissions available available on the server instance\";\n\t\t\tcase TsPermission.b_serverinstance_permission_find: return \"Search permission assignments by name or ID\";\n\t\t\tcase TsPermission.b_virtualserver_create: return \"Create virtual servers\";\n\t\t\tcase TsPermission.b_virtualserver_delete: return \"Delete virtual servers\";\n\t\t\tcase TsPermission.b_virtualserver_start_any: return \"Start any virtual server in the server instance\";\n\t\t\tcase TsPermission.b_virtualserver_stop_any: return \"Stop any virtual server in the server instance\";\n\t\t\tcase TsPermission.b_virtualserver_change_machine_id: return \"Change a virtual servers machine ID\";\n\t\t\tcase TsPermission.b_virtualserver_change_template: return \"Edit virtual server default template values\";\n\t\t\tcase TsPermission.b_serverquery_login: return \"Login to ServerQuery\";\n\t\t\tcase TsPermission.b_serverinstance_textmessage_send: return \"Send text messages to all virtual servers at once\";\n\t\t\tcase TsPermission.b_serverinstance_log_view: return \"Retrieve global server log\";\n\t\t\tcase TsPermission.b_serverinstance_log_add: return \"Write to global server log\";\n\t\t\tcase TsPermission.b_serverinstance_stop: return \"Shutdown the server process\";\n\t\t\tcase TsPermission.b_serverinstance_modify_settings: return \"Edit global settings\";\n\t\t\tcase TsPermission.b_serverinstance_modify_querygroup: return \"Edit global ServerQuery groups\";\n\t\t\tcase TsPermission.b_serverinstance_modify_templates: return \"Edit global template groups\";\n\t\t\tcase TsPermission.b_virtualserver_select: return \"Select a virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_info_view: return \"Retrieve virtual server information\";\n\t\t\tcase TsPermission.b_virtualserver_connectioninfo_view: return \"Retrieve virtual server connection information\";\n\t\t\tcase TsPermission.b_virtualserver_channel_list: return \"List channels on a virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_channel_search: return \"Search for channels on a virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_client_list: return \"List clients online on a virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_client_search: return \"Search for clients online on a virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_client_dblist: return \"List client identities known by the virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_client_dbsearch: return \"Search for client identities known by the virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_client_dbinfo: return \"Retrieve client information\";\n\t\t\tcase TsPermission.b_virtualserver_permission_find: return \"Find permissions\";\n\t\t\tcase TsPermission.b_virtualserver_custom_search: return \"Find custom fields\";\n\t\t\tcase TsPermission.b_virtualserver_start: return \"Start own virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_stop: return \"Stop own virtual server\";\n\t\t\tcase TsPermission.b_virtualserver_token_list: return \"List privilege keys available\";\n\t\t\tcase TsPermission.b_virtualserver_token_add: return \"Create new privilege keys\";\n\t\t\tcase TsPermission.b_virtualserver_token_use: return \"Use a privilege keys to gain access to groups\";\n\t\t\tcase TsPermission.b_virtualserver_token_delete: return \"Delete a privilege key\";\n\t\t\tcase TsPermission.b_virtualserver_log_view: return \"Retrieve virtual server log\";\n\t\t\tcase TsPermission.b_virtualserver_log_add: return \"Write to virtual server log\";\n\t\t\tcase TsPermission.b_virtualserver_join_ignore_password: return \"Join virtual server ignoring its password\";\n\t\t\tcase TsPermission.b_virtualserver_notify_register: return \"Register for server notifications\";\n\t\t\tcase TsPermission.b_virtualserver_notify_unregister: return \"Unregister from server notifications\";\n\t\t\tcase TsPermission.b_virtualserver_snapshot_create: return \"Create server snapshots\";\n\t\t\tcase TsPermission.b_virtualserver_snapshot_deploy: return \"Deploy server snapshots\";\n\t\t\tcase TsPermission.b_virtualserver_permission_reset: return \"Reset the server permission settings to default values\";\n\t\t\tcase TsPermission.b_virtualserver_modify_name: return \"Modify server name\";\n\t\t\tcase TsPermission.b_virtualserver_modify_welcomemessage: return \"Modify welcome message\";\n\t\t\tcase TsPermission.b_virtualserver_modify_maxclients: return \"Modify servers max clients\";\n\t\t\tcase TsPermission.b_virtualserver_modify_reserved_slots: return \"Modify reserved slots\";\n\t\t\tcase TsPermission.b_virtualserver_modify_password: return \"Modify server password\";\n\t\t\tcase TsPermission.b_virtualserver_modify_default_servergroup: return \"Modify default Server Group\";\n\t\t\tcase TsPermission.b_virtualserver_modify_default_channelgroup: return \"Modify default Channel Group\";\n\t\t\tcase TsPermission.b_virtualserver_modify_default_channeladmingroup: return \"Modify default Channel Admin Group\";\n\t\t\tcase TsPermission.b_virtualserver_modify_channel_forced_silence: return \"Modify channel force silence value\";\n\t\t\tcase TsPermission.b_virtualserver_modify_complain: return \"Modify individual complain settings\";\n\t\t\tcase TsPermission.b_virtualserver_modify_antiflood: return \"Modify individual antiflood settings\";\n\t\t\tcase TsPermission.b_virtualserver_modify_ft_settings: return \"Modify file transfer settings\";\n\t\t\tcase TsPermission.b_virtualserver_modify_ft_quotas: return \"Modify file transfer quotas\";\n\t\t\tcase TsPermission.b_virtualserver_modify_hostmessage: return \"Modify individual hostmessage settings\";\n\t\t\tcase TsPermission.b_virtualserver_modify_hostbanner: return \"Modify individual hostbanner settings\";\n\t\t\tcase TsPermission.b_virtualserver_modify_hostbutton: return \"Modify individual hostbutton settings\";\n\t\t\tcase TsPermission.b_virtualserver_modify_port: return \"Modify server port\";\n\t\t\tcase TsPermission.b_virtualserver_modify_autostart: return \"Modify server autostart\";\n\t\t\tcase TsPermission.b_virtualserver_modify_needed_identity_security_level: return \"Modify required identity security level\";\n\t\t\tcase TsPermission.b_virtualserver_modify_priority_speaker_dimm_modificator: return \"Modify priority speaker dimm modificator\";\n\t\t\tcase TsPermission.b_virtualserver_modify_log_settings: return \"Modify log settings\";\n\t\t\tcase TsPermission.b_virtualserver_modify_min_client_version: return \"Modify min client version\";\n\t\t\tcase TsPermission.b_virtualserver_modify_icon_id: return \"Modify server icon\";\n\t\t\tcase TsPermission.b_virtualserver_modify_weblist: return \"Modify web server list reporting settings\";\n\t\t\tcase TsPermission.b_virtualserver_modify_codec_encryption_mode: return \"Modify codec encryption mode\";\n\t\t\tcase TsPermission.b_virtualserver_modify_temporary_passwords: return \"Modify temporary serverpasswords\";\n\t\t\tcase TsPermission.b_virtualserver_modify_temporary_passwords_own: return \"Modify own temporary serverpasswords\";\n\t\t\tcase TsPermission.b_virtualserver_modify_channel_temp_delete_delay_default: return \"Modify default temporary channel delete delay\";\n\t\t\tcase TsPermission.b_virtualserver_modify_nickname: return \"Modify server nicknames\";\n\t\t\tcase TsPermission.b_virtualserver_modify_integrations: return \"Modify integrations\";\n\t\t\tcase TsPermission.i_channel_min_depth: return \"Min channel creation depth in hierarchy\";\n\t\t\tcase TsPermission.i_channel_max_depth: return \"Max channel creation depth in hierarchy\";\n\t\t\tcase TsPermission.b_channel_group_inheritance_end: return \"Stop inheritance of channel group permissions\";\n\t\t\tcase TsPermission.i_channel_permission_modify_power: return \"Modify channel permission power\";\n\t\t\tcase TsPermission.i_channel_needed_permission_modify_power: return \"Needed modify channel permission power\";\n\t\t\tcase TsPermission.b_channel_info_view: return \"Retrieve channel information\";\n\t\t\tcase TsPermission.b_channel_create_child: return \"Create sub-channels\";\n\t\t\tcase TsPermission.b_channel_create_permanent: return \"Create permanent channels\";\n\t\t\tcase TsPermission.b_channel_create_semi_permanent: return \"Create semi-permanent channels\";\n\t\t\tcase TsPermission.b_channel_create_temporary: return \"Create temporary channels\";\n\t\t\tcase TsPermission.b_channel_create_private: return \"Create private channel\";\n\t\t\tcase TsPermission.b_channel_create_with_topic: return \"Create channels with a topic\";\n\t\t\tcase TsPermission.b_channel_create_with_description: return \"Create channels with a description\";\n\t\t\tcase TsPermission.b_channel_create_with_password: return \"Create password protected channels\";\n\t\t\tcase TsPermission.b_channel_create_modify_with_codec_speex8: return \"Create channels using Speex Narrowband (8 kHz) codecs\";\n\t\t\tcase TsPermission.b_channel_create_modify_with_codec_speex16: return \"Create channels using Speex Wideband (16 kHz) codecs\";\n\t\t\tcase TsPermission.b_channel_create_modify_with_codec_speex32: return \"Create channels using Speex Ultra-Wideband (32 kHz) codecs\";\n\t\t\tcase TsPermission.b_channel_create_modify_with_codec_celtmono48: return \"Create channels using the CELT Mono (48 kHz) codec\";\n\t\t\tcase TsPermission.b_channel_create_modify_with_codec_opusvoice: return \"Create channels using OPUS (voice) codec\";\n\t\t\tcase TsPermission.b_channel_create_modify_with_codec_opusmusic: return \"Create channels using OPUS (music) codec\";\n\t\t\tcase TsPermission.i_channel_create_modify_with_codec_maxquality: return \"Create channels with custom codec quality\";\n\t\t\tcase TsPermission.i_channel_create_modify_with_codec_latency_factor_min: return \"Create channels with minimal custom codec latency factor\";\n\t\t\tcase TsPermission.b_channel_create_with_maxclients: return \"Create channels with custom max clients\";\n\t\t\tcase TsPermission.b_channel_create_with_maxfamilyclients: return \"Create channels with custom max family clients\";\n\t\t\tcase TsPermission.b_channel_create_with_sortorder: return \"Create channels with custom sort order\";\n\t\t\tcase TsPermission.b_channel_create_with_default: return \"Create default channels\";\n\t\t\tcase TsPermission.b_channel_create_with_needed_talk_power: return \"Create channels with needed talk power\";\n\t\t\tcase TsPermission.b_channel_create_modify_with_force_password: return \"Create new channels only with password\";\n\t\t\tcase TsPermission.i_channel_create_modify_with_temp_delete_delay: return \"Max delete delay for temporary channels\";\n\t\t\tcase TsPermission.b_channel_modify_parent: return \"Move channels\";\n\t\t\tcase TsPermission.b_channel_modify_make_default: return \"Make channel default\";\n\t\t\tcase TsPermission.b_channel_modify_make_permanent: return \"Make channel permanent\";\n\t\t\tcase TsPermission.b_channel_modify_make_semi_permanent: return \"Make channel semi-permanent\";\n\t\t\tcase TsPermission.b_channel_modify_make_temporary: return \"Make channel temporary\";\n\t\t\tcase TsPermission.b_channel_modify_name: return \"Modify channel name\";\n\t\t\tcase TsPermission.b_channel_modify_topic: return \"Modify channel topic\";\n\t\t\tcase TsPermission.b_channel_modify_description: return \"Modify channel description\";\n\t\t\tcase TsPermission.b_channel_modify_password: return \"Modify channel password\";\n\t\t\tcase TsPermission.b_channel_modify_codec: return \"Modify channel codec\";\n\t\t\tcase TsPermission.b_channel_modify_codec_quality: return \"Modify channel codec quality\";\n\t\t\tcase TsPermission.b_channel_modify_codec_latency_factor: return \"Modify channel codec latency factor\";\n\t\t\tcase TsPermission.b_channel_modify_maxclients: return \"Modify channels max clients\";\n\t\t\tcase TsPermission.b_channel_modify_maxfamilyclients: return \"Modify channels max family clients\";\n\t\t\tcase TsPermission.b_channel_modify_sortorder: return \"Modify channel sort order\";\n\t\t\tcase TsPermission.b_channel_modify_needed_talk_power: return \"Change needed channel talk power\";\n\t\t\tcase TsPermission.i_channel_modify_power: return \"Channel modify power\";\n\t\t\tcase TsPermission.i_channel_needed_modify_power: return \"Needed channel modify power\";\n\t\t\tcase TsPermission.b_channel_modify_make_codec_encrypted: return \"Make channel codec encrypted\";\n\t\t\tcase TsPermission.b_channel_modify_temp_delete_delay: return \"Modify temporary channel delete delay\";\n\t\t\tcase TsPermission.b_channel_delete_permanent: return \"Delete permanent channels\";\n\t\t\tcase TsPermission.b_channel_delete_semi_permanent: return \"Delete semi-permanent channels\";\n\t\t\tcase TsPermission.b_channel_delete_temporary: return \"Delete temporary channels\";\n\t\t\tcase TsPermission.b_channel_delete_flag_force: return \"Force channel delete\";\n\t\t\tcase TsPermission.i_channel_delete_power: return \"Delete channel power\";\n\t\t\tcase TsPermission.i_channel_needed_delete_power: return \"Needed delete channel power\";\n\t\t\tcase TsPermission.b_channel_join_permanent: return \"Join permanent channels\";\n\t\t\tcase TsPermission.b_channel_join_semi_permanent: return \"Join semi-permanent channels\";\n\t\t\tcase TsPermission.b_channel_join_temporary: return \"Join temporary channels\";\n\t\t\tcase TsPermission.b_channel_join_ignore_password: return \"Join channel ignoring its password\";\n\t\t\tcase TsPermission.b_channel_join_ignore_maxclients: return \"Ignore channels max clients limit\";\n\t\t\tcase TsPermission.i_channel_join_power: return \"Channel join power\";\n\t\t\tcase TsPermission.i_channel_needed_join_power: return \"Needed channel join power\";\n\t\t\tcase TsPermission.i_channel_subscribe_power: return \"Channel subscribe power\";\n\t\t\tcase TsPermission.i_channel_needed_subscribe_power: return \"Needed channel subscribe power\";\n\t\t\tcase TsPermission.i_channel_description_view_power: return \"Channel description view power\";\n\t\t\tcase TsPermission.i_channel_needed_description_view_power: return \"Needed channel needed description view power\";\n\t\t\tcase TsPermission.i_icon_id: return \"Group icon identifier\";\n\t\t\tcase TsPermission.i_max_icon_filesize: return \"Max icon filesize in bytes\";\n\t\t\tcase TsPermission.b_icon_manage: return \"Enables icon management\";\n\t\t\tcase TsPermission.b_group_is_permanent: return \"Group is permanent\";\n\t\t\tcase TsPermission.i_group_auto_update_type: return \"Group auto-update type\";\n\t\t\tcase TsPermission.i_group_auto_update_max_value: return \"Group auto-update max value\";\n\t\t\tcase TsPermission.i_group_sort_id: return \"Group sort id\";\n\t\t\tcase TsPermission.i_group_show_name_in_tree: return \"Show group name in tree depending on selected mode\";\n\t\t\tcase TsPermission.b_virtualserver_servergroup_list: return \"List server groups\";\n\t\t\tcase TsPermission.b_virtualserver_servergroup_permission_list: return \"List server group permissions\";\n\t\t\tcase TsPermission.b_virtualserver_servergroup_client_list: return \"List clients from a server group\";\n\t\t\tcase TsPermission.b_virtualserver_channelgroup_list: return \"List channel groups\";\n\t\t\tcase TsPermission.b_virtualserver_channelgroup_permission_list: return \"List channel group permissions\";\n\t\t\tcase TsPermission.b_virtualserver_channelgroup_client_list: return \"List clients from a channel group\";\n\t\t\tcase TsPermission.b_virtualserver_client_permission_list: return \"List client permissions\";\n\t\t\tcase TsPermission.b_virtualserver_channel_permission_list: return \"List channel permissions\";\n\t\t\tcase TsPermission.b_virtualserver_channelclient_permission_list: return \"List channel client permissions\";\n\t\t\tcase TsPermission.b_virtualserver_servergroup_create: return \"Create server groups\";\n\t\t\tcase TsPermission.b_virtualserver_channelgroup_create: return \"Create channel groups\";\n\t\t\tcase TsPermission.i_group_modify_power: return \"Group modify power\";\n\t\t\tcase TsPermission.i_group_needed_modify_power: return \"Needed group modify power\";\n\t\t\tcase TsPermission.i_group_member_add_power: return \"Group member add power\";\n\t\t\tcase TsPermission.i_group_needed_member_add_power: return \"Needed group member add power\";\n\t\t\tcase TsPermission.i_group_member_remove_power: return \"Group member delete power\";\n\t\t\tcase TsPermission.i_group_needed_member_remove_power: return \"Needed group member delete power\";\n\t\t\tcase TsPermission.i_permission_modify_power: return \"Permission modify power\";\n\t\t\tcase TsPermission.b_permission_modify_power_ignore: return \"Ignore needed permission modify power\";\n\t\t\tcase TsPermission.b_virtualserver_servergroup_delete: return \"Delete server groups\";\n\t\t\tcase TsPermission.b_virtualserver_channelgroup_delete: return \"Delete channel groups\";\n\t\t\tcase TsPermission.i_client_permission_modify_power: return \"Client permission modify power\";\n\t\t\tcase TsPermission.i_client_needed_permission_modify_power: return \"Needed client permission modify power\";\n\t\t\tcase TsPermission.i_client_max_clones_uid: return \"Max additional connections per client identity\";\n\t\t\tcase TsPermission.i_client_max_idletime: return \"Max idle time in seconds\";\n\t\t\tcase TsPermission.i_client_max_avatar_filesize: return \"Max avatar filesize in bytes\";\n\t\t\tcase TsPermission.i_client_max_channel_subscriptions: return \"Max channel subscriptions\";\n\t\t\tcase TsPermission.b_client_is_priority_speaker: return \"Client is priority speaker\";\n\t\t\tcase TsPermission.b_client_skip_channelgroup_permissions: return \"Ignore channel group permissions\";\n\t\t\tcase TsPermission.b_client_force_push_to_talk: return \"Force Push-To-Talk capture mode\";\n\t\t\tcase TsPermission.b_client_ignore_bans: return \"Ignore bans\";\n\t\t\tcase TsPermission.b_client_ignore_antiflood: return \"Ignore antiflood measurements\";\n\t\t\tcase TsPermission.b_client_issue_client_query_command: return \"Issue query commands from client\";\n\t\t\tcase TsPermission.b_client_use_reserved_slot: return \"Use an reserved slot\";\n\t\t\tcase TsPermission.b_client_use_channel_commander: return \"Use channel commander\";\n\t\t\tcase TsPermission.b_client_request_talker: return \"Allow to request talk power\";\n\t\t\tcase TsPermission.b_client_avatar_delete_other: return \"Allow deletion of avatars from other clients\";\n\t\t\tcase TsPermission.b_client_is_sticky: return \"Client will be sticked to current channel\";\n\t\t\tcase TsPermission.b_client_ignore_sticky: return \"Client ignores sticky flag\";\n\t\t\tcase TsPermission.b_client_info_view: return \"Retrieve client information\";\n\t\t\tcase TsPermission.b_client_permissionoverview_view: return \"Retrieve client permissions overview\";\n\t\t\tcase TsPermission.b_client_permissionoverview_own: return \"Retrieve clients own permissions overview\";\n\t\t\tcase TsPermission.b_client_remoteaddress_view: return \"View client IP address and port\";\n\t\t\tcase TsPermission.i_client_serverquery_view_power: return \"ServerQuery view power\";\n\t\t\tcase TsPermission.i_client_needed_serverquery_view_power: return \"Needed ServerQuery view power\";\n\t\t\tcase TsPermission.b_client_custom_info_view: return \"View custom fields\";\n\t\t\tcase TsPermission.i_client_kick_from_server_power: return \"Client kick power from server\";\n\t\t\tcase TsPermission.i_client_needed_kick_from_server_power: return \"Needed client kick power from server\";\n\t\t\tcase TsPermission.i_client_kick_from_channel_power: return \"Client kick power from channel\";\n\t\t\tcase TsPermission.i_client_needed_kick_from_channel_power: return \"Needed client kick power from channel\";\n\t\t\tcase TsPermission.i_client_ban_power: return \"Client ban power\";\n\t\t\tcase TsPermission.i_client_needed_ban_power: return \"Needed client ban power\";\n\t\t\tcase TsPermission.i_client_move_power: return \"Client move power\";\n\t\t\tcase TsPermission.i_client_needed_move_power: return \"Needed client move power\";\n\t\t\tcase TsPermission.i_client_complain_power: return \"Complain power\";\n\t\t\tcase TsPermission.i_client_needed_complain_power: return \"Needed complain power\";\n\t\t\tcase TsPermission.b_client_complain_list: return \"Show complain list\";\n\t\t\tcase TsPermission.b_client_complain_delete_own: return \"Delete own complains\";\n\t\t\tcase TsPermission.b_client_complain_delete: return \"Delete complains\";\n\t\t\tcase TsPermission.b_client_ban_list: return \"Show banlist\";\n\t\t\tcase TsPermission.b_client_ban_create: return \"Add a ban\";\n\t\t\tcase TsPermission.b_client_ban_delete_own: return \"Delete own bans\";\n\t\t\tcase TsPermission.b_client_ban_delete: return \"Delete bans\";\n\t\t\tcase TsPermission.i_client_ban_max_bantime: return \"Max bantime\";\n\t\t\tcase TsPermission.i_client_private_textmessage_power: return \"Client private message power\";\n\t\t\tcase TsPermission.i_client_needed_private_textmessage_power: return \"Needed client private message power\";\n\t\t\tcase TsPermission.b_client_server_textmessage_send: return \"Send text messages to virtual server\";\n\t\t\tcase TsPermission.b_client_channel_textmessage_send: return \"Send text messages to channel\";\n\t\t\tcase TsPermission.b_client_offline_textmessage_send: return \"Send offline messages to clients\";\n\t\t\tcase TsPermission.i_client_talk_power: return \"Client talk power\";\n\t\t\tcase TsPermission.i_client_needed_talk_power: return \"Needed client talk power\";\n\t\t\tcase TsPermission.i_client_poke_power: return \"Client poke power\";\n\t\t\tcase TsPermission.i_client_needed_poke_power: return \"Needed client poke power\";\n\t\t\tcase TsPermission.b_client_set_flag_talker: return \"Set the talker flag for clients and allow them to speak\";\n\t\t\tcase TsPermission.i_client_whisper_power: return \"Client whisper power\";\n\t\t\tcase TsPermission.i_client_needed_whisper_power: return \"Client needed whisper power\";\n\t\t\tcase TsPermission.b_client_modify_description: return \"Edit a clients description\";\n\t\t\tcase TsPermission.b_client_modify_own_description: return \"Allow client to edit own description\";\n\t\t\tcase TsPermission.b_client_modify_dbproperties: return \"Edit a clients properties in the database\";\n\t\t\tcase TsPermission.b_client_delete_dbproperties: return \"Delete a clients properties in the database\";\n\t\t\tcase TsPermission.b_client_create_modify_serverquery_login: return \"Create or modify own ServerQuery account\";\n\t\t\tcase TsPermission.b_ft_ignore_password: return \"Browse files without channel password\";\n\t\t\tcase TsPermission.b_ft_transfer_list: return \"Retrieve list of running filetransfers\";\n\t\t\tcase TsPermission.i_ft_file_upload_power: return \"File upload power\";\n\t\t\tcase TsPermission.i_ft_needed_file_upload_power: return \"Needed file upload power\";\n\t\t\tcase TsPermission.i_ft_file_download_power: return \"File download power\";\n\t\t\tcase TsPermission.i_ft_needed_file_download_power: return \"Needed file download power\";\n\t\t\tcase TsPermission.i_ft_file_delete_power: return \"File delete power\";\n\t\t\tcase TsPermission.i_ft_needed_file_delete_power: return \"Needed file delete power\";\n\t\t\tcase TsPermission.i_ft_file_rename_power: return \"File rename power\";\n\t\t\tcase TsPermission.i_ft_needed_file_rename_power: return \"Needed file rename power\";\n\t\t\tcase TsPermission.i_ft_file_browse_power: return \"File browse power\";\n\t\t\tcase TsPermission.i_ft_needed_file_browse_power: return \"Needed file browse power\";\n\t\t\tcase TsPermission.i_ft_directory_create_power: return \"Create directory power\";\n\t\t\tcase TsPermission.i_ft_needed_directory_create_power: return \"Needed create directory power\";\n\t\t\tcase TsPermission.i_ft_quota_mb_download_per_client: return \"Download quota per client in MByte\";\n\t\t\tcase TsPermission.i_ft_quota_mb_upload_per_client: return \"Upload quota per client in MByte\";\n\t\t\tdefault: throw Tools.UnhandledDefault(permid);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "TSLib/Generated/TsPermission.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"false\" hostspecific=\"true\" language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ assembly name=\"Microsoft.VisualBasic\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ import namespace=\"Microsoft.VisualBasic.FileIO\" #>\n<#@ output extension=\".cs\" #>\n<#\nstring declFilePath = Host.ResolvePath(\"../Declarations/Permissions.csv\");\nvar data = new List<string[]>();\nusing (TextFieldParser parser = new TextFieldParser(declFilePath))\n{\n\tparser.TextFieldType = FieldType.Delimited;\n\tparser.SetDelimiters(\",\");\n\twhile (!parser.EndOfData)\n\t\tdata.Add(parser.ReadFields());\n}\n#>\nusing TSLib.Helper;\n\nnamespace TSLib\n{\n\t// Source: https://www.tsviewer.com/index.php?page=faq&id=12&newlanguage=en\n\tpublic enum TsPermission\n\t{\n\t\t// ReSharper disable InconsistentNaming, UnusedMember.Global\n\t\tundefined,<# foreach (var line in data.Skip(1)) { #>\n\t\t/// <summary><#= line[1] #></summary>\n\t\t<#= line[0] #>,<# } #>\n\t\t// ReSharper restore InconsistentNaming, UnusedMember.Global\n\t}\n\n\tpublic static partial class TsPermissionHelper\n\t{\n\t\tpublic static string GetDescription(TsPermission permid)\n\t\t{\n\t\t\tswitch (permid)\n\t\t\t{\n\t\t\tcase TsPermission.undefined: return \"Undefined permission\";<# foreach (var line in data.Skip(1)) { #>\n\t\t\tcase TsPermission.<#= line[0] #>: return \"<#= line[1] #>\";<# } #>\n\t\t\tdefault: throw Tools.UnhandledDefault(permid);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "TSLib/Generated/TsVersion.gen.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\n\n\nnamespace TSLib\n{\n\tpartial class TsVersionSigned\n\t{\n\t\t// ReSharper disable InconsistentNaming, UnusedMember.Global\n\t\tpublic static TsVersionSigned VER_WIN_3_X_X { get; } = new TsVersionSigned(\"3.?.? [Build: 5680278000] DEBUG\", \"Windows\", ClientPlatform.Windows, 5680278000UL, \"FaA10gndI44f19ZThYJX2OSM8ESrx9/vJ2uY+rON4enzzPsPR9kiPhsUXtMcC5szzTu6F/vLCiNNEhCr70CKCQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_X_X { get; } = new TsVersionSigned(\"3.?.? [Build: 5680278000]\", \"OS X\", ClientPlatform.MacOs, 5680278000UL, \"SttEnjoWE8jqIM6BOHSfiZP9DGjW0EP/ajU4bdKqgGMV4aYq/kzwVA9gxbmdIzV4lbaokvXBqrRjfBHrTVh8Cg==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_X_X { get; } = new TsVersionSigned(\"3.?.? [Build: 5680278000]\", \"Linux\", ClientPlatform.Linux, 5680278000UL, \"Hjd+N58Gv3ENhoKmGYy2bNRBsNNgm5kpiaQWxOj5HN2DXttG6REjymSwJtpJ8muC2gSwRuZi0R+8Laan5ts5CQ==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_X_X { get; } = new TsVersionSigned(\"3.?.? [Build: 5680278000]\", \"iOS\", ClientPlatform.Ios, 5680278000UL, \"XrAf+Buq6Eb0ehEW/niFp06YX+nGGOS0Ke4MoUBzn+cX9q6G5C0A/d5XtgcNMe8r9jJgV/adIYVpsGS3pVlSAA==\");\n\t\tpublic static TsVersionSigned VER_AND_3_X_X { get; } = new TsVersionSigned(\"3.?.? [Build: 5680278000]\", \"Android\", ClientPlatform.Android, 5680278000UL, \"AWb948BY32Z7bpIyoAlQguSmxOGcmjESPceQe1DpW5IZ4+AW1KfTk2VUIYNfUPsxReDJMCtlhVKslzhR2lf0AA==\");\n\t\tpublic static TsVersionSigned VER_MAC_5_0_0 { get; } = new TsVersionSigned(\"5.0.0-beta.25 [Build: 1588064367]\", \"macOS\", ClientPlatform.MacOs, 1588064367UL, \"+Y1iB58sLO38/4AI1YRUlEhXhhrbkAVbaSmOcZj0IrTmQm1eY+prEYJPQgF8StFdjWmAGmMG3ezzb0wEzRE3CQ==\");\n\t\tpublic static TsVersionSigned VER_LIN_5_0_0 { get; } = new TsVersionSigned(\"5.0.0-beta.25 [Build: 1588064367]\", \"Linux\", ClientPlatform.Linux, 1588064367UL, \"L5rpK9OLT84Hgpg/NXSCwpHfrRc/JTtMa/kFfaD2rlF7c/YHiEnly/4+A9y0iowA70+5JEzyH6CBjkniiz4DAw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_5_3 { get; } = new TsVersionSigned(\"3.5.3 [Build: 1587971024]\", \"Windows\", ClientPlatform.Windows, 1587971024UL, \"Kvmj7qX6wJCPI5GVT71samfmhz/bvs7M+OTXWB/JWxdQbxDe17xda7dzUWLX7pjvdJTqZmbse1HBmTxThPKvAg==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_5_3 { get; } = new TsVersionSigned(\"3.5.3 [Build: 1587971024]\", \"Linux\", ClientPlatform.Linux, 1587971024UL, \"59chu1YQ1W4DdVj+yJOVmwhJK7s9p9FatqIjQRxEDmIb0CcDDO/K8CrbVnBHbD67/cExJbC3PjC/o/n0pDbiCg==\");\n\t\tpublic static TsVersionSigned VER_WIN_5_0_0 { get; } = new TsVersionSigned(\"5.0.0-test.111 [Build: 1587633723]\", \"Windows\", ClientPlatform.Windows, 1587633723UL, \"60DETVUkR9veo0Cc9WCV+t3r0w836CfRZTgw/sZH0LL6AwtAab8sbcYNcOBybSssn+QgZI37kdc7B9YViszgCw==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_5_3 { get; } = new TsVersionSigned(\"3.5.3 [Build: 1586955962]\", \"OS X\", ClientPlatform.MacOs, 1586955962UL, \"/9gsbyyJoyHW1okwykGgXrn2j29wvnEfnw6/Hvft2WS12CURxTv5L9uLuu36I5u3TzWOxyB9dEbD1FeZ201uCQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_5_2 { get; } = new TsVersionSigned(\"3.5.2 [Build: 1585812952]\", \"Windows\", ClientPlatform.Windows, 1585812952UL, \"6HIIG9j6bIUavbDFJR50Hk3hwl1j4BL/1hQS5Q4JfAS0oerwLNBbdAfXM963aOlE8yan9d/LWiXnuSKhQXAKAQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_5_2 { get; } = new TsVersionSigned(\"3.5.2 [Build: 1585812952]\", \"OS X\", ClientPlatform.MacOs, 1585812952UL, \"VhEA3HpeSCbV06Dfh5wonQ+XMuC8dG96ZXvU5HCNLvkSatAfOsDGLaQNLfbkVZVcs0Hvf9oPFgWvAseSX96rCw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_5_2 { get; } = new TsVersionSigned(\"3.5.2 [Build: 1585812952]\", \"Linux\", ClientPlatform.Linux, 1585812952UL, \"Fy5GNeXUzrP5chKDWhG4G7T3jj8tjg0JkoTNRl+tgrONOWNbNf1zBD+I2LNqJREJXvaSrXcMB1pOQQrWKIXqDQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_5_1 { get; } = new TsVersionSigned(\"3.5.1 [Build: 1584955996]\", \"Windows\", ClientPlatform.Windows, 1584955996UL, \"LY20d0yqDFwknHND8FYADnvsKnq81kya6lAEnJEQ+87oN0k8KqTXMDpy/0z0yC54+B8Mo/P8kSjrpRugaVAPDA==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_5_1 { get; } = new TsVersionSigned(\"3.5.1 [Build: 1584955996]\", \"OS X\", ClientPlatform.MacOs, 1584955996UL, \"xk8NdgtqWPihDy1gUPGVtcLkfrl5Fd2lfigB0N7d9K0VGyCxC4ZvQOdX6kM/StTX1xulCnENp0wb+gqwjO5nBA==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_5_1 { get; } = new TsVersionSigned(\"3.5.1 [Build: 1584955996]\", \"Linux\", ClientPlatform.Linux, 1584955996UL, \"YtR6uJ0zzFwlAXoV1ikV8DVD9y7ka0WCh46wvALArdCBw9zaBLE7ese6Uu3U2Dmg4//ook5cNvupeOlzHcGPDQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_5_0 { get; } = new TsVersionSigned(\"3.5.0 [Build: 1584610661]\", \"Windows\", ClientPlatform.Windows, 1584610661UL, \"8um3guYdjDlKHOUZMYqt//4nT9k+SBYnAAP/9CarVp5pUXEzYaTZlflyOi6hjYIDn5cQ7gdvrKmdXLOXBJiqCA==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_5_0 { get; } = new TsVersionSigned(\"3.5.0 [Build: 1584610661]\", \"OS X\", ClientPlatform.MacOs, 1584610661UL, \"RZJrT/fysauFMv9ugB82ZAZN/t/MSWeJmFLu35FXx/r+3O1QZrM8rDfU5Iq/moG68hPRcc12KloOvrlVTdfiBg==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_5_0 { get; } = new TsVersionSigned(\"3.5.0 [Build: 1584610661]\", \"Linux\", ClientPlatform.Linux, 1584610661UL, \"kHfR/JyZ6Ah06rW/t+dFIHkOgLGFth5CCbRr9T3xfPd2gqL5CeYei47LGBjA9K9GrVVRivF0L5eo5MrxGh/QDA==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_5_1 { get; } = new TsVersionSigned(\"3.5.1 [Build: 1582118844]\", \"iOS\", ClientPlatform.Ios, 1582118844UL, \"3ZiKmiSA9g1xUhb67wgAPz7duV97QCoMQn4OmjqXUffVN5cvztaUhIBm0oZ8n0DEXsgx8hulbqWBFIN8QgAIBA==\");\n\t\tpublic static TsVersionSigned VER_AND_3_5_0 { get; } = new TsVersionSigned(\"3.5.0 [Build: 1582117478]\", \"Android\", ClientPlatform.Android, 1582117478UL, \"vASJQFPECG2TpUh5ATsR2c/gVrvsuZ9QlMpKN51F+HnanYNH3oCSGoievQX6ACjsKH3OZihNFQZ6f5HRU/MAAg==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_5_0 { get; } = new TsVersionSigned(\"3.5.0 [Build: 1574357871]\", \"iOS\", ClientPlatform.Ios, 1574357871UL, \"9m9E+yrIfJKmRDvujRH5IsbHXClEbgm9zRms+iL9ikLhiM1gzIBWBVVUKFqmtpSSZDq3lnmkN9DmaC8gxhvPBw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_3_2 { get; } = new TsVersionSigned(\"3.3.2 [Build: 1566767614]\", \"Windows\", ClientPlatform.Windows, 1566767614UL, \"fAjM3pPl95eGXrhFcsvCXgdI6Epr8XpafOJZlYbFws2VMllYy/4DUleSVzPuVqu/TCgrTaqb0wP+KANse3/vAw==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_3_2 { get; } = new TsVersionSigned(\"3.3.2 [Build: 1566767614]\", \"OS X\", ClientPlatform.MacOs, 1566767614UL, \"JiKoykMS5BExaAEMpIYB3JRH+YturPua/Q+VTQxJGRi002zni9b8ReitLaJJQt2EMcNAbDpl57um4mekqFvGBA==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_3_2 { get; } = new TsVersionSigned(\"3.3.2 [Build: 1566767614]\", \"Linux\", ClientPlatform.Linux, 1566767614UL, \"UhiFNnz8npgT22qkLXlZJnX3T2n+a8usv/0cTh+tgybrgsFd2WIuI3eabWCibPeU+AYeHLaeYR+x+pF4GX/NDw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_3_1 { get; } = new TsVersionSigned(\"3.3.1 [Build: 1566673023]\", \"Windows\", ClientPlatform.Windows, 1566673023UL, \"utZjz6KhPiaR9zdhS3NvbLpi4oTGH/vseHd9/mUrLxYYD5JvfeeHH6nzLf8H3manoNrQnONsCcqUOvYglCotCQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_3_1 { get; } = new TsVersionSigned(\"3.3.1 [Build: 1566673023]\", \"OS X\", ClientPlatform.MacOs, 1566673023UL, \"dNpW3zyuLCNdhCJpCbaCHWob9xnHSbrRNyJgNShwAPQfyclrtarPLOiTYN9IgQbIGxTu1Yo4fra59VHzpHhaDQ==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_3_1 { get; } = new TsVersionSigned(\"3.3.1 [Build: 1566673023]\", \"Linux\", ClientPlatform.Linux, 1566673023UL, \"IdO00q19oqEwf9CB1R2c+2ZALMrUC6YPwTohdmD9abnDzpfDH/P/p70oDolrL+pRLoh1LjDiLtUdKRETLbeqAw==\");\n\t\tpublic static TsVersionSigned VER_AND_3_3_1 { get; } = new TsVersionSigned(\"3.3.1 [Build: 1564678999]\", \"Android\", ClientPlatform.Android, 1564678999UL, \"kPqHuXEgLxpThXc5XYdvTLk+iaY0AL99jf2WJIXKBJuCJmD0pfW1Ep/zYCxU2NGsu4HIHMMXnB0d2lkr7AHiDw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_3_0 { get; } = new TsVersionSigned(\"3.3.0 [Build: 1560850141]\", \"Windows\", ClientPlatform.Windows, 1560850141UL, \"v9gCHwBYJKBxLWwptMvqhj+tvWuSAz/AjcThvv/J3ZNsPeivRk4P9Y9YtalQbIRkrALQSC+qNc5wIAw4HG2cCA==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_3_0 { get; } = new TsVersionSigned(\"3.3.0 [Build: 1560850141]\", \"OS X\", ClientPlatform.MacOs, 1560850141UL, \"Z/UJgrYae1BsdKJfvMorW4/zIQ8E0sKBMTBI5Cm58oYE3TtCE9+1FpUE9VkqWSm3J8SMmu2+J/FpaK6pa8KaBQ==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_3_0 { get; } = new TsVersionSigned(\"3.3.0 [Build: 1560850141]\", \"Linux\", ClientPlatform.Linux, 1560850141UL, \"8giDUlJFDtdmzpfyngDzL3UP47C1+U1iwrzROU70MoiSeswf1oJujYeQ1bx4dD2OPxF4Avi/XgbZUQ/Y4NcDAA==\");\n\t\tpublic static TsVersionSigned VER_AND_3_3_0 { get; } = new TsVersionSigned(\"3.3.0 [Build: 1559834030]\", \"Android\", ClientPlatform.Android, 1559834030UL, \"Ux59iejFFnEANHPjL4dmwUgXKhvnV7dPqjzAIqYMNs0RoF9RyhsgxEaJO72IgNt7D3yaD+4lGtYfcEFG8WDKCg==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_3_0 { get; } = new TsVersionSigned(\"3.3.0 [Build: 1559144369]\", \"iOS\", ClientPlatform.Ios, 1559144369UL, \"xXYmjT4t0D0Oll99yVPTsRXxJuqFr4ShKEtetow7ii6Qwkm3mkMIrg67NR8foo24bBQgcY+s1CQC88CD8WT6Bg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_2_5 { get; } = new TsVersionSigned(\"3.2.5 [Build: 1555517253]\", \"Windows\", ClientPlatform.Windows, 1555517253UL, \"iyy+8G7ksPHvXb45ijQ9Kfr8TMsCc3sGRKJLiPArx7YMPu8YV4GgYzM4+MpuMQUTlNkU7w5B0od9IJ/7E4nDDQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_2_5 { get; } = new TsVersionSigned(\"3.2.5 [Build: 1555517253]\", \"OS X\", ClientPlatform.MacOs, 1555517253UL, \"xrP7+C0BjffIZf7FD21P/xYoCSTmq8nCa3w2q3McX2DlUIEjfMLAX7uepdeiNYZfspAWJmi9QIkpQCltNBwqAg==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_2_5 { get; } = new TsVersionSigned(\"3.2.5 [Build: 1555517253]\", \"Linux\", ClientPlatform.Linux, 1555517253UL, \"+nqAMBv2NxHYfPwHyRmleALMU/2gpiv1LAV6dmrLjNXaTS3BwLBVuysSuqHsuiK3/Xff0IRRFANz8qT1ztJqDQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_0_0_1 { get; } = new TsVersionSigned(\"0.0.1 [Build: 1555082010]\", \"OS X\", ClientPlatform.MacOs, 1555082010UL, \"o/GYOMVcxtE+JWFjozRjS9FJ/h35gGcPfvZkc23AlglNXI5aj6oGg3Gin3M1fLOnSOxn3TSU5WhaQtvCYZgZDg==\");\n\t\tpublic static TsVersionSigned VER_WIN_0_0_1 { get; } = new TsVersionSigned(\"0.0.1 [Build: 1555015683]\", \"Windows\", ClientPlatform.Windows, 1555015683UL, \"AMnbAjVfFPOWlwcEFQjz0pokTLpjGEN7TdH6HliidbMBQXLlj9T/LmwRr+IT/ZjpY9+znSXLbVmF2+d0jLRLAA==\");\n\t\tpublic static TsVersionSigned VER_AND_3_2_5 { get; } = new TsVersionSigned(\"3.2.5 [Build: 1554991343]\", \"Android\", ClientPlatform.Android, 1554991343UL, \"HkOn2tmPaY8qTNhnpZl34QkmhHJzOBVuUdeANQQoCMqDyDovii5zFJnGALyuab5/bHPl9rqy1jllmhWlm34JCA==\");\n\t\tpublic static TsVersionSigned VER_LIN_0_0_1 { get; } = new TsVersionSigned(\"0.0.1 [Build: 1550226976]\", \"Linux\", ClientPlatform.Linux, 1550226976UL, \"22vWrtMv2ObaBwrQGw2CLs2LzUQJ94KoXiVuMObXf5pfoIw2MY4ZqMt8oL9CCyQBtKl6vV3CZntLrAR25ljeDw==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_2_3 { get; } = new TsVersionSigned(\"3.2.3 [Build: 1538494750]\", \"iOS\", ClientPlatform.Ios, 1538494750UL, \"YgRxbZGpaxVAPuC3bln8HiCdgyx8EgM37H+VCSjZnn+05+lo1w74P9LFHSVqr1NBuB5YtKNWp0xjHRbBZVJtDQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_2_3 { get; } = new TsVersionSigned(\"3.2.3 [Build: 1538467030]\", \"Windows\", ClientPlatform.Windows, 1538467030UL, \"dZ1i/CsCaAh4F7Pi2F/FfaBpdTmUuNVsAIRnqm86FUR3HhwBRn+xlmbwRF8gObgFMuwFMCLmawncFWplSILKAQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_2_3 { get; } = new TsVersionSigned(\"3.2.3 [Build: 1538467030]\", \"OS X\", ClientPlatform.MacOs, 1538467030UL, \"yr8F54NuExnwarhvcJ27f3LvDop1wqwrhyqEVvpliRKi0hLD3e+cW2mJWRkq0eDjPRQ2kzPvBst9yNH1MsuYAQ==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_2_3 { get; } = new TsVersionSigned(\"3.2.3 [Build: 1538467030]\", \"Linux\", ClientPlatform.Linux, 1538467030UL, \"pEBdtUvRUmczMmHZM5xmeZuiRP/Kb/H2YShNKGpaat8aPTmG5EF+zsbjUFNWW4tnt43Yard0bWDUsrJ9/mmjBQ==\");\n\t\tpublic static TsVersionSigned VER_AND_3_2_4 { get; } = new TsVersionSigned(\"3.2.4 [Build: 1537790492]\", \"Android\", ClientPlatform.Android, 1537790492UL, \"cJVVnQRoUWsYSaYKWZ/sIGAAMTpnBDFu8T6shyH5o9AXWLVyu2qRmVVuyvKmMSlEVlYNtVrHIlC2AHtq3l2nDg==\");\n\t\tpublic static TsVersionSigned VER_AND_3_2_3 { get; } = new TsVersionSigned(\"3.2.3 [Build: 1537790492]\", \"Android\", ClientPlatform.Android, 1537790492UL, \"qLdDfrZyNIdl1pDYtyrGbOLZK/Yi/i8PE/a7QOInsEa5/RBz+HW8EBGPvazz+lLZbHrBXyp875NyrKtLnc4dDg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_2_2 { get; } = new TsVersionSigned(\"3.2.2 [Build: 1537178465]\", \"Windows\", ClientPlatform.Windows, 1537178465UL, \"LHJV3O+hoZZlKWDPKH4ZMCoPUarYWwnaUgfMP+Xdm/4sY5NYUYjkVQaU4FS4pqxii5jx6O4cFToG7ekFB53NBA==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_2_2 { get; } = new TsVersionSigned(\"3.2.2 [Build: 1537178465]\", \"OS X\", ClientPlatform.MacOs, 1537178465UL, \"QbSOeAPhPHgZKykNbEAlzGLZe8w+ulxcZXbk07wOBGLK/vWCfQlyIDPUK5DipGBUfRY9yJvxfUx7g9b5dU8aBw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_2_2 { get; } = new TsVersionSigned(\"3.2.2 [Build: 1537178465]\", \"Linux\", ClientPlatform.Linux, 1537178465UL, \"P2NaVyWrk5AkG1KE8hTPCT6J0ql0NzLeeII4BF3WarfVjDbekqKu2sQfO7W3OSJKN3cH8w5470csP4LZ+hrkAA==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_2_2 { get; } = new TsVersionSigned(\"3.2.2 [Build: 1536587534]\", \"iOS\", ClientPlatform.Ios, 1536587534UL, \"4rsRo3H9Uw0kui/cQkaBiqYy8ox6/gC6jDUVktcB6I71m1TeqUYy/IYMYbNSBtv0bmKntvcA0ZU79+zoXUkSAg==\");\n\t\tpublic static TsVersionSigned VER_AND_3_2_2 { get; } = new TsVersionSigned(\"3.2.2 [Build: 1536327256]\", \"Android\", ClientPlatform.Android, 1536327256UL, \"dwHJuheBuCMZlUGz2N+DeyoWokK9/ui0CCV6HE4yJ6fqjoyFIyuX9TqXho63tNKXDa0XscL1U4TOaJlgU6pWDQ==\");\n\t\tpublic static TsVersionSigned VER_AND_3_2_1 { get; } = new TsVersionSigned(\"3.2.1 [Build: 1535010120]\", \"Android\", ClientPlatform.Android, 1535010120UL, \"HHlJgd/XKWFdPOR5N4n2hpsjZ3y5b+4f4x1tLk397GI+gcALWlehtQDSaxe2R975/dFcEWmHiFd9zSC3tsecDA==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_2_0 { get; } = new TsVersionSigned(\"3.2.0 [Build: 1534410132]\", \"iOS\", ClientPlatform.Ios, 1534410132UL, \"BIWgZdgGSu6yPwCiEDQuORaLRqV1Z17ZLcxYdLqM2hfWXiKwBOO/j5eH4IH7LGubFfDwdGcVW2RUYKATpaJAAA==\");\n\t\tpublic static TsVersionSigned VER_AND_3_2_0 { get; } = new TsVersionSigned(\"3.2.0 [Build: 1534407950]\", \"Android\", ClientPlatform.Android, 1534407950UL, \"rY2Hhki/5tJZW5YyJI6S9o9zuU4IGFpONwR6JBJ3Q7Pukfj08z2brFwCmGR61RzH8IaoPxoAWXIHQoHp6fUABQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_2_1 { get; } = new TsVersionSigned(\"3.2.1 [Build: 1534255236]\", \"Windows\", ClientPlatform.Windows, 1534255236UL, \"RtNOb2UrlXwwy3lplxRilvknygxamwb3eKlRRAsG5YjrMEikStl/Sf+oJgFUFBBMSJ+q+xPx3+xfOmMxAkB8Bg==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_2_1 { get; } = new TsVersionSigned(\"3.2.1 [Build: 1534255236]\", \"OS X\", ClientPlatform.MacOs, 1534255236UL, \"AWbZhd8XH+s7uu5Qkb2QkdDcc9/WXfNu2iKWD+e6m2oTrOmI1Jt55SsyDTvkpBpumnWsrtR/GI2nK9HbmFhGAw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_2_1 { get; } = new TsVersionSigned(\"3.2.1 [Build: 1534255236]\", \"Linux\", ClientPlatform.Linux, 1534255236UL, \"betw82OYRNjyhXDHmmUKwR6xfvyPHBMdkn+jukQKNG8PPLKOfLFb0OAMXPZxp9n8gio840gFowwA/jnbg/OMBw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_2_0 { get; } = new TsVersionSigned(\"3.2.0 [Build: 1533739581]\", \"Windows\", ClientPlatform.Windows, 1533739581UL, \"TJ1XoCjQz+VxW15qiGInWf5llTBtVu+2m2ShbY0/HWTM7adLyfThq7wzSgr09Fvowibvu91nOFxTlIpPXCAVAQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_2_0 { get; } = new TsVersionSigned(\"3.2.0 [Build: 1533739581]\", \"OS X\", ClientPlatform.MacOs, 1533739581UL, \"WkySbYMiHN22ra3Y1cktHyeNikQ4fZ0K++8brc+8ImYhuzrmuzeGwL+QNaPJNty7stTNCfRUSpDzVAWz5TYQCA==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_2_0 { get; } = new TsVersionSigned(\"3.2.0 [Build: 1533739581]\", \"Linux\", ClientPlatform.Linux, 1533739581UL, \"Vt+iPp952TU4uKwGXY0L61mXgBNfXg+1+16fnS0snPU9fhkfOKzdPN4rBELOwJ5XzZc33KdVC8rzZGYzlQceBg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_10 { get; } = new TsVersionSigned(\"3.1.10 [Build: 1528537615]\", \"Windows\", ClientPlatform.Windows, 1528537615UL, \"+/BWvueikGg4YkO1v2uuZB5vtJJgUZ5bL8cRfxAstfnCVdro2ja+4a+8rGUzDx8/vvTZOUVD6U95hnWb638MCQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_10 { get; } = new TsVersionSigned(\"3.1.10 [Build: 1528537615]\", \"OS X\", ClientPlatform.MacOs, 1528537615UL, \"AJMF6gyw5DBtzAuW7aA7YcZaLIgOHFappwzWtE+0UUMYgMjMkSZ1LewDaW3YyRDHuLG5Nb7X26VNhFNZu+ohBw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_10 { get; } = new TsVersionSigned(\"3.1.10 [Build: 1528537615]\", \"Linux\", ClientPlatform.Linux, 1528537615UL, \"jEfjYy09JfbJPZ+W3fwqygOu8uuc5raYTGpbJ5F8dHLHpqUfvmCyJVKoXRieMNkmPzeiylsUc9/HiV+8bt8tDw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_9 { get; } = new TsVersionSigned(\"3.1.9 [Build: 1525442084]\", \"Windows\", ClientPlatform.Windows, 1525442084UL, \"2SLjPTFXM9hQyNkeEGYIzs0fkBffyhsh5z+ZuaCcZdDfM8vgRM5lrAU6KNspFjLddcvw8cXw6gxRY73ZHsRVBg==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_9 { get; } = new TsVersionSigned(\"3.1.9 [Build: 1525442084]\", \"OS X\", ClientPlatform.MacOs, 1525442084UL, \"WVaMmYPig4eG2JUM8cMMW2MA7+IoRoPUSr74CPe7oS8TLHGjYxPr1FP88op6YsFFQrPJysWmIsnGR7BiFXjHCQ==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_9 { get; } = new TsVersionSigned(\"3.1.9 [Build: 1525442084]\", \"Linux\", ClientPlatform.Linux, 1525442084UL, \"wBcnfNU7FA0CvFeisKhywZWzmUqD6IBFbYQTveMvxWowXUjWwNHTg9tbRLQ1YgBFDdlOwV36VMX7aAMXMX2rAA==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_1_8 { get; } = new TsVersionSigned(\"3.1.8 [Build: 1516887927]\", \"iOS\", ClientPlatform.Ios, 1516887927UL, \"pdWyIOpTWECIdA2NExrjqY1a7Q0alFyU7MgiDJYdiUXAspusOHwMIcfKm7oAh+Ty2gcgVgOh8wAPyZcKFKYXBA==\");\n\t\tpublic static TsVersionSigned VER_AND_3_1_8 { get; } = new TsVersionSigned(\"3.1.8 [Build: 1516865456]\", \"Android\", ClientPlatform.Android, 1516865456UL, \"sG/qsKb9iZpBRXFSYY2Tuq7ZLUKHcmgA/6Qe/cx35L3risqoH4aGkPkDicuKtaQi8Ikh4IrQz6xe7V49M+8VBg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_8 { get; } = new TsVersionSigned(\"3.1.8 [Build: 1516614607]\", \"Windows\", ClientPlatform.Windows, 1516614607UL, \"gDEgQf/BiOQZdAheKccM1XWcMUj2OUQqt75oFuvF2c0MQMXyv88cZQdUuckKbcBRp7RpmLInto4PIgd7mPO7BQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_8 { get; } = new TsVersionSigned(\"3.1.8 [Build: 1516614607]\", \"OS X\", ClientPlatform.MacOs, 1516614607UL, \"93J+FDUbtRjonzFnQpGdgN6+o4jwI2M65zEKftQILCdZlGHGfc7z5Z9+TM6nU0/pnPgTqvKmaw9WYPsh88iCCA==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_8 { get; } = new TsVersionSigned(\"3.1.8 [Build: 1516614607]\", \"Linux\", ClientPlatform.Linux, 1516614607UL, \"LJ5q+KWT4KwBX7oR/9j9A12hBrq5ds5ony99f9kepNmqFskhT7gfB51bAJNgAMOzXVCeaItNmc10F2wUNktqCw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_7 { get; } = new TsVersionSigned(\"3.1.7 [Build: 1513163251]\", \"Windows\", ClientPlatform.Windows, 1513163251UL, \"tdNngCAZ1ImAf7BxJzO4RXv5nBRsUERsrSOnMKVUFNQg6BS4Bzag0RFgLVzs2DRj19AC8+q5cXgH+5Ms50mTCA==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_7 { get; } = new TsVersionSigned(\"3.1.7 [Build: 1513163251]\", \"OS X\", ClientPlatform.MacOs, 1513163251UL, \"41eIdGPhullYi9ofXewHPXf232ZbepovkYsmR3Kc4CPlA5d/K599m5BZYBYwSz1/YfKvbTzzg0VE0FRbhcZmBQ==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_7 { get; } = new TsVersionSigned(\"3.1.7 [Build: 1513163251]\", \"Linux\", ClientPlatform.Linux, 1513163251UL, \"/j5TZqPuOU8yMYPdGehvijYvU74KefRrKO5sgTUrkpeslNFiy4XfU7quKW0diLHQoPQn1t3KArdfzOAMk8dlAg==\");\n\t\tpublic static TsVersionSigned VER_AND_3_1_7 { get; } = new TsVersionSigned(\"3.1.7 [Build: 1512665843]\", \"Android\", ClientPlatform.Android, 1512665843UL, \"J04O7RCgM3ZlecpZz5H8IgWggyCJQB5KG4/MEEB5/mrW6XJEK4J5IpU3jKztkvy54B8Nrj9tbwMaRujZfILSAg==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_1_6 { get; } = new TsVersionSigned(\"3.1.6 [Build: 1502881949]\", \"iOS\", ClientPlatform.Ios, 1502881949UL, \"DXVaZKOza0ivNdKG66VPD/g+TYwio6XmJlCfralcUIpJuh3PI4ZgAnjxzXONzTmgFm0O/rb2iN/vvxIYwhcqAQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_6 { get; } = new TsVersionSigned(\"3.1.6 [Build: 1502873983]\", \"Windows\", ClientPlatform.Windows, 1502873983UL, \"73fB82Jt1lmIRHKBFaE8h1JKPGFbnt6/yrXOHwTS93Oo7Adx1usY5TzNg+8BKy9nmmA2FEBnRmz5cRfXDghnBA==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_6 { get; } = new TsVersionSigned(\"3.1.6 [Build: 1502873983]\", \"OS X\", ClientPlatform.MacOs, 1502873983UL, \"ELteM70OI6OkQ6hjOr1m1ZXxDtOeCI7pqO2ce7+Sw7CoUgKlqxreTKVSlHpD7XfCEuqo3AdNfxWUNAaBci3DDA==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_6 { get; } = new TsVersionSigned(\"3.1.6 [Build: 1502873983]\", \"Linux\", ClientPlatform.Linux, 1502873983UL, \"o+l92HKfiUF+THx2rBsuNjj/S1QpxG1fd5o3Q7qtWxkviR3LI3JeWyc26eTmoQoMTgI3jjHV7dCwHsK1BVu6Aw==\");\n\t\tpublic static TsVersionSigned VER_AND_3_1_6 { get; } = new TsVersionSigned(\"3.1.6 [Build: 1502275280]\", \"Android\", ClientPlatform.Android, 1502275280UL, \"sEg1lt9N9lck/Kub6/N6kffI28dEsTrybGLsLc/MeWWfZ/t3EoVwwqCcBxEbUZyszx1htnbnWbd/dYBcrjSCCw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_5 { get; } = new TsVersionSigned(\"3.1.5 [Build: 1500537355]\", \"Windows\", ClientPlatform.Windows, 1500537355UL, \"O9WqHB9oX0qe9AXIYmJm0+mzl6VLxNvrGF0lGlovLaig5MXUIwd6T00NkCj62OkBbzM3eECs9FUuJk7N8V0dCg==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_5 { get; } = new TsVersionSigned(\"3.1.5 [Build: 1500537355]\", \"OS X\", ClientPlatform.MacOs, 1500537355UL, \"oiS3ROFEy4r7zhkmCuj4cro2kIwntHNpuTFpFB+zV+AkfwX3Y2F51/JJPWG0J63tPR82n3ot/JiDkJqPKBJpDg==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_5 { get; } = new TsVersionSigned(\"3.1.5 [Build: 1500537355]\", \"Linux\", ClientPlatform.Linux, 1500537355UL, \"Ea/9gUeh5HuXyiOZ+gRDPOn0rDHzXDVSYB70qy/BtczJPZn/0dDwQgRAF7/W6vHcaH67j+IF9AtUpuDCA6yzBw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_4_2 { get; } = new TsVersionSigned(\"3.1.4.2 [Build: 1498644101]\", \"Windows\", ClientPlatform.Windows, 1498644101UL, \"WtscrpvJG13kbF6aoVzsGwQuE/WwR1b8++ydDc8IpmiXLw+zFC6zFUvLinOeE0zZgh2Hs5Amp3DZoPJSynOWBg==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_4_2 { get; } = new TsVersionSigned(\"3.1.4.2 [Build: 1498644101]\", \"OS X\", ClientPlatform.MacOs, 1498644101UL, \"MMVozpqhiRqPHFu+skm8ftODA2waeWJx2trAx205schgiJMz+H4KOLfoa92Fjrn8kAQZxpA3krUro/iBpJYkBw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_4_2 { get; } = new TsVersionSigned(\"3.1.4.2 [Build: 1498644101]\", \"Linux\", ClientPlatform.Linux, 1498644101UL, \"Rv3SzHDwLIkuUqySQhn279jf2b7PPzCQH2q53zHWH5qyFL/Qw4m/n7ZrXEF46/sUSpOPFPYjfKMKcN/9IRCoCQ==\");\n\t\tpublic static TsVersionSigned VER_AND_3_1_3_1 { get; } = new TsVersionSigned(\"3.1.3.1 [Build: 1493128735]\", \"Android\", ClientPlatform.Android, 1493128735UL, \"Me2oMSfwCsCCGsBtgDTy+TCidslmK66JxQVR2qFsKv0v6izk6o7jzuPIFdL8Fo4rVegdCyuXPbzmOPe9j71YCQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_4 { get; } = new TsVersionSigned(\"3.1.4 [Build: 1491993378]\", \"Windows\", ClientPlatform.Windows, 1491993378UL, \"rwdyEwnJCzbVfNCqbxMrRyhL5BSYqYSzKQkeZ6m5KImc1F8VB8wEkwwwyxoG7SimC/sxIyy4h27CjBFP6rcgBQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_4 { get; } = new TsVersionSigned(\"3.1.4 [Build: 1491993378]\", \"OS X\", ClientPlatform.MacOs, 1491993378UL, \"JSg4RcthTCvJUSXTLhrmdPt1592Nk1lG9AuXg+yIyOBL6tlb030+hXniu/QrI2NeNHAMYxTJgZyi+rTnu6sFCQ==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_4 { get; } = new TsVersionSigned(\"3.1.4 [Build: 1491993378]\", \"Linux\", ClientPlatform.Linux, 1491993378UL, \"wJPx0S2Q2S8EgSEpZhu+Yp80d6xVQDX5u9DYgm7XxI7sh7gJIoBbdaE5cfjwR2UN6XFyV+V/2AV4stB3CxtgCQ==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_1_2 { get; } = new TsVersionSigned(\"3.1.2 [Build: 1490291439]\", \"iOS\", ClientPlatform.Ios, 1490291439UL, \"mTC8yRgh04oHF3jKleXVy5324ysJKp2LQIUhWh85MXqPTjh9CD0pgiUIoTuCzDQTNutAzRefcLVwniaIhNCnAw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_3 { get; } = new TsVersionSigned(\"3.1.3 [Build: 1490279472]\", \"Windows\", ClientPlatform.Windows, 1490279472UL, \"7RPY2bzJmMdgVX24VuKD3lTnYYb6yHWqfn2x21tFOjXL9q+2t7tU9Vy8Bh5/IpeiqklUHTWc23mWpYOCoW9eCA==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_3 { get; } = new TsVersionSigned(\"3.1.3 [Build: 1490279472]\", \"Linux\", ClientPlatform.Linux, 1490279472UL, \"Y1M2TQvKLGmUSP4YPuTBQOeUxmF+jaqazFXuN4v2gOKP8QmxyYOsg9PsG9z7SFYQkgneQxs8QdzC+IGo0bOWBQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_2 { get; } = new TsVersionSigned(\"3.1.2 [Build: 1489662774]\", \"Windows\", ClientPlatform.Windows, 1489662774UL, \"5Aaj21gGFtrjW9424ezfLa1SMQBpZvgQgcJLZmrLoNMe4XebBPV2s8rxEDAIodfFpruLxLFbFpH63A/BGnJyDw==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_2 { get; } = new TsVersionSigned(\"3.1.2 [Build: 1489662774]\", \"OS X\", ClientPlatform.MacOs, 1489662774UL, \"571chpoaq6bxLisThXfiU3zB7pU0NOmH/Qso8ABTR0TXmcK9Y16pYwmPFs/d7fmcHVeI3xSM4dbgzKjRSB61Dg==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_2 { get; } = new TsVersionSigned(\"3.1.2 [Build: 1489662774]\", \"Linux\", ClientPlatform.Linux, 1489662774UL, \"W9TgKEviDgWvrQErw8vaoQcPboaUx8xRL5MPoQzlur9eO2yseHgvzkpWGYqSQyCI+ptcCpTHaXRFym0imKnfBA==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_1_1 { get; } = new TsVersionSigned(\"3.1.1.1 [Build: 1487668590]\", \"Windows\", ClientPlatform.Windows, 1487668590UL, \"CchjMitGiVGfRlGph0D1mDjOCJCnkVxR/WuYvNHdPyeQUCncRWML8jYxYfnhRF6CzViwYRnsmZkN+W5oenB2CQ==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_1_1_1 { get; } = new TsVersionSigned(\"3.1.1.1 [Build: 1487668590]\", \"OS X\", ClientPlatform.MacOs, 1487668590UL, \"WrETtyinA18FGhiDC458SwfGDozCnM+euEDmCeyC1YgQnfaEC49FtoVAbw2fry/daonzgxmyNBymVHhoUX5iDA==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_1_1 { get; } = new TsVersionSigned(\"3.1.1.1 [Build: 1487668590]\", \"Linux\", ClientPlatform.Linux, 1487668590UL, \"0B4RK2WOu5w39+CLznQtaexYeNqqBwU9YHBvSLw3bu+OAne8XtFc2NJzepjynrxwc1/xsmrm8uEZJzqzF+TcAg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_1 { get; } = new TsVersionSigned(\"3.1.1 [Build: 1486712038]\", \"Windows\", ClientPlatform.Windows, 1486712038UL, \"sryyx++NhRWKDAo+Tnwv9N+IrOaQBP0XjjDszY0BBv0YIMr4jmdHtgrwzWkUqhU7kfql7qBWIhlb/r0l1ZHeBw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_1 { get; } = new TsVersionSigned(\"3.1.1 [Build: 1486712038]\", \"Linux\", ClientPlatform.Linux, 1486712038UL, \"umeERdZkG9pS3oeJTirnYK9Q947j8lVlszz2VXBPcjhQrsiKFM6lIkbj3K2HSqA/hJ+sUOcuZgo880PmU6ZdCw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1_0_1 { get; } = new TsVersionSigned(\"3.1.0.1 [Build: 1484223040]\", \"Windows\", ClientPlatform.Windows, 1484223040UL, \"oaaorJ4co/sS2m5JT5oRiu9AieW6kfFY+RENqPfp26iP4pbWbf9GcZj+JhDA+/JyLpfueCcSulZSRRbash2JCw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1_0_1 { get; } = new TsVersionSigned(\"3.1.0.1 [Build: 1484223040]\", \"Linux\", ClientPlatform.Linux, 1484223040UL, \"xWfxm14Vw53mTMHuzeaIM428KkoI/2wuoR4O2TIuy2Q7ZpwaN48vG0rMJbUQNVycP8rRHg+bIGuFiJai8f5dDg==\");\n\t\tpublic static TsVersionSigned VER_AND_3_1_0 { get; } = new TsVersionSigned(\"3.1.0 [Build: 1481889010]\", \"Android\", ClientPlatform.Android, 1481889010UL, \"eH8svg9XpltTbw+UYkQ4ixfqpbEAhwO9nmDDUWuI11swEU3Ye5HKGlFv70LxHZSgYlEqEH/N1J9U4ygptbPIDg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_1 { get; } = new TsVersionSigned(\"3.1 [Build: 1481795005]\", \"Windows\", ClientPlatform.Windows, 1481795005UL, \"3TpZZM0V+PKHELFnsfRPoKjEFfvfHUL/6mUP5LHbI3nvmdOjRqEEKi4ndXZG6OpWOKQ3VeadHDH0KBfD8EI2Cg==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_1 { get; } = new TsVersionSigned(\"3.1 [Build: 1481795005]\", \"Linux\", ClientPlatform.Linux, 1481795005UL, \"xpJQcdaIImbctnJw0PnLQOIZBcmN+HDGcjxoIW8So7SSdSYLyUI5lAECWaCewbYmNKqaO85YqXPiNXfOBM5fBA==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_1 { get; } = new TsVersionSigned(\"3.1 [Build: 1481641346]\", \"iOS\", ClientPlatform.Ios, 1481641346UL, \"SDH0QNTA1wDQdfIU0HbcRugD3qkkPHnvlSq/IeW/I4A2myFQnDbzm8ilEGR0vOU4NoTae8CH5XsBmRqwyPIeBA==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_19_4 { get; } = new TsVersionSigned(\"3.0.19.4 [Build: 1468491418]\", \"Windows\", ClientPlatform.Windows, 1468491418UL, \"ldWL49uDKC3N9uxdgWRMTOzUuiG1nBqUiOa+Nal5HvdxJiN4fsTnmmPo5tvglN7WqoVoFfuuKuYq1LzodtEtCg==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_0_19_4 { get; } = new TsVersionSigned(\"3.0.19.4 [Build: 1468491418]\", \"OS X\", ClientPlatform.MacOs, 1468491418UL, \"Pvcizdk3HRQMzTLt7goUYBmmS5nbAS1g2E6HIypLU+9eXTqGTBLim0UUtKc0s867TFHbK91GroDrTtv0aMUGAw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_0_19_4 { get; } = new TsVersionSigned(\"3.0.19.4 [Build: 1468491418]\", \"Linux\", ClientPlatform.Linux, 1468491418UL, \"jvhhk75EV3nCGeewx4Y5zZmiZSN07q5ByKZ9Wlmg85aAbnw7c1jKq5/Iq0zY6dfGwCEwuKod0I5lQcVLf2NTCg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_19_3 { get; } = new TsVersionSigned(\"3.0.19.3 [Build: 1466672534]\", \"Windows\", ClientPlatform.Windows, 1466672534UL, \"a1OYzvM18mrmfUQBUgxYBxYz2DUU6y5k3/mEL6FurzU0y97Bd1FL7+PRpcHyPkg4R+kKAFZ1nhyzbgkGphDWDg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_19_2 { get; } = new TsVersionSigned(\"3.0.19.2 [Build: 1466597785]\", \"Windows\", ClientPlatform.Windows, 1466597785UL, \"sDOzu7rCGb7kBID2WbBk35DjPijKkXzujnsAtLhXxhkQ+am0JlDOpuU1ISHhq9gCl/Qo0dzc723o0AIPI+yoCQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_20 { get; } = new TsVersionSigned(\"3.0.20 [Build: 1465542546]\", \"Windows\", ClientPlatform.Windows, 1465542546UL, \"vDK31sOwOvDpTXgqAJzmR1NzeUeSDG9dLMgIz5LCX+KpDSVD/qU60mzScz9tuc9AsLyrL8DxHpDDO3eQD+hYCA==\");\n\t\tpublic static TsVersionSigned VER_AND_3_0_23 { get; } = new TsVersionSigned(\"3.0.23 [Build: 1463662487]\", \"Android\", ClientPlatform.Android, 1463662487UL, \"RN+cwFI+jSHJEhggucIuUyEteWNVFy4iw0QDp3qn2UzfopypFVE9BPZqJjBUGeoCN7Q/SfYL4RNIRzJEQaZUCA==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_19_1 { get; } = new TsVersionSigned(\"3.0.19.1 [Build: 1461588969]\", \"Windows\", ClientPlatform.Windows, 1461588969UL, \"KYo52MA89dowkYpFU1KixgHngjbJ6F2Yi++5tbaqBlBpz9YikX2gI3sqmU1kP1ghsKCLKM7o0patDH1hv9bmAg==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_0_19_1 { get; } = new TsVersionSigned(\"3.0.19.1 [Build: 1461588969]\", \"OS X\", ClientPlatform.MacOs, 1461588969UL, \"J4cWj2v28tC/8uRqXB1nnAQPfFngOFE/E4Yx7uKMY+Cb8csFrhsJW4J8i+t3dpvZeMJ0BJnB0a/dZ1iL4zh1Dw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_19 { get; } = new TsVersionSigned(\"3.0.19 [Build: 1459504131]\", \"Windows\", ClientPlatform.Windows, 1459504131UL, \"JoHyZHF4k/a3+QH1zPNSEzc40487fzbpssyRZtoWB5kbQorAJgwlpcScA08J4vjGoUbdaTZsT0vCw56wo/Q9Ag==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_0_19 { get; } = new TsVersionSigned(\"3.0.19 [Build: 1459504131]\", \"Linux\", ClientPlatform.Linux, 1459504131UL, \"48s6oiT+4yKVJPsEzbPUZ2L2LqrKJ0bixxVmTFjS5f5EsfDFbD8bl7t3V+OQd84bgN7t8W80B/fjEW45IszpAg==\");\n\t\tpublic static TsVersionSigned VER_AND_3_0_21 { get; } = new TsVersionSigned(\"3.0.21 [Build: 1449476724]\", \"Android\", ClientPlatform.Android, 1449476724UL, \"X/xPOfXLC8ycGeWMlBc5zbyjQdBj7gYFVaSfG95gcZLoNijUaWDkB8DiqBfDvmef2JgmF8YdKTdmwjUm2n5MCw==\");\n\t\tpublic static TsVersionSigned VER_AND_3_0_20_2 { get; } = new TsVersionSigned(\"3.0.20.2 [Build: 1445517273]\", \"Android\", ClientPlatform.Android, 1445517273UL, \"fp6DjpIL/GlTmI3o2QEhwnXUj/pY7OFvZVPbtFBizI2Rloqm+8i0jG8Iwk05ZBn1bDOF6acPzHjBwZgl8CeWAg==\");\n\t\tpublic static TsVersionSigned VER_IOS_3_0_18_2 { get; } = new TsVersionSigned(\"3.0.18.2 [Build: 1445516611]\", \"iOS\", ClientPlatform.Ios, 1445516611UL, \"TEC965pHLJhoiNA2N95xBjQfh2n6uasS3BRFraucFv/+WgAKCKeoUYb3tu6feO5zvTEEiH6YCsedQdhbU1FFCw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_18_2 { get; } = new TsVersionSigned(\"3.0.18.2 [Build: 1445512488]\", \"Windows\", ClientPlatform.Windows, 1445512488UL, \"F0hY25Dtja0wcU6dzC39rNuYbhnDAbIwPHC3VO9Oicf13kUY2I2g6scPZ3p195Cw9gUYdBIRYm8ucHEhtSeWCw==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_0_18_2 { get; } = new TsVersionSigned(\"3.0.18.2 [Build: 1445512488]\", \"OS X\", ClientPlatform.MacOs, 1445512488UL, \"hRZrg1T+25VXJffJoM9hV1qPe90HHrjbuHJM4SOj2QIasS+5bFSgzZ50/zus7Yzj8ZUovPWwn7B7WwdyiU29BQ==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_0_18_2 { get; } = new TsVersionSigned(\"3.0.18.2 [Build: 1445512488]\", \"Linux\", ClientPlatform.Linux, 1445512488UL, \"W9sU8xDfWZ+eQryTdNxXVXM5Ak81wJpYKDLOiJoJUuEXoxcPnKBWpTr5JPrUzheQvkUYUIJf6WzgGAG2B7GYCg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_18_1 { get; } = new TsVersionSigned(\"3.0.18.1 [Build: 1444491275]\", \"Windows\", ClientPlatform.Windows, 1444491275UL, \"xqfa3CUd2GFiTqjJWYzcu9ZbxVVLng8qIMKlVxMqWdiM8JrTRiXBAaTBDd8Xc+flVe+rGSIOZTkXRsz1rqjiAA==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_18 { get; } = new TsVersionSigned(\"3.0.18 [Build: 1442998335]\", \"Windows\", ClientPlatform.Windows, 1442998335UL, \"vUgm8mJoeVLBG6qB2HcYF7YNG4D+H/4edILaZbHze2Unua6mrBvNmbtRkRtmRyDZSd7sVQHMApinRDgGT1mUBw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_17 { get; } = new TsVersionSigned(\"3.0.17 [Build: 1438673913]\", \"Windows\", ClientPlatform.Windows, 1438673913UL, \"znDjHvCgmQF/jQKTK49X8tnXqF7AGXfS2XYcogww4XxNTBxp2tf1aFc/jgboKco9EuVa0ku2cf/xg9wW3Cm7AQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_16 { get; } = new TsVersionSigned(\"3.0.16 [Build: 1407159763]\", \"Windows\", ClientPlatform.Windows, 1407159763UL, \"Y1DuQGXo/8/rYznEGyeQHgpvZMuiCH4FYm4QVyAgLYyMpNpc/LM7XetVWhDQxGsNejkN/2olI7GVJkt4X+ooDg==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_0_16 { get; } = new TsVersionSigned(\"3.0.16 [Build: 1407159763]\", \"OS X\", ClientPlatform.MacOs, 1407159763UL, \"vLAH2cYjkF/3sQCgr/zSmtffXcH2flI2vOnUP3uNIDSm8gKO61Q2hOdQaUzXE1yekLSMx2E9RYz+OQjQ868KAw==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_0_16 { get; } = new TsVersionSigned(\"3.0.16 [Build: 1407159763]\", \"Linux\", ClientPlatform.Linux, 1407159763UL, \"8776GitHAgkFPfOLxEh5x+Luuh4NrYPEJUdsUzNKndcAuWMYjwQTZkmeZOeG/swdn/p2Cg2pRfZfsIFSOAUWCQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_15_1 { get; } = new TsVersionSigned(\"3.0.15.1 [Build: 1405341092]\", \"Windows\", ClientPlatform.Windows, 1405341092UL, \"b+hr0KQWOVW2WEn49BmNb08R9zimsJcThm2gEeF7EAgRUeUDYzeplh5HrHmda0ftbbnrzWV33U/GOo2LAs/rAg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_15 { get; } = new TsVersionSigned(\"3.0.15 [Build: 1403250090]\", \"Windows\", ClientPlatform.Windows, 1403250090UL, \"FKKAHPwV1swKwH6mqHqdcGuYm8o5mZw4WreBxJrQjOprC3NXXcJviPe0p7EZPI810HOWMfmQRUgFpggoRL8kAQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_14 { get; } = new TsVersionSigned(\"3.0.14 [Build: 1394624943]\", \"Windows\", ClientPlatform.Windows, 1394624943UL, \"F0WIO9sBVzG893AtX2Jfd98cH6yZPAnfMBNvBlQbAIfvfyiq+cbjZ31AUngEjq7UPIYdnYSsdRX9hczwdBrKAQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_13_1 { get; } = new TsVersionSigned(\"3.0.13.1 [Build: 1382530211]\", \"Windows\", ClientPlatform.Windows, 1382530211UL, \"bCIfLPUgTM6C0kNkesvhcxaDPvV9h6qLbYVy9cQVSP5lzaYebZaeDzAOOHsdjKcRTa6LU1oHEdz9D/d+2gxJCw==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_0_13_1 { get; } = new TsVersionSigned(\"3.0.13.1 [Build: 1382530211]\", \"OS X\", ClientPlatform.MacOs, 1382530211UL, \"0KNdNcf2zmYUV7JzfKlXdM0Y6/dv9LOlETE8h2mTxq0YitdbZSObUdAJvrdiKX0LH2QP4h3QF2JeXyzjRSQTCw==\");\n\t\tpublic static TsVersionSigned VER_AND_3_0_13 { get; } = new TsVersionSigned(\"3.0.13 [Build: 1380616389]\", \"Android\", ClientPlatform.Android, 1380616389UL, \"04JRo/B0zh54n18a61qWr3qFUrEVQeEiy7dyIEVhCLMwY8QJwk7kwG7GQKSxnr0rmRfTzD7iDXMUWlcwgkc/Cg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_13 { get; } = new TsVersionSigned(\"3.0.13 [Build: 1380283653]\", \"Windows\", ClientPlatform.Windows, 1380283653UL, \"7dA+6EbVyMevol4gE3/Cu1WonRjqu1C6pTWF+txApbaiTgKtZ/ky+NVxluPkSDnCxXN1pOR4uGdF6B7LUqQgDQ==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_12 { get; } = new TsVersionSigned(\"3.0.12 [Build: 1378715177]\", \"Windows\", ClientPlatform.Windows, 1378715177UL, \"x6wFA5xqjenf6kbAh36IC4CkrbT8/uSBpgjM9juSt9oxGCXLqHOC2oaYlB1zZSJZjT4sOrnp0M+uOdVjYCzLCg==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_11_1 { get; } = new TsVersionSigned(\"3.0.11.1 [Build: 1375773286]\", \"Windows\", ClientPlatform.Windows, 1375773286UL, \"Qfvcn4uQmKETDsD4LbtdbZR8rDetJ26Z/bVbu5SZJjMjGlYEMSbJnR4PtOBshdMSEwEsAJf1G+5tjx+onm2fDA==\");\n\t\tpublic static TsVersionSigned VER_MAC_3_0_11_1 { get; } = new TsVersionSigned(\"3.0.11.1 [Build: 1375773286]\", \"OS X\", ClientPlatform.MacOs, 1375773286UL, \"BngQ1112epNzhND5v7uDdbClbP9dSWczXKxvi1iRQo+xWt7WLYKJu/05MrW/CtPVtKwlT4PnbfI0Trvw+HvUCA==\");\n\t\tpublic static TsVersionSigned VER_LIN_3_0_11_1 { get; } = new TsVersionSigned(\"3.0.11.1 [Build: 1375773286]\", \"Linux\", ClientPlatform.Linux, 1375773286UL, \"JMTTCSHw+ibyhqCDCWRgby/oJ5uAYHk0/QOwqqI5rNHCKTkb+ce6N+4J38WXAnRmtcEaMb0s30s3ipQBokrqDw==\");\n\t\tpublic static TsVersionSigned VER_WIN_3_0_11 { get; } = new TsVersionSigned(\"3.0.11 [Build: 1375083581]\", \"Windows\", ClientPlatform.Windows, 1375083581UL, \"54wPDkfv0kT56UE0lv/LFkFJObH+Q4Irmo4Brfz1EcvjVhj8hJ+RCHcVTZsdKU2XvVvh+VLJpURulEHsAOsyBw==\");\n\t\t// ReSharper restore InconsistentNaming, UnusedMember.Global\n\t}\n}\n"
  },
  {
    "path": "TSLib/Generated/TsVersion.gen.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"false\" hostspecific=\"true\" language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ assembly name=\"Microsoft.VisualBasic\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ import namespace=\"Microsoft.VisualBasic.FileIO\" #>\n<#@ import namespace=\"System.Text.RegularExpressions\" #>\n<#@ output extension=\".cs\" #>\n<#\nstring declFilePath = Host.ResolvePath(\"../Declarations/Versions.csv\");\nvar data = new List<string[]>();\nusing (TextFieldParser parser = new TextFieldParser(declFilePath))\n{\n\tparser.TextFieldType = FieldType.Delimited;\n\tparser.SetDelimiters(\",\");\n\twhile (!parser.EndOfData)\n\t\tdata.Add(parser.ReadFields());\n}\nvar dict = new Dictionary<string, Ver> {\n\t{ \"Windows\", new Ver { plat = \"WIN\", enu = \"Windows\" } },\n\t{ \"Linux\", new Ver { plat = \"LIN\", enu = \"Linux\" } },\n\t{ \"OS X\", new Ver { plat = \"MAC\", enu = \"MacOs\" } },\n\t{ \"macOS\", new Ver { plat = \"MAC\", enu = \"MacOs\" } },\n\t{ \"Android\", new Ver { plat = \"AND\", enu = \"Android\" } },\n\t{ \"iOS\", new Ver { plat = \"IOS\", enu = \"Ios\" } },\n};\nvar reg = new Regex(@\"^(\\d(?:\\.[\\d?]+)+)\");\nstring BuildToFld(string build)\n{\n\tvar m = reg.Match(build);\n\treturn string.Join(\"_\", m.Groups[1].Value.Split('.').Select(x => x.Replace(\"?\", \"X\")));\n}\n#>\n\nnamespace TSLib\n{\n\tpartial class TsVersionSigned\n\t{\n\t\t// ReSharper disable InconsistentNaming, UnusedMember.Global<#\n\t\tvar header = data[0];\n\t\tint ichan = Array.IndexOf(header, \"channel\");\n\t\tint iname = Array.IndexOf(header, \"version\");\n\t\tint iplat = Array.IndexOf(header, \"platform\");\n\t\tint ihash = Array.IndexOf(header, \"hash\");\n\t\tvar duplicates = new HashSet<string>();\n\n\t\tforeach (var line in data.Skip(1).Reverse()) {\n\t\t\tvar ver = dict[line[iplat]];\n\t\t\tvar fldName = $\"VER_{ver.plat}_{BuildToFld(line[iname])}\";\n\t\t\tif (duplicates.Contains(fldName))\n\t\t\t\tcontinue;\n\t\t\tduplicates.Add(fldName);\n\t\t\tRegex VersionPattern = new Regex(@\"([^ ])* \\[Build: (\\d+)\\]\");\n\t\t\tvar build = VersionPattern.Match(line[iname]).Groups[2].Value;\n\t\t#>\n\t\tpublic static TsVersionSigned <#= fldName #> { get; } = new TsVersionSigned(\"<#=\n\t\t\tline[iname] #>\", \"<#=\n\t\t\tline[iplat] #>\", ClientPlatform.<#=\n\t\t\tver.enu #>, <#= \n\t\t\tbuild #>UL, \"<#=\n\t\t\tline[ihash] #>\");<#\n\t\t} #>\n\t\t// ReSharper restore InconsistentNaming, UnusedMember.Global\n\t}\n}\n<#+ class Ver\n{\n\tpublic string plat;\n\tpublic string enu;\n}\n#>"
  },
  {
    "path": "TSLib/Generated/Util.ttinclude",
    "content": "<#@ assembly name=\"System.Core\" #>\n<#@ assembly name=\"%userprofile%/.nuget/packages/nett/0.13.0/lib/Net40/Nett.dll\" #>\n<#+\npublic void Warn(string _warn) { WriteLine($\"#warning {_warn}\"); }\n\nconst string ConversionSet = \n@\"#pragma warning disable CS8019 // Ignore unused imports\nusing i8  = System.SByte;\nusing u8  = System.Byte;\nusing i16 = System.Int16;\nusing u16 = System.UInt16;\nusing i32 = System.Int32;\nusing u32 = System.UInt32;\nusing i64 = System.Int64;\nusing u64 = System.UInt64;\nusing f32 = System.Single;\nusing f64 = System.Double;\nusing str = System.String;\n\nusing DateTime = System.DateTime;\nusing Duration = System.TimeSpan;\nusing DurationSeconds = System.TimeSpan;\nusing DurationMilliseconds = System.TimeSpan;\nusing SocketAddr = System.String;\nusing IpAddr = System.String;\nusing Ts3ErrorCode = TSLib.TsErrorCode;\nusing Ts3Permission = TSLib.TsPermission;\n\nusing IconHash = System.Int32;\nusing ConnectionId = System.UInt32;\nusing EccKeyPubP256 = TSLib.Uid;\n#pragma warning restore CS8019\";\n#>"
  },
  {
    "path": "TSLib/Helper/AsyncEventHandler.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace TSLib.Helper\n{\n\t// Normal EventHandler:\n\t// public delegate void EventHandler(object? sender, EventArgs e);\n\n\tpublic delegate Task AsyncEventHandler(object? sender, EventArgs e);\n\tpublic delegate Task AsyncEventHandler<T>(object? sender, T value);\n\n\tpublic static class AsyncEventExtensions\n\t{\n\t\tpublic static Task InvokeAsync<T>(this AsyncEventHandler<T>? ev, object? sender, T value)\n\t\t{\n\t\t\tif (ev == null)\n\t\t\t\treturn Task.CompletedTask;\n\n\t\t\tvar invList = ev.GetInvocationList();\n\t\t\tif (invList.Length == 1)\n\t\t\t{\n\t\t\t\treturn ((AsyncEventHandler<T>)invList[0]).Invoke(sender, value);\n\t\t\t}\n\n\t\t\treturn Task.WhenAll(invList.Select(func => ((AsyncEventHandler<T>)func).Invoke(sender, value)));\n\t\t}\n\n\t\tpublic static Task InvokeAsync(this AsyncEventHandler? ev, object? sender)\n\t\t\t=> InvokeAsync(ev, sender, EventArgs.Empty);\n\t\tpublic static Task InvokeAsync(this AsyncEventHandler? ev, object? sender, EventArgs e)\n\t\t{\n\t\t\tif (ev == null)\n\t\t\t\treturn Task.CompletedTask;\n\n\t\t\tvar invList = ev.GetInvocationList();\n\t\t\tif (invList.Length == 1)\n\t\t\t{\n\t\t\t\treturn ((AsyncEventHandler)invList[0]).Invoke(sender, e);\n\t\t\t}\n\n\t\t\treturn Task.WhenAll(invList.Select(func => ((AsyncEventHandler)func).Invoke(sender, e)));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/CommandErrorExtensions.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace TSLib.Messages\n{\n\tpublic partial class CommandError\n\t{\n\t\tpublic static CommandError ConnectionClosed { get; } = Custom(\"Connection closed\");\n\n\t\tpublic static CommandError NoResult { get; } = Custom(\"Result is empty\");\n\n\t\tpublic static CommandError Parser { get; } = Custom(\"Result could not be parsed\");\n\n\t\tpublic static CommandError CommandTimeout { get; } = Custom(\"Command protocol timout\");\n\n\t\tpublic static CommandError Custom(string message) => new CommandError { Id = TsErrorCode.custom_error, Message = message };\n\n\t\tpublic string ErrorFormat()\n\t\t{\n\t\t\tif (MissingPermissionId != null\n\t\t\t\t&& MissingPermissionId != TsPermission.unknown\n\t\t\t\t&& MissingPermissionId != TsPermission.undefined)\n\t\t\t\treturn $\"{Id}: the command failed to execute: {Message} (missing permission:{MissingPermissionId})\";\n\t\t\telse\n\t\t\t\treturn $\"{Id}: the command failed to execute: {Message}\";\n\t\t}\n\t}\n\n\t/// <summary>Provides useful extension methods for error formatting.</summary>\n\tpublic static class CommandErrorExtensions\n\t{\n\t\tpublic static R<T, CommandError> MapToSingle<T>(in this R<T[], CommandError> result) where T : IMessage\n\t\t{\n\t\t\tif (result.Ok)\n\t\t\t\treturn MapToSingle(result.Value);\n\t\t\treturn R<T, CommandError>.Err(result.Error);\n\t\t}\n\n\t\tpublic static async Task<R<T, CommandError>> MapToSingle<T>(this Task<R<T[], CommandError>> task) where T : IMessage\n\t\t\t=> (await task).MapToSingle();\n\n\t\tinternal static R<T, CommandError> MapToSingle<T>(this IEnumerable<T> enu) where T : IMessage\n\t\t{\n\t\t\tvar first = enu.FirstOrDefault();\n\t\t\tif (first != null)\n\t\t\t\treturn R<T, CommandError>.OkR(first);\n\t\t\treturn R<T, CommandError>.Err(CommandError.NoResult);\n\t\t}\n\n\t\tpublic static R<T, CommandError> MapToSingle<T>(in this R<LazyNotification, CommandError> result) where T : class, IMessage\n\t\t\t=> result.UnwrapNotification<T>().MapToSingle();\n\n\t\tpublic static async Task<R<T, CommandError>> MapToSingle<T>(this Task<R<LazyNotification, CommandError>> task) where T : class, IMessage\n\t\t\t=> (await task).MapToSingle<T>();\n\n\t\tpublic static R<T[], CommandError> UnwrapNotification<T>(in this R<LazyNotification, CommandError> result) where T : class, IMessage\n\t\t{\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result.Error;\n\t\t\treturn R<T[], CommandError>.OkR((T[])result.Value.Notifications);\n\t\t}\n\n\t\tpublic static R<TI, CommandError> WrapInterface<TC, TI>(in this R<TC, CommandError> result) where TC : notnull, IMessage, TI where TI : notnull\n\t\t{\n\t\t\tif (!result.Ok)\n\t\t\t\treturn result.Error;\n\t\t\treturn result.Value;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/DebugUtil.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Linq;\n\nnamespace TSLib.Helper\n{\n\tinternal static class DebugUtil\n\t{\n\t\tpublic static string DebugToHex(byte[] bytes) => bytes is null ? \"<null>\" : DebugToHex(bytes.AsSpan());\n\n\t\tpublic static string DebugToHex(ReadOnlySpan<byte> bytes)\n\t\t{\n\t\t\tvar c = new char[bytes.Length * 3];\n\t\t\tfor (int bx = 0, cx = 0; bx < bytes.Length; ++bx, ++cx)\n\t\t\t{\n\t\t\t\tvar b = (byte)(bytes[bx] >> 4);\n\t\t\t\tc[cx] = (char)(b > 9 ? b - 10 + 'A' : b + '0');\n\n\t\t\t\tb = (byte)(bytes[bx] & 0x0F);\n\t\t\t\tc[++cx] = (char)(b > 9 ? b - 10 + 'A' : b + '0');\n\t\t\t\tc[++cx] = ' ';\n\t\t\t}\n\t\t\treturn new string(c);\n\t\t}\n\n\t\tpublic static byte[] DebugFromHex(string hex)\n\t\t\t=> hex.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)\n\t\t\t\t.Select(x => Convert.ToByte(x, 16)).ToArray();\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/LogId.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Helper\n{\n\tpublic readonly struct Id : IEquatable<Id>\n\t{\n\t\tpublic static readonly Id Null = new Id(-1);\n\n\t\tpublic int Value { get; }\n\n\t\tpublic Id(int id)\n\t\t{\n\t\t\tValue = id;\n\t\t}\n\n\t\tpublic static implicit operator int(Id id) => id.Value;\n\n\t\tpublic override string ToString() => Value.ToString();\n\n\t\tpublic override bool Equals(object? obj) => obj is Id id && Equals(id);\n\t\tpublic bool Equals(Id other) => Value == other.Value;\n\t\tpublic override int GetHashCode() => Value;\n\n\t\tpublic static bool operator ==(Id id, Id other) => id.Value == other.Value;\n\t\tpublic static bool operator !=(Id id, Id other) => id.Value != other.Value;\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/MissingEnumCaseException.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace TSLib.Helper\n{\n\t[Serializable]\n\tpublic sealed class MissingEnumCaseException : Exception\n\t{\n\t\tpublic MissingEnumCaseException(string enumTypeName, string valueName) : base($\"The switch does not handle the value \\\"{valueName}\\\" from \\\"{enumTypeName}\\\".\") { }\n\t\tpublic MissingEnumCaseException(string message, Exception inner) : base(message, inner) { }\n\t\tprivate MissingEnumCaseException(SerializationInfo info, StreamingContext context) : base(info, context) { }\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/NativeLibraryLoader.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Runtime.InteropServices;\n\nnamespace TSLib.Helper\n{\n\tinternal static class NativeLibraryLoader\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\n#if !NETCOREAPP3_1\n\t\t[DllImport(\"kernel32.dll\", SetLastError = true)]\n\t\tprivate static extern IntPtr LoadLibrary(string dllToLoad);\n#endif\n\n\t\tpublic static bool DirectLoadLibrary(string lib, Action? dummyLoad = null)\n\t\t{\n\t\t\tif (Tools.IsLinux)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tdummyLoad?.Invoke();\n\t\t\t\t}\n\t\t\t\tcatch (DllNotFoundException ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Error(ex, \"Failed to load library \\\"{0}\\\".\", lib);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tforeach (var libPath in LibPathOptions(lib))\n\t\t\t\t{\n\t\t\t\t\tLog.Debug(\"Loading \\\"{0}\\\" from \\\"{1}\\\"\", lib, libPath);\n#if NETCOREAPP3_1\n\t\t\t\t\tif (NativeLibrary.TryLoad(libPath, out _))\n\t\t\t\t\t\treturn true;\n#else\n\t\t\t\t\tvar handle = LoadLibrary(libPath);\n\t\t\t\t\tif (handle != IntPtr.Zero)\n\t\t\t\t\t\treturn true;\n#endif\n\t\t\t\t}\n\t\t\t\tLog.Error(\"Failed to load library \\\"{0}\\\", error: {1}\", lib, Marshal.GetLastWin32Error());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate static IEnumerable<string> LibPathOptions(string lib)\n\t\t{\n\t\t\tvar fullPath = Directory.GetCurrentDirectory();\n\t\t\tyield return Path.Combine(fullPath, \"lib\", ArchFolder, lib);\n\t\t\tyield return Path.Combine(fullPath, \"lib\", lib);\n\t\t\tvar asmPath = Path.GetDirectoryName(typeof(NativeLibraryLoader).Assembly.Location)!;\n\t\t\tyield return Path.Combine(asmPath, \"lib\", ArchFolder, lib);\n\t\t\tyield return Path.Combine(asmPath, \"lib\", lib);\n\t\t}\n\n\t\tpublic static string ArchFolder\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (IntPtr.Size == 8)\n\t\t\t\t\treturn \"x64\";\n\t\t\t\tif (IntPtr.Size == 4)\n\t\t\t\t\treturn \"x86\";\n\t\t\t\treturn \"xOther\";\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/R.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace System\n{\n\t/// <summary>\n\t/// Provides a safe alternative to Exceptions for error and result wrapping.\n\t/// This type represents either success or an error + message.\n\t/// </summary>\n\tpublic static class R\n\t{\n\t\tpublic static readonly _Ok Ok = new _Ok();\n\t\tpublic static readonly _Error Err = new _Error();\n\t}\n\n#pragma warning disable IDE1006 // Naming Styles\n\tpublic readonly struct _Ok { }\n\tpublic readonly struct _Error { }\n#pragma warning restore IDE1006 // Naming Styles\n\n\t/// <summary>\n\t/// Provides a safe alternative to Exceptions for error and result wrapping.\n\t/// This type represents either success + value or an error + error-object.\n\t/// The value is guaranteed to be non-null when successful.\n\t/// </summary>\n\t/// <typeparam name=\"TSuccess\">The type of the success value.</typeparam>\n\t/// <typeparam name=\"TError\">The error type.</typeparam>\n\t[DebuggerDisplay(\"{Ok ? (\\\"Ok : \\\" + typeof(TSuccess).Name) : (\\\"Err : \\\" + typeof(TError).Name), nq}\")]\n\tpublic readonly struct R<TSuccess, TError> where TSuccess : notnull where TError : notnull\n\t{\n\t\tprivate readonly bool isError;\n\t\tpublic bool Ok => !isError;\n\t\tpublic TError Error { get; }\n\t\tpublic TSuccess Value { get; }\n\n\t\tprivate R(TSuccess value) { isError = false; Error = default!; if (value == null) throw new ArgumentNullException(nameof(value), \"Return of ok must not be null.\"); Value = value; }\n\t\tprivate R(TError error) { isError = true; Value = default!; if (error == null) throw new ArgumentNullException(nameof(error), \"Error must not be null.\"); Error = error; }\n\t\tinternal R(bool isError, TSuccess value, TError error) { this.isError = isError; Value = value; Error = error; }\n\n\t\t/// <summary>Creates a new failed result with an error object</summary>\n\t\t/// <param name=\"error\">The error</param>\n\t\tpublic static R<TSuccess, TError> Err(TError error) => new R<TSuccess, TError>(error);\n\t\t/// <summary>Creates a new successful result with a value</summary>\n\t\t/// <param name=\"value\">The value</param>\n\t\tpublic static R<TSuccess, TError> OkR(TSuccess value) => new R<TSuccess, TError>(value);\n\n\t\tpublic static implicit operator bool(R<TSuccess, TError> result) => result.Ok;\n\t\tpublic static implicit operator TError(R<TSuccess, TError> result) => result.Error;\n\n\t\tpublic static implicit operator R<TSuccess, TError>(TSuccess result) => new R<TSuccess, TError>(result);\n\t\tpublic static implicit operator R<TSuccess, TError>(TError error) => new R<TSuccess, TError>(error);\n\n\t\t// Fluent get\n\t\tpublic bool GetOk([MaybeNullWhen(false)] out TSuccess value)\n\t\t{\n\t\t\tif (Ok)\n\t\t\t\tvalue = Value;\n\t\t\telse\n\t\t\t\tvalue = default!;\n\t\t\treturn Ok;\n\t\t}\n\n\t\tpublic bool Get([MaybeNullWhen(false)] out TSuccess result, [MaybeNullWhen(true)] out TError error)\n\t\t{\n\t\t\tif (Ok)\n\t\t\t{\n\t\t\t\tresult = Value;\n\t\t\t\terror = default!;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tresult = default!;\n\t\t\t\terror = Error;\n\t\t\t}\n\t\t\treturn Ok;\n\t\t}\n\n\t\t// Unwrapping\n\t\t[return: MaybeNull, NotNullIfNotNull(\"alt\")]\n\t\tpublic TSuccess OkOr([AllowNull] TSuccess alt) => Ok ? Value : alt;\n\n\t\tpublic TSuccess Unwrap() => Ok ? Value : throw new InvalidOperationException(\"Called upwrap on error\");\n\n\t\t// Downwrapping\n\t\tpublic E<TError> OnlyError() => new E<TError>(isError, Error);\n\t\tpublic static implicit operator E<TError>(R<TSuccess, TError> result) => result.OnlyError();\n\n\t\tpublic R<T, TError> Map<T>(Func<TSuccess, T> map) where T : notnull => Ok\n\t\t\t? new R<T, TError>(isError, map(Value), default!)\n\t\t\t: new R<T, TError>(isError, default!, Error);\n\t\tpublic R<TSuccess, T> MapError<T>(Func<TError, T> mapE) where T : notnull => Ok\n\t\t\t? new R<TSuccess, T>(isError, Value, default!)\n\t\t\t: new R<TSuccess, T>(isError, default!, mapE(Error));\n\t}\n\n\t/// <summary>\n\t/// Provides a safe alternative to Exceptions for error and result wrapping.\n\t/// This type represents either success or an error + error object.\n\t/// </summary>\n\t/// <typeparam name=\"TError\">The type of the error value.</typeparam>\n\t[DebuggerDisplay(\"{Ok ? \\\"Ok\\\" : (\\\"Err : \\\" + typeof(TError).Name), nq}\")]\n\tpublic readonly struct E<TError> where TError : notnull\n\t{\n\t\t/// <summary>Represents a successful state.</summary>\n\t\tpublic static E<TError> OkR { get; } = new E<TError>();\n\n\t\tprivate readonly bool isError;\n\t\tpublic bool Ok => !isError;\n\t\tpublic TError Error { get; }\n\n\t\tprivate E(TError error) { isError = true; if (error == null) throw new ArgumentNullException(nameof(error), \"Error must not be null.\"); Error = error; }\n\t\tinternal E(bool isError, TError error) { this.isError = isError; Error = error; } // No null check here, we already check cosistently.\n\n\t\t/// <summary>Creates a new failed result with a error object.</summary>\n\t\t/// <param name=\"error\">The error object.</param>\n\t\tpublic static E<TError> Err(TError error) => new E<TError>(error);\n\n\t\tpublic static implicit operator bool(E<TError> result) => result.Ok;\n\t\tpublic static implicit operator TError(E<TError> result) => result.Error;\n\n\t\tpublic static implicit operator E<TError>(TError result) => new E<TError>(result);\n\n\t\t// Fluent get\n\t\tpublic bool GetOk([MaybeNullWhen(true)] out TError error)\n\t\t{\n\t\t\tif (Ok)\n\t\t\t\terror = default!;\n\t\t\telse\n\t\t\t\terror = Error;\n\t\t\treturn Ok;\n\t\t}\n\n\t\t// Convenience casting\n\t\tpublic static implicit operator E<TError>(_Ok _) => OkR;\n\n\t\t// Unwrapping\n\t\tpublic void Unwrap() { if (!Ok) throw new InvalidOperationException(\"Called upwrap on error\"); }\n\n\t\t// Upwrapping\n\t\t/// <summary>\n\t\t/// Adds a success value to the result.\n\t\t/// This will not change the success state of the result.\n\t\t/// Therefore the value may only be null when the state is an error.\n\t\t/// </summary>\n\t\t/// <param name=\"value\">The success value. Can be null when the current state is an error.</param>\n\t\t/// <returns>A new combined result.</returns>\n\t\tpublic R<TSuccess, TError> WithValue<TSuccess>(TSuccess value) where TSuccess : notnull\n\t\t{\n\t\t\tif (!isError && value == null) throw new ArgumentNullException(nameof(value), \"Value must not be null.\");\n\t\t\treturn new R<TSuccess, TError>(isError, value, Error);\n\t\t}\n\t}\n\n\tpublic static class RExtensions\n\t{\n\t\tpublic static R<TSuccess, TError> Flat<TSuccess, TError>(this R<R<TSuccess, TError>, TError> boxedR) where TSuccess : notnull where TError : notnull\n\t\t{\n\t\t\tif (!boxedR.Ok)\n\t\t\t\treturn boxedR.Error;\n\t\t\treturn boxedR.Value;\n\t\t}\n\n\t\tpublic static E<TError> Flat<TError>(this R<E<TError>, TError> boxedR) where TError : notnull\n\t\t{\n\t\t\tif (!boxedR.Ok)\n\t\t\t\treturn boxedR.Error;\n\t\t\treturn boxedR.Value;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/SpanExtensions.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Helper\n{\n\tpublic static class SpanExtensions\n\t{\n\t\tpublic static string NewUtf8String(this ReadOnlySpan<byte> span)\n\t\t{\n#if NETSTANDARD2_1 || NETCOREAPP3_1\n\t\t\treturn Tools.Utf8Encoder.GetString(span);\n#else\n\t\t\treturn Tools.Utf8Encoder.GetString(span.ToArray());\n#endif\n\t\t}\n\n\t\tpublic static string NewUtf8String(this Span<byte> span) => ((ReadOnlySpan<byte>)span).NewUtf8String();\n\n\t\tpublic static ReadOnlySpan<byte> Trim(this ReadOnlySpan<byte> span, byte elem) => span.TrimStart(elem).TrimEnd(elem);\n\n\t\tpublic static ReadOnlySpan<byte> TrimStart(this ReadOnlySpan<byte> span, byte elem)\n\t\t{\n\t\t\tint start = 0;\n\t\t\tfor (; start < span.Length; start++)\n\t\t\t{\n\t\t\t\tif (span[start] != elem)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn span.Slice(start);\n\t\t}\n\n\t\tpublic static ReadOnlySpan<byte> TrimEnd(this ReadOnlySpan<byte> span, byte elem)\n\t\t{\n\t\t\tint end = span.Length - 1;\n\t\t\tfor (; end >= 0; end--)\n\t\t\t{\n\t\t\t\tif (span[end] != elem)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn span.Slice(0, end + 1);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/SpanSplitter.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Runtime.CompilerServices;\n\nnamespace TSLib.Helper\n{\n\tinternal struct SpanSplitter<T> where T : IEquatable<T>\n\t{\n\t\tpublic bool HasNext => NextIndex >= 0;\n\t\tpublic int NextIndex { get; private set; }\n\t\tprivate T splitchar;\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic void First(in ReadOnlySpan<T> span, T split)\n\t\t{\n\t\t\tsplitchar = split;\n\t\t\tNextIndex = span.IndexOf(split);\n\t\t}\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic ReadOnlySpan<T> Next(in ReadOnlySpan<T> current)\n\t\t{\n\t\t\tif (!HasNext)\n\t\t\t\tthrow new InvalidOperationException(\"No next element in span split\");\n\t\t\tvar ret = current.Slice(NextIndex + 1);\n\t\t\tNextIndex = ret.IndexOf(splitchar);\n\t\t\treturn ret;\n\t\t}\n\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic ReadOnlySpan<T> Trim(in ReadOnlySpan<T> current) => HasNext ? current.Slice(0, NextIndex) : current;\n\t}\n}\n"
  },
  {
    "path": "TSLib/Helper/Tools.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace TSLib.Helper\n{\n\tpublic static class Tools\n\t{\n\t\tpublic static bool IsLinux\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar p = (int)Environment.OSVersion.Platform;\n\t\t\t\treturn p == 4 || p == 6 || p == 128;\n\t\t\t}\n\t\t}\n\n\t\tpublic static IEnumerable<Enum> GetFlags(this Enum input) => Enum.GetValues(input.GetType()).Cast<Enum>().Where(input.HasFlag);\n\n\t\t// Encoding\n\n\t\tpublic static Encoding Utf8Encoder { get; } = new UTF8Encoding(false, false);\n\n\t\t// Time\n\n\t\tpublic static readonly DateTime UnixTimeStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);\n\n\t\tpublic static uint ToUnix(this DateTime dateTime) => (uint)(dateTime - UnixTimeStart).TotalSeconds;\n\n\t\tpublic static DateTime FromUnix(uint unixTimestamp) => UnixTimeStart.AddSeconds(unixTimestamp);\n\n\t\tpublic static uint UnixNow => (uint)(DateTime.UtcNow - UnixTimeStart).TotalSeconds;\n\n\t\tpublic static DateTime Now => DateTime.UtcNow;\n\n\t\t// Random\n\n\t\tpublic static Random Random { get; } = new Random();\n\n\t\tpublic static T PickRandom<T>(IReadOnlyList<T> collection)\n\t\t{\n\t\t\tint pick = Random.Next(0, collection.Count);\n\t\t\treturn collection[pick];\n\t\t}\n\n\t\t// Math\n\n\t\tpublic static TimeSpan Min(this TimeSpan a, TimeSpan b) => a < b ? a : b;\n\t\tpublic static TimeSpan Max(this TimeSpan a, TimeSpan b) => a > b ? a : b;\n\n\t\tpublic static int MathMod(int x, int mod) => (x % mod + mod) % mod;\n\n\t\tpublic static float Clamp(float value, float min, float max) => Math.Min(Math.Max(value, min), max);\n\t\tpublic static int Clamp(int value, int min, int max) => Math.Min(Math.Max(value, min), max);\n\n\t\t// Generic\n\n\t\tpublic static void SetLogId(Id id) => SetLogId(id.ToString());\n\t\tpublic static void SetLogId(string id) => NLog.MappedDiagnosticsLogicalContext.Set(\"BotId\", id);\n\n\t\tpublic static Exception UnhandledDefault<T>(T value) where T : struct { return new MissingEnumCaseException(typeof(T).Name, value.ToString() ?? string.Empty); }\n\t}\n}\n"
  },
  {
    "path": "TSLib/LazyNotification.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TSLib.Messages;\n\nnamespace TSLib\n{\n\tpublic readonly struct LazyNotification\n\t{\n\t\tpublic readonly INotification[] Notifications;\n\t\tpublic readonly NotificationType NotifyType;\n\n\t\tpublic LazyNotification(INotification[] notifications, NotificationType notifyType)\n\t\t{\n\t\t\tNotifications = notifications;\n\t\t\tNotifyType = notifyType;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/MessageProcessor.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing TSLib.Helper;\nusing TSLib.Messages;\n\nnamespace TSLib\n{\n\tinternal abstract class BaseMessageProcessor\n\t{\n\t\tprotected static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprotected readonly List<WaitBlock>[] dependingBlocks;\n\t\tprivate readonly Func<string, NotificationType> findTypeOfNotification;\n\t\tpublic Deserializer Deserializer { get; } = new Deserializer();\n\n\t\tprotected ReadOnlyMemory<byte>? cmdLineBuffer;\n\t\tprivate const byte AsciiSpace = (byte)' ';\n\n\t\tprotected BaseMessageProcessor(Func<string, NotificationType> findTypeOfNotification)\n\t\t{\n\t\t\tdependingBlocks = new List<WaitBlock>[Enum.GetValues(typeof(NotificationType)).Length];\n\t\t\tthis.findTypeOfNotification = findTypeOfNotification;\n\t\t}\n\n\t\tpublic LazyNotification? PushMessage(ReadOnlyMemory<byte> message)\n\t\t{\n\t\t\tvar msgSpan = message.Span;\n\t\t\tstring notifyname;\n\t\t\tint splitindex = msgSpan.IndexOf(AsciiSpace);\n\t\t\tif (splitindex < 0)\n\t\t\t\tnotifyname = msgSpan.TrimEnd(AsciiSpace).NewUtf8String();\n\t\t\telse\n\t\t\t\tnotifyname = msgSpan.Slice(0, splitindex).NewUtf8String();\n\n\t\t\tbool hasEqual = notifyname.IndexOf('=') >= 0;\n\t\t\tNotificationType ntfyType;\n\t\t\tif (hasEqual || (ntfyType = findTypeOfNotification(notifyname)) == NotificationType.Unknown)\n\t\t\t{\n\t\t\t\tif (!hasEqual)\n\t\t\t\t\tLog.Debug(\"Maybe unknown notification: {0}\", notifyname);\n\t\t\t\tcmdLineBuffer = message;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tvar lineDataPart = splitindex < 0 ? ReadOnlySpan<byte>.Empty : msgSpan.Slice(splitindex);\n\n\t\t\t// if it's not an error it is a notification\n\t\t\tif (ntfyType != NotificationType.CommandError)\n\t\t\t{\n\t\t\t\tvar notification = Deserializer.GenerateNotification(lineDataPart, ntfyType);\n\t\t\t\tif (notification is null)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(\"Got unparsable message. ({0})\", msgSpan.NewUtf8String());\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tvar lazyNotification = new LazyNotification(notification, ntfyType);\n\t\t\t\tvar dependantList = dependingBlocks[(int)ntfyType];\n\t\t\t\tif (dependantList != null)\n\t\t\t\t{\n\t\t\t\t\tforeach (var item in dependantList)\n\t\t\t\t\t{\n\t\t\t\t\t\titem.SetNotification(lazyNotification);\n\t\t\t\t\t\tif (item.DependsOn != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach (var otherDepType in item.DependsOn)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (otherDepType == ntfyType)\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\tdependingBlocks[(int)otherDepType]?.Remove(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdependantList.Clear();\n\t\t\t\t}\n\n\t\t\t\treturn lazyNotification;\n\t\t\t}\n\n\t\t\tvar result = Deserializer.GenerateSingleNotification(lineDataPart, NotificationType.CommandError);\n\t\t\tvar errorStatus = result is null ? CommandError.Custom(\"Invalid Error code\") : (CommandError)result;\n\n\t\t\treturn PushMessageInternal(errorStatus, ntfyType);\n\t\t}\n\n\t\tprotected abstract LazyNotification? PushMessageInternal(CommandError errorStatus, NotificationType ntfyType);\n\n\t\tpublic abstract void DropQueue();\n\t}\n\n\tinternal sealed class AsyncMessageProcessor : BaseMessageProcessor\n\t{\n\t\tprivate readonly Dictionary<string, WaitBlock> requestDict;\n\n\t\tpublic AsyncMessageProcessor(Func<string, NotificationType> findTypeOfNotification) : base(findTypeOfNotification)\n\t\t{\n\t\t\trequestDict = new Dictionary<string, WaitBlock>();\n\t\t}\n\n\t\tprotected override LazyNotification? PushMessageInternal(CommandError errorStatus, NotificationType ntfyType)\n\t\t{\n\t\t\tif (errorStatus.ReturnCode is null)\n\t\t\t{\n\t\t\t\treturn new LazyNotification(new[] { errorStatus }, ntfyType);\n\t\t\t}\n\n\t\t\t// otherwise it is the result status code to a request\n\t\t\tif (requestDict.Remove(errorStatus.ReturnCode, out var waitBlock))\n\t\t\t{\n\t\t\t\twaitBlock.SetAnswerAuto(errorStatus, cmdLineBuffer);\n\t\t\t\tcmdLineBuffer = null;\n\t\t\t}\n\t\t\telse { /* ??? */ }\n\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic void EnqueueRequest(string returnCode, WaitBlock waitBlock)\n\t\t{\n\t\t\trequestDict.Add(returnCode, waitBlock);\n\t\t\tif (waitBlock.DependsOn != null)\n\t\t\t{\n\t\t\t\tforeach (var dependantType in waitBlock.DependsOn)\n\t\t\t\t{\n\t\t\t\t\tvar depentantList = dependingBlocks[(int)dependantType];\n\t\t\t\t\tif (depentantList is null)\n\t\t\t\t\t\tdependingBlocks[(int)dependantType] = depentantList = new List<WaitBlock>();\n\n\t\t\t\t\tdepentantList.Add(waitBlock);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic override void DropQueue()\n\t\t{\n\t\t\tforeach (var wb in requestDict.Values)\n\t\t\t\twb.SetError(CommandError.ConnectionClosed);\n\t\t\trequestDict.Clear();\n\n\t\t\tforeach (var block in dependingBlocks)\n\t\t\t{\n\t\t\t\tblock?.ForEach(wb => wb.SetError(CommandError.ConnectionClosed));\n\t\t\t\tblock?.Clear();\n\t\t\t}\n\t\t}\n\t}\n\n\tinternal sealed class SyncMessageProcessor : BaseMessageProcessor\n\t{\n\t\tprivate readonly ConcurrentQueue<WaitBlock> requestQueue;\n\n\t\tpublic SyncMessageProcessor(Func<string, NotificationType> findTypeOfNotification) : base(findTypeOfNotification)\n\t\t{\n\t\t\trequestQueue = new ConcurrentQueue<WaitBlock>();\n\t\t}\n\n\t\tprotected override LazyNotification? PushMessageInternal(CommandError errorStatus, NotificationType ntfyType)\n\t\t{\n\t\t\tif (!requestQueue.IsEmpty && requestQueue.TryDequeue(out var waitBlock))\n\t\t\t{\n\t\t\t\twaitBlock.SetAnswerAuto(errorStatus, cmdLineBuffer);\n\t\t\t\tcmdLineBuffer = null;\n\t\t\t}\n\t\t\telse { /* ??? */ }\n\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic void EnqueueRequest(WaitBlock waitBlock)\n\t\t{\n\t\t\trequestQueue.Enqueue(waitBlock);\n\t\t}\n\n\t\tpublic override void DropQueue()\n\t\t{\n\t\t\twhile (!requestQueue.IsEmpty && requestQueue.TryDequeue(out var waitBlock))\n\t\t\t\twaitBlock.SetError(CommandError.ConnectionClosed);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Messages/BaseTypes.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace TSLib.Messages\n{\n\tpublic interface IMessage\n\t{\n\t\tvoid SetField(string name, ReadOnlySpan<byte> value, Deserializer ser);\n\t\tvoid Expand(IMessage[] to, IEnumerable<string> flds);\n\t}\n\n\tpublic interface INotification : IMessage\n\t{\n\t\tNotificationType NotifyType { get; }\n\t}\n\n\tpublic interface IResponse : IMessage\n\t{\n\t\tstring? ReturnCode { get; set; }\n\t}\n}\n"
  },
  {
    "path": "TSLib/Messages/Deserializer.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing TSLib.Helper;\n\nnamespace TSLib.Messages\n{\n\tpublic class Deserializer\n\t{\n\t\tprotected static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tpublic IPermissionTransform PermissionTransform { get; set; } = DummyPermissionTransform.Instance;\n\n\t\tprivate const byte AsciiSpace = (byte)' ';\n\t\tprivate const byte AsciiPipe = (byte)'|';\n\t\tprivate const byte AsciiEquals = (byte)'=';\n\n\t\t// data to notification\n\t\tpublic INotification[]? GenerateNotification(ReadOnlySpan<byte> line, NotificationType ntfyType)\n\t\t{\n\t\t\tif (ntfyType == NotificationType.Unknown)\n\t\t\t\tthrow new ArgumentException(\"The NotificationType must not be unknown\", nameof(ntfyType));\n\n\t\t\tvar pipes = PipeList(line);\n\t\t\tvar arr = MessageHelper.InstatiateNotificationArray(ntfyType, (pipes?.Count ?? 0) + 1);\n\t\t\treturn Dersialize(arr, line, pipes);\n\t\t}\n\n\t\tpublic INotification? GenerateSingleNotification(ReadOnlySpan<byte> line, NotificationType ntfyType)\n\t\t{\n\t\t\tif (line.IsEmpty)\n\t\t\t\tthrow new ArgumentNullException(nameof(line));\n\n\t\t\tvar result = GenerateNotification(line, ntfyType);\n\t\t\tif (result is null || result.Length == 0)\n\t\t\t\treturn null;\n\t\t\treturn result[0];\n\t\t}\n\n\t\tprivate static List<int>? PipeList(ReadOnlySpan<byte> line)\n\t\t{\n\t\t\tList<int>? pipes = null;\n\t\t\tfor (int i = 0; i < line.Length; i++)\n\t\t\t\tif (line[i] == AsciiPipe)\n\t\t\t\t\t(pipes ??= new List<int>()).Add(i);\n\t\t\treturn pipes;\n\t\t}\n\n\t\tprivate T[]? Dersialize<T>(T[] arr, ReadOnlySpan<byte> line, List<int>? pipes) where T : IMessage\n\t\t{\n\t\t\tif (pipes is null || pipes.Count == 0)\n\t\t\t{\n\t\t\t\tif (!ParseKeyValueLine(arr[0], line, null, null))\n\t\t\t\t\treturn null;\n\t\t\t\treturn arr;\n\t\t\t}\n\n\t\t\tvar arrItems = new HashSet<string>();\n\t\t\tvar single = new List<string>();\n\n\t\t\tif (!ParseKeyValueLine(arr[^1], line.Slice(pipes[^1] + 1).Trim(AsciiSpace), arrItems, null))\n\t\t\t\treturn null;\n\n\t\t\tfor (int i = 0; i < pipes.Count - 1; i++)\n\t\t\t{\n\t\t\t\tif (!ParseKeyValueLine(arr[i + 1], line.Slice(pipes[i] + 1, pipes[i + 1] - pipes[i] - 1), arrItems, null))\n\t\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// trim with the first one\n\t\t\tif (!ParseKeyValueLine(arr[0], line.Slice(0, pipes[0]), arrItems, single))\n\t\t\t\treturn null;\n\n\t\t\tif (arrItems.Count > 0)\n\t\t\t{\n\t\t\t\tarr[0].Expand((IMessage[])(object)arr, single);\n\t\t\t}\n\t\t\treturn arr;\n\t\t}\n\n\t\t// data to response\n\t\tpublic T[]? GenerateResponse<T>(ReadOnlySpan<byte> line) where T : IResponse, new()\n\t\t{\n\t\t\tif (line.IsEmpty)\n\t\t\t\treturn Array.Empty<T>();\n\n\t\t\tvar pipes = PipeList(line);\n\t\t\tvar arr = new T[(pipes?.Count ?? 0) + 1];\n\t\t\tfor (int i = 0; i < arr.Length; i++)\n\t\t\t\tarr[i] = new T();\n\t\t\treturn Dersialize(arr, line, pipes);\n\t\t}\n\n\t\tprivate bool ParseKeyValueLine(IMessage qm, ReadOnlySpan<byte> line, HashSet<string>? indexing, List<string>? single)\n\t\t{\n\t\t\tif (line.IsEmpty)\n\t\t\t\treturn true;\n\n\t\t\tvar ss = new SpanSplitter<byte>();\n\t\t\tss.First(line, AsciiSpace);\n\t\t\tvar key = ReadOnlySpan<byte>.Empty;\n\t\t\tvar value = ReadOnlySpan<byte>.Empty;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tvar param = ss.Trim(line);\n\t\t\t\t\tvar kvpSplitIndex = param.IndexOf(AsciiEquals);\n\t\t\t\t\tkey = kvpSplitIndex >= 0 ? param.Slice(0, kvpSplitIndex) : ReadOnlySpan<byte>.Empty;\n\t\t\t\t\tvalue = kvpSplitIndex <= param.Length - 1 ? param.Slice(kvpSplitIndex + 1) : ReadOnlySpan<byte>.Empty;\n\n\t\t\t\t\tif (!key.IsEmpty)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar keyStr = key.NewUtf8String();\n\t\t\t\t\t\tqm.SetField(keyStr, value, this);\n\t\t\t\t\t\tif (indexing != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (single is null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tindexing.Add(keyStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!indexing.Contains(keyStr))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsingle.Add(keyStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tindexing = null;\n\t\t\t\t\t\t\t\tsingle = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!ss.HasNext)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tline = ss.Next(line);\n\t\t\t\t} while (line.Length > 0);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Deserialization format error. Data: class:{0} field:{1} value:{2} msg:{3}\", qm.GetType().Name, key.NewUtf8String(), value.NewUtf8String(), line.NewUtf8String());\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Messages/MessageAdditions.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nnamespace TSLib.Messages\n{\n\tpublic interface IChannelCreateResponse\n\t{\n\t\tChannelId ChannelId { get; set; }\n\t}\n\n\tpartial class ChannelCreateResponse : IChannelCreateResponse { }\n\n\tpartial class ChannelCreated : IChannelCreateResponse { }\n}\n"
  },
  {
    "path": "TSLib/Messages/PermissionTransform.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Messages\n{\n\tpublic interface IPermissionTransform\n\t{\n\t\tushort GetId(TsPermission name);\n\t\tTsPermission GetName(ushort id);\n\t}\n\n\tpublic class DummyPermissionTransform : IPermissionTransform\n\t{\n\t\tpublic static readonly IPermissionTransform Instance = new DummyPermissionTransform();\n\n\t\tpublic ushort GetId(TsPermission name) => 0;\n\t\tpublic TsPermission GetName(ushort id) => TsPermission.undefined;\n\t}\n\n\tpublic class TablePermissionTransform : IPermissionTransform\n\t{\n\t\tprivate readonly TsPermission[] nameTable;\n\t\tprivate readonly ushort[] idTable;\n\n\t\tpublic TablePermissionTransform(TsPermission[] nameTable)\n\t\t{\n\t\t\tthis.nameTable = nameTable;\n\t\t\tidTable = new ushort[Enum.GetValues(typeof(TsPermission)).Length];\n\t\t\tfor (ushort i = 0; i < nameTable.Length; i++)\n\t\t\t{\n\t\t\t\tidTable[(int)nameTable[i]] = i;\n\t\t\t}\n\t\t}\n\n\t\tpublic ushort GetId(TsPermission name) => (int)name < idTable.Length ? idTable[(int)name] : (ushort)0;\n\t\tpublic TsPermission GetName(ushort id) => id < nameTable.Length ? nameTable[id] : TsPermission.undefined;\n\t}\n}\n"
  },
  {
    "path": "TSLib/Messages/ResponseDictionary.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing TSLib.Helper;\nusing KeyType = System.String;\nusing ValueType = System.String;\n\nnamespace TSLib.Messages\n{\n\tpublic class ResponseDictionary : IDictionary<KeyType, ValueType>, IResponse\n\t{\n\t\tprivate readonly IDictionary<KeyType, ValueType> data;\n\n\t\tpublic ResponseDictionary() { data = new Dictionary<KeyType, ValueType>(); }\n\t\tpublic ResponseDictionary(IDictionary<KeyType, ValueType> dataDict) { data = dataDict; }\n\n\t\tpublic ValueType this[KeyType key]\n\t\t{\n\t\t\tget => data[key];\n\t\t\tset => throw new NotSupportedException();\n\t\t}\n\t\tpublic int Count => data.Count;\n\t\tpublic bool IsReadOnly => true;\n\t\tpublic ICollection<KeyType> Keys => data.Keys;\n\t\tpublic ICollection<ValueType> Values => data.Values;\n\t\tpublic void Add(KeyValuePair<KeyType, ValueType> item) { throw new NotSupportedException(); }\n\t\tpublic void Add(KeyType key, ValueType value) { throw new NotSupportedException(); }\n\t\tpublic void Clear() { throw new NotSupportedException(); }\n\t\tpublic bool Contains(KeyValuePair<KeyType, ValueType> item) => data.Contains(item);\n\t\tpublic bool ContainsKey(string key) => data.ContainsKey(key);\n\t\tpublic void CopyTo(KeyValuePair<KeyType, ValueType>[] array, int arrayIndex) => data.CopyTo(array, arrayIndex);\n\t\tpublic IEnumerator<KeyValuePair<KeyType, ValueType>> GetEnumerator() => data.GetEnumerator();\n\t\tpublic bool Remove(KeyValuePair<KeyType, ValueType> item) { throw new NotSupportedException(); }\n\t\tpublic bool Remove(KeyType key) { throw new NotSupportedException(); }\n\t\tpublic bool TryGetValue(KeyType key, [MaybeNullWhen(false)] out ValueType value) => data.TryGetValue(key, out value!);\n\t\tIEnumerator IEnumerable.GetEnumerator() => data.GetEnumerator();\n\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser) => data[name] = value.NewUtf8String();\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds)\n\t\t{\n\t\t\tforeach (var fld in flds)\n\t\t\t{\n\t\t\t\tif (TryGetValue(fld, out var fldval))\n\t\t\t\t{\n\t\t\t\t\tforeach (var toi in (ResponseDictionary[])to)\n\t\t\t\t\t{\n\t\t\t\t\t\ttoi.data[fld] = fldval;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpublic string? ReturnCode\n\t\t{\n\t\t\tget => data.ContainsKey(\"return_code\") ? data[\"return_code\"] : string.Empty;\n\t\t\tset => data[\"return_code\"] = value!;\n\t\t}\n\t}\n\n\tpublic sealed class ResponseVoid : IResponse\n\t{\n\t\tpublic string? ReturnCode { get => null; set { } }\n\t\tpublic void SetField(string name, ReadOnlySpan<byte> value, Deserializer ser) { }\n\t\tpublic void Expand(IMessage[] to, IEnumerable<string> flds) { }\n\t}\n}\n"
  },
  {
    "path": "TSLib/Properties.cs",
    "content": "using System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"TS3ABotUnitTests\")]\n"
  },
  {
    "path": "TSLib/Query/TsQueryClient.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Buffers;\nusing System.IO;\nusing System.IO.Pipelines;\nusing System.Net.Sockets;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TSLib.Commands;\nusing TSLib.Full.Book;\nusing TSLib.Helper;\nusing TSLib.Messages;\nusing CmdR = System.Threading.Tasks.Task<System.E<TSLib.Messages.CommandError>>;\n\nnamespace TSLib.Query\n{\n\tpublic sealed partial class TsQueryClient : TsBaseFunctions\n\t{\n\t\tprivate readonly object sendQueueLock = new object();\n\t\tprivate readonly TcpClient tcpClient;\n\t\tprivate StreamReader? tcpReader;\n\t\tprivate StreamWriter? tcpWriter;\n\t\tprivate CancellationTokenSource? cts;\n\t\tprivate readonly SyncMessageProcessor msgProc;\n\t\tprivate readonly IEventDispatcher dispatcher;\n\t\tprivate readonly Pipe dataPipe = new Pipe();\n\n\t\tpublic override ClientType ClientType => ClientType.Query;\n\t\tpublic override bool Connected => tcpClient.Connected;\n\t\tprivate bool connecting;\n\t\tpublic override bool Connecting => connecting && !Connected;\n\t\tprotected override Deserializer Deserializer => msgProc.Deserializer;\n\n\t\tpublic override event EventHandler<DisconnectEventArgs>? OnDisconnected;\n\n\t\tpublic TsQueryClient()\n\t\t{\n\t\t\tconnecting = false;\n\t\t\ttcpClient = new TcpClient();\n\t\t\tmsgProc = new SyncMessageProcessor(MessageHelper.GetToClientNotificationType);\n\t\t\tdispatcher = new ExtraThreadEventDispatcher();\n\t\t}\n\n\t\tpublic override async CmdR Connect(ConnectionData conData)\n\t\t{\n\t\t\tremoteAddress = await TsDnsResolver.TryResolve(conData.Address, TsDnsResolver.TsQueryDefaultPort);\n\t\t\tif (remoteAddress is null)\n\t\t\t\treturn CommandError.Custom(\"Could not read or resolve address.\");\n\n\t\t\tNetworkStream tcpStream;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tconnecting = true;\n\n\t\t\t\tawait tcpClient.ConnectAsync(remoteAddress.Address, remoteAddress.Port);\n\n\t\t\t\tConnectionData = conData;\n\n\t\t\t\ttcpStream = tcpClient.GetStream();\n\t\t\t\ttcpReader = new StreamReader(tcpStream, Tools.Utf8Encoder);\n\t\t\t\ttcpWriter = new StreamWriter(tcpStream, Tools.Utf8Encoder) { NewLine = \"\\n\" };\n\n\t\t\t\tif (await tcpReader.ReadLineAsync() != \"TS3\")\n\t\t\t\t\treturn CommandError.Custom(\"Protocol violation. The stream must start with 'TS3'\");\n\t\t\t\tif (string.IsNullOrEmpty(await tcpReader.ReadLineAsync()))\n\t\t\t\t\tawait tcpReader.ReadLineAsync();\n\t\t\t}\n\t\t\tcatch (SocketException ex) { return CommandError.Custom(\"Could not connect: \" + ex.Message); }\n\t\t\tfinally { connecting = false; }\n\n\t\t\tcts = new CancellationTokenSource();\n\t\t\tdispatcher.Init(InvokeEvent, conData.LogId);\n\t\t\t_ = NetworkLoop(tcpStream, cts.Token);\n\t\t\treturn R.Ok;\n\t\t}\n\n\t\tpublic override Task Disconnect()\n\t\t{\n\t\t\tlock (sendQueueLock)\n\t\t\t{\n\t\t\t\tSendRaw(\"quit\");\n\t\t\t\tcts?.Cancel();\n\t\t\t\tcts = null;\n\t\t\t\tif (tcpClient.Connected)\n\t\t\t\t\ttcpClient.Dispose();\n\t\t\t}\n\t\t\treturn Task.CompletedTask;\n\t\t}\n\n\t\tprivate async Task NetworkLoop(NetworkStream tcpStream, CancellationToken cancellationToken)\n\t\t{\n\t\t\tawait Task.WhenAll(NetworkToPipeLoopAsync(tcpStream, dataPipe.Writer, cancellationToken), PipeProcessorAsync(dataPipe.Reader, cancellationToken));\n\t\t\tOnDisconnected?.Invoke(this, new DisconnectEventArgs(Reason.LeftServer));\n\t\t}\n\n\t\tprivate async Task NetworkToPipeLoopAsync(NetworkStream stream, PipeWriter writer, CancellationToken cancellationToken = default)\n\t\t{\n\t\t\tconst int minimumBufferSize = 4096;\n#if !(NETSTANDARD2_1 || NETCOREAPP3_1)\n\t\t\tvar dataReadBuffer = new byte[minimumBufferSize];\n#endif\n\n\t\t\twhile (!cancellationToken.IsCancellationRequested)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tvar mem = writer.GetMemory(minimumBufferSize);\n#if NETSTANDARD2_1 || NETCOREAPP3_1\n\t\t\t\t\tint bytesRead = await stream.ReadAsync(mem, cancellationToken);\n#else\n\t\t\t\t\tint bytesRead = await stream.ReadAsync(dataReadBuffer, 0, dataReadBuffer.Length, cancellationToken);\n\t\t\t\t\tdataReadBuffer.CopyTo(mem);\n#endif\n\t\t\t\t\tif (bytesRead == 0)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\twriter.Advance(bytesRead);\n\t\t\t\t}\n\t\t\t\tcatch (IOException) { break; }\n\n\t\t\t\tvar result = await writer.FlushAsync(cancellationToken);\n\t\t\t\tif (result.IsCompleted || result.IsCanceled)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tawait writer.CompleteAsync();\n\t\t}\n\n\t\tprivate async Task PipeProcessorAsync(PipeReader reader, CancellationToken cancelationToken = default)\n\t\t{\n\t\t\twhile (!cancelationToken.IsCancellationRequested)\n\t\t\t{\n\t\t\t\tvar result = await reader.ReadAsync(cancelationToken);\n\n\t\t\t\tvar buffer = result.Buffer;\n\t\t\t\tSequencePosition? position;\n\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tposition = buffer.PositionOf((byte)'\\n');\n\n\t\t\t\t\tif (position != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar notif = msgProc.PushMessage(buffer.Slice(0, position.Value).ToArray());\n\t\t\t\t\t\tif (notif.HasValue)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdispatcher.Invoke(notif.Value);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// +2 = skipping \\n\\r\n\t\t\t\t\t\tbuffer = buffer.Slice(buffer.GetPosition(2, position.Value));\n\t\t\t\t\t}\n\t\t\t\t} while (position != null);\n\n\t\t\t\treader.AdvanceTo(buffer.Start, buffer.End);\n\t\t\t\tif (result.IsCompleted || result.IsCanceled)\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tawait reader.CompleteAsync();\n\t\t}\n\n\t\tpublic override Task<R<T[], CommandError>> Send<T>(TsCommand com)\n\t\t{\n\t\t\tusing var wb = new WaitBlock(msgProc.Deserializer);\n\t\t\tlock (sendQueueLock)\n\t\t\t{\n\t\t\t\tmsgProc.EnqueueRequest(wb);\n\t\t\t\tSendRaw(com.ToString());\n\t\t\t}\n\n\t\t\treturn wb.WaitForMessageAsync<T>();\n\t\t}\n\n\t\tpublic override Task<R<T[], CommandError>> SendHybrid<T>(TsCommand com, NotificationType type)\n\t\t\t=> Send<T>(com);\n\n\t\tprivate void SendRaw(string data)\n\t\t{\n\t\t\tif (!tcpClient.Connected)\n\t\t\t\treturn;\n\t\t\ttcpWriter?.WriteLine(data);\n\t\t\ttcpWriter?.Flush();\n\t\t}\n\n\t\t#region QUERY SPECIFIC COMMANDS\n\n\t\tprivate static readonly string[] TargetTypeString = { \"(dummy)\", \"textprivate\", \"textchannel\", \"textserver\", \"channel\", \"server\" };\n\n\t\tpublic CmdR RegisterNotification(TextMessageTargetMode target)\n\t\t\t=> RegisterNotification(TargetTypeString[(int)target], null);\n\n\t\tpublic CmdR RegisterNotificationChannel(ChannelId? channel = null)\n\t\t\t=> RegisterNotification(TargetTypeString[(int)ReasonIdentifier.Channel], channel);\n\n\t\tpublic CmdR RegisterNotificationServer()\n\t\t\t=> RegisterNotification(TargetTypeString[(int)ReasonIdentifier.Server], null);\n\n\t\tprivate CmdR RegisterNotification(string target, ChannelId? channel)\n\t\t\t=> SendVoid(new TsCommand(\"servernotifyregister\") {\n\t\t\t\t{ \"event\", target },\n\t\t\t\t{ \"id\", channel },\n\t\t\t});\n\n\t\tpublic CmdR Login(string username, string password)\n\t\t\t=> SendVoid(new TsCommand(\"login\") {\n\t\t\t\t{ \"client_login_name\", username },\n\t\t\t\t{ \"client_login_password\", password },\n\t\t\t});\n\n\t\tpublic CmdR UseServer(int serverId)\n\t\t\t=> SendVoid(new TsCommand(\"use\") {\n\t\t\t\t{ \"sid\", serverId },\n\t\t\t});\n\n\t\tpublic CmdR UseServerPort(ushort port)\n\t\t\t=> SendVoid(new TsCommand(\"use\") {\n\t\t\t\t{ \"port\", port },\n\t\t\t});\n\n\t\t// Splitted base commands\n\n\t\tpublic override async Task<R<IChannelCreateResponse, CommandError>> ChannelCreate(string name,\n\t\t\tstring? namePhonetic = null, string? topic = null, string? description = null, string? password = null,\n\t\t\tCodec? codec = null, int? codecQuality = null, int? codecLatencyFactor = null, bool? codecEncrypted = null,\n\t\t\tint? maxClients = null, int? maxFamilyClients = null, bool? maxClientsUnlimited = null,\n\t\t\tbool? maxFamilyClientsUnlimited = null, bool? maxFamilyClientsInherited = null, ChannelId? order = null,\n\t\t\tChannelId? parent = null, ChannelType? type = null, TimeSpan? deleteDelay = null, int? neededTalkPower = null)\n\t\t{\n\t\t\tvar result = await Send<ChannelCreateResponse>(ChannelOp(\"channelcreate\", null, name, namePhonetic, topic, description,\n\t\t\t\tpassword, codec, codecQuality, codecLatencyFactor, codecEncrypted,\n\t\t\t\tmaxClients, maxFamilyClients, maxClientsUnlimited, maxFamilyClientsUnlimited,\n\t\t\t\tmaxFamilyClientsInherited, order, parent, type, deleteDelay, neededTalkPower));\n\t\t\treturn result.MapToSingle()\n\t\t\t\t.WrapInterface<ChannelCreateResponse, IChannelCreateResponse>();\n\t\t}\n\n\t\tpublic override Task<R<ServerGroupAddResponse, CommandError>> ServerGroupAdd(string name, GroupType? type = null)\n\t\t\t=> Send<ServerGroupAddResponse>(new TsCommand(\"servergroupadd\") {\n\t\t\t\t{ \"name\", name },\n\t\t\t\t{ \"type\", (int?)type }\n\t\t\t}).MapToSingle();\n\n\t\tpublic override Task<R<FileUpload, CommandError>> FileTransferInitUpload(ChannelId channelId, string path, string channelPassword,\n\t\t\tushort clientTransferId, long fileSize, bool overwrite, bool resume)\n\t\t\t=> Send<FileUpload>(new TsCommand(\"ftinitupload\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"name\", path },\n\t\t\t\t{ \"cpw\", channelPassword },\n\t\t\t\t{ \"clientftfid\", clientTransferId },\n\t\t\t\t{ \"size\", fileSize },\n\t\t\t\t{ \"overwrite\", overwrite },\n\t\t\t\t{ \"resume\", resume }\n\t\t\t}).MapToSingle();\n\n\t\tpublic override Task<R<FileDownload, CommandError>> FileTransferInitDownload(ChannelId channelId, string path, string channelPassword,\n\t\t\tushort clientTransferId, long seek)\n\t\t\t=> Send<FileDownload>(new TsCommand(\"ftinitdownload\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"name\", path },\n\t\t\t\t{ \"cpw\", channelPassword },\n\t\t\t\t{ \"clientftfid\", clientTransferId },\n\t\t\t\t{ \"seekpos\", seek }\n\t\t\t}).MapToSingle();\n\n\t\t#endregion\n\n\t\tpublic override void Dispose()\n\t\t{\n\t\t\tlock (sendQueueLock)\n\t\t\t{\n\t\t\t\ttcpWriter?.Dispose();\n\t\t\t\ttcpWriter = null;\n\t\t\t\ttcpReader?.Dispose();\n\t\t\t\ttcpReader = null;\n\t\t\t\tmsgProc.DropQueue();\n\t\t\t\tdispatcher.Dispose();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Query/TsQueryClient.gen.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nusing System;\nusing TSLib.Helper;\nusing TSLib.Messages;\n\n#nullable enable\nnamespace TSLib.Query\n{\n\tpartial class TsQueryClient\n\t{\n\t\t\n\t\tpublic override event NotifyEventHandler<ChannelChanged>? OnChannelChanged;\n\t\tpublic override event EventHandler<ChannelChanged>? OnEachChannelChanged;\n\t\tpublic override event NotifyEventHandler<ChannelCreated>? OnChannelCreated;\n\t\tpublic override event EventHandler<ChannelCreated>? OnEachChannelCreated;\n\t\tpublic override event NotifyEventHandler<ChannelDeleted>? OnChannelDeleted;\n\t\tpublic override event EventHandler<ChannelDeleted>? OnEachChannelDeleted;\n\t\tpublic override event NotifyEventHandler<ChannelEdited>? OnChannelEdited;\n\t\tpublic override event EventHandler<ChannelEdited>? OnEachChannelEdited;\n\t\tpublic override event NotifyEventHandler<ChannelMoved>? OnChannelMoved;\n\t\tpublic override event EventHandler<ChannelMoved>? OnEachChannelMoved;\n\t\tpublic override event NotifyEventHandler<ChannelPasswordChanged>? OnChannelPasswordChanged;\n\t\tpublic override event EventHandler<ChannelPasswordChanged>? OnEachChannelPasswordChanged;\n\t\tpublic override event NotifyEventHandler<ClientEnterView>? OnClientEnterView;\n\t\tpublic override event EventHandler<ClientEnterView>? OnEachClientEnterView;\n\t\tpublic override event NotifyEventHandler<ClientLeftView>? OnClientLeftView;\n\t\tpublic override event EventHandler<ClientLeftView>? OnEachClientLeftView;\n\t\tpublic override event NotifyEventHandler<ClientMoved>? OnClientMoved;\n\t\tpublic override event EventHandler<ClientMoved>? OnEachClientMoved;\n\t\tpublic override event NotifyEventHandler<ServerEdited>? OnServerEdited;\n\t\tpublic override event EventHandler<ServerEdited>? OnEachServerEdited;\n\t\tpublic override event NotifyEventHandler<TextMessage>? OnTextMessage;\n\t\tpublic override event EventHandler<TextMessage>? OnEachTextMessage;\n\t\tpublic override event NotifyEventHandler<TokenUsed>? OnTokenUsed;\n\t\tpublic override event EventHandler<TokenUsed>? OnEachTokenUsed;\n\n\n\t\tprivate void InvokeEvent(LazyNotification lazyNotification)\n\t\t{\n\t\t\tvar ntf = lazyNotification.Notifications;\n\t\t\tswitch (lazyNotification.NotifyType)\n\t\t\t{\n\t\t\t\n\t\t\tcase NotificationType.ChannelChanged: {\n\t\t\t\tvar ntfc = (ChannelChanged[])ntf;\n\t\t\t\tOnChannelChanged?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelChanged;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelCreated: {\n\t\t\t\tvar ntfc = (ChannelCreated[])ntf;\n\t\t\t\tOnChannelCreated?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelCreated;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelDeleted: {\n\t\t\t\tvar ntfc = (ChannelDeleted[])ntf;\n\t\t\t\tOnChannelDeleted?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelDeleted;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelEdited: {\n\t\t\t\tvar ntfc = (ChannelEdited[])ntf;\n\t\t\t\tOnChannelEdited?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelEdited;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelMoved: {\n\t\t\t\tvar ntfc = (ChannelMoved[])ntf;\n\t\t\t\tOnChannelMoved?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelMoved;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ChannelPasswordChanged: {\n\t\t\t\tvar ntfc = (ChannelPasswordChanged[])ntf;\n\t\t\t\tOnChannelPasswordChanged?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachChannelPasswordChanged;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientEnterView: {\n\t\t\t\tvar ntfc = (ClientEnterView[])ntf;\n\t\t\t\tOnClientEnterView?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientEnterView;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientLeftView: {\n\t\t\t\tvar ntfc = (ClientLeftView[])ntf;\n\t\t\t\tOnClientLeftView?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientLeftView;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ClientMoved: {\n\t\t\t\tvar ntfc = (ClientMoved[])ntf;\n\t\t\t\tOnClientMoved?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachClientMoved;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.ServerEdited: {\n\t\t\t\tvar ntfc = (ServerEdited[])ntf;\n\t\t\t\tOnServerEdited?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachServerEdited;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.TextMessage: {\n\t\t\t\tvar ntfc = (TextMessage[])ntf;\n\t\t\t\tOnTextMessage?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachTextMessage;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.TokenUsed: {\n\t\t\t\tvar ntfc = (TokenUsed[])ntf;\n\t\t\t\tOnTokenUsed?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEachTokenUsed;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcase NotificationType.CommandError: break;\n\t\t\tcase NotificationType.Unknown:\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(lazyNotification.NotifyType);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Query/TsQueryClient.gen.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"true\" hostSpecific=\"true\" language=\"C#\" #>\n<#@ include file=\"../Generated/M2BParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"../Generated/MessageParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"../Generated/BookParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"../Generated/NotificationUtil.ttinclude\" once=\"true\" #>\n<#@ output extension=\".cs\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n\nusing System;\nusing TSLib.Helper;\nusing TSLib.Messages;\n\n#nullable enable\nnamespace TSLib.Query\n{\n\tpartial class TsQueryClient\n\t{\n\t\t<#\n\t\tvar genbook = BookDeclarations.Parse(Host.ResolvePath(\"../Declarations/Book.toml\"));\n\t\tvar genmsg = Messages.Parse(Host.ResolvePath(\"../Declarations/Messages.toml\"));\n\t\tvar genm2b = M2BDeclarations.Parse(Host.ResolvePath(\"../Declarations/MessagesToBook.toml\"), genmsg, genbook);\n\t\t\n\t\tGenNtfyDecls(OnlyS2C(genmsg.NotifiesSorted).Where(ntfy => sharedNotifications.Contains(ntfy.name)));\n\t\t#>\n\n\t\tprivate void InvokeEvent(LazyNotification lazyNotification)\n\t\t{\n\t\t\tvar ntf = lazyNotification.Notifications;\n\t\t\tswitch (lazyNotification.NotifyType)\n\t\t\t{\n\t\t\t<#\n\t\t\tforeach(var ntfy in OnlyS2C(genmsg.NotifiesSorted))\n\t\t\t{\n\t\t\t\tif(!sharedNotifications.Contains(ntfy.name)) continue;\n\t\t\t#>\n\t\t\tcase NotificationType.<#= ntfy.name #>: {\n\t\t\t\tvar ntfc = (<#=ntfy.name #>[])ntf;\n\t\t\t\tOn<#= ntfy.name #>?.Invoke(this, ntfc);\n\t\t\t\tvar ev = OnEach<#= ntfy.name #>;\n\t\t\t\tforeach(var that in ntfc) {\n\t\t\t\t\tev?.Invoke(this, that);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t<#\n\t\t\t}\n\t\t\t#>\n\t\t\tcase NotificationType.CommandError: break;\n\t\t\tcase NotificationType.Unknown:\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(lazyNotification.NotifyType);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "TSLib/Scheduler/DedicatedTaskScheduler.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TSLib.Helper;\n\nnamespace TSLib.Scheduler\n{\n\tpublic sealed class DedicatedTaskScheduler : TaskScheduler, IDisposable\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate static readonly TimeSpan CombineTimerThreshold = TimeSpan.FromMilliseconds(10);\n\t\tprivate readonly TaskFactory factory;\n\t\tprivate readonly BlockingCollection<Task> queue = new BlockingCollection<Task>();\n\t\tprivate readonly HashSet<TickWorker> timers = new HashSet<TickWorker>();\n\t\tprivate readonly Thread thread;\n\t\tprivate readonly Id logId;\n\t\t// This is not a duraration but an instant from ticks\n\t\t// The TimeSpan class is used for calculation convenience\n\t\t// The values is used as a cache so we don't need to recheck the list on each loop\n\t\tprivate TimeSpan nextTimerDue = TimeSpan.MaxValue;\n\t\tprivate readonly Stopwatch monotoneClock = Stopwatch.StartNew();\n\t\tprivate bool IsOwnThread => Thread.CurrentThread == thread;\n#if DEBUG\n\t\tprivate readonly Stack<Task> taskStack = new Stack<Task>();\n\t\tprivate TimeSpan lastTaskCompleted = TimeSpan.MinValue;\n\t\tprivate readonly Stopwatch overallWatch = new Stopwatch();\n\t\tprivate TimeSpan actualRunningTime;\n#endif\n\t\tprivate DedicatedTaskScheduler()\n\t\t{\n\t\t\tfactory = new TaskFactory(this);\n\t\t\tthread = Thread.CurrentThread;\n\t\t}\n\n\t\tpublic DedicatedTaskScheduler(Id id)\n\t\t{\n\t\t\tfactory = new TaskFactory(this);\n\t\t\tthis.logId = id;\n\t\t\tthread = new Thread(DoWork)\n\t\t\t{\n\t\t\t\tName = DispatcherHelper.CreateDispatcherTitle(id)\n\t\t\t};\n\t\t\tthread.Start();\n\t\t}\n\n\t\tpublic static void FromCurrentThread(Action root)\n\t\t{\n\t\t\tvar dedi = new DedicatedTaskScheduler();\n\t\t\t_ = dedi.Invoke(root);\n\t\t\tdedi.DoWork();\n\t\t}\n\n\t\tprivate void DoWork()\n\t\t{\n\t\t\tTools.SetLogId(logId);\n\t\t\twhile (!queue.IsCompleted)\n\t\t\t{\n\t\t\t\tTimeSpan timeTillNextTimer = DispatchTimers();\n\n\t\t\t\tif (queue.TryTake(out var task, timeTillNextTimer))\n\t\t\t\t{\n\t\t\t\t\tif (task != Task.CompletedTask)\n\t\t\t\t\t{\n\t\t\t\t\t\tTryExecuteTaskInternal(task, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tLog.Debug(\"Finalizing TaskScheduler\");\n\t\t\tqueue.Dispose();\n\t\t\tLog.Debug(\"TaskScheduler closed\");\n\t\t}\n\n\t\tprivate TimeSpan DispatchTimers()\n\t\t{\n\t\t\tvar now = GetTimestamp();\n\t\t\tif (timers.Count == 0)\n\t\t\t{\n\t\t\t\tLog.ConditionalTrace(\"Quick return 1\");\n\t\t\t\tnextTimerDue = TimeSpan.MaxValue;\n\t\t\t\treturn Timeout.InfiniteTimeSpan;\n\t\t\t}\n\t\t\t// [Heuristic]\n\t\t\t// Problem: We don't want to recheck the list each time a new Task\n\t\t\t// is processed from the queue.\n\t\t\t// Idea: On very high load, when the queue is permanently full and\n\t\t\t//       the current cache is in 'inf' cache state starting timers\n\t\t\t//       will only add more load which won't be processed anyway.\n\t\t\t//       So we wait for that the queue is empty then we recheck.\n\t\t\t//       When we are not in 'inf' state we will just check like normal.\n\t\t\tif (queue.Count > 0 && now + CombineTimerThreshold < nextTimerDue && nextTimerDue != TimeSpan.MaxValue)\n\t\t\t{\n\t\t\t\tLog.ConditionalTrace(\"Quick return 2\");\n\t\t\t\treturn nextTimerDue - now;\n\t\t\t}\n\n\t\t\tLog.ConditionalTrace(\"Recalc\");\n\n\t\t\tvar timeTillNextTimer = TimeSpan.MaxValue;\n\t\t\tforeach (var timer in timers) // TODO might be modified\n\t\t\t{\n\t\t\t\tvar due = timer.Timestamp + timer.Interval;\n\t\t\t\tTimeSpan wait;\n\t\t\t\tif (due < now)\n\t\t\t\t{\n\t\t\t\t\t_ = Invoke(timer.Method);\n\t\t\t\t\ttimer.Timestamp = GetTimestamp();\n\t\t\t\t\twait = timer.Interval;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twait = due - now;\n\t\t\t\t}\n\n\t\t\t\tif (wait < timeTillNextTimer)\n\t\t\t\t{\n\t\t\t\t\ttimeTillNextTimer = wait;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tTrace.Assert(timeTillNextTimer != TimeSpan.MaxValue);\n\n\t\t\ttimeTillNextTimer = timeTillNextTimer.Max(CombineTimerThreshold);\n\t\t\tnextTimerDue = now + timeTillNextTimer;\n\t\t\treturn timeTillNextTimer;\n\t\t}\n\n\t\tprivate bool TryExecuteTaskInternal(Task task, bool inline)\n\t\t{\n#if DEBUG\n\t\t\tLogExecuteEnter(task, inline);\n#endif\n\t\t\tbool ok = TryExecuteTask(task);\n#if DEBUG\n\t\t\tLogExecuteExit(task);\n#endif\n\t\t\treturn ok;\n\t\t}\n\n#if DEBUG\n\t\tprivate void LogExecuteEnter(Task task, bool inline)\n\t\t{\n\t\t\tif (taskStack.Count == 0)\n\t\t\t{\n\t\t\t\toverallWatch.Restart();\n\t\t\t\tactualRunningTime = TimeSpan.Zero;\n\t\t\t\tlastTaskCompleted = GetTimestamp();\n\t\t\t}\n\n\t\t\tLog.Trace(\"Processing Task {0} {1}\", task.Id, inline ? \"inline\" : \"from queue\");\n\t\t\ttaskStack.Push(task);\n\t\t}\n\n\t\tprivate void LogExecuteExit(Task task)\n\t\t{\n\t\t\tvar now = GetTimestamp();\n\t\t\tvar calcTime = (now - lastTaskCompleted);\n\t\t\tactualRunningTime += calcTime;\n\t\t\tLog.Trace(\"Task {0} took {1:F3}ms. Resulted {2}\", task.Id, calcTime.TotalMilliseconds, task.Status);\n\t\t\tlastTaskCompleted = now;\n\n\t\t\tTrace.Assert(task == taskStack.Pop());\n\t\t\tif (taskStack.Count == 0)\n\t\t\t{\n\t\t\t\tvar overallTime = overallWatch.Elapsed;\n\t\t\t\tLog.Debug(\"Overall call time: {0:F3} Task Time: {1:F3} Overhead: {2:F3}\",\n\t\t\t\t\toverallTime.TotalMilliseconds,\n\t\t\t\t\tactualRunningTime.TotalMilliseconds,\n\t\t\t\t\t(overallTime - actualRunningTime).TotalMilliseconds);\n\t\t\t\tif (queue.Count == 0)\n\t\t\t\t\tLog.Trace(\"Eoq\");\n\t\t\t}\n\t\t}\n#endif\n\n\t\tpublic override int MaximumConcurrencyLevel => 1;\n\n\t\tprotected override IEnumerable<Task>? GetScheduledTasks() => queue.ToArray();\n\n\t\tprotected override void QueueTask(Task task)\n\t\t\t=> QueueTaskInternal(task);\n\n\t\tprivate void QueueTaskInternal(Task task)\n\t\t{\n\t\t\tif (task is null) throw new ArgumentNullException(nameof(task));\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tqueue.Add(task);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Debug(ex, \"Dropping Task\");\n\t\t\t}\n\t\t}\n\n\t\tprotected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)\n\t\t\t=> IsOwnThread && TryExecuteTaskInternal(task, true);\n\n\t\tpublic TickWorker CreateTimer(Action method, TimeSpan interval, bool active)\n\t\t{\n\t\t\tVerifyOwnThread();\n\t\t\tif (method is null) throw new ArgumentNullException(nameof(method));\n\t\t\tvar worker = new TickWorker(this, method, interval);\n\t\t\t// Add the worker to the list (if it's enabled)\n\t\t\tif (active)\n\t\t\t\tworker.Enable();\n\t\t\treturn worker;\n\t\t}\n\n\t\tinternal void EnableTimer(TickWorker timer)\n\t\t{\n\t\t\tVerifyOwnThread();\n\t\t\ttimer.Timestamp = GetTimestamp();\n\t\t\ttimers.Add(timer);\n\t\t\tBumpTimer();\n\t\t}\n\n\t\tinternal void DisableTimer(TickWorker timer)\n\t\t{\n\t\t\tVerifyOwnThread();\n\t\t\ttimers.Remove(timer);\n\t\t}\n\n\t\tinternal void BumpTimer() => QueueTaskInternal(Task.CompletedTask);\n\n\t\tprivate TimeSpan GetTimestamp() => monotoneClock.Elapsed;\n\n\t\tpublic void VerifyOwnThread()\n\t\t{\n\t\t\tif (!IsOwnThread)\n\t\t\t{\n\t\t\t\tvar stack = new StackTrace();\n\t\t\t\tLog.Error(\"Current call is not scheduled correctly. Sched: {0}, Own: {1}. Stack: {2}\",\n\t\t\t\t\t(Current as DedicatedTaskScheduler)?.logId.ToString() ?? $\"S{Current.Id}\",\n\t\t\t\t\tlogId,\n\t\t\t\t\tstack\n\t\t\t\t);\n\t\t\t\tthrow new TaskSchedulerException(\"Cannot call from an outside thread\");\n\t\t\t}\n\t\t}\n\n\t\t// Invokes\n\n\t\tpublic Task Invoke(Action action)\n\t\t{\n\t\t\tif (Current == this)\n\t\t\t{\n\t\t\t\taction();\n\t\t\t\treturn Task.CompletedTask;\n\t\t\t}\n\n\t\t\treturn factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, this);\n\t\t}\n\n\t\tpublic Task<T> Invoke<T>(Func<T> action)\n\t\t{\n\t\t\tif (Current == this)\n\t\t\t{\n\t\t\t\tvar t = action();\n\t\t\t\treturn Task.FromResult(t);\n\t\t\t}\n\n\t\t\treturn factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, this);\n\t\t}\n\n\t\tpublic Task InvokeAsync(Func<Task> action)\n\t\t{\n\t\t\tif (Current == this)\n\t\t\t{\n\t\t\t\tvar t = action();\n\t\t\t\treturn t;\n\t\t\t}\n\n\t\t\treturn factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, this).Unwrap();\n\t\t}\n\n\t\tpublic Task<T> InvokeAsync<T>(Func<Task<T>> action)\n\t\t{\n\t\t\tif (Current == this)\n\t\t\t{\n\t\t\t\tvar t = action();\n\t\t\t\treturn t;\n\t\t\t}\n\n\t\t\treturn factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, this).Unwrap();\n\t\t}\n\n\t\tpublic override string ToString() => $\"Dedicated Task Scheduler: {logId}\";\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tqueue.CompleteAdding();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/Scheduler/DispatcherHelper.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TSLib.Helper;\n\nnamespace TSLib.Scheduler\n{\n\tinternal static class DispatcherHelper\n\t{\n\t\tpublic const string DispatcherTitle = \"TS Dispatcher\";\n\n\t\tinternal static string CreateLogThreadName(string threadName, Id id) => threadName + (id == Id.Null ? \"\" : $\"[{id}]\");\n\n\t\tinternal static string CreateDispatcherTitle(Id id) => CreateLogThreadName(DispatcherTitle, id);\n\t}\n}\n"
  },
  {
    "path": "TSLib/Scheduler/TickWorker.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib.Scheduler\n{\n\tpublic class TickWorker\n\t{\n\t\treadonly DedicatedTaskScheduler parent;\n\t\tprivate TimeSpan interval;\n\n\t\tinternal Action Method { get; }\n\t\tinternal TimeSpan Timestamp { get; set; } = TimeSpan.Zero;\n\n\t\tpublic TimeSpan Interval\n\t\t{\n\t\t\tget => interval;\n\t\t\tset\n\t\t\t{\n\t\t\t\tif (value <= TimeSpan.Zero)\n\t\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(Interval), \"Interval must not be 0 or negative\");\n\t\t\t\tinterval = value;\n\t\t\t}\n\t\t}\n\n\t\tpublic bool IsActive { get; private set; } = false;\n\n\t\tpublic void Enable()\n\t\t{\n\t\t\tif (!IsActive)\n\t\t\t{\n\t\t\t\tparent.EnableTimer(this);\n\t\t\t\tIsActive = true;\n\t\t\t}\n\t\t}\n\n\t\tpublic void Disable()\n\t\t{\n\t\t\tif (IsActive)\n\t\t\t{\n\t\t\t\tparent.DisableTimer(this);\n\t\t\t\tIsActive = false;\n\t\t\t}\n\t\t}\n\n\t\tinternal TickWorker(DedicatedTaskScheduler parent, Action method, TimeSpan interval)\n\t\t{\n\t\t\tthis.parent = parent;\n\t\t\tMethod = method;\n\t\t\tInterval = interval;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/TSLib.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFrameworks>netcoreapp3.1;netstandard2.0;netstandard2.1</TargetFrameworks>\n    <LangVersion>8.0</LangVersion>\n    <RootNamespace>TSLib</RootNamespace>\n    <AssemblyName>TSLib</AssemblyName>\n\n    <Nullable>enable</Nullable>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <Prefer32Bit>false</Prefer32Bit>\n    <DebugType>portable</DebugType>\n\n    <RepositoryUrl>https://github.com/Splamy/TS3AudioBot.git</RepositoryUrl>\n    <RepositoryType>git</RepositoryType>\n    <PublishRepositoryUrl>true</PublishRepositoryUrl>\n    <GeneratePackageOnBuild>false</GeneratePackageOnBuild>\n    <PackageId>Splamy.TSLib</PackageId>\n    <Authors>Splamy, Flakebi, TSLib Contributors</Authors>\n    <Company>TSLib</Company>\n    <Description>\n      A free and open source TeamSpeak 3 and 5 client library.\n      Can connect as normal voice or query client and is optimized for performance.\n    </Description>\n    <Copyright>Splamy, Flakebi, TSLib Contributors</Copyright>\n    <PackageLicenseExpression>OSL-3.0</PackageLicenseExpression>\n    <PackageProjectUrl>https://github.com/Splamy/TS3AudioBot</PackageProjectUrl>\n    <PackageTags>TeamSpeak, TS3, TS5, Voice, Client, Query, Normal, Communication</PackageTags>\n    <Version>1.1.0</Version>\n    <PackageIcon>ReSpeak.png</PackageIcon>\n    <!-- PackageIconUrl is deprecated, but doc says it might be good for backwards compatibility -->\n    <PackageIconUrl>https://splamy.de/static/ReSpeak.png</PackageIconUrl>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"NLog\" Version=\"4.7.3\" />\n    <PackageReference Include=\"Newtonsoft.Json\" Version=\"12.0.3\" />\n    <PackageReference Include=\"Heijden.Dns.Portable\" Version=\"2.0.19\" />\n    <PackageReference Include=\"Nullable\" Version=\"1.2.1\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"Portable.BouncyCastle\" Version=\"1.8.6.7\" />\n    <PackageReference Include=\"Splamy.Ed25519.Toolkit\" Version=\"1.0.3\" />\n    <PackageReference Include=\"System.IO.Pipelines\" Version=\"4.7.2\" />\n    <PackageReference Condition=\"'$(TargetFramework)' == 'netstandard2.0'\" Include=\"System.Memory\" Version=\"4.5.4\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"ReSpeak.png\" Pack=\"true\" PackagePath=\"\\\" />\n    <None Include=\"Generated\\BookParser.ttinclude\" />\n    <None Include=\"Generated\\ErrorParser.ttinclude\" />\n    <None Include=\"Generated\\M2BParser.ttinclude\" />\n    <None Include=\"Generated\\MessageParser.ttinclude\" />\n    <None Include=\"Generated\\Util.ttinclude\" />\n    <None Update=\"Commands\\TsCommand.gen.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>TsCommand.gen.cs</LastGenOutput>\n    </None>\n    <None Update=\"Generated\\Book.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>Book.cs</LastGenOutput>\n    </None>\n    <None Update=\"Generated\\TsErrorCode.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>TsErrorCode.cs</LastGenOutput>\n    </None>\n    <None Update=\"Generated\\M2B.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>M2B.cs</LastGenOutput>\n    </None>\n    <None Update=\"Generated\\Messages.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>Messages.cs</LastGenOutput>\n    </None>\n    <None Update=\"Generated\\TsPermission.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>TsPermission.cs</LastGenOutput>\n    </None>\n    <None Update=\"Full\\TsFullClient.gen.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>TsFullClient.gen.cs</LastGenOutput>\n    </None>\n    <None Update=\"Query\\TsQueryClient.gen.tt\">\n      <LastGenOutput>TsQueryClient.gen.cs</LastGenOutput>\n      <Generator>TextTemplatingFileGenerator</Generator>\n    </None>\n    <None Update=\"Types.gen.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>Types.gen.cs</LastGenOutput>\n    </None>\n    <None Update=\"Generated\\TsVersion.gen.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>TsVersion.gen.cs</LastGenOutput>\n    </None>\n    <None Update=\"TsBaseFunctions.gen.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>TsBaseFunctions.gen.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Update=\"Commands\\TsCommand.gen.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>TsCommand.gen.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Full\\TsFullClient.gen.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>TsFullClient.gen.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Generated\\Book.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Book.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Generated\\TsErrorCode.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>TsErrorCode.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Generated\\M2B.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>M2B.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Generated\\Messages.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Messages.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Generated\\TsPermission.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>TsPermission.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Generated\\TsVersion.gen.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>TsVersion.gen.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Query\\TsQueryClient.gen.cs\">\n      <DependentUpon>TsQueryClient.gen.tt</DependentUpon>\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n    </Compile>\n    <Compile Update=\"TsBaseFunctions.gen.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>TsBaseFunctions.gen.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Types.gen.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Types.gen.tt</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <!-- Transform all Templates tool -->\n    <Service Include=\"{508349b6-6b84-4df5-91f0-309beebad82d}\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "TSLib/TsBaseFunctions.FileTransfer.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Net.Sockets;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Threading.Tasks;\nusing TSLib.Messages;\nusing IOFileInfo = System.IO.FileInfo;\n\nnamespace TSLib\n{\n\tpartial class TsBaseFunctions\n\t{\n\t\t/// <summary>Initiate a file upload to the server.</summary>\n\t\t/// <param name=\"file\">Local file to upload.</param>\n\t\t/// <param name=\"channel\">The channel id to upload to.</param>\n\t\t/// <param name=\"path\">The upload path within the channel. Eg: \"file.txt\", \"path/file.png\"</param>\n\t\t/// <param name=\"overwrite\">True if the upload should overwrite the file if it exists.\n\t\t/// False will throw an exception if the file already exists.</param>\n\t\t/// <param name=\"channelPassword\">The password for the channel.</param>\n\t\t/// <returns>A token to track the file transfer.</returns>\n\t\tpublic Task<R<FileTransferToken, CommandError>> UploadFile(IOFileInfo file, ChannelId channel, string path, bool overwrite = false, string channelPassword = \"\")\n\t\t\t=> UploadFile(file.Open(FileMode.Open, FileAccess.Read), channel, path, overwrite, channelPassword);\n\n\t\t/// <summary>Initiate a file upload to the server.</summary>\n\t\t/// <param name=\"stream\">Data stream to upload.</param>\n\t\t/// <param name=\"channel\">The channel id to upload to.</param>\n\t\t/// <param name=\"path\">The upload path within the channel. Eg: \"file.txt\", \"path/file.png\"</param>\n\t\t/// <param name=\"overwrite\">True if the upload should overwrite the file if it exists.\n\t\t/// False will throw an exception if the file already exists.</param>\n\t\t/// <param name=\"channelPassword\">The password for the channel.</param>\n\t\t/// <param name=\"closeStream\">True will <see cref=\"IDisposable.Dispose\"/> the stream after the upload is finished.</param>\n\t\t/// <param name=\"createMd5\">Will generate a md5 sum of the uploaded file.</param>\n\t\t/// <returns>A token to track the file transfer.</returns>\n\t\tpublic async Task<R<FileTransferToken, CommandError>> UploadFile(Stream stream, ChannelId channel, string path, bool overwrite = false, string channelPassword = \"\", bool closeStream = true, bool createMd5 = false)\n\t\t{\n\t\t\tushort cftid = GetFreeTransferId();\n\t\t\tvar request = await FileTransferInitUpload(channel, path, channelPassword, cftid, stream.Length, overwrite, false);\n\t\t\tif (!request.Ok)\n\t\t\t{\n\t\t\t\tif (closeStream)\n\t\t\t\t{\n#if NETSTANDARD2_0\n\t\t\t\t\tstream.Dispose();\n#else\n\t\t\t\t\tawait stream.DisposeAsync();\n#endif\n\t\t\t\t}\n\t\t\t\treturn request.Error;\n\t\t\t}\n\t\t\tvar token = new FileTransferToken(stream, request.Value, channel, path, channelPassword, stream.Length, createMd5) { CloseStreamWhenDone = closeStream };\n\t\t\treturn await Transfer(token);\n\t\t}\n\n\t\t/// <summary>Initiate a file download from the server.</summary>\n\t\t/// <param name=\"file\">Local file to save to.</param>\n\t\t/// <param name=\"channel\">The channel id to download from.</param>\n\t\t/// <param name=\"path\">The download path within the channel. Eg: \"file.txt\", \"path/file.png\"</param>\n\t\t/// <param name=\"channelPassword\">The password for the channel.</param>\n\t\t/// <returns>A token to track the file transfer.</returns>\n\t\tpublic Task<R<FileTransferToken, CommandError>> DownloadFile(IOFileInfo file, ChannelId channel, string path, string channelPassword = \"\")\n\t\t\t=> DownloadFile(file.Open(FileMode.Create, FileAccess.Write), channel, path, channelPassword, true);\n\n\t\t/// <summary>Initiate a file download from the server.</summary>\n\t\t/// <param name=\"stream\">Data stream to write to.</param>\n\t\t/// <param name=\"channel\">The channel id to download from.</param>\n\t\t/// <param name=\"path\">The download path within the channel. Eg: \"file.txt\", \"path/file.png\"</param>\n\t\t/// <param name=\"channelPassword\">The password for the channel.</param>\n\t\t/// <param name=\"closeStream\">True will <see cref=\"IDisposable.Dispose\"/> the stream after the download is finished.</param>\n\t\t/// <returns>A token to track the file transfer.</returns>\n\t\tpublic async Task<R<FileTransferToken, CommandError>> DownloadFile(Stream stream, ChannelId channel, string path, string channelPassword = \"\", bool closeStream = true)\n\t\t{\n\t\t\tushort cftid = GetFreeTransferId();\n\t\t\tvar request = await FileTransferInitDownload(channel, path, channelPassword, cftid, 0);\n\t\t\tif (!request.Ok)\n\t\t\t{\n\t\t\t\tif (closeStream)\n\t\t\t\t{\n#if NETSTANDARD2_0\n\t\t\t\t\tstream.Dispose();\n#else\n\t\t\t\t\tawait stream.DisposeAsync();\n#endif\n\t\t\t\t}\n\t\t\t\treturn request.Error;\n\t\t\t}\n\t\t\tvar token = new FileTransferToken(stream, request.Value, channel, path, channelPassword, 0) { CloseStreamWhenDone = closeStream };\n\t\t\treturn await Transfer(token);\n\t\t}\n\n\t\tprivate async Task<R<FileTransferToken, CommandError>> Transfer(FileTransferToken token)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (remoteAddress is null)\n\t\t\t\t{\n\t\t\t\t\ttoken.Status = TransferStatus.Failed;\n\t\t\t\t\tLog.Trace(\"Client is not connected. Transfer failed {@token}\", token);\n\t\t\t\t\treturn CommandError.ConnectionClosed;\n\t\t\t\t}\n\t\t\t\tif (token.Status != TransferStatus.Waiting)\n\t\t\t\t\treturn CommandError.Custom(\"Token is not open\");\n\t\t\t\ttoken.Status = TransferStatus.Transfering;\n\n\t\t\t\tLog.Trace(\"Creating new file transfer connection to {0}\", remoteAddress);\n\t\t\t\tusing var client = new TcpClient(remoteAddress.AddressFamily);\n\t\t\t\ttry { await client.ConnectAsync(remoteAddress.Address, token.Port); }\n\t\t\t\tcatch (SocketException ex)\n\t\t\t\t{\n\t\t\t\t\tLog.Warn(ex, \"SocketException trying to connect to filetransfer port\");\n\t\t\t\t\ttoken.Status = TransferStatus.Failed;\n\t\t\t\t\treturn CommandError.ConnectionClosed;\n\t\t\t\t}\n\t\t\t\tusing var md5Dig = token.CreateMd5 ? MD5.Create() : null;\n\t\t\t\tusing var stream = client.GetStream();\n\t\t\t\tbyte[] keyBytes = Encoding.ASCII.GetBytes(token.TransferKey);\n\t\t\t\tawait stream.WriteAsync(keyBytes, 0, keyBytes.Length);\n\n\t\t\t\tif (token.SeekPosition >= 0 && token.LocalStream.Position != token.SeekPosition)\n\t\t\t\t\ttoken.LocalStream.Seek(token.SeekPosition, SeekOrigin.Begin);\n\n\t\t\t\tif (token.Direction == TransferDirection.Upload)\n\t\t\t\t{\n\t\t\t\t\t// https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs,2a0f078c2e0c0aa8,references\n\t\t\t\t\tconst int bufferSize = 81920;\n\t\t\t\t\tvar buffer = new byte[bufferSize];\n\t\t\t\t\tint read;\n\t\t\t\t\tmd5Dig?.Initialize();\n\t\t\t\t\twhile ((read = await token.LocalStream.ReadAsync(buffer, 0, buffer.Length)) != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tawait stream.WriteAsync(buffer, 0, read);\n\t\t\t\t\t\tmd5Dig?.TransformBlock(buffer, 0, read, buffer, 0);\n\t\t\t\t\t}\n\t\t\t\t\tmd5Dig?.TransformFinalBlock(Array.Empty<byte>(), 0, 0);\n\t\t\t\t\ttoken.Md5Sum = md5Dig?.Hash;\n\t\t\t\t}\n\t\t\t\telse // Download\n\t\t\t\t{\n\t\t\t\t\t// try to preallocate space\n\t\t\t\t\ttry { token.LocalStream.SetLength(token.Size); }\n\t\t\t\t\tcatch (NotSupportedException) { }\n\n\t\t\t\t\tawait stream.CopyToAsync(token.LocalStream);\n\t\t\t\t}\n\t\t\t\tif (token.Status == TransferStatus.Transfering && token.LocalStream.Position == token.Size)\n\t\t\t\t{\n\t\t\t\t\ttoken.Status = TransferStatus.Done;\n\t\t\t\t\tif (token.CloseStreamWhenDone)\n\t\t\t\t\t{\n#if NETSTANDARD2_0\n\t\t\t\t\t\ttoken.LocalStream.Dispose();\n#else\n\t\t\t\t\t\tawait token.LocalStream.DisposeAsync();\n#endif\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch (IOException ex)\n\t\t\t{\n\t\t\t\tLog.Debug(ex, \"IOException during filetransfer\");\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Error(ex, \"Exception during filetransfer\");\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tif (token.Status != TransferStatus.Done && token.Status != TransferStatus.Cancelled)\n\t\t\t\t\ttoken.Status = TransferStatus.Failed;\n\t\t\t}\n\t\t\tif (token.Status == TransferStatus.Failed)\n\t\t\t\treturn CommandError.Custom(\"Upload didn't finish\");\n\t\t\treturn token;\n\t\t}\n\n\t\tprivate ushort GetFreeTransferId() => unchecked(++transferIdCnt);\n\n\t\t/// <summary>Resumes a download from a previously stopped position.</summary>\n\t\t/// <param name=\"token\">The aborted token.</param>\n\t\tpublic async Task<E<CommandError>> Resume(FileTransferToken token)\n\t\t{\n\t\t\tif (token.Status != TransferStatus.Cancelled)\n\t\t\t\treturn CommandError.Custom(\"Only cancelled transfers can be resumed\");\n\n\t\t\tif (token.Direction == TransferDirection.Upload)\n\t\t\t{\n\t\t\t\tvar result = await FileTransferInitUpload(token.ChannelId, token.Path, token.ChannelPassword, token.ClientTransferId, token.Size, false, true);\n\t\t\t\tif (!result.Ok)\n\t\t\t\t\treturn result.Error;\n\t\t\t\tvar request = result.Value;\n\t\t\t\ttoken.ServerTransferId = request.ServerFileTransferId;\n\t\t\t\ttoken.SeekPosition = (long)request.SeekPosition;\n\t\t\t\ttoken.Port = request.Port;\n\t\t\t\ttoken.TransferKey = request.FileTransferKey;\n\t\t\t}\n\t\t\telse // Download\n\t\t\t{\n\t\t\t\tvar result = await FileTransferInitDownload(token.ChannelId, token.Path, token.ChannelPassword, token.ClientTransferId, token.LocalStream.Position);\n\t\t\t\tif (!result.Ok)\n\t\t\t\t\treturn result.Error;\n\t\t\t\tvar request = result.Value;\n\t\t\t\ttoken.ServerTransferId = request.ServerFileTransferId;\n\t\t\t\ttoken.SeekPosition = -1;\n\t\t\t\ttoken.Port = request.Port;\n\t\t\t\ttoken.TransferKey = request.FileTransferKey;\n\t\t\t}\n\n\t\t\ttoken.Status = TransferStatus.Waiting;\n\n\t\t\treturn await Transfer(token);\n\t\t}\n\n\t\t/// <summary>Stops an active transfer.</summary>\n\t\t/// <param name=\"token\">The token to abort.</param>\n\t\t/// <param name=\"delete\">True to delete the file.\n\t\t/// False to only temporarily stop the transfer (can be resumed again with <see cref=\"Resume\"/>).</param>\n\t\tpublic async Task Abort(FileTransferToken token, bool delete = false)\n\t\t{\n\t\t\tif (token.Status != TransferStatus.Transfering && token.Status != TransferStatus.Waiting)\n\t\t\t\treturn;\n\t\t\tawait FileTransferStop(token.ServerTransferId, delete);\n\t\t\ttoken.Status = TransferStatus.Cancelled;\n\t\t\tif (delete && token.CloseStreamWhenDone)\n\t\t\t{\n#if NETSTANDARD2_0\n\t\t\t\ttoken.LocalStream.Dispose();\n#else\n\t\t\t\tawait token.LocalStream.DisposeAsync();\n#endif\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>Gets information about the current transfer status.</summary>\n\t\t/// <param name=\"token\">The transfer to check.</param>\n\t\t/// <returns>Returns an information object or <code>null</code> when not available.</returns>\n\t\tpublic async Task<R<FileTransfer, CommandError>> GetStats(FileTransferToken token)\n\t\t{\n\t\t\tif (token.Status != TransferStatus.Transfering)\n\t\t\t\treturn CommandError.Custom(\"No transfer found\");\n\n\t\t\tvar result = await FileTransferList();\n\t\t\tif (result.Ok)\n\t\t\t\treturn result.Value.Where(x => x.ServerFileTransferId == token.ServerTransferId).MapToSingle();\n\t\t\treturn result.Error;\n\t\t}\n\t}\n\n\t/// <summary>Points to a file transfer.\n\t/// This token can be used to further interact with a transfer via the <see cref=\"FileTransferManager\"/>.</summary>\n\tpublic sealed class FileTransferToken\n\t{\n\t\tpublic Stream LocalStream { get; }\n\t\tpublic TransferDirection Direction { get; }\n\t\tpublic ChannelId ChannelId { get; }\n\t\tpublic string Path { get; }\n\t\tpublic long Size { get; }\n\t\tpublic ushort ClientTransferId { get; }\n\t\tpublic ushort ServerTransferId { get; internal set; }\n\t\tpublic string ChannelPassword { get; set; }\n\t\tpublic ushort Port { get; internal set; }\n\t\tpublic long SeekPosition { get; internal set; }\n\t\tpublic string TransferKey { get; internal set; }\n\t\tpublic bool CloseStreamWhenDone { get; set; }\n\t\tpublic bool CreateMd5 { get; }\n\t\tpublic byte[]? Md5Sum { get; internal set; }\n\t\tpublic TransferStatus Status { get; set; }\n\n\t\tpublic FileTransferToken(Stream localStream, FileUpload upload, ChannelId channelId,\n\t\t\tstring path, string channelPassword, long size, bool createMd5)\n\t\t\t: this(localStream, upload.ClientFileTransferId, upload.ServerFileTransferId, TransferDirection.Upload,\n\t\t\t\tchannelId, path, channelPassword, upload.Port, (long)upload.SeekPosition, upload.FileTransferKey, size, createMd5)\n\t\t{ }\n\n\t\tpublic FileTransferToken(Stream localStream, FileDownload download, ChannelId channelId,\n\t\t\tstring path, string channelPassword, long seekPos)\n\t\t\t: this(localStream, download.ClientFileTransferId, download.ServerFileTransferId, TransferDirection.Download,\n\t\t\t\tchannelId, path, channelPassword, download.Port, seekPos, download.FileTransferKey, (long)download.Size, false)\n\t\t{ }\n\n\t\tpublic FileTransferToken(Stream localStream, ushort cftid, ushort sftid,\n\t\t\tTransferDirection dir, ChannelId channelId, string path, string channelPassword, ushort port, long seekPos,\n\t\t\tstring transferKey, long size, bool createMd5)\n\t\t{\n\t\t\tCloseStreamWhenDone = false;\n\t\t\tStatus = TransferStatus.Waiting;\n\t\t\tLocalStream = localStream;\n\t\t\tDirection = dir;\n\t\t\tClientTransferId = cftid;\n\t\t\tServerTransferId = sftid;\n\t\t\tChannelId = channelId;\n\t\t\tPath = path;\n\t\t\tChannelPassword = channelPassword;\n\t\t\tPort = port;\n\t\t\tSeekPosition = seekPos;\n\t\t\tTransferKey = transferKey;\n\t\t\tSize = size;\n\t\t\tCreateMd5 = createMd5;\n\t\t}\n\t}\n\n\tpublic enum TransferDirection\n\t{\n\t\tUpload,\n\t\tDownload,\n\t}\n\n\tpublic enum TransferStatus\n\t{\n\t\tWaiting,\n\t\tTransfering,\n\t\tDone,\n\t\tCancelled,\n\t\tFailed,\n\t}\n}\n"
  },
  {
    "path": "TSLib/TsBaseFunctions.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net;\nusing System.Threading.Tasks;\nusing TSLib.Commands;\nusing TSLib.Full.Book;\nusing TSLib.Messages;\nusing CmdR = System.Threading.Tasks.Task<System.E<TSLib.Messages.CommandError>>;\n\nnamespace TSLib\n{\n\tpublic delegate void NotifyEventHandler<in TEventArgs>(object sender, IEnumerable<TEventArgs> e) where TEventArgs : INotification;\n\n\t/// <summary>A shared function base between the query and full client.</summary>\n\tpublic abstract partial class TsBaseFunctions : IDisposable\n\t{\n\t\tprotected readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\t/// <summary>After the client disconnected.</summary>\n\t\tpublic abstract event EventHandler<DisconnectEventArgs> OnDisconnected;\n\n\t\t/// <summary>Get whether this client is currently connected.</summary>\n\t\tpublic abstract bool Connected { get; }\n\t\t/// <summary>Get whether this client is currently trying to connect.</summary>\n\t\tpublic abstract bool Connecting { get; }\n\t\t/// <summary>The derived client type.</summary>\n\t\tpublic abstract ClientType ClientType { get; }\n\t\t/// <summary>The connection data this client was last connected with (or is currently connected to).</summary>\n\t\tpublic ConnectionData? ConnectionData { get; protected set; }\n\t\tinternal IPEndPoint? remoteAddress;\n\t\tprivate ushort transferIdCnt;\n\t\tprotected abstract Deserializer Deserializer { get; }\n\t\tpublic TsConst ServerConstants { get; protected set; } = TsConst.Default;\n\n\t\tpublic abstract CmdR Connect(ConnectionData conData);\n\t\tpublic abstract Task Disconnect();\n\t\tpublic abstract void Dispose();\n\n\t\t#region NETWORK SEND\n\t\t/// <summary>Sends a command to the server. Commands look exactly like query commands and mostly also behave identically.</summary>\n\t\t/// <typeparam name=\"T\">The type to deserialize the response to. Use <see cref=\"ResponseDictionary\"/> for unknown response data.</typeparam>\n\t\t/// <param name=\"com\">The raw command to send.</param>\n\t\t/// <returns>Returns an enumeration of the deserialized and split up in <see cref=\"T\"/> objects data.</returns>\n\t\tpublic abstract Task<R<T[], CommandError>> Send<T>(TsCommand com) where T : IResponse, new();\n\n\t\t/// <summary>\n\t\t/// Sends a command and depending on the client type waits for a response or notification.\n\t\t/// <para>NOTE: Do not use this method unless you are sure the ts command fits the criteria.</para>\n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command to send.</param>\n\t\t/// <param name=\"type\">The notification type to wait for and serialize to.</param>\n\t\tpublic abstract Task<R<T[], CommandError>> SendHybrid<T>(TsCommand com, NotificationType type) where T : class, IResponse, new();\n\t\t#endregion\n\n\t\tprivate string? GenPassword(string? password)\n\t\t{\n\t\t\tif (ClientType == ClientType.Full && password != null)\n\t\t\t\treturn Full.TsCrypt.HashPassword(password);\n\t\t\telse\n\t\t\t\treturn password;\n\t\t}\n\n\t\t#region UNIVERSAL COMMANDS\n\n\t\tpublic CmdR ChangeName(string newName)\n\t\t\t=> SendVoid(new TsCommand(\"clientupdate\") {\n\t\t\t\t{ \"client_nickname\", newName },\n\t\t\t});\n\n\t\tpublic CmdR ChangeBadges(string newBadges)\n\t\t\t=> SendVoid(new TsCommand(\"clientupdate\") {\n\t\t\t\t{ \"client_badges\", newBadges },\n\t\t\t});\n\n\t\tpublic CmdR ChangeDescription(string newDescription, ClientId clientId)\n\t\t\t=> SendVoid(new TsCommand(\"clientedit\") {\n\t\t\t\t{ \"clid\", clientId },\n\t\t\t\t{ \"client_description\", newDescription },\n\t\t\t});\n\n\t\t/// <summary>Displays information about your current ServerQuery connection including your loginname, etc.</summary>\n\t\tpublic Task<R<WhoAmI, CommandError>> WhoAmI() // Q ?\n\t\t\t=> Send<WhoAmI>(\"whoami\").MapToSingle();\n\n\t\tpublic CmdR SendPrivateMessage(string message, ClientId clientId)\n\t\t\t=> SendMessage(message, TextMessageTargetMode.Private, clientId.Value);\n\n\t\tpublic CmdR SendChannelMessage(string message)\n\t\t\t=> SendMessage(message, TextMessageTargetMode.Channel, 0);\n\n\t\tpublic CmdR SendServerMessage(string message, ulong serverId)\n\t\t\t=> SendMessage(message, TextMessageTargetMode.Server, serverId);\n\n\t\t/// <summary>Sends a text message to a specified target.\n\t\t/// If targetmode is set to <see cref=\"TextMessageTargetMode.Private\"/>, a message is sent to the client with the ID specified by target.\n\t\t/// If targetmode is set to <see cref=\"TextMessageTargetMode.Channel\"/> or <see cref=\"TextMessageTargetMode.Server\"/>,\n\t\t/// the target parameter will be ignored and a message is sent to the current channel or server respectively.</summary>\n\t\tpublic CmdR SendMessage(string message, TextMessageTargetMode target, ulong id)\n\t\t\t=> SendVoid(new TsCommand(\"sendtextmessage\") {\n\t\t\t\t{ \"targetmode\", (int)target },\n\t\t\t\t{ \"target\", id },\n\t\t\t\t{ \"msg\", message },\n\t\t\t});\n\n\t\t/// <summary>Sends a text message to all clients on all virtual servers in the TeamSpeak 3 Server instance.</summary>\n\t\tpublic CmdR SendGlobalMessage(string message)\n\t\t\t=> SendVoid(new TsCommand(\"gm\") {\n\t\t\t\t{ \"msg\", message },\n\t\t\t});\n\n\t\tpublic CmdR KickClientFromServer(ClientId clientId, string? reasonMsg = null)\n\t\t\t=> KickClient(new[] { clientId }, ReasonIdentifier.Server, reasonMsg);\n\n\t\tpublic CmdR KickClientFromServer(ClientId[] clientIds, string? reasonMsg = null)\n\t\t\t=> KickClient(clientIds, ReasonIdentifier.Server, reasonMsg);\n\n\t\tpublic CmdR KickClientFromChannel(ClientId clientId, string? reasonMsg = null)\n\t\t\t=> KickClient(new[] { clientId }, ReasonIdentifier.Channel, reasonMsg);\n\n\t\tpublic CmdR KickClientFromChannel(ClientId[] clientIds, string? reasonMsg = null)\n\t\t\t=> KickClient(clientIds, ReasonIdentifier.Channel, reasonMsg);\n\n\t\t/// <summary>Kicks one or more clients specified with clid from their currently joined channel or from the server, depending on <paramref name=\"reasonId\"/>.\n\t\t/// The reasonmsg parameter specifies a text message sent to the kicked clients.\n\t\t/// This parameter is optional and may only have a maximum of 40 characters.</summary>\n\t\tpublic CmdR KickClient(ClientId[] clientIds, ReasonIdentifier reasonId, string? reasonMsg = null)\n\t\t\t=> SendVoid(new TsCommand(\"clientkick\") {\n\t\t\t\t{ \"reasonid\", (int)reasonId },\n\t\t\t\t{ \"clid\", clientIds },\n\t\t\t\t{ \"reasonmsg\", reasonMsg },\n\t\t\t});\n\n\t\tpublic CmdR BanClient(ushort clientId, TimeSpan? duration = null, string? reasonMsg = null)\n\t\t\t=> BanClient(new CommandParameter(\"clid\", clientId), reasonMsg, duration);\n\n\t\tpublic CmdR BanClient(Uid clientUid = default, TimeSpan? duration = null, string? reasonMsg = null)\n\t\t\t=> BanClient(new CommandParameter(\"uid\", clientUid), reasonMsg, duration);\n\n\t\tprivate CmdR BanClient(ICommandPart clientIdentifier, string? reasonMsg = null, TimeSpan? duration = null)\n\t\t\t=> SendVoid(new TsCommand(\"banclient\") {\n\t\t\t\tclientIdentifier,\n\t\t\t\t{ \"banreason\", reasonMsg },\n\t\t\t\t{ \"time\", duration?.TotalSeconds },\n\t\t\t});\n\n\t\tpublic CmdR ChannelEdit(ChannelId channelId,\n\t\t\tstring? name = null, string? namePhonetic = null, string? topic = null, string? description = null,\n\t\t\tstring? password = null, Codec? codec = null, int? codecQuality = null, int? codecLatencyFactor = null,\n\t\t\tbool? codecEncrypted = null, int? maxClients = null, int? maxFamilyClients = null, bool? maxClientsUnlimited = null,\n\t\t\tbool? maxFamilyClientsUnlimited = null, bool? maxFamilyClientsInherited = null, ChannelId? order = null,\n\t\t\tChannelType? type = null, TimeSpan? deleteDelay = null, int? neededTalkPower = null)\n\t\t\t=> SendVoid(ChannelOp(\"channeledit\", channelId, name, namePhonetic, topic, description,\n\t\t\t\tpassword, codec, codecQuality, codecLatencyFactor, codecEncrypted,\n\t\t\t\tmaxClients, maxFamilyClients, maxClientsUnlimited, maxFamilyClientsUnlimited,\n\t\t\t\tmaxFamilyClientsInherited, order, null, type, deleteDelay, neededTalkPower));\n\n\t\tpublic abstract Task<R<IChannelCreateResponse, CommandError>> ChannelCreate(string name,\n\t\t\tstring? namePhonetic = null, string? topic = null, string? description = null, string? password = null,\n\t\t\tCodec? codec = null, int? codecQuality = null, int? codecLatencyFactor = null, bool? codecEncrypted = null,\n\t\t\tint? maxClients = null, int? maxFamilyClients = null, bool? maxClientsUnlimited = null,\n\t\t\tbool? maxFamilyClientsUnlimited = null, bool? maxFamilyClientsInherited = null, ChannelId? order = null,\n\t\t\tChannelId? parent = null, ChannelType? type = null, TimeSpan? deleteDelay = null, int? neededTalkPower = null);\n\n\t\tprotected TsCommand ChannelOp(string op, ChannelId? channelId,\n\t\t\tstring? name, string? namePhonetic, string? topic, string? description, string? password,\n\t\t\tCodec? codec, int? codecQuality, int? codecLatencyFactor, bool? codecEncrypted, int? maxClients,\n\t\t\tint? maxFamilyClients, bool? maxClientsUnlimited, bool? maxFamilyClientsUnlimited, bool? maxFamilyClientsInherited,\n\t\t\tChannelId? order, ChannelId? parent, ChannelType? type, TimeSpan? deleteDelay, int? neededTalkPower)\n\t\t\t=> new TsCommand(op) {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"cpid\", parent },\n\t\t\t\t{ \"channel_name\", name },\n\t\t\t\t{ \"channel_name_phonetic\", namePhonetic },\n\t\t\t\t{ \"channel_topic\", topic },\n\t\t\t\t{ \"channel_description\", description },\n\t\t\t\t{ \"channel_password\", GenPassword(password) },\n\t\t\t\t{ \"channel_codec\", (byte?)codec },\n\t\t\t\t{ \"channel_codec_quality\", codecQuality },\n\t\t\t\t{ \"channel_codec_latency_factor\", codecLatencyFactor },\n\t\t\t\t{ \"channel_codec_is_unencrypted\", !codecEncrypted },\n\t\t\t\t{ \"channel_maxclients\", maxClients },\n\t\t\t\t{ \"channel_maxfamilyclients\", maxFamilyClients },\n\t\t\t\t{ \"channel_flag_maxclients_unlimited\", maxClientsUnlimited },\n\t\t\t\t{ \"channel_flag_maxfamilyclients_unlimited\", maxFamilyClientsUnlimited },\n\t\t\t\t{ \"channel_flag_maxfamilyclients_inherited\", maxFamilyClientsInherited },\n\t\t\t\t{ \"channel_order\", order },\n\t\t\t\t{ \"channel_flag_permanent\", type == null ? (bool?)null : type == ChannelType.Permanent },\n\t\t\t\t{ \"channel_flag_semi_permanent\", type == null ? (bool?)null : type == ChannelType.SemiPermanent },\n\t\t\t\t{ \"channel_delete_delay\", (ulong?)deleteDelay?.TotalSeconds }, // TODO Check\n\t\t\t\t{ \"channel_needed_talk_power\", neededTalkPower },\n\t\t\t};\n\n\t\t/// <summary>Displays detailed configuration information about a channel including ID, topic, description, etc.\n\t\t/// For detailed information, see Channel Properties.</summary>\n\t\tpublic Task<R<ChannelInfoResponse[], CommandError>> ChannelInfo(ChannelId channelId)\n\t\t\t=> Send<ChannelInfoResponse>(new TsCommand(\"channelinfo\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t});\n\n\t\t/// <summary>Displays a list of channels created on a virtual server including their ID, order, name, etc.\n\t\t/// The output can be modified using several command options.</summary>\n\t\tpublic Task<R<ChannelListResponse[], CommandError>> ChannelList(ChannelListOptions options = 0)\n\t\t\t=> Send<ChannelListResponse>(\"channellist\",\n\t\t\tnew CommandOption(options));\n\n\t\tpublic CmdR ChannelMove(ChannelId channelId, ChannelId? parent = null, ChannelId? order = null)\n\t\t\t=> SendVoid(new TsCommand(\"channelmove\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"cpid\", parent },\n\t\t\t\t{ \"order\", order },\n\t\t\t});\n\n\t\tpublic CmdR ChannelDelete(ChannelId channelId, bool force = false)\n\t\t\t=> SendVoid(new TsCommand(\"channeldelete\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"force\", force },\n\t\t\t});\n\n\t\t/// <summary>Displays detailed database information about a client including unique ID, creation date, etc.</summary>\n\t\tpublic Task<R<ClientDbInfo, CommandError>> ClientDbInfo(ClientDbId clientDbId)\n\t\t\t=> Send<ClientDbInfo>(new TsCommand(\"clientdbinfo\") {\n\t\t\t\t{ \"cldbid\", clientDbId },\n\t\t\t}).MapToSingle();\n\n\t\t/// <summary>Displays a list of clients online on a virtual server including their ID, nickname, status flags, etc.\n\t\t/// The output can be modified using several command options.\n\t\t/// Please note that the output will only contain clients which are currently in channels you're able to subscribe to.</summary>\n\t\tpublic Task<R<ClientList[], CommandError>> ClientList(ClientListOptions options = 0)\n\t\t\t=> Send<ClientList>(\"clientlist\",\n\t\t\tnew CommandOption(options));\n\n\t\t/// <summary>Displays detailed configuration information about a client including unique ID, nickname, client version, etc.</summary>\n\t\tpublic Task<R<ClientInfo, CommandError>> ClientInfo(ClientId clientId)\n\t\t\t=> Send<ClientInfo>(new TsCommand(\"clientinfo\") {\n\t\t\t\t{ \"clid\", clientId },\n\t\t\t}).MapToSingle();\n\n\t\t/// <summary>Use a token key and gain access to a server or channel group.\n\t\t/// Please note that the server will automatically delete the token after it has been used.</summary>\n\t\tpublic CmdR PrivilegeKeyUse(string key)\n\t\t\t=> SendVoid(new TsCommand(\"privilegekeyuse\") {\n\t\t\t\t{ \"token\", key },\n\t\t\t});\n\n\t\t/// <summary>Adds a set of specified permissions to the server group specified with <paramref name=\"serverGroupId\"/>.\n\t\t/// Multiple permissions can be added by providing the four parameters of each permission.</summary>\n\t\tpublic CmdR ServerGroupAddPerm(ServerGroupId serverGroupId, TsPermission permission, int permissionValue,\n\t\t\t\tbool permissionNegated, bool permissionSkip)\n\t\t\t=> SendVoid(new TsCommand(\"servergroupaddperm\") {\n\t\t\t\t{ \"sgid\", serverGroupId },\n\t\t\t\t{ \"permvalue\", permissionValue },\n\t\t\t\t{ \"permnegated\", permissionNegated },\n\t\t\t\t{ \"permskip\", permissionSkip },\n\t\t\t\tTsPermissionHelper.GetAsParameter(Deserializer.PermissionTransform, permission),\n\t\t\t});\n\n\t\t/// <summary>Adds a set of specified permissions to the server group specified with <paramref name=\"serverGroupId\"/>.\n\t\t/// Multiple permissions can be added by providing the four parameters of each permission.</summary>\n\t\tpublic CmdR ServerGroupAddPerm(ServerGroupId serverGroupId, TsPermission[] permission, int[] permissionValue,\n\t\t\t\tbool[] permissionNegated, bool[] permissionSkip)\n\t\t\t=> SendVoid(new TsCommand(\"servergroupaddperm\") {\n\t\t\t\t{ \"sgid\", serverGroupId },\n\t\t\t\t{ \"permvalue\", permissionValue },\n\t\t\t\t{ \"permnegated\", permissionNegated },\n\t\t\t\t{ \"permskip\", permissionSkip },\n\t\t\t\tTsPermissionHelper.GetAsMultiParameter(Deserializer.PermissionTransform, permission),\n\t\t\t});\n\n\t\t/// <summary>Adds a client to the server group specified with <paramref name=\"serverGroupId\"/>. Please note that a\n\t\t/// client cannot be added to default groups or template groups.</summary>\n\t\tpublic CmdR ServerGroupAddClient(ServerGroupId serverGroupId, ClientDbId clientDbId)\n\t\t\t=> SendVoid(new TsCommand(\"servergroupaddclient\") {\n\t\t\t\t{ \"sgid\", serverGroupId },\n\t\t\t\t{ \"cldbid\", clientDbId },\n\t\t\t});\n\n\t\t/// <summary>Removes a client specified with cldbid from the server group specified with <paramref name=\"serverGroupId\"/>.</summary>\n\t\tpublic CmdR ServerGroupDelClient(ServerGroupId serverGroupId, ClientDbId clientDbId)\n\t\t\t=> SendVoid(new TsCommand(\"servergroupdelclient\") {\n\t\t\t\t{ \"sgid\", serverGroupId },\n\t\t\t\t{ \"cldbid\", clientDbId },\n\t\t\t});\n\n\t\tpublic CmdR FileTransferStop(ushort serverTransferId, bool delete)\n\t\t\t=> SendVoid(new TsCommand(\"ftstop\") {\n\t\t\t\t{ \"serverftfid\", serverTransferId },\n\t\t\t\t{ \"delete\", delete },\n\t\t\t});\n\n\t\tpublic CmdR FileTransferDeleteFile(ChannelId channelId, string[] path, string channelPassword = \"\")\n\t\t\t=> SendVoid(new TsCommand(\"ftdeletefile\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"cpw\", channelPassword },\n\t\t\t\t{ \"name\", path },\n\t\t\t});\n\n\t\tpublic CmdR FileTransferCreateDirectory(ChannelId channelId, string path, string channelPassword = \"\")\n\t\t\t=> SendVoid(new TsCommand(\"ftcreatedir\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"dirname\", path },\n\t\t\t\t{ \"cpw\", channelPassword },\n\t\t\t});\n\n\t\tpublic CmdR FileTransferRenameFile(ChannelId channelId, string oldName, string channelPassword, string newName,\n\t\t\t\tChannelId? targetChannel = null, string targetChannelPassword = \"\")\n\t\t\t=> SendVoid(new TsCommand(\"ftrenamefile\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"oldname\", oldName },\n\t\t\t\t{ \"newname\", newName },\n\t\t\t\t{ \"cpw\", channelPassword },\n\t\t\t\t{ \"tcid\", targetChannel },\n\t\t\t\t{ \"tcpw\", targetChannel.HasValue ? targetChannelPassword : null },\n\t\t\t});\n\n\t\tpublic async CmdR UploadAvatar(System.IO.Stream image)\n\t\t{\n\t\t\tvar token = await UploadFile(image, ChannelId.Null, \"/avatar\", overwrite: true, createMd5: true);\n\t\t\tif (!token.Ok)\n\t\t\t\treturn CommandError.Custom(\"Avatar upload failed: \" + token.Error.ErrorFormat());\n\t\t\tif (token.Value.Status != TransferStatus.Done)\n\t\t\t\treturn CommandError.Custom(\"Avatar upload failed\");\n\t\t\tvar md5 = string.Concat(token.Value.Md5Sum.Select(x => x.ToString(\"x2\")));\n\t\t\treturn await SendVoid(new TsCommand(\"clientupdate\") { { \"client_flag_avatar\", md5 } });\n\t\t}\n\n\t\t/// <summary>Deletes the avatar of a user.\n\t\t/// Can be called without uid to delete own avatar.</summary>\n\t\t/// <param name=\"clientUid\">The client uid where the avatar should be deleted.</param>\n\t\tpublic CmdR DeleteAvatar(Uid? clientUid = null)\n\t\t{\n\t\t\tstring path = \"/avatar_\" + clientUid;\n\t\t\treturn FileTransferDeleteFile(ChannelId.Null, new[] { path });\n\t\t}\n\n\t\tpublic CmdR ClientMove(ClientId clientId, ChannelId channelId, string? channelPassword = null)\n\t\t\t=> SendVoid(new TsCommand(\"clientmove\") {\n\t\t\t\t{ \"clid\", clientId },\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"cpw\", GenPassword(channelPassword) },\n\t\t\t});\n\n\t\t#endregion\n\n\t\t#region UNIVERSAL HYRBRID COMMANDS\n\n\t\t/// <summary>Creates a new server group using the name specified with <paramref name=\"name\"/> and return its ID.\n\t\t/// The optional <paramref name=\"type\"/> parameter can be used to create ServerQuery groups and template groups.</summary>\n\t\tpublic abstract Task<R<ServerGroupAddResponse, CommandError>> ServerGroupAdd(string name, GroupType? type = null);\n\n\t\t/// <summary>Displays all server groups the client specified with <paramref name=\"clDbId\"/> is currently residing in.</summary>\n\t\tpublic Task<R<ServerGroupsByClientId[], CommandError>> ServerGroupsByClientDbId(ClientDbId clDbId)\n\t\t\t=> SendHybrid<ServerGroupsByClientId>(new TsCommand(\"servergroupsbyclientid\")\n\t\t\t{\n\t\t\t\t{ \"cldbid\", clDbId }\n\t\t\t}, NotificationType.ServerGroupsByClientId);\n\n\t\tpublic abstract Task<R<FileUpload, CommandError>> FileTransferInitUpload(ChannelId channelId, string path, string channelPassword,\n\t\t\tushort clientTransferId, long fileSize, bool overwrite, bool resume);\n\n\t\tpublic abstract Task<R<FileDownload, CommandError>> FileTransferInitDownload(ChannelId channelId, string path, string channelPassword,\n\t\t\tushort clientTransferId, long seek);\n\n\t\tpublic Task<R<FileTransfer[], CommandError>> FileTransferList()\n\t\t\t=> SendHybrid<FileTransfer>(new TsCommand(\"ftlist\"),\n\t\t\t\tNotificationType.FileTransfer);\n\n\t\tpublic Task<R<FileList[], CommandError>> FileTransferGetFileList(ChannelId channelId, string path, string channelPassword = \"\")\n\t\t\t=> SendHybrid<FileList>(new TsCommand(\"ftgetfilelist\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"path\", path },\n\t\t\t\t{ \"cpw\", channelPassword } // TODO CHECK ?\n\t\t\t}, NotificationType.FileList);\n\n\t\tpublic Task<R<FileInfo[], CommandError>> FileTransferGetFileInfo(ChannelId channelId, string[] path, string channelPassword = \"\")\n\t\t\t=> SendHybrid<FileInfo>(new TsCommand(\"ftgetfileinfo\") {\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\t{ \"cpw\", channelPassword }, // TODO CHECK ?\n\t\t\t\t{ \"name\", path }\n\t\t\t}, NotificationType.FileInfo);\n\n\t\tpublic Task<R<ClientDbIdFromUid, CommandError>> GetClientDbIdFromUid(Uid clientUid)\n\t\t\t=> SendHybrid<ClientDbIdFromUid>(new TsCommand(\"clientgetdbidfromuid\") {\n\t\t\t\t{ \"cluid\", clientUid }\n\t\t\t}, NotificationType.ClientDbIdFromUid).MapToSingle();\n\n\t\tpublic Task<R<ClientUidFromClid, CommandError>> GetClientUidFromClientId(ClientId clientId)\n\t\t\t=> SendHybrid<ClientUidFromClid>(new TsCommand(\"clientgetuidfromclid\") {\n\t\t\t\t{ \"clid\", clientId }\n\t\t\t}, NotificationType.ClientUidFromClid).MapToSingle();\n\n\t\tpublic Task<R<ClientNameFromUid, CommandError>> GetClientNameFromUid(Uid clientUid)\n\t\t\t=> SendHybrid<ClientNameFromUid>(new TsCommand(\"clientgetnamefromuid\")\n\t\t\t{\n\t\t\t\t{ \"cluid\", clientUid }\n\t\t\t}, NotificationType.ClientNameFromUid).MapToSingle();\n\n\t\tpublic Task<R<ClientIds[], CommandError>> GetClientIds(Uid clientUid)\n\t\t\t=> SendHybrid<ClientIds>(new TsCommand(\"clientgetids\") {\n\t\t\t\t{ \"cluid\", clientUid }\n\t\t\t}, NotificationType.ClientIds);\n\n\t\tpublic Task<R<PermOverview[], CommandError>> PermOverview(ClientDbId clientDbId, ChannelId channelId, params TsPermission[] permission)\n\t\t\t=> SendHybrid<PermOverview>(new TsCommand(\"permoverview\") {\n\t\t\t\t{ \"cldbid\", clientDbId },\n\t\t\t\t{ \"cid\", channelId },\n\t\t\t\tTsPermissionHelper.GetAsMultiParameter(Deserializer.PermissionTransform, permission)\n\t\t\t}, NotificationType.PermOverview);\n\n\t\tpublic Task<R<PermList[], CommandError>> PermissionList()\n\t\t\t=> SendHybrid<PermList>(new TsCommand(\"permissionlist\"),\n\t\t\t\tNotificationType.PermList);\n\n\t\tpublic Task<R<ServerConnectionInfo, CommandError>> GetServerConnectionInfo()\n\t\t\t=> SendHybrid<ServerConnectionInfo>(new TsCommand(\"serverrequestconnectioninfo\"),\n\t\t\t\tNotificationType.ServerConnectionInfo).MapToSingle();\n\n\t\tpublic Task<R<ServerGroupClientList[], CommandError>> ServerGroupClientList(ServerGroupId serverGroupId, bool getNames = false)\n\t\t\t=> SendHybrid<ServerGroupClientList>(new TsCommand(\"servergroupclientlist\")\n\t\t\t{\n\t\t\t\t{ \"sgid\", serverGroupId },\n\t\t\t\t{ getNames ? new CommandOption(\"names\") : null }\n\t\t\t}, NotificationType.ServerGroupClientList);\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "TSLib/TsBaseFunctions.gen.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nusing System;\nusing System.Threading.Tasks;\nusing TSLib.Commands;\nusing TSLib.Messages;\n\n#nullable enable\nnamespace TSLib\n{\n\tpartial class TsBaseFunctions\n\t{\n\n\t\t/// <summary>\n\t\t/// Sends a TS-command.\n\t\t/// \n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameters to be added to this command.\n\t\t/// See <see cref=\"CommandParameter\"/>, <see cref=\"CommandOption\"/> or <see cref=\"CommandMultiParameter\"/> for more information.</param>\n\t\t/// \n\t\t/// \n\t\tpublic async Task<R<ResponseDictionary[], CommandError>> Send(string command, params ICommandPart[] parameter)\n\t\t\t=> await Send<ResponseDictionary>(new TsCommand(command, parameter));\n\n\t\t/// <summary>\n\t\t/// Sends a TS-command.\n\t\t/// \n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameters to be added to this command.\n\t\t/// See <see cref=\"CommandParameter\"/>, <see cref=\"CommandOption\"/> or <see cref=\"CommandMultiParameter\"/> for more information.</param>\n\t\t/// \n\t\t/// <returns>Returns an enumeration of the deserialized and split up in <see cref=\"T\"/> objects data.</returns>\n\t\tpublic async Task<R<T[], CommandError>> Send<T>(string command, params ICommandPart[] parameter) where T : IResponse, new()\n\t\t\t=> await Send<T>(new TsCommand(command, parameter));\n\n\t\t/// <summary>\n\t\t/// Sends a TS-command.\n\t\t/// \n\t\t/// The response (if any) is not deserialized and is discarded.\n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameters to be added to this command.\n\t\t/// See <see cref=\"CommandParameter\"/>, <see cref=\"CommandOption\"/> or <see cref=\"CommandMultiParameter\"/> for more information.</param>\n\t\t/// \n\t\t/// \n\t\tpublic async Task<E<CommandError>> SendVoid(string command, params ICommandPart[] parameter)\n\t\t\t=> await Send<ResponseVoid>(new TsCommand(command, parameter));\n\n\t\t/// <summary>\n\t\t/// Sends a TS-command.\n\t\t/// \n\t\t/// The response (if any) is not deserialized and is discarded.\n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameters to be added to this command.\n\t\t/// See <see cref=\"CommandParameter\"/>, <see cref=\"CommandOption\"/> or <see cref=\"CommandMultiParameter\"/> for more information.</param>\n\t\t/// \n\t\t/// \n\t\tpublic async Task<E<CommandError>> SendVoid(TsCommand com)\n\t\t\t=> await Send<ResponseVoid>(com);\n\n\t\t/// <summary>\n\t\t/// Sends a TS-command.\n\t\t/// This will send a normal query-command when connected via query client. When connected as a full client the first specified notification is used as the response.\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameters to be added to this command.\n\t\t/// See <see cref=\"CommandParameter\"/>, <see cref=\"CommandOption\"/> or <see cref=\"CommandMultiParameter\"/> for more information.</param>\n\t\t/// <param name=\"type\">The notification type to wait for and serialize to when called from the full client.</param>\n\t\t/// \n\t\tpublic async Task<R<ResponseDictionary[], CommandError>> SendHybrid(string command, NotificationType type, params ICommandPart[] parameter)\n\t\t\t=> await SendHybrid<ResponseDictionary>(new TsCommand(command, parameter), type);\n\n\t\t/// <summary>\n\t\t/// Sends a TS-command.\n\t\t/// This will send a normal query-command when connected via query client. When connected as a full client the first specified notification is used as the response.\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameters to be added to this command.\n\t\t/// See <see cref=\"CommandParameter\"/>, <see cref=\"CommandOption\"/> or <see cref=\"CommandMultiParameter\"/> for more information.</param>\n\t\t/// <param name=\"type\">The notification type to wait for and serialize to when called from the full client.</param>\n\t\t/// <returns>Returns an enumeration of the deserialized and split up in <see cref=\"T\"/> objects data.</returns>\n\t\tpublic async Task<R<T[], CommandError>> SendHybrid<T>(string command, NotificationType type, params ICommandPart[] parameter) where T : class, IResponse, new()\n\t\t\t=> await SendHybrid<T>(new TsCommand(command, parameter), type);\n\n\n#pragma warning disable CS0067\n\n\t\tpublic abstract event NotifyEventHandler<ChannelChanged>? OnChannelChanged;\n\t\tpublic abstract event EventHandler<ChannelChanged>? OnEachChannelChanged;\n\t\tpublic abstract event NotifyEventHandler<ChannelCreated>? OnChannelCreated;\n\t\tpublic abstract event EventHandler<ChannelCreated>? OnEachChannelCreated;\n\t\tpublic abstract event NotifyEventHandler<ChannelDeleted>? OnChannelDeleted;\n\t\tpublic abstract event EventHandler<ChannelDeleted>? OnEachChannelDeleted;\n\t\tpublic abstract event NotifyEventHandler<ChannelEdited>? OnChannelEdited;\n\t\tpublic abstract event EventHandler<ChannelEdited>? OnEachChannelEdited;\n\t\tpublic abstract event NotifyEventHandler<ChannelMoved>? OnChannelMoved;\n\t\tpublic abstract event EventHandler<ChannelMoved>? OnEachChannelMoved;\n\t\tpublic abstract event NotifyEventHandler<ChannelPasswordChanged>? OnChannelPasswordChanged;\n\t\tpublic abstract event EventHandler<ChannelPasswordChanged>? OnEachChannelPasswordChanged;\n\t\tpublic abstract event NotifyEventHandler<ClientEnterView>? OnClientEnterView;\n\t\tpublic abstract event EventHandler<ClientEnterView>? OnEachClientEnterView;\n\t\tpublic abstract event NotifyEventHandler<ClientLeftView>? OnClientLeftView;\n\t\tpublic abstract event EventHandler<ClientLeftView>? OnEachClientLeftView;\n\t\tpublic abstract event NotifyEventHandler<ClientMoved>? OnClientMoved;\n\t\tpublic abstract event EventHandler<ClientMoved>? OnEachClientMoved;\n\t\tpublic abstract event NotifyEventHandler<ServerEdited>? OnServerEdited;\n\t\tpublic abstract event EventHandler<ServerEdited>? OnEachServerEdited;\n\t\tpublic abstract event NotifyEventHandler<TextMessage>? OnTextMessage;\n\t\tpublic abstract event EventHandler<TextMessage>? OnEachTextMessage;\n\t\tpublic abstract event NotifyEventHandler<TokenUsed>? OnTokenUsed;\n\t\tpublic abstract event EventHandler<TokenUsed>? OnEachTokenUsed;\n\n#pragma warning restore CS0067\n\t}\n}\n"
  },
  {
    "path": "TSLib/TsBaseFunctions.gen.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"true\" hostSpecific=\"true\" language=\"C#\" #>\n<#@ include file=\"Generated/MessageParser.ttinclude\" once=\"true\" #>\n<#@ include file=\"Generated/NotificationUtil.ttinclude\" once=\"true\" #>\n<#@ output extension=\".cs\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.IO\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\nusing System;\nusing System.Threading.Tasks;\nusing TSLib.Commands;\nusing TSLib.Messages;\n\n#nullable enable\nnamespace TSLib\n{\n\tpartial class TsBaseFunctions\n\t{\n<#\n\t// SEND UTILITY METHODS\n\n\tforeach(var isHybrid in new[]{ false, true })\n\tforeach(var hasReturn in new[]{ \"dict\", \"T\", \"void\" })\n\t{\n\t\tif (isHybrid && hasReturn == \"void\") continue;\n\n\t\tFunc<string, string, string, string> Ret = (a, b, c) => {\n\t\t\treturn\n\t\t\thasReturn == \"dict\" ? a :\n\t\t\thasReturn == \"T\" ? b :\n\t\t\thasReturn == \"void\" ? c :\n\t\t\t\"!ERR!\";\n\t\t};\n\n\t\tvar retSuffix = Ret(\"\", \"\", \"Void\");\n\t\tvar callTitle = \"Send\" + retSuffix + (isHybrid ? \"Hybrid\" : \"\");\n\t\tvar retType = Ret(\n\t\t\t\"Task<R<ResponseDictionary[], CommandError>>\",\n\t\t\t\"Task<R<T[], CommandError>>\",\n\t\t\t\"Task<E<CommandError>>\");\n\t\tvar genMod = Ret(\"\", \"<T>\", \"\");\n\t\tvar genSuffix = Ret(\"\", $\" where T : {(isHybrid ? \"class, \" : \"\")}IResponse, new()\", \"\");\n\t\tvar fwdModInfix = Ret(\"<ResponseDictionary>\", \"<T>\", \"<ResponseVoid>\");\n\t\tvar fwdTitle = \"Send\" + (isHybrid ? \"Hybrid\" : \"\");\n\t\tvar fwdSuffix = Ret(\"\", \"\", \".ContinueWith(t => t.Result.OnlyError())\");\n\tforeach(var vparam in new[]{ \"cp\", \"com\" })\n\t{\n\t\tif(vparam == \"com\" && callTitle == fwdTitle) continue;\n\n\t\tFunc<string, string, string> Par = (a, b) => {\n\t\t\treturn\n\t\t\tvparam == \"cp\" ? a :\n\t\t\tvparam == \"com\" ? b :\n\t\t\t\"!ERR!\";\n\t\t};\n\t\tvar hybridParam = isHybrid ? \", NotificationType type\" : \"\";\n\t\tvar callParam = Par(\n\t\t\t$\"string command{hybridParam}, params ICommandPart[] parameter\",\n\t\t\t$\"TsCommand com{hybridParam}\");\n\t\tvar fwdParam = Par(\n\t\t\t$\"new TsCommand(command, parameter)\",\n\t\t\t$\"com\");\n\t\tif (isHybrid) fwdParam += \", type\";\n#>\n\t\t/// <summary>\n\t\t/// Sends a TS-command.\n\t\t/// <# if(isHybrid) { #>This will send a normal query-command when connected via query client. When connected as a full client the first specified notification is used as the response.<# } #>\n\t\t/// <# if(hasReturn == \"void\") { #>The response (if any) is not deserialized and is discarded.<# } #>\n\t\t/// </summary>\n\t\t/// <param name=\"command\">The command name.</param>\n\t\t/// <param name=\"parameter\">The parameters to be added to this command.\n\t\t/// See <see cref=\"CommandParameter\"/>, <see cref=\"CommandOption\"/> or <see cref=\"CommandMultiParameter\"/> for more information.</param>\n\t\t/// <# if(isHybrid) { #><param name=\"type\">The notification type to wait for and serialize to when called from the full client.</param><# } #>\n\t\t/// <# if(hasReturn == \"T\") { #><returns>Returns an enumeration of the deserialized and split up in <see cref=\"T\"/> objects data.</returns><# } #>\n\t\tpublic async <#= retType #> <#= callTitle #><#= genMod #>(<#= callParam #>)<#= genSuffix #>\n\t\t\t=> await <#= fwdTitle #><#= fwdModInfix #>(<#= fwdParam #>);\n<# }} #>\n\n#pragma warning disable CS0067\n<#\n\t// NOTIFICATIONS\n\n\tvar genmsg = Messages.Parse(Host.ResolvePath(\"Declarations/Messages.toml\"));\n\tGenNtfyDecls(OnlyS2C(genmsg.NotifiesSorted).Where(ntfy => sharedNotifications.Contains(ntfy.name)), true);\n#>\n#pragma warning restore CS0067\n\t}\n}"
  },
  {
    "path": "TSLib/TsDnsResolver.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing Heijden.Dns.Portable;\nusing Heijden.DNS;\nusing System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing TSLib.Helper;\n\nnamespace TSLib\n{\n\t/// <summary>Provides methods to resolve TSDNS, SRV redirects and nicknames</summary>\n\tpublic static class TsDnsResolver\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tpublic const ushort TsVoiceDefaultPort = 9987;\n\t\tpublic const ushort TsQueryDefaultPort = 10011;\n\t\tprivate const ushort TsDnsDefaultPort = 41144;\n\t\tprivate const string DnsPrefixTcp = \"_tsdns._tcp.\";\n\t\tprivate const string DnsPrefixUdp = \"_ts3._udp.\";\n\t\tprivate const string NicknameLookup = \"https://named.myteamspeak.com/lookup?name=\";\n\t\tprivate static readonly TimeSpan LookupTimeout = TimeSpan.FromSeconds(1);\n\t\tpublic static readonly Resolver Resolver = new Resolver(new[]\n\t\t{\n\t\t\t// Google\n\t\t\tnew IPEndPoint(new IPAddress(new byte[] { 8,8,8,8 }), 53),\n\t\t\tnew IPEndPoint(new IPAddress(new byte[] { 8,8,4,4 }), 53),\n\t\t\t// Cloudflare\n\t\t\tnew IPEndPoint(new IPAddress(new byte[] { 1,1,1,1 }), 53),\n\t\t\tnew IPEndPoint(new IPAddress(new byte[] { 1,0,0,1 }), 53),\n\t\t\t// OpenDNS\n\t\t\tnew IPEndPoint(new IPAddress(new byte[] { 208,67,222,222 }), 53),\n\t\t\tnew IPEndPoint(new IPAddress(new byte[] { 208,67,220,220 }), 53),\n\t\t\t// Freenom\n\t\t\tnew IPEndPoint(new IPAddress(new byte[] { 80,80,80,80 }), 53),\n\t\t\tnew IPEndPoint(new IPAddress(new byte[] { 80,80,81,81 }), 53),\n\t\t});\n\n\t\t// TODO maybe change to proper TLRU\n\t\tprivate static readonly ConcurrentDictionary<string, CacheEntry> addressCache\n\t\t\t= new ConcurrentDictionary<string, CacheEntry>();\n\t\tprivate static readonly TimeSpan CacheTimeout = TimeSpan.FromMinutes(10);\n\n\t\t/// <summary>Tries to resolve an address string to an ip.</summary>\n\t\t/// <param name=\"address\">The address, nickname, etc. to resolve.</param>\n\t\t/// <param name=\"defaultPort\">The default port when no port is specified with the address or the resolved address.</param>\n\t\t/// <returns>The ip address if successfully resolved.</returns>\n\t\tpublic static async Task<IPEndPoint?> TryResolve(string address, ushort defaultPort = TsVoiceDefaultPort)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(address)) throw new ArgumentNullException(nameof(address));\n\n\t\t\tif (addressCache.TryGetValue(address, out var cache) && Tools.Now - cache.Created < CacheTimeout)\n\t\t\t\treturn cache.Ip;\n\n\t\t\tvar endPoint = await TryResolveUncached(address, defaultPort);\n\t\t\taddressCache.TryAdd(address, new CacheEntry(endPoint, Tools.Now));\n\t\t\treturn endPoint;\n\t\t}\n\n\t\tpublic static async Task<IPEndPoint?> TryResolveUncached(string address, ushort defaultPort = TsVoiceDefaultPort)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(address)) throw new ArgumentNullException(nameof(address));\n\t\t\tIPEndPoint? endPoint;\n\n\t\t\tLog.Debug(\"Trying to look up '{0}'\", address);\n\n\t\t\t// if this address does not look like a domain it might be a nickname\n\t\t\tif (!address.Contains(\".\") && !address.Contains(\":\") && address != \"localhost\")\n\t\t\t{\n\t\t\t\tLog.Debug(\"Resolving '{0}' as nickname\", address);\n\t\t\t\tvar resolvedNickname = await ResolveNickname(address).ConfigureAwait(false);\n\t\t\t\tif (resolvedNickname != null)\n\t\t\t\t{\n\t\t\t\t\tLog.Debug(\"Resolved nickname '{0}' as '{1}'\", address, resolvedNickname);\n\t\t\t\t\taddress = resolvedNickname;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// host is specified as an IP (+ Port)\n\t\t\tif ((endPoint = ParseIpEndPoint(address, defaultPort)) != null)\n\t\t\t{\n\t\t\t\tLog.Debug(\"Address is an ip: '{0}'\", endPoint);\n\t\t\t\treturn endPoint;\n\t\t\t}\n\n\t\t\tif (!Uri.TryCreate(\"http://\" + address, UriKind.Absolute, out var uri))\n\t\t\t{\n\t\t\t\tLog.Warn(\"Could not parse address as uri\");\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// host is a dns name\n\t\t\tvar hasUriPort = !string.IsNullOrEmpty(uri.GetComponents(UriComponents.Port, UriFormat.Unescaped));\n\n\t\t\t// Try resolve udp prefix\n\t\t\t// At this address we'll get ts voice server\n\t\t\tendPoint = await ResolveSrv(Resolver, DnsPrefixUdp + uri.Host).ConfigureAwait(false);\n\t\t\tif (endPoint != null)\n\t\t\t{\n\t\t\t\tif (hasUriPort)\n\t\t\t\t\tendPoint.Port = uri.Port;\n\t\t\t\tLog.Debug(\"Address found using _udp prefix '{0}'\", endPoint);\n\t\t\t\treturn endPoint;\n\t\t\t}\n\n\t\t\t// split domain to get a list of subdomains, for e.g.:\n\t\t\t// my.cool.subdomain.from.de\n\t\t\t// => from.de\n\t\t\t// => subdomain.from.de\n\t\t\t// => cool.subdomain.from.de\n\t\t\tvar domainSplit = uri.Host.Split('.');\n\t\t\tif (domainSplit.Length <= 1)\n\t\t\t\treturn null;\n\t\t\tvar domainList = new List<string>();\n\t\t\tfor (int i = 1; i < Math.Min(domainSplit.Length, 4); i++)\n\t\t\t\tdomainList.Add(string.Join(\".\", domainSplit, domainSplit.Length - (i + 1), i + 1));\n\n\t\t\t// Try resolve tcp prefix\n\t\t\t// Under this address we'll get the tsdns server\n\t\t\tforeach (var domain in domainList)\n\t\t\t{\n\t\t\t\tvar srvEndPoint = await ResolveSrv(Resolver, DnsPrefixTcp + domain).ConfigureAwait(false);\n\t\t\t\tif (srvEndPoint is null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tendPoint = await ResolveTsDns(srvEndPoint, uri.Host, defaultPort).ConfigureAwait(false);\n\t\t\t\tif (endPoint != null)\n\t\t\t\t{\n\t\t\t\t\tif (hasUriPort)\n\t\t\t\t\t\tendPoint.Port = uri.Port;\n\t\t\t\t\tLog.Debug(\"Address found using _tcp prefix '{0}'\", endPoint);\n\t\t\t\t\treturn endPoint;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try resolve to the tsdns service directly\n\t\t\tforeach (var domain in domainList)\n\t\t\t{\n\t\t\t\tendPoint = await ResolveTsDns(domain, TsDnsDefaultPort, uri.Host, defaultPort).ConfigureAwait(false);\n\t\t\t\tif (endPoint != null)\n\t\t\t\t\treturn endPoint;\n\t\t\t}\n\n\t\t\t// Try to normally resolve server address\n\t\t\tvar hostAddress = await ResolveDns(uri.Host).ConfigureAwait(false);\n\t\t\tif (hostAddress is null)\n\t\t\t\treturn null;\n\n\t\t\tvar port = hasUriPort ? uri.Port : defaultPort;\n\t\t\treturn new IPEndPoint(hostAddress, port);\n\t\t}\n\n\t\tprivate static async Task<IPEndPoint?> ResolveSrv(Resolver resolver, string domain)\n\t\t{\n\t\t\tLog.Trace(\"Resolving srv record '{0}'\", domain);\n\t\t\tResponse response;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tresponse = await resolver.Query(domain, QType.SRV, QClass.IN).ConfigureAwait(false);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Unexcepted dns resolve error.\");\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (response.RecordsSRV.Length > 0)\n\t\t\t{\n\t\t\t\tvar srvRecord = response.RecordsSRV[0];\n\n\t\t\t\tvar hostAddress = await ResolveDns(srvRecord.TARGET).ConfigureAwait(false);\n\t\t\t\tif (hostAddress != null)\n\t\t\t\t\treturn new IPEndPoint(hostAddress, srvRecord.PORT);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tprivate static async Task<IPEndPoint?> ResolveTsDns(string tsDnsAddress, ushort port, string resolveAddress, ushort defaultPort)\n\t\t{\n\t\t\tLog.Trace(\"Looking for the tsdns under '{0}'\", tsDnsAddress);\n\t\t\tvar hostAddress = await ResolveDns(tsDnsAddress).ConfigureAwait(false);\n\t\t\tif (hostAddress is null)\n\t\t\t\treturn null;\n\n\t\t\treturn await ResolveTsDns(new IPEndPoint(hostAddress, port), resolveAddress, defaultPort).ConfigureAwait(false);\n\t\t}\n\n\t\tprivate static async Task<IPEndPoint?> ResolveTsDns(IPEndPoint tsDnsAddress, string resolveAddress, ushort defaultPort)\n\t\t{\n\t\t\tLog.Trace(\"Looking up tsdns address '{0}'\", resolveAddress);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tusing var client = new TcpClient();\n\t\t\t\tvar cancelTask = Task.Delay(LookupTimeout);\n\t\t\t\tvar connectTask = client.ConnectAsync(tsDnsAddress.Address, tsDnsAddress.Port).ContinueWith(async t =>\n\t\t\t\t{\n\t\t\t\t\t// Swallow error on connect error\n\t\t\t\t\ttry { await t; } catch { }\n\t\t\t\t}, TaskContinuationOptions.OnlyOnFaulted);\n\t\t\t\tawait Task.WhenAny(connectTask, cancelTask);\n\t\t\t\tif (cancelTask.IsCompleted)\n\t\t\t\t{\n\t\t\t\t\tLog.Debug(\"Request to '{0}' timed out\", tsDnsAddress);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tusing var stream = client.GetStream();\n\t\t\t\tvar addBuf = Encoding.ASCII.GetBytes(resolveAddress);\n\t\t\t\tawait stream.WriteAsync(addBuf, 0, addBuf.Length);\n\t\t\t\tawait stream.FlushAsync();\n\n\t\t\t\tstream.ReadTimeout = (int)LookupTimeout.TotalMilliseconds;\n\t\t\t\tvar readBuffer = new byte[128];\n\t\t\t\tint readLen = await stream.ReadAsync(readBuffer, 0, readBuffer.Length);\n\t\t\t\tstring returnString = Encoding.ASCII.GetString(readBuffer, 0, readLen);\n\n\t\t\t\treturn ParseIpEndPoint(returnString, defaultPort);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Debug(ex, \"Socket error checking '{0}', reason {1}\", resolveAddress, ex.Message);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tprivate static async Task<IPAddress?> ResolveDns(string hostOrNameAddress)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tLog.Trace(\"Lookup dns: '{0}'\", hostOrNameAddress);\n\t\t\t\tIPHostEntry hostEntry = await Dns.GetHostEntryAsync(hostOrNameAddress).ConfigureAwait(false);\n\t\t\t\tif (hostEntry.AddressList.Length == 0)\n\t\t\t\t\treturn null;\n\t\t\t\treturn hostEntry.AddressList[0];\n\t\t\t}\n\t\t\tcatch (SocketException) { return null; }\n\t\t}\n\n\t\tprivate static readonly Regex IpRegex = new Regex(@\"(?<ip>(?:\\d{1,3}\\.){3}\\d{1,3}|\\[[0-9a-fA-F:]+\\]|localhost)(?::(?<port>\\d{1,5}))?\", RegexOptions.ECMAScript | RegexOptions.Compiled);\n\n\t\tprivate static IPEndPoint? ParseIpEndPoint(string address, ushort defaultPort)\n\t\t{\n\t\t\tvar match = IpRegex.Match(address);\n\t\t\tif (!match.Success)\n\t\t\t\treturn null;\n\n\t\t\tIPAddress ipAddr;\n\t\t\tif (match.Groups[\"ip\"].Value == \"localhost\")\n\t\t\t\tipAddr = IPAddress.Loopback;\n\t\t\telse if (!IPAddress.TryParse(match.Groups[\"ip\"].Value, out ipAddr))\n\t\t\t\treturn null;\n\n\t\t\tif (!match.Groups[\"port\"].Success)\n\t\t\t\treturn new IPEndPoint(ipAddr, defaultPort);\n\n\t\t\tif (!ushort.TryParse(match.Groups[\"port\"].Value, out ushort port))\n\t\t\t\treturn null;\n\n\t\t\treturn new IPEndPoint(ipAddr, port);\n\t\t}\n\n\t\tprivate static async Task<string?> ResolveNickname(string nickname)\n\t\t{\n\t\t\tstring result;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar request = WebRequest.Create(NicknameLookup + Uri.EscapeDataString(nickname));\n\t\t\t\tusing var respose = await request.GetResponseAsync().ConfigureAwait(false);\n\t\t\t\tusing var stream = respose.GetResponseStream();\n\t\t\t\tusing var reader = new StreamReader(stream, Tools.Utf8Encoder, false, (int)respose.ContentLength);\n\t\t\t\tresult = await reader.ReadToEndAsync().ConfigureAwait(false);\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tLog.Warn(ex, \"Failed to resolve nickname \\\"{0}\\\"\", nickname);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tvar splits = result.Split(new[] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\t\tif (splits.Length == 0)\n\t\t\t{\n\t\t\t\tLog.Warn(\"Nickname \\\"{0}\\\" has no address entries\", nickname);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn splits[0];\n\t\t}\n\n\t\tprivate readonly struct CacheEntry\n\t\t{\n\t\t\tpublic IPEndPoint? Ip { get; }\n\t\t\tpublic DateTime Created { get; }\n\n\t\t\tpublic CacheEntry(IPEndPoint? ip, DateTime created)\n\t\t\t{\n\t\t\t\tIp = ip;\n\t\t\t\tCreated = created;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/TsEnums.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\n\nnamespace TSLib\n{\n\t/*\n\t\t* Most important Id datatypes:\n\t\t*\n\t\t* ClientUid: string\n\t\t* ClientDbId: ulong\n\t\t* ClientId: ushort\n\t\t* ChannelId: ulong\n\t\t* ServerGroupId: ulong\n\t\t* ChannelGroupId: ulong\n\t\t* PermissionIdT: int ???\n\t*/\n\n\tpublic enum ClientType\n\t{\n\t\tFull = 0,\n\t\tQuery,\n\t}\n\n\t[Flags]\n\tpublic enum ClientListOptions\n\t{\n\t\t// ReSharper disable InconsistentNaming, UnusedMember.Global\n\t\tuid = 1 << 0,\n\t\taway = 1 << 1,\n\t\tvoice = 1 << 2,\n\t\ttimes = 1 << 3,\n\t\tgroups = 1 << 4,\n\t\tinfo = 1 << 5,\n\t\ticon = 1 << 6,\n\t\tcountry = 1 << 7,\n\t\t// ReSharper restore InconsistentNaming, UnusedMember.Global\n\t}\n\n\t[Flags]\n\tpublic enum ChannelListOptions\n\t{\n\t\t// ReSharper disable InconsistentNaming, UnusedMember.Global\n\t\ttopic = 1 << 0,\n\t\tflags = 1 << 1,\n\t\tvoice = 1 << 2,\n\t\tlimits = 1 << 3,\n\t\ticon = 1 << 4,\n\t\tsecondsempty = 1 << 5,\n\t\t// ReSharper restore InconsistentNaming, UnusedMember.Global\n\t}\n\n\tpublic enum GroupNamingMode\n\t{\n\t\t/// <summary>No group name is displayed.</summary>\n\t\tNone = 0,\n\t\t/// <summary>The group is displayed before the client name.</summary>\n\t\tBefore,\n\t\t/// <summary>The group is displayed after the client name.</summary>\n\t\tAfter\n\t}\n\n\t// ReSharper disable UnusedMember.Global\n\tpublic enum Reason\n\t{\n\t\tUserAction = 0,\n\t\tUserOrChannelMoved,\n\t\tSubscriptionChanged,\n\t\tTimeout,\n\t\tKickedFromChannel,\n\t\tKickedFromServer,\n\t\tBanned,\n\t\tServerStopped,\n\t\tLeftServer,\n\t\tChannelUpdated,\n\t\tServerOrChannelEdited,\n\t\tServerShutdown,\n\n\t\tSocketError = 1000,\n\t}\n\n\tpublic enum GroupWhisperType : byte\n\t{\n\t\t/// <summary>Targets all users in the specified server group.\n\t\t/// (Requires servergroup targetId)</summary>\n\t\tServerGroup = 0,\n\t\t/// <summary>Targets all users in the specified channel group.\n\t\t/// (Requires channelgroup targetId)</summary>\n\t\tChannelGroup,\n\t\t/// <summary>Targets all users with channel commander.</summary>\n\t\tChannelCommander,\n\t\t/// <summary>Targets all users on the server.</summary>\n\t\tAllClients,\n\t}\n\n\tpublic enum GroupWhisperTarget : byte\n\t{\n\t\tAllChannels = 0,\n\t\tCurrentChannel,\n\t\tParentChannel,\n\t\tAllParentChannel,\n\t\tChannelFamily,\n\t\tCompleteChannelFamily,\n\t\tSubchannels,\n\t}\n\t// ReSharper enable UnusedMember.Global\n\n\tpublic enum LicenseType : ushort\n\t{\n\t\t/// <summary>No licence</summary>\n\t\tNoLicense = 0,\n\t\t///<summary>Authorised TeamSpeak Host Provider License (ATHP)</summary>\n\t\tAthp = 1,\n\t\t///<summary>Offline/LAN License</summary>\n\t\tLan = 2,\n\t\t///<summary>Non-Profit License (NPL)</summary>\n\t\tNpl = 3,\n\t\t///<summary>Unknown License</summary>\n\t\tUnknown = 4,\n\t}\n\n\t// http://media.teamspeak.com/ts3_literature/TeamSpeak%203%20Server%20Query%20Manual.pdf\n\t// public_definitions.h from the ts3 plugin library\n\n\tpublic enum HostMessageMode\n\t{\n\t\t/// <summary>Dont display anything</summary>\n\t\tNone = 0,\n\t\t/// <summary>Display message in chatlog.</summary>\n\t\tLog,\n\t\t/// <summary>Display message in modal dialog.</summary>\n\t\tModal,\n\t\t/// <summary>Display message in modal dialog and close connection.</summary>\n\t\tModalQuit\n\t}\n\n\tpublic enum HostBannerMode\n\t{\n\t\t///<summary>Do not adjust.</summary>\n\t\tNoAdjust = 0,\n\t\t///<summary>Adjust but ignore aspect ratio (like TeamSpeak 2).</summary>\n\t\tIgnoreAspect,\n\t\t///<summary>Adjust and keep aspect ratio.</summary>\n\t\tKeepAspect\n\t}\n\n\tpublic enum Codec : byte\n\t{\n\t\t///<summary>mono, 16bit, 8kHz</summary>\n\t\tSpeexNarrowband = 0,\n\t\t///<summary>mono, 16bit, 16kHz</summary>\n\t\tSpeexWideband,\n\t\t///<summary>mono, 16bit, 32kHz</summary>\n\t\tSpeexUltraWideband,\n\t\t///<summary>mono, 16bit, 48kHz</summary>\n\t\tCeltMono,\n\t\t///<summary>mono, 16bit, 48kHz, optimized for voice</summary>\n\t\tOpusVoice,\n\t\t///<summary>stereo, 16bit, 48kHz, optimized for music</summary>\n\t\tOpusMusic,\n\n\t\t/// <summary>PCM S16LE 1/2 Channel (TSLib extension; not supported by normal TeamSpeak clients!)</summary>\n\t\tRaw = 127,\n\t}\n\n\tpublic enum CodecEncryptionMode\n\t{\n\t\t///<summary>Configure per channel.</summary>\n\t\tIndividual = 0,\n\t\t///<summary>Globally disabled.</summary>\n\t\tDisabled,\n\t\t///<summary>Globally enabled.</summary>\n\t\tEnabled\n\t}\n\n\tpublic enum TextMessageTargetMode\n\t{\n\t\t/// <summary>Target is a client.</summary>\n\t\tPrivate = 1,\n\t\t/// <summary>Target is a channel.</summary>\n\t\tChannel,\n\t\t/// <summary>Target is a virtual server.</summary>\n\t\tServer,\n\t}\n\n\tpublic enum LogLevel\n\t{\n\t\t///<summary>Everything that is really bad.</summary>\n\t\tError = 1,\n\t\t///<summary>Everything that might be bad.</summary>\n\t\tWarning,\n\t\t///<summary>Output that might help find a problem.</summary>\n\t\tDebug,\n\t\t///<summary>Informational output.</summary>\n\t\tInfo\n\t}\n\n\tpublic enum ReasonIdentifier\n\t{\n\t\t///<summary>Kick client from channel.</summary>\n\t\tChannel = 4,\n\t\t///<summary>Kick client from server.</summary>\n\t\tServer,\n\t}\n\n\tpublic enum GroupType\n\t{\n\t\t///<summary>Template group (used for new virtual servers).</summary>\n\t\tTemplate = 0,\n\t\t///<summary>Regular group (used for regular clients).</summary>\n\t\tRegular,\n\t\t///<summary>Global query group (used for ServerQuery clients).</summary>\n\t\tQuery\n\t}\n\n\tpublic enum PermissionType\n\t{\n\t\t///<summary>Server group permission. (id1: ServerGroupId, id2: 0)</summary>\n\t\tServerGroup = 0,\n\t\t///<summary>Client specific permission. (id1: ClientDbId, id2: 0)</summary>\n\t\tGlobalClient,\n\t\t///<summary>Channel specific permission. (id1: ChannelId, id2: 0)</summary>\n\t\tChannel,\n\t\t///<summary>Channel group permission. (id1: ChannelId, id2: ChannelGroupId)</summary>\n\t\tChannelGroup,\n\t\t///<summary>Channel-client specific permission. (id1: ChannelId, id2: ClientDbId)</summary>\n\t\tChannelClient\n\t}\n\n\tpublic enum TokenType\n\t{\n\t\t///<summary>Server group token (id1: ServerGroupId, id2: 0).</summary>\n\t\tServerGroup = 0,\n\t\t///<summary>Channel group token (id1: ServerGroupId, id2: ChannelId).</summary>\n\t\tChannelGroup\n\t}\n\n\tpublic enum PluginTargetMode\n\t{\n\t\t///<summary>Send to all clients in current channel.</summary>\n\t\tCurrentChannel = 0,\n\t\t///<summary>Send to all clients on server.</summary>\n\t\tServer,\n\t\t///<summary>Send to all given client ids.</summary>\n\t\tClient,\n\t\t///<summary>Send to all subscribed clients in current channel.</summary>\n\t\tCurrentChannelSubscribedClients,\n\t}\n\n\t// notifychannelpermhints\n\t[Flags]\n\tpublic enum ChannelPermissionHint\n\t{\n\t\tNone = 0,\n\n\t\tJoin = 1 << 0, // b_channel_join_*\n\t\tModify = 1 << 1, // i_channel_modify_power\n\t\tForceDelete = 1 << 2, // b_channel_delete_flag_force\n\t\tDelete = 1 << 3, // b_channel_delete_*\n\t\tSubscribe = 1 << 4, // i_channel_subscribe_power\n\t\tViewDescription = 1 << 5, // i_channel_description_view_power\n\t\tFileUpload = 1 << 6, // i_ft_file_upload_power\n\t\tFileDownload = 1 << 7, // i_ft_needed_file_download_power\n\t\tFileDelete = 1 << 8, // i_ft_file_delete_power\n\t\tFileRename = 1 << 9, // i_ft_file_rename_power\n\t\tFileBrowse = 1 << 10, // i_ft_file_browse_power\n\t\tFileDirectoryCreate = 1 << 11, // i_ft_directory_create_power\n\t\tModifyPermissions = 1 << 12, // i_channel_permission_modify_power\n\n\t\tAll = (1 << 13) - 1,\n\t}\n\n\t// notifyclientpermhints\n\t[Flags]\n\tpublic enum ClientPermissionHint\n\t{\n\t\tNone = 0,\n\n\t\tKickServer = 1 << 0, // i_client_kick_from_server_power\n\t\tKickChannel = 1 << 1, // i_client_kick_from_channel_power\n\t\tBan = 1 << 2, // i_client_ban_power\n\t\tMoveClient = 1 << 3, // i_client_move_power\n\t\tPrivateMessage = 1 << 4, // i_client_private_textmessage_power\n\t\tPoke = 1 << 5, // i_client_poke_power\n\t\tWhisper = 1 << 6, // i_client_whisper_power\n\t\tComplain = 1 << 7, // i_client_complain_power\n\t\tModifyPermissions = 1 << 8, // i_client_permission_modify_power\n\n\t\tAll = (1 << 9) - 1,\n\t}\n}\n"
  },
  {
    "path": "TSLib/TsPermissionHelper.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Linq;\nusing TSLib.Commands;\nusing TSLib.Helper;\nusing TSLib.Messages;\n\nnamespace TSLib\n{\n\tpublic static partial class TsPermissionHelper\n\t{\n\t\tpublic static ICommandPart GetAsParameter(IPermissionTransform permissionTransform, TsPermission permission)\n\t\t{\n\t\t\tif (permissionTransform is null || permissionTransform == DummyPermissionTransform.Instance)\n\t\t\t\treturn new CommandParameter(\"permsid\", permission.ToString());\n\t\t\telse\n\t\t\t\treturn new CommandParameter(\"permid\", permissionTransform.GetId(permission));\n\t\t}\n\n\t\tpublic static ICommandPart GetAsMultiParameter(IPermissionTransform permissionTransform, params TsPermission[] permission)\n\t\t{\n\t\t\tif (permissionTransform is null || permissionTransform == DummyPermissionTransform.Instance)\n\t\t\t\treturn new CommandMultiParameter(\"permsid\", permission.Select(x => x.ToString()));\n\t\t\telse\n\t\t\t\treturn new CommandMultiParameter(\"permid\", permission.Select(x => permissionTransform.GetId(x)));\n\t\t}\n\n\t\tpublic static PermOverview Combine(this PermOverview perm, PermOverview other)\n\t\t{\n\t\t\t// A pretty good documentation on permissions: http://yat.qa/ressourcen/definitionen-und-algorithmen/#permissions\n\t\t\tswitch (perm.PermissionType)\n\t\t\t{\n\t\t\tcase PermissionType.ServerGroup:\n\t\t\t\tswitch (other.PermissionType)\n\t\t\t\t{\n\t\t\t\tcase PermissionType.ServerGroup:\n\t\t\t\t\tif (perm.PermissionNegated && other.PermissionNegated)\n\t\t\t\t\t\treturn perm.PermissionValue < other.PermissionValue ? perm : other;\n\t\t\t\t\telse if (other.PermissionNegated)\n\t\t\t\t\t\treturn other;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn perm.PermissionValue > other.PermissionValue ? perm : other;\n\n\t\t\t\tcase PermissionType.GlobalClient:\n\t\t\t\tcase PermissionType.ChannelClient:\n\t\t\t\t\treturn other;\n\n\t\t\t\tcase PermissionType.Channel:\n\t\t\t\tcase PermissionType.ChannelGroup:\n\t\t\t\t\tif (perm.PermissionSkip)\n\t\t\t\t\t\treturn perm;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn other;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(perm.PermissionType);\n\t\t\t\t}\n\n\t\t\tcase PermissionType.GlobalClient:\n\t\t\t\tswitch (other.PermissionType)\n\t\t\t\t{\n\t\t\t\tcase PermissionType.ServerGroup:\n\t\t\t\t\treturn Combine(other, perm);\n\n\t\t\t\tcase PermissionType.GlobalClient:\n\t\t\t\t\treturn perm.PermissionValue > other.PermissionValue ? perm : other;\n\n\t\t\t\tcase PermissionType.Channel:\n\t\t\t\tcase PermissionType.ChannelGroup:\n\t\t\t\t\tif (perm.PermissionSkip)\n\t\t\t\t\t\treturn perm;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn other;\n\n\t\t\t\tcase PermissionType.ChannelClient:\n\t\t\t\t\treturn other;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(perm.PermissionType);\n\t\t\t\t}\n\n\t\t\tcase PermissionType.Channel:\n\t\t\t\tswitch (other.PermissionType)\n\t\t\t\t{\n\t\t\t\tcase PermissionType.ServerGroup:\n\t\t\t\tcase PermissionType.GlobalClient:\n\t\t\t\t\treturn Combine(other, perm);\n\n\t\t\t\tcase PermissionType.Channel:\n\t\t\t\t\treturn perm.PermissionValue > other.PermissionValue ? perm : other;\n\n\t\t\t\tcase PermissionType.ChannelGroup:\n\t\t\t\tcase PermissionType.ChannelClient:\n\t\t\t\t\treturn other;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(perm.PermissionType);\n\t\t\t\t}\n\n\t\t\tcase PermissionType.ChannelGroup:\n\t\t\t\tswitch (other.PermissionType)\n\t\t\t\t{\n\t\t\t\tcase PermissionType.ServerGroup:\n\t\t\t\tcase PermissionType.GlobalClient:\n\t\t\t\tcase PermissionType.Channel:\n\t\t\t\t\treturn perm;\n\n\t\t\t\tcase PermissionType.ChannelGroup:\n\t\t\t\t\treturn perm.PermissionValue > other.PermissionValue ? perm : other;\n\n\t\t\t\tcase PermissionType.ChannelClient:\n\t\t\t\t\treturn other;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(perm.PermissionType);\n\t\t\t\t}\n\n\t\t\tcase PermissionType.ChannelClient:\n\t\t\t\tswitch (other.PermissionType)\n\t\t\t\t{\n\t\t\t\tcase PermissionType.ServerGroup:\n\t\t\t\tcase PermissionType.GlobalClient:\n\t\t\t\tcase PermissionType.Channel:\n\t\t\t\tcase PermissionType.ChannelGroup:\n\t\t\t\t\treturn perm;\n\n\t\t\t\tcase PermissionType.ChannelClient:\n\t\t\t\t\treturn perm.PermissionValue > other.PermissionValue ? perm : other;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow Tools.UnhandledDefault(perm.PermissionType);\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tthrow Tools.UnhandledDefault(perm.PermissionType);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/TsVersion.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\nusing TSLib.Full;\n\nnamespace TSLib\n{\n\t/// <summary>Describes a version tuple of version and platform.</summary>\n\tpublic class TsVersion\n\t{\n\t\tprotected static readonly Regex VersionPattern = new Regex(@\"([^ ])* \\[Build: (\\d+)\\]\", RegexOptions.ECMAScript | RegexOptions.Compiled);\n\n\t\tprivate static readonly Dictionary<string, ClientPlatform> Platforms = new Dictionary<string, ClientPlatform> {\n\t\t\t{ \"Windows\", ClientPlatform.Windows },\n\t\t\t{ \"Linux\", ClientPlatform.Linux },\n\t\t\t{ \"OS X\", ClientPlatform.MacOs },\n\t\t\t{ \"macOS\", ClientPlatform.MacOs },\n\t\t\t{ \"Android\", ClientPlatform.Android },\n\t\t\t{ \"iOS\", ClientPlatform.Ios },\n\t\t};\n\n\t\tprotected static ClientPlatform GetPlatform(string platform)\n\t\t\t=> Platforms.TryGetValue(platform, out var enu) ? enu : ClientPlatform.Other;\n\n\t\tpublic string Version { get; }\n\t\tpublic string Platform { get; }\n\t\tpublic ClientPlatform PlatformType { get; }\n\t\tpublic ulong Build { get; }\n\n\t\tpublic TsVersion(string rawVersion, string platform, ulong build)\n\t\t\t\t: this(rawVersion, platform, GetPlatform(platform), build) { }\n\n\t\tpublic TsVersion(string rawVersion, string platform, ClientPlatform platformType, ulong build)\n\t\t{\n\t\t\tVersion = rawVersion;\n\t\t\tPlatform = platform;\n\t\t\tPlatformType = platformType;\n\t\t\tBuild = build;\n\t\t}\n\n\t\tpublic static TsVersion? TryParse(string version, string platform)\n\t\t{\n\t\t\tvar match = VersionPattern.Match(version);\n\t\t\tif (!match.Success)\n\t\t\t\treturn null;\n\t\t\tif (!ulong.TryParse(match.Groups[2].Value, out var build))\n\t\t\t\treturn null;\n\t\t\treturn new TsVersion(version, platform, build);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Describes a triple of version, platform and a cryptographical signature (usually distributed by \"TeamSpeak Systems\").\n\t/// Each triple has to match and is not interchangeable with other triple parts.\n\t/// </summary>\n\tpublic sealed partial class TsVersionSigned : TsVersion\n\t{\n\t\tpublic string Sign { get; }\n\n\t\tpublic TsVersionSigned(string rawVersion, string platform, ulong build, string sign)\n\t\t\t: this(rawVersion, platform, GetPlatform(platform), build, sign) { }\n\n\t\tpublic TsVersionSigned(string rawVersion, string platform, ClientPlatform platformType, ulong build, string sign)\n\t\t\t: base(rawVersion, platform, platformType, build)\n\t\t{\n\t\t\tSign = sign;\n\t\t}\n\n\t\tpublic static TsVersionSigned? TryParse(string version, string platform, string sign)\n\t\t{\n\t\t\tvar match = VersionPattern.Match(version);\n\t\t\tif (!match.Success)\n\t\t\t\treturn null;\n\t\t\tif (!ulong.TryParse(match.Groups[2].Value, out var build))\n\t\t\t\treturn null;\n\t\t\tvar prelim = new TsVersionSigned(version, platform, build, sign);\n\t\t\tif (!prelim.CheckValid())\n\t\t\t\treturn null;\n\t\t\treturn prelim;\n\t\t}\n\n\t\tpublic bool CheckValid() => TsCrypt.EdCheck(this);\n\t}\n\n\tpublic enum ClientPlatform\n\t{\n\t\tOther = 0,\n\t\tWindows,\n\t\tLinux,\n\t\tMacOs,\n\t\tAndroid,\n\t\tIos,\n\t}\n}\n"
  },
  {
    "path": "TSLib/Types.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing TSLib.Full;\n\nnamespace TSLib\n{\n\tpublic partial struct Uid\n\t{\n\t\t/// <summary>Unofficial type</summary>\n\t\tpublic static readonly Uid Anonymous = new Uid(\"anonymous\");\n\t\tpublic static readonly Uid ServerAdmin = new Uid(\"serveradmin\");\n\n\t\tpublic static bool IsValid(string uid)\n\t\t{\n\t\t\tif (uid == Anonymous.Value || uid == ServerAdmin.Value)\n\t\t\t\treturn true;\n\t\t\tvar result = TsCrypt.Base64Decode(uid);\n\t\t\treturn result != null && result.Length == 20;\n\t\t}\n\t}\n\n\tpublic partial struct ChannelId\n\t{\n\t\tpublic string ToPath() => $\"/{Value}\";\n\t}\n}\n"
  },
  {
    "path": "TSLib/Types.gen.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n\n\n\n\n\n\n\n#nullable enable\nusing Newtonsoft.Json;\nusing System;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.Runtime.InteropServices;\n\nnamespace TSLib\n{\n\tpublic static class TsTypes\n\t{\n\t\tpublic static Type[] All => new Type[] { typeof(Uid),typeof(ClientDbId),typeof(ClientId),typeof(ChannelId),typeof(ServerGroupId),typeof(ChannelGroupId), };\n\t}\n\n\t\n\t[StructLayout(LayoutKind.Sequential, Pack=0)]\n\t[DebuggerDisplay(\"{Value, nq}\")]\n\t[JsonConverter(typeof(Uid.Converter))]\n\tpublic readonly partial struct Uid : IEquatable<Uid>\n\t{\n\t\tpublic static readonly Uid Null = new Uid(string.Empty);\n\t\tpublic static Uid To(String v) => new Uid(v);\n\n\t\tpublic String Value { get; }\n\t\tpublic Uid(String value) { if (value == null) throw new ArgumentNullException(nameof(value)); Value = value; }\n\t\tpublic static explicit operator Uid(String v) => new Uid(v);\n\t\tpublic static bool operator ==(Uid a, Uid b) => a.Value == b.Value;\n\t\tpublic static bool operator !=(Uid a, Uid b) => a.Value != b.Value;\n\t\tpublic override int GetHashCode() => Value?.GetHashCode() ?? 0 ;\n\t\tpublic override bool Equals(object? obj) => obj is Uid c && this.Equals(c);\n\t\tpublic override string ToString() => Value ?? \"\";\n\t\t\n\t\tpublic bool Equals(Uid other) => string.Equals(Value, other.Value, StringComparison.Ordinal);\n\t\t\n\t\tpublic static Uid? TryFrom(object value) {\n\t\t\t\n\t\t\tif (value is string s) return new Uid(s);\n\t\t\treturn null;\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\tprivate class Converter : JsonConverter<Uid>\n\t\t{\n\t\t\tpublic override void WriteJson(JsonWriter writer, Uid value, JsonSerializer serializer)\n\t\t\t\t=> writer.WriteValue(value.Value);\n\t\t\tpublic override Uid ReadJson(JsonReader reader, Type objectType, Uid existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t\t\t=> new Uid((reader.ReadAsString() ?? throw new FormatException()));\n\t\t}\n\t}\n\t\n\t[StructLayout(LayoutKind.Sequential, Pack=0)]\n\t[DebuggerDisplay(\"{Value, nq}\")]\n\t[JsonConverter(typeof(ClientDbId.Converter))]\n\tpublic readonly partial struct ClientDbId : IFormattable, IEquatable<ClientDbId>\n\t{\n\t\tpublic static readonly ClientDbId Null = new ClientDbId(default);\n\t\tpublic static ClientDbId To(UInt64 v) => new ClientDbId(v);\n\n\t\tpublic UInt64 Value { get; }\n\t\tpublic ClientDbId(UInt64 value) {  Value = value; }\n\t\tpublic static explicit operator ClientDbId(UInt64 v) => new ClientDbId(v);\n\t\tpublic static bool operator ==(ClientDbId a, ClientDbId b) => a.Value == b.Value;\n\t\tpublic static bool operator !=(ClientDbId a, ClientDbId b) => a.Value != b.Value;\n\t\tpublic override int GetHashCode() => Value.GetHashCode() ;\n\t\tpublic override bool Equals(object? obj) => obj is ClientDbId c && this.Equals(c);\n\t\tpublic override string ToString() => Value .ToString();\n\t\t\n\t\tpublic bool Equals(ClientDbId other) => Value.Equals(other.Value);\n\t\tpublic string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider);\n\t\t\n\t\tpublic static ClientDbId? TryFrom(object value) {\n\t\t\t\n\t\t\tif (value is UInt64 bvalue) return new ClientDbId(bvalue);\n\t\t\tif (value is string s && UInt64.TryParse(s, out var num)) return new ClientDbId(num);\n\t\t\tif (value is IConvertible c) return new ClientDbId(c.ToUInt64(CultureInfo.InvariantCulture));\n\n\t\t\treturn null;\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\tprivate class Converter : JsonConverter<ClientDbId>\n\t\t{\n\t\t\tpublic override void WriteJson(JsonWriter writer, ClientDbId value, JsonSerializer serializer)\n\t\t\t\t=> writer.WriteValue(value.Value);\n\t\t\tpublic override ClientDbId ReadJson(JsonReader reader, Type objectType, ClientDbId existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t\t\t=> new ClientDbId(UInt64.Parse(reader.ReadAsString() ?? throw new FormatException()));\n\t\t}\n\t}\n\t\n\t[StructLayout(LayoutKind.Sequential, Pack=0)]\n\t[DebuggerDisplay(\"{Value, nq}\")]\n\t[JsonConverter(typeof(ClientId.Converter))]\n\tpublic readonly partial struct ClientId : IFormattable, IEquatable<ClientId>\n\t{\n\t\tpublic static readonly ClientId Null = new ClientId(default);\n\t\tpublic static ClientId To(UInt16 v) => new ClientId(v);\n\n\t\tpublic UInt16 Value { get; }\n\t\tpublic ClientId(UInt16 value) {  Value = value; }\n\t\tpublic static explicit operator ClientId(UInt16 v) => new ClientId(v);\n\t\tpublic static bool operator ==(ClientId a, ClientId b) => a.Value == b.Value;\n\t\tpublic static bool operator !=(ClientId a, ClientId b) => a.Value != b.Value;\n\t\tpublic override int GetHashCode() => Value.GetHashCode() ;\n\t\tpublic override bool Equals(object? obj) => obj is ClientId c && this.Equals(c);\n\t\tpublic override string ToString() => Value .ToString();\n\t\t\n\t\tpublic bool Equals(ClientId other) => Value.Equals(other.Value);\n\t\tpublic string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider);\n\t\t\n\t\tpublic static ClientId? TryFrom(object value) {\n\t\t\t\n\t\t\tif (value is UInt16 bvalue) return new ClientId(bvalue);\n\t\t\tif (value is string s && UInt16.TryParse(s, out var num)) return new ClientId(num);\n\t\t\tif (value is IConvertible c) return new ClientId(c.ToUInt16(CultureInfo.InvariantCulture));\n\n\t\t\treturn null;\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\tprivate class Converter : JsonConverter<ClientId>\n\t\t{\n\t\t\tpublic override void WriteJson(JsonWriter writer, ClientId value, JsonSerializer serializer)\n\t\t\t\t=> writer.WriteValue(value.Value);\n\t\t\tpublic override ClientId ReadJson(JsonReader reader, Type objectType, ClientId existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t\t\t=> new ClientId(UInt16.Parse(reader.ReadAsString() ?? throw new FormatException()));\n\t\t}\n\t}\n\t\n\t[StructLayout(LayoutKind.Sequential, Pack=0)]\n\t[DebuggerDisplay(\"{Value, nq}\")]\n\t[JsonConverter(typeof(ChannelId.Converter))]\n\tpublic readonly partial struct ChannelId : IFormattable, IEquatable<ChannelId>\n\t{\n\t\tpublic static readonly ChannelId Null = new ChannelId(default);\n\t\tpublic static ChannelId To(UInt64 v) => new ChannelId(v);\n\n\t\tpublic UInt64 Value { get; }\n\t\tpublic ChannelId(UInt64 value) {  Value = value; }\n\t\tpublic static explicit operator ChannelId(UInt64 v) => new ChannelId(v);\n\t\tpublic static bool operator ==(ChannelId a, ChannelId b) => a.Value == b.Value;\n\t\tpublic static bool operator !=(ChannelId a, ChannelId b) => a.Value != b.Value;\n\t\tpublic override int GetHashCode() => Value.GetHashCode() ;\n\t\tpublic override bool Equals(object? obj) => obj is ChannelId c && this.Equals(c);\n\t\tpublic override string ToString() => Value .ToString();\n\t\t\n\t\tpublic bool Equals(ChannelId other) => Value.Equals(other.Value);\n\t\tpublic string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider);\n\t\t\n\t\tpublic static ChannelId? TryFrom(object value) {\n\t\t\t\n\t\t\tif (value is UInt64 bvalue) return new ChannelId(bvalue);\n\t\t\tif (value is string s && UInt64.TryParse(s, out var num)) return new ChannelId(num);\n\t\t\tif (value is IConvertible c) return new ChannelId(c.ToUInt64(CultureInfo.InvariantCulture));\n\n\t\t\treturn null;\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\tprivate class Converter : JsonConverter<ChannelId>\n\t\t{\n\t\t\tpublic override void WriteJson(JsonWriter writer, ChannelId value, JsonSerializer serializer)\n\t\t\t\t=> writer.WriteValue(value.Value);\n\t\t\tpublic override ChannelId ReadJson(JsonReader reader, Type objectType, ChannelId existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t\t\t=> new ChannelId(UInt64.Parse(reader.ReadAsString() ?? throw new FormatException()));\n\t\t}\n\t}\n\t\n\t[StructLayout(LayoutKind.Sequential, Pack=0)]\n\t[DebuggerDisplay(\"{Value, nq}\")]\n\t[JsonConverter(typeof(ServerGroupId.Converter))]\n\tpublic readonly partial struct ServerGroupId : IFormattable, IEquatable<ServerGroupId>\n\t{\n\t\tpublic static readonly ServerGroupId Null = new ServerGroupId(default);\n\t\tpublic static ServerGroupId To(UInt64 v) => new ServerGroupId(v);\n\n\t\tpublic UInt64 Value { get; }\n\t\tpublic ServerGroupId(UInt64 value) {  Value = value; }\n\t\tpublic static explicit operator ServerGroupId(UInt64 v) => new ServerGroupId(v);\n\t\tpublic static bool operator ==(ServerGroupId a, ServerGroupId b) => a.Value == b.Value;\n\t\tpublic static bool operator !=(ServerGroupId a, ServerGroupId b) => a.Value != b.Value;\n\t\tpublic override int GetHashCode() => Value.GetHashCode() ;\n\t\tpublic override bool Equals(object? obj) => obj is ServerGroupId c && this.Equals(c);\n\t\tpublic override string ToString() => Value .ToString();\n\t\t\n\t\tpublic bool Equals(ServerGroupId other) => Value.Equals(other.Value);\n\t\tpublic string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider);\n\t\t\n\t\tpublic static ServerGroupId? TryFrom(object value) {\n\t\t\t\n\t\t\tif (value is UInt64 bvalue) return new ServerGroupId(bvalue);\n\t\t\tif (value is string s && UInt64.TryParse(s, out var num)) return new ServerGroupId(num);\n\t\t\tif (value is IConvertible c) return new ServerGroupId(c.ToUInt64(CultureInfo.InvariantCulture));\n\n\t\t\treturn null;\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\tprivate class Converter : JsonConverter<ServerGroupId>\n\t\t{\n\t\t\tpublic override void WriteJson(JsonWriter writer, ServerGroupId value, JsonSerializer serializer)\n\t\t\t\t=> writer.WriteValue(value.Value);\n\t\t\tpublic override ServerGroupId ReadJson(JsonReader reader, Type objectType, ServerGroupId existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t\t\t=> new ServerGroupId(UInt64.Parse(reader.ReadAsString() ?? throw new FormatException()));\n\t\t}\n\t}\n\t\n\t[StructLayout(LayoutKind.Sequential, Pack=0)]\n\t[DebuggerDisplay(\"{Value, nq}\")]\n\t[JsonConverter(typeof(ChannelGroupId.Converter))]\n\tpublic readonly partial struct ChannelGroupId : IFormattable, IEquatable<ChannelGroupId>\n\t{\n\t\tpublic static readonly ChannelGroupId Null = new ChannelGroupId(default);\n\t\tpublic static ChannelGroupId To(UInt64 v) => new ChannelGroupId(v);\n\n\t\tpublic UInt64 Value { get; }\n\t\tpublic ChannelGroupId(UInt64 value) {  Value = value; }\n\t\tpublic static explicit operator ChannelGroupId(UInt64 v) => new ChannelGroupId(v);\n\t\tpublic static bool operator ==(ChannelGroupId a, ChannelGroupId b) => a.Value == b.Value;\n\t\tpublic static bool operator !=(ChannelGroupId a, ChannelGroupId b) => a.Value != b.Value;\n\t\tpublic override int GetHashCode() => Value.GetHashCode() ;\n\t\tpublic override bool Equals(object? obj) => obj is ChannelGroupId c && this.Equals(c);\n\t\tpublic override string ToString() => Value .ToString();\n\t\t\n\t\tpublic bool Equals(ChannelGroupId other) => Value.Equals(other.Value);\n\t\tpublic string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider);\n\t\t\n\t\tpublic static ChannelGroupId? TryFrom(object value) {\n\t\t\t\n\t\t\tif (value is UInt64 bvalue) return new ChannelGroupId(bvalue);\n\t\t\tif (value is string s && UInt64.TryParse(s, out var num)) return new ChannelGroupId(num);\n\t\t\tif (value is IConvertible c) return new ChannelGroupId(c.ToUInt64(CultureInfo.InvariantCulture));\n\n\t\t\treturn null;\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\tprivate class Converter : JsonConverter<ChannelGroupId>\n\t\t{\n\t\t\tpublic override void WriteJson(JsonWriter writer, ChannelGroupId value, JsonSerializer serializer)\n\t\t\t\t=> writer.WriteValue(value.Value);\n\t\t\tpublic override ChannelGroupId ReadJson(JsonReader reader, Type objectType, ChannelGroupId existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t\t\t=> new ChannelGroupId(UInt64.Parse(reader.ReadAsString() ?? throw new FormatException()));\n\t\t}\n\t}\n\t\n}"
  },
  {
    "path": "TSLib/Types.gen.tt",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n// <auto-generated />\n\n<#@ template debug=\"true\" hostSpecific=\"true\" language=\"C#\" #>\n<#@ output extension=\".cs\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.IO\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#\nvar types = new (string alias, string backing)[] {\n\t(\"Uid\", \"String\"),\n\t(\"ClientDbId\", \"UInt64\"),\n\t(\"ClientId\", \"UInt16\"),\n\t(\"ChannelId\", \"UInt64\"),\n\t(\"ServerGroupId\", \"UInt64\"),\n\t(\"ChannelGroupId\", \"UInt64\"),\n\t//(\"IconHash\", \"Int32\"),\n\t//(\"ConnectionId\", \"UInt32\"),\n};\n#>\n#nullable enable\nusing Newtonsoft.Json;\nusing System;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.Runtime.InteropServices;\n\nnamespace TSLib\n{\n\tpublic static class TsTypes\n\t{\n\t\tpublic static Type[] All => new Type[] { <# foreach(var type in types) { Write($\"typeof({type.alias}),\"); } #> };\n\t}\n\n\t<# foreach(var type in types) {\n\t\tvar isStr = type.backing.Equals(\"string\",StringComparison.OrdinalIgnoreCase); #>\n\t[StructLayout(LayoutKind.Sequential, Pack=0)]\n\t[DebuggerDisplay(\"{Value, nq}\")]\n\t[JsonConverter(typeof(<#= type.alias #>.Converter))]\n\tpublic readonly partial struct <#= type.alias #> :<#= isStr ? \"\" : \" IFormattable,\" #> IEquatable<<#= type.alias #>>\n\t{\n\t\tpublic static readonly <#= type.alias #> Null = new <#= type.alias #>(<#= isStr ? \"string.Empty\" : \"default\" #>);\n\t\tpublic static <#= type.alias #> To(<#= type.backing #> v) => new <#= type.alias #>(v);\n\n\t\tpublic <#= type.backing #> Value { get; }\n\t\tpublic <#= type.alias #>(<#= type.backing #> value) { <#= isStr ? \"if (value == null) throw new ArgumentNullException(nameof(value));\" : \"\" #> Value = value; }\n\t\tpublic static explicit operator <#= type.alias #>(<#= type.backing #> v) => new <#= type.alias #>(v);\n\t\tpublic static bool operator ==(<#= type.alias #> a, <#= type.alias #> b) => a.Value == b.Value;\n\t\tpublic static bool operator !=(<#= type.alias #> a, <#= type.alias #> b) => a.Value != b.Value;\n\t\tpublic override int GetHashCode() => <#= isStr ? \"Value?.GetHashCode() ?? 0\" : \"Value.GetHashCode()\" #> ;\n\t\tpublic override bool Equals(object? obj) => obj is <#= type.alias #> c && this.Equals(c);\n\t\tpublic override string ToString() => Value <#= isStr ? \"?? \\\"\\\"\" : \".ToString()\" #>;\n\t\t<# if (isStr) { #>\n\t\tpublic bool Equals(<#= type.alias #> other) => string.Equals(Value, other.Value, StringComparison.Ordinal);\n\t\t<# } else { #>\n\t\tpublic bool Equals(<#= type.alias #> other) => Value.Equals(other.Value);\n\t\tpublic string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider);\n\t\t<# } #>\n\t\tpublic static <#= type.alias #>? TryFrom(object value) {\n\t\t\t<# if (isStr) { #>\n\t\t\tif (value is string s) return new <#= type.alias #>(s);\n\t\t\treturn null;\n\t\t\t<# } else { #>\n\t\t\tif (value is <#= type.backing #> bvalue) return new <#= type.alias #>(bvalue);\n\t\t\tif (value is string s && <#= type.backing #>.TryParse(s, out var num)) return new <#= type.alias #>(num);\n\t\t\tif (value is IConvertible c) return new <#= type.alias #>(c.To<#= type.backing #>(CultureInfo.InvariantCulture));\n\n\t\t\treturn null;\n\t\t\t<# } #>\n\t\t\t\n\t\t}\n\n\t\tprivate class Converter : JsonConverter<<#= type.alias #>>\n\t\t{\n\t\t\tpublic override void WriteJson(JsonWriter writer, <#= type.alias #> value, JsonSerializer serializer)\n\t\t\t\t=> writer.WriteValue(value.Value);\n\t\t\tpublic override <#= type.alias #> ReadJson(JsonReader reader, Type objectType, <#= type.alias #> existingValue, bool hasExistingValue, JsonSerializer serializer)\n\t\t\t\t=> new <#= type.alias #>(<#= isStr ? \"\" : type.backing + \".Parse\" #>(reader.ReadAsString() ?? throw new FormatException()));\n\t\t}\n\t}\n\t<# } #>\n}"
  },
  {
    "path": "TSLib/WaitBlock.cs",
    "content": "// TSLib - A free TeamSpeak 3 and 5 client library\n// Copyright (C) 2017  TSLib contributors\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the Open Software License v. 3.0\n//\n// You should have received a copy of the Open Software License along with this\n// program. If not, see <https://opensource.org/licenses/OSL-3.0>.\n\nusing System;\nusing System.Diagnostics;\nusing System.Threading.Tasks;\nusing TSLib.Full;\nusing TSLib.Messages;\n\nnamespace TSLib\n{\n\t/// <summary>\n\t/// Synchronizes data between the receiving packet Thread and the waiting dispatcher Thread.\n\t/// </summary>\n\tinternal sealed class WaitBlock : IDisposable\n\t{\n\t\tprivate static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();\n\t\tprivate const string NotANotifyBlock = \"This waitblock has no dependent notification\";\n\t\tprivate const string NotifyListEmpty = \"Depending notification array must not be empty\";\n\t\tprivate const string NotifyDoesNotMatch = \"The notification does not match this waitblock\";\n\t\tprivate static readonly TimeSpan CommandTimeout = PacketHandlerConst.PacketTimeout.Divide(2);\n\n\t\tprivate bool isDisposed;\n\t\tprivate readonly Deserializer deserializer;\n\t\tprivate readonly TaskCompletionSource<R<ReadOnlyMemory<byte>, CommandError>> answerWaiterAsync;\n\t\tprivate readonly TaskCompletionSource<LazyNotification>? notificationWaiterAsync;\n\n\t\tpublic NotificationType[]? DependsOn { get; }\n\n\t\tpublic WaitBlock(Deserializer deserializer, NotificationType[]? dependsOn = null)\n\t\t{\n\t\t\tthis.deserializer = deserializer;\n\t\t\tisDisposed = false;\n\t\t\tDependsOn = dependsOn;\n\n\t\t\tanswerWaiterAsync = new TaskCompletionSource<R<ReadOnlyMemory<byte>, CommandError>>();\n\t\t\tif (dependsOn != null)\n\t\t\t{\n\t\t\t\tif (dependsOn.Length == 0)\n\t\t\t\t\tthrow new InvalidOperationException(NotifyListEmpty);\n\t\t\t\tnotificationWaiterAsync = new TaskCompletionSource<LazyNotification>();\n\t\t\t}\n\t\t}\n\n\t\tpublic void SetError(CommandError commandError)\n\t\t{\n\t\t\tif (commandError.Id == TsErrorCode.ok)\n\t\t\t\tthrow new ArgumentException(\"Passed explicit error without error code\", nameof(commandError));\n\t\t\tSetAnswerAuto(commandError, null);\n\t\t}\n\n\t\tpublic void SetAnswer(ReadOnlyMemory<byte> commandLine) => SetAnswerAuto(null, commandLine);\n\n\t\tpublic void SetAnswerAuto(CommandError? commandError, ReadOnlyMemory<byte>? commandLine)\n\t\t{\n\t\t\tif (isDisposed)\n\t\t\t\treturn;\n\n\t\t\tif (commandError != null && commandError.Id != TsErrorCode.ok)\n\t\t\t{\n\t\t\t\tanswerWaiterAsync.SetResult(commandError);\n\t\t\t}\n\t\t\telse if (commandLine != null)\n\t\t\t{\n\t\t\t\tanswerWaiterAsync.SetResult(commandLine.Value);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tanswerWaiterAsync.SetResult(ReadOnlyMemory<byte>.Empty);\n\t\t\t}\n\t\t}\n\n\t\tpublic void SetNotification(LazyNotification notification)\n\t\t{\n\t\t\tif (isDisposed)\n\t\t\t\treturn;\n\t\t\tif (notificationWaiterAsync is null || DependsOn is null)\n\t\t\t\tthrow new InvalidOperationException(NotANotifyBlock);\n\t\t\tif (Array.IndexOf(DependsOn, notification.NotifyType) < 0)\n\t\t\t\tthrow new ArgumentException(NotifyDoesNotMatch);\n\t\t\tnotificationWaiterAsync.SetResult(notification);\n\t\t}\n\n\t\tpublic async Task<R<T[], CommandError>> WaitForMessageAsync<T>() where T : IResponse, new()\n\t\t{\n\t\t\tif (isDisposed)\n\t\t\t\tthrow new ObjectDisposedException(nameof(WaitBlock));\n\n\t\t\tvar timeOut = Task.Delay(CommandTimeout);\n\t\t\tvar res = await Task.WhenAny(answerWaiterAsync.Task, timeOut);\n\t\t\tif (res == timeOut)\n\t\t\t\treturn CommandError.CommandTimeout;\n\t\t\tTrace.Assert(answerWaiterAsync.Task.IsCompleted);\n\n\t\t\tif (!(await answerWaiterAsync.Task).Get(out var value, out var error))\n\t\t\t\treturn error;\n\n\t\t\tvar response = deserializer.GenerateResponse<T>(value.Span);\n\t\t\tif (response is null)\n\t\t\t\treturn CommandError.Parser;\n\t\t\telse\n\t\t\t\treturn response;\n\t\t}\n\n\t\tpublic async Task<R<LazyNotification, CommandError>> WaitForNotificationAsync()\n\t\t{\n\t\t\tif (isDisposed)\n\t\t\t\tthrow new ObjectDisposedException(nameof(WaitBlock));\n\t\t\tif (notificationWaiterAsync is null)\n\t\t\t\tthrow new InvalidOperationException(NotANotifyBlock);\n\n\t\t\tvar timeOut = Task.Delay(CommandTimeout);\n\t\t\tif (await Task.WhenAny(answerWaiterAsync.Task, timeOut) == timeOut)\n\t\t\t\treturn CommandError.CommandTimeout;\n\t\t\tTrace.Assert(answerWaiterAsync.Task.IsCompleted);\n\n\t\t\tif (!(await answerWaiterAsync.Task).OnlyError().GetOk(out var error))\n\t\t\t\treturn error;\n\n\t\t\tif (await Task.WhenAny(notificationWaiterAsync.Task, timeOut) == timeOut)\n\t\t\t\treturn CommandError.CommandTimeout;\n\t\t\tTrace.Assert(notificationWaiterAsync.Task.IsCompleted);\n\n\t\t\treturn await notificationWaiterAsync.Task;\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tif (isDisposed)\n\t\t\t\treturn;\n\n\t\t\tanswerWaiterAsync.TrySetResult(CommandError.ConnectionClosed);\n\t\t\tnotificationWaiterAsync?.TrySetCanceled();\n\n\t\t\tisDisposed = true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "TSLib/bin/Debug/netcoreapp3.1/TSLib.deps.json",
    "content": "{\n  \"runtimeTarget\": {\n    \"name\": \".NETCoreApp,Version=v3.1\",\n    \"signature\": \"\"\n  },\n  \"compilationOptions\": {},\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {\n      \"TSLib/1.1.0\": {\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Nullable\": \"1.2.1\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"runtime\": {\n          \"TSLib.dll\": {}\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {\n            \"assemblyVersion\": \"2.0.19.0\",\n            \"fileVersion\": \"2.0.19.0\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {},\n      \"Microsoft.NETCore.Targets/1.1.0\": {},\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"assemblyVersion\": \"12.0.0.0\",\n            \"fileVersion\": \"12.0.3.23909\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.7.3.11982\"\n          }\n        }\n      },\n      \"Nullable/1.2.1\": {},\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"assemblyVersion\": \"1.8.6.0\",\n            \"fileVersion\": \"1.8.6.7\"\n          }\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {\n            \"assemblyVersion\": \"1.0.3.0\",\n            \"fileVersion\": \"1.0.3.0\"\n          }\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {\n            \"assemblyVersion\": \"4.0.2.1\",\n            \"fileVersion\": \"4.700.20.21406\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"hashPath\": \"heijden.dns.portable.2.0.19.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Platforms/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==\",\n      \"path\": \"microsoft.netcore.platforms/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.platforms.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.targets.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"hashPath\": \"newtonsoft.json.12.0.3.nupkg.sha512\"\n    },\n    \"NLog/4.7.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"path\": \"nlog/4.7.3\",\n      \"hashPath\": \"nlog.4.7.3.nupkg.sha512\"\n    },\n    \"Nullable/1.2.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==\",\n      \"path\": \"nullable/1.2.1\",\n      \"hashPath\": \"nullable.1.2.1.nupkg.sha512\"\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"hashPath\": \"portable.bouncycastle.1.8.6.7.nupkg.sha512\"\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"hashPath\": \"runtime.native.system.4.3.0.nupkg.sha512\"\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"hashPath\": \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\"\n    },\n    \"System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"path\": \"system.collections/4.3.0\",\n      \"hashPath\": \"system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"hashPath\": \"system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"path\": \"system.io/4.3.0\",\n      \"hashPath\": \"system.io.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"hashPath\": \"system.io.pipelines.4.7.2.nupkg.sha512\"\n    },\n    \"System.Linq/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"path\": \"system.linq/4.3.0\",\n      \"hashPath\": \"system.linq.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"hashPath\": \"system.net.networkinformation.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"hashPath\": \"system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"hashPath\": \"system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"hashPath\": \"system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"hashPath\": \"system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"hashPath\": \"system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"hashPath\": \"system.security.claims.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"hashPath\": \"system.security.principal.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"hashPath\": \"system.security.principal.windows.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"hashPath\": \"system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"path\": \"system.threading/4.3.0\",\n      \"hashPath\": \"system.threading.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"hashPath\": \"system.threading.overlapped.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"hashPath\": \"system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"hashPath\": \"system.threading.thread.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"hashPath\": \"system.threading.threadpool.4.3.0.nupkg.sha512\"\n    }\n  }\n}"
  },
  {
    "path": "TSLib/bin/Debug/netstandard2.0/TSLib.deps.json",
    "content": "{\n  \"runtimeTarget\": {\n    \"name\": \".NETStandard,Version=v2.0/\",\n    \"signature\": \"\"\n  },\n  \"compilationOptions\": {},\n  \"targets\": {\n    \".NETStandard,Version=v2.0\": {},\n    \".NETStandard,Version=v2.0/\": {\n      \"TSLib/1.1.0\": {\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NETStandard.Library\": \"2.0.3\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Nullable\": \"1.2.1\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\",\n          \"System.Memory\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"TSLib.dll\": {}\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {\n            \"assemblyVersion\": \"2.0.19.0\",\n            \"fileVersion\": \"2.0.19.0\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {},\n      \"Microsoft.NETCore.Targets/1.1.0\": {},\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"NETStandard.Library/2.0.3\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\"\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"assemblyVersion\": \"12.0.0.0\",\n            \"fileVersion\": \"12.0.3.23909\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.7.3.11982\"\n          }\n        }\n      },\n      \"Nullable/1.2.1\": {},\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"assemblyVersion\": \"1.8.6.0\",\n            \"fileVersion\": \"1.8.6.7\"\n          }\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Chaos.NaCl.dll\": {\n            \"assemblyVersion\": \"1.0.3.0\",\n            \"fileVersion\": \"1.0.3.0\"\n          }\n        }\n      },\n      \"System.Buffers/4.5.1\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Buffers.dll\": {\n            \"assemblyVersion\": \"4.0.3.0\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.IO.Pipelines.dll\": {\n            \"assemblyVersion\": \"4.0.2.1\",\n            \"fileVersion\": \"4.700.20.21406\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.4.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Memory.dll\": {\n            \"assemblyVersion\": \"4.0.1.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Numerics.Vectors/4.4.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Numerics.Vectors.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.6.25519.3\"\n          }\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"assemblyVersion\": \"4.0.4.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {\n            \"assemblyVersion\": \"4.0.12.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.4\": {\n        \"dependencies\": {\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\": {\n            \"assemblyVersion\": \"4.2.0.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {\n            \"assemblyVersion\": \"4.0.1.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {\n            \"assemblyVersion\": \"4.0.11.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"hashPath\": \"heijden.dns.portable.2.0.19.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Platforms/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==\",\n      \"path\": \"microsoft.netcore.platforms/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.platforms.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.targets.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"NETStandard.Library/2.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==\",\n      \"path\": \"netstandard.library/2.0.3\",\n      \"hashPath\": \"netstandard.library.2.0.3.nupkg.sha512\"\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"hashPath\": \"newtonsoft.json.12.0.3.nupkg.sha512\"\n    },\n    \"NLog/4.7.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"path\": \"nlog/4.7.3\",\n      \"hashPath\": \"nlog.4.7.3.nupkg.sha512\"\n    },\n    \"Nullable/1.2.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==\",\n      \"path\": \"nullable/1.2.1\",\n      \"hashPath\": \"nullable.1.2.1.nupkg.sha512\"\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"hashPath\": \"portable.bouncycastle.1.8.6.7.nupkg.sha512\"\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"hashPath\": \"runtime.native.system.4.3.0.nupkg.sha512\"\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"hashPath\": \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\"\n    },\n    \"System.Buffers/4.5.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==\",\n      \"path\": \"system.buffers/4.5.1\",\n      \"hashPath\": \"system.buffers.4.5.1.nupkg.sha512\"\n    },\n    \"System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"path\": \"system.collections/4.3.0\",\n      \"hashPath\": \"system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"hashPath\": \"system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"path\": \"system.io/4.3.0\",\n      \"hashPath\": \"system.io.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"hashPath\": \"system.io.pipelines.4.7.2.nupkg.sha512\"\n    },\n    \"System.Linq/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"path\": \"system.linq/4.3.0\",\n      \"hashPath\": \"system.linq.4.3.0.nupkg.sha512\"\n    },\n    \"System.Memory/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"path\": \"system.memory/4.5.4\",\n      \"hashPath\": \"system.memory.4.5.4.nupkg.sha512\"\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"hashPath\": \"system.net.networkinformation.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"hashPath\": \"system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"hashPath\": \"system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"System.Numerics.Vectors/4.4.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==\",\n      \"path\": \"system.numerics.vectors/4.4.0\",\n      \"hashPath\": \"system.numerics.vectors.4.4.0.nupkg.sha512\"\n    },\n    \"System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"hashPath\": \"system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"hashPath\": \"system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.5.3\",\n      \"hashPath\": \"system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512\"\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"hashPath\": \"system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"hashPath\": \"system.security.claims.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"hashPath\": \"system.security.principal.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"hashPath\": \"system.security.principal.windows.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"hashPath\": \"system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"path\": \"system.threading/4.3.0\",\n      \"hashPath\": \"system.threading.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"hashPath\": \"system.threading.overlapped.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"hashPath\": \"system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks.Extensions/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==\",\n      \"path\": \"system.threading.tasks.extensions/4.5.4\",\n      \"hashPath\": \"system.threading.tasks.extensions.4.5.4.nupkg.sha512\"\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"hashPath\": \"system.threading.thread.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"hashPath\": \"system.threading.threadpool.4.3.0.nupkg.sha512\"\n    }\n  }\n}"
  },
  {
    "path": "TSLib/bin/Debug/netstandard2.1/TSLib.deps.json",
    "content": "{\n  \"runtimeTarget\": {\n    \"name\": \".NETStandard,Version=v2.1/\",\n    \"signature\": \"\"\n  },\n  \"compilationOptions\": {},\n  \"targets\": {\n    \".NETStandard,Version=v2.1\": {},\n    \".NETStandard,Version=v2.1/\": {\n      \"TSLib/1.1.0\": {\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Nullable\": \"1.2.1\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"runtime\": {\n          \"TSLib.dll\": {}\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {\n            \"assemblyVersion\": \"2.0.19.0\",\n            \"fileVersion\": \"2.0.19.0\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {},\n      \"Microsoft.NETCore.Targets/1.1.0\": {},\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"assemblyVersion\": \"12.0.0.0\",\n            \"fileVersion\": \"12.0.3.23909\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.7.3.11982\"\n          }\n        }\n      },\n      \"Nullable/1.2.1\": {},\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"assemblyVersion\": \"1.8.6.0\",\n            \"fileVersion\": \"1.8.6.7\"\n          }\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Chaos.NaCl.dll\": {\n            \"assemblyVersion\": \"1.0.3.0\",\n            \"fileVersion\": \"1.0.3.0\"\n          }\n        }\n      },\n      \"System.Buffers/4.5.1\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Buffers.dll\": {\n            \"assemblyVersion\": \"4.0.3.0\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.IO.Pipelines.dll\": {\n            \"assemblyVersion\": \"4.0.2.1\",\n            \"fileVersion\": \"4.700.20.21406\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.4.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Memory.dll\": {\n            \"assemblyVersion\": \"4.0.1.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Numerics.Vectors/4.4.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Numerics.Vectors.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.6.25519.3\"\n          }\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"assemblyVersion\": \"4.0.4.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {\n            \"assemblyVersion\": \"4.0.12.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.4\": {\n        \"dependencies\": {\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\": {\n            \"assemblyVersion\": \"4.2.0.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {\n            \"assemblyVersion\": \"4.0.1.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {\n            \"assemblyVersion\": \"4.0.11.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"hashPath\": \"heijden.dns.portable.2.0.19.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Platforms/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==\",\n      \"path\": \"microsoft.netcore.platforms/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.platforms.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.targets.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"hashPath\": \"newtonsoft.json.12.0.3.nupkg.sha512\"\n    },\n    \"NLog/4.7.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"path\": \"nlog/4.7.3\",\n      \"hashPath\": \"nlog.4.7.3.nupkg.sha512\"\n    },\n    \"Nullable/1.2.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==\",\n      \"path\": \"nullable/1.2.1\",\n      \"hashPath\": \"nullable.1.2.1.nupkg.sha512\"\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"hashPath\": \"portable.bouncycastle.1.8.6.7.nupkg.sha512\"\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"hashPath\": \"runtime.native.system.4.3.0.nupkg.sha512\"\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"hashPath\": \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\"\n    },\n    \"System.Buffers/4.5.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==\",\n      \"path\": \"system.buffers/4.5.1\",\n      \"hashPath\": \"system.buffers.4.5.1.nupkg.sha512\"\n    },\n    \"System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"path\": \"system.collections/4.3.0\",\n      \"hashPath\": \"system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"hashPath\": \"system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"path\": \"system.io/4.3.0\",\n      \"hashPath\": \"system.io.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"hashPath\": \"system.io.pipelines.4.7.2.nupkg.sha512\"\n    },\n    \"System.Linq/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"path\": \"system.linq/4.3.0\",\n      \"hashPath\": \"system.linq.4.3.0.nupkg.sha512\"\n    },\n    \"System.Memory/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"path\": \"system.memory/4.5.4\",\n      \"hashPath\": \"system.memory.4.5.4.nupkg.sha512\"\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"hashPath\": \"system.net.networkinformation.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"hashPath\": \"system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"hashPath\": \"system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"System.Numerics.Vectors/4.4.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==\",\n      \"path\": \"system.numerics.vectors/4.4.0\",\n      \"hashPath\": \"system.numerics.vectors.4.4.0.nupkg.sha512\"\n    },\n    \"System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"hashPath\": \"system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"hashPath\": \"system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.5.3\",\n      \"hashPath\": \"system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512\"\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"hashPath\": \"system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"hashPath\": \"system.security.claims.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"hashPath\": \"system.security.principal.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"hashPath\": \"system.security.principal.windows.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"hashPath\": \"system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"path\": \"system.threading/4.3.0\",\n      \"hashPath\": \"system.threading.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"hashPath\": \"system.threading.overlapped.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"hashPath\": \"system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks.Extensions/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==\",\n      \"path\": \"system.threading.tasks.extensions/4.5.4\",\n      \"hashPath\": \"system.threading.tasks.extensions.4.5.4.nupkg.sha512\"\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"hashPath\": \"system.threading.thread.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"hashPath\": \"system.threading.threadpool.4.3.0.nupkg.sha512\"\n    }\n  }\n}"
  },
  {
    "path": "TSLib/bin/Release/netcoreapp3.1/TSLib.deps.json",
    "content": "{\n  \"runtimeTarget\": {\n    \"name\": \".NETCoreApp,Version=v3.1\",\n    \"signature\": \"\"\n  },\n  \"compilationOptions\": {},\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {\n      \"TSLib/1.1.0\": {\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Nullable\": \"1.2.1\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"runtime\": {\n          \"TSLib.dll\": {}\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {\n            \"assemblyVersion\": \"2.0.19.0\",\n            \"fileVersion\": \"2.0.19.0\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {},\n      \"Microsoft.NETCore.Targets/1.1.0\": {},\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"assemblyVersion\": \"12.0.0.0\",\n            \"fileVersion\": \"12.0.3.23909\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.7.3.11982\"\n          }\n        }\n      },\n      \"Nullable/1.2.1\": {},\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"assemblyVersion\": \"1.8.6.0\",\n            \"fileVersion\": \"1.8.6.7\"\n          }\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {\n            \"assemblyVersion\": \"1.0.3.0\",\n            \"fileVersion\": \"1.0.3.0\"\n          }\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {\n            \"assemblyVersion\": \"4.0.2.1\",\n            \"fileVersion\": \"4.700.20.21406\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"hashPath\": \"heijden.dns.portable.2.0.19.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Platforms/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==\",\n      \"path\": \"microsoft.netcore.platforms/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.platforms.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.targets.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"hashPath\": \"newtonsoft.json.12.0.3.nupkg.sha512\"\n    },\n    \"NLog/4.7.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"path\": \"nlog/4.7.3\",\n      \"hashPath\": \"nlog.4.7.3.nupkg.sha512\"\n    },\n    \"Nullable/1.2.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==\",\n      \"path\": \"nullable/1.2.1\",\n      \"hashPath\": \"nullable.1.2.1.nupkg.sha512\"\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"hashPath\": \"portable.bouncycastle.1.8.6.7.nupkg.sha512\"\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"hashPath\": \"runtime.native.system.4.3.0.nupkg.sha512\"\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"hashPath\": \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\"\n    },\n    \"System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"path\": \"system.collections/4.3.0\",\n      \"hashPath\": \"system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"hashPath\": \"system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"path\": \"system.io/4.3.0\",\n      \"hashPath\": \"system.io.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"hashPath\": \"system.io.pipelines.4.7.2.nupkg.sha512\"\n    },\n    \"System.Linq/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"path\": \"system.linq/4.3.0\",\n      \"hashPath\": \"system.linq.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"hashPath\": \"system.net.networkinformation.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"hashPath\": \"system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"hashPath\": \"system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"hashPath\": \"system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"hashPath\": \"system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"hashPath\": \"system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"hashPath\": \"system.security.claims.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"hashPath\": \"system.security.principal.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"hashPath\": \"system.security.principal.windows.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"hashPath\": \"system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"path\": \"system.threading/4.3.0\",\n      \"hashPath\": \"system.threading.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"hashPath\": \"system.threading.overlapped.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"hashPath\": \"system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"hashPath\": \"system.threading.thread.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"hashPath\": \"system.threading.threadpool.4.3.0.nupkg.sha512\"\n    }\n  }\n}"
  },
  {
    "path": "TSLib/bin/Release/netstandard2.0/TSLib.deps.json",
    "content": "{\n  \"runtimeTarget\": {\n    \"name\": \".NETStandard,Version=v2.0/\",\n    \"signature\": \"\"\n  },\n  \"compilationOptions\": {},\n  \"targets\": {\n    \".NETStandard,Version=v2.0\": {},\n    \".NETStandard,Version=v2.0/\": {\n      \"TSLib/1.1.0\": {\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NETStandard.Library\": \"2.0.3\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Nullable\": \"1.2.1\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\",\n          \"System.Memory\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"TSLib.dll\": {}\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {\n            \"assemblyVersion\": \"2.0.19.0\",\n            \"fileVersion\": \"2.0.19.0\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {},\n      \"Microsoft.NETCore.Targets/1.1.0\": {},\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"NETStandard.Library/2.0.3\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\"\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"assemblyVersion\": \"12.0.0.0\",\n            \"fileVersion\": \"12.0.3.23909\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.7.3.11982\"\n          }\n        }\n      },\n      \"Nullable/1.2.1\": {},\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"assemblyVersion\": \"1.8.6.0\",\n            \"fileVersion\": \"1.8.6.7\"\n          }\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Chaos.NaCl.dll\": {\n            \"assemblyVersion\": \"1.0.3.0\",\n            \"fileVersion\": \"1.0.3.0\"\n          }\n        }\n      },\n      \"System.Buffers/4.5.1\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Buffers.dll\": {\n            \"assemblyVersion\": \"4.0.3.0\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.IO.Pipelines.dll\": {\n            \"assemblyVersion\": \"4.0.2.1\",\n            \"fileVersion\": \"4.700.20.21406\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.4.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Memory.dll\": {\n            \"assemblyVersion\": \"4.0.1.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Numerics.Vectors/4.4.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Numerics.Vectors.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.6.25519.3\"\n          }\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"assemblyVersion\": \"4.0.4.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {\n            \"assemblyVersion\": \"4.0.12.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.4\": {\n        \"dependencies\": {\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\": {\n            \"assemblyVersion\": \"4.2.0.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {\n            \"assemblyVersion\": \"4.0.1.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {\n            \"assemblyVersion\": \"4.0.11.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"hashPath\": \"heijden.dns.portable.2.0.19.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Platforms/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==\",\n      \"path\": \"microsoft.netcore.platforms/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.platforms.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.targets.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"NETStandard.Library/2.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==\",\n      \"path\": \"netstandard.library/2.0.3\",\n      \"hashPath\": \"netstandard.library.2.0.3.nupkg.sha512\"\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"hashPath\": \"newtonsoft.json.12.0.3.nupkg.sha512\"\n    },\n    \"NLog/4.7.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"path\": \"nlog/4.7.3\",\n      \"hashPath\": \"nlog.4.7.3.nupkg.sha512\"\n    },\n    \"Nullable/1.2.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==\",\n      \"path\": \"nullable/1.2.1\",\n      \"hashPath\": \"nullable.1.2.1.nupkg.sha512\"\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"hashPath\": \"portable.bouncycastle.1.8.6.7.nupkg.sha512\"\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"hashPath\": \"runtime.native.system.4.3.0.nupkg.sha512\"\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"hashPath\": \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\"\n    },\n    \"System.Buffers/4.5.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==\",\n      \"path\": \"system.buffers/4.5.1\",\n      \"hashPath\": \"system.buffers.4.5.1.nupkg.sha512\"\n    },\n    \"System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"path\": \"system.collections/4.3.0\",\n      \"hashPath\": \"system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"hashPath\": \"system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"path\": \"system.io/4.3.0\",\n      \"hashPath\": \"system.io.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"hashPath\": \"system.io.pipelines.4.7.2.nupkg.sha512\"\n    },\n    \"System.Linq/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"path\": \"system.linq/4.3.0\",\n      \"hashPath\": \"system.linq.4.3.0.nupkg.sha512\"\n    },\n    \"System.Memory/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"path\": \"system.memory/4.5.4\",\n      \"hashPath\": \"system.memory.4.5.4.nupkg.sha512\"\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"hashPath\": \"system.net.networkinformation.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"hashPath\": \"system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"hashPath\": \"system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"System.Numerics.Vectors/4.4.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==\",\n      \"path\": \"system.numerics.vectors/4.4.0\",\n      \"hashPath\": \"system.numerics.vectors.4.4.0.nupkg.sha512\"\n    },\n    \"System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"hashPath\": \"system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"hashPath\": \"system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.5.3\",\n      \"hashPath\": \"system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512\"\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"hashPath\": \"system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"hashPath\": \"system.security.claims.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"hashPath\": \"system.security.principal.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"hashPath\": \"system.security.principal.windows.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"hashPath\": \"system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"path\": \"system.threading/4.3.0\",\n      \"hashPath\": \"system.threading.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"hashPath\": \"system.threading.overlapped.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"hashPath\": \"system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks.Extensions/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==\",\n      \"path\": \"system.threading.tasks.extensions/4.5.4\",\n      \"hashPath\": \"system.threading.tasks.extensions.4.5.4.nupkg.sha512\"\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"hashPath\": \"system.threading.thread.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"hashPath\": \"system.threading.threadpool.4.3.0.nupkg.sha512\"\n    }\n  }\n}"
  },
  {
    "path": "TSLib/bin/Release/netstandard2.1/TSLib.deps.json",
    "content": "{\n  \"runtimeTarget\": {\n    \"name\": \".NETStandard,Version=v2.1/\",\n    \"signature\": \"\"\n  },\n  \"compilationOptions\": {},\n  \"targets\": {\n    \".NETStandard,Version=v2.1\": {},\n    \".NETStandard,Version=v2.1/\": {\n      \"TSLib/1.1.0\": {\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Nullable\": \"1.2.1\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"runtime\": {\n          \"TSLib.dll\": {}\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {\n            \"assemblyVersion\": \"2.0.19.0\",\n            \"fileVersion\": \"2.0.19.0\"\n          }\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {},\n      \"Microsoft.NETCore.Targets/1.1.0\": {},\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {\n            \"assemblyVersion\": \"12.0.0.0\",\n            \"fileVersion\": \"12.0.3.23909\"\n          }\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {\n            \"assemblyVersion\": \"4.0.0.0\",\n            \"fileVersion\": \"4.7.3.11982\"\n          }\n        }\n      },\n      \"Nullable/1.2.1\": {},\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {\n            \"assemblyVersion\": \"1.8.6.0\",\n            \"fileVersion\": \"1.8.6.7\"\n          }\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Chaos.NaCl.dll\": {\n            \"assemblyVersion\": \"1.0.3.0\",\n            \"fileVersion\": \"1.0.3.0\"\n          }\n        }\n      },\n      \"System.Buffers/4.5.1\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Buffers.dll\": {\n            \"assemblyVersion\": \"4.0.3.0\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.4\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.IO.Pipelines.dll\": {\n            \"assemblyVersion\": \"4.0.2.1\",\n            \"fileVersion\": \"4.700.20.21406\"\n          }\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {\n            \"assemblyVersion\": \"4.1.1.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.4.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Memory.dll\": {\n            \"assemblyVersion\": \"4.0.1.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        }\n      },\n      \"System.Numerics.Vectors/4.4.0\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Numerics.Vectors.dll\": {\n            \"assemblyVersion\": \"4.1.3.0\",\n            \"fileVersion\": \"4.6.25519.3\"\n          }\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {\n            \"assemblyVersion\": \"4.0.4.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {\n            \"assemblyVersion\": \"4.0.2.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {\n            \"assemblyVersion\": \"4.0.12.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.4\": {\n        \"dependencies\": {\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\": {\n            \"assemblyVersion\": \"4.2.0.1\",\n            \"fileVersion\": \"4.6.28619.1\"\n          }\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {\n            \"assemblyVersion\": \"4.0.1.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {\n            \"assemblyVersion\": \"4.0.11.0\",\n            \"fileVersion\": \"4.6.24705.1\"\n          }\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"serviceable\": false,\n      \"sha512\": \"\"\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"hashPath\": \"heijden.dns.portable.2.0.19.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Platforms/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==\",\n      \"path\": \"microsoft.netcore.platforms/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.platforms.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"hashPath\": \"microsoft.netcore.targets.1.1.0.nupkg.sha512\"\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"hashPath\": \"microsoft.win32.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"hashPath\": \"newtonsoft.json.12.0.3.nupkg.sha512\"\n    },\n    \"NLog/4.7.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"path\": \"nlog/4.7.3\",\n      \"hashPath\": \"nlog.4.7.3.nupkg.sha512\"\n    },\n    \"Nullable/1.2.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==\",\n      \"path\": \"nullable/1.2.1\",\n      \"hashPath\": \"nullable.1.2.1.nupkg.sha512\"\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"hashPath\": \"portable.bouncycastle.1.8.6.7.nupkg.sha512\"\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"hashPath\": \"runtime.native.system.4.3.0.nupkg.sha512\"\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"hashPath\": \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\"\n    },\n    \"System.Buffers/4.5.1\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==\",\n      \"path\": \"system.buffers/4.5.1\",\n      \"hashPath\": \"system.buffers.4.5.1.nupkg.sha512\"\n    },\n    \"System.Collections/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"path\": \"system.collections/4.3.0\",\n      \"hashPath\": \"system.collections.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"hashPath\": \"system.diagnostics.debug.4.3.0.nupkg.sha512\"\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"hashPath\": \"system.diagnostics.tracing.4.3.0.nupkg.sha512\"\n    },\n    \"System.Globalization/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"hashPath\": \"system.globalization.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"path\": \"system.io/4.3.0\",\n      \"hashPath\": \"system.io.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"hashPath\": \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"hashPath\": \"system.io.pipelines.4.7.2.nupkg.sha512\"\n    },\n    \"System.Linq/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"path\": \"system.linq/4.3.0\",\n      \"hashPath\": \"system.linq.4.3.0.nupkg.sha512\"\n    },\n    \"System.Memory/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"path\": \"system.memory/4.5.4\",\n      \"hashPath\": \"system.memory.4.5.4.nupkg.sha512\"\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"hashPath\": \"system.net.networkinformation.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"hashPath\": \"system.net.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"hashPath\": \"system.net.sockets.4.3.0.nupkg.sha512\"\n    },\n    \"System.Numerics.Vectors/4.4.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==\",\n      \"path\": \"system.numerics.vectors/4.4.0\",\n      \"hashPath\": \"system.numerics.vectors.4.4.0.nupkg.sha512\"\n    },\n    \"System.Reflection/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"hashPath\": \"system.reflection.4.3.0.nupkg.sha512\"\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"hashPath\": \"system.reflection.primitives.4.3.0.nupkg.sha512\"\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"hashPath\": \"system.resources.resourcemanager.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"hashPath\": \"system.runtime.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.5.3\",\n      \"hashPath\": \"system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512\"\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"hashPath\": \"system.runtime.extensions.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"hashPath\": \"system.runtime.handles.4.3.0.nupkg.sha512\"\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"hashPath\": \"system.runtime.interopservices.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"hashPath\": \"system.security.claims.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"hashPath\": \"system.security.principal.4.3.0.nupkg.sha512\"\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"hashPath\": \"system.security.principal.windows.4.3.0.nupkg.sha512\"\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"hashPath\": \"system.text.encoding.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"path\": \"system.threading/4.3.0\",\n      \"hashPath\": \"system.threading.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"hashPath\": \"system.threading.overlapped.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"hashPath\": \"system.threading.tasks.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.Tasks.Extensions/4.5.4\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==\",\n      \"path\": \"system.threading.tasks.extensions/4.5.4\",\n      \"hashPath\": \"system.threading.tasks.extensions.4.5.4.nupkg.sha512\"\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"hashPath\": \"system.threading.thread.4.3.0.nupkg.sha512\"\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"type\": \"package\",\n      \"serviceable\": true,\n      \"sha512\": \"sha512-k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"hashPath\": \"system.threading.threadpool.4.3.0.nupkg.sha512\"\n    }\n  }\n}"
  },
  {
    "path": "TSLib/dnc2_compat/Extensions.cs",
    "content": "#if NETSTANDARD2_0\n\nusing System;\nusing System.Collections.Generic;\n\ninternal static class Extensions\n{\n\t// TimeSpan\n\n\tpublic static TimeSpan Divide(this TimeSpan timeSpan, double divisor) => TimeSpan.FromTicks((long)(timeSpan.Ticks / divisor));\n\n\t// Dictionary\n\n\tpublic static bool Remove<K, V>(this Dictionary<K, V> dict, K key, out V value)\n\t{\n\t\tif (dict.TryGetValue(key, out value))\n\t\t{\n\t\t\treturn dict.Remove(key);\n\t\t}\n\t\treturn false;\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "TSLib/dnc2_compat/Range.cs",
    "content": "// Source: https://www.meziantou.net/how-to-use-csharp-8-indices-and-ranges-in-dotnet-standard-2-0-and-dotn.htm\n\n// https://github.com/dotnet/corefx/blob/1597b894a2e9cac668ce6e484506eca778a85197/src/Common/src/CoreLib/System/Index.cs\n// https://github.com/dotnet/corefx/blob/1597b894a2e9cac668ce6e484506eca778a85197/src/Common/src/CoreLib/System/Range.cs\n\n#if NETSTANDARD2_0\n\nusing System.Runtime.CompilerServices;\n\nnamespace System\n{\n\t/// <summary>Represent a type can be used to index a collection either from the start or the end.</summary>\n\t/// <remarks>\n\t/// Index is used by the C# compiler to support the new index syntax\n\t/// <code>\n\t/// int[] someArray = new int[5] { 1, 2, 3, 4, 5 } ;\n\t/// int lastElement = someArray[^1]; // lastElement = 5\n\t/// </code>\n\t/// </remarks>\n\tinternal readonly struct Index : IEquatable<Index>\n\t{\n\t\tprivate readonly int _value;\n\n\t\t/// <summary>Construct an Index using a value and indicating if the index is from the start or from the end.</summary>\n\t\t/// <param name=\"value\">The index value. it has to be zero or positive number.</param>\n\t\t/// <param name=\"fromEnd\">Indicating if the index is from the start or from the end.</param>\n\t\t/// <remarks>\n\t\t/// If the Index constructed from the end, index value 1 means pointing at the last element and index value 0 means pointing at beyond last element.\n\t\t/// </remarks>\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic Index(int value, bool fromEnd = false)\n\t\t{\n\t\t\tif (value < 0)\n\t\t\t{\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(value), \"value must be non-negative\");\n\t\t\t}\n\n\t\t\tif (fromEnd)\n\t\t\t\t_value = ~value;\n\t\t\telse\n\t\t\t\t_value = value;\n\t\t}\n\n\t\t// The following private constructors mainly created for perf reason to avoid the checks\n\t\tprivate Index(int value)\n\t\t{\n\t\t\t_value = value;\n\t\t}\n\n\t\t/// <summary>Create an Index pointing at first element.</summary>\n\t\tpublic static Index Start => new Index(0);\n\n\t\t/// <summary>Create an Index pointing at beyond last element.</summary>\n\t\tpublic static Index End => new Index(~0);\n\n\t\t/// <summary>Create an Index from the start at the position indicated by the value.</summary>\n\t\t/// <param name=\"value\">The index value from the start.</param>\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic static Index FromStart(int value)\n\t\t{\n\t\t\tif (value < 0)\n\t\t\t{\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(value), \"value must be non-negative\");\n\t\t\t}\n\n\t\t\treturn new Index(value);\n\t\t}\n\n\t\t/// <summary>Create an Index from the end at the position indicated by the value.</summary>\n\t\t/// <param name=\"value\">The index value from the end.</param>\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic static Index FromEnd(int value)\n\t\t{\n\t\t\tif (value < 0)\n\t\t\t{\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(value), \"value must be non-negative\");\n\t\t\t}\n\n\t\t\treturn new Index(~value);\n\t\t}\n\n\t\t/// <summary>Returns the index value.</summary>\n\t\tpublic int Value\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif (_value < 0)\n\t\t\t\t{\n\t\t\t\t\treturn ~_value;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn _value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>Indicates whether the index is from the start or the end.</summary>\n\t\tpublic bool IsFromEnd => _value < 0;\n\n\t\t/// <summary>Calculate the offset from the start using the giving collection length.</summary>\n\t\t/// <param name=\"length\">The length of the collection that the Index will be used with. length has to be a positive value</param>\n\t\t/// <remarks>\n\t\t/// For performance reason, we don't validate the input length parameter and the returned offset value against negative values.\n\t\t/// we don't validate either the returned offset is greater than the input length.\n\t\t/// It is expected Index will be used with collections which always have non negative length/count. If the returned offset is negative and\n\t\t/// then used to index a collection will get out of range exception which will be same affect as the validation.\n\t\t/// </remarks>\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic int GetOffset(int length)\n\t\t{\n\t\t\tvar offset = _value;\n\t\t\tif (IsFromEnd)\n\t\t\t{\n\t\t\t\t// offset = length - (~value)\n\t\t\t\t// offset = length + (~(~value) + 1)\n\t\t\t\t// offset = length + value + 1\n\n\t\t\t\toffset += length + 1;\n\t\t\t}\n\t\t\treturn offset;\n\t\t}\n\n\t\t/// <summary>Indicates whether the current Index object is equal to another object of the same type.</summary>\n\t\t/// <param name=\"value\">An object to compare with this object</param>\n\t\tpublic override bool Equals(object? value) => value is Index index && _value == index._value;\n\n\t\t/// <summary>Indicates whether the current Index object is equal to another Index object.</summary>\n\t\t/// <param name=\"other\">An object to compare with this object</param>\n\t\tpublic bool Equals(Index other) => _value == other._value;\n\n\t\t/// <summary>Returns the hash code for this instance.</summary>\n\t\tpublic override int GetHashCode() => _value;\n\n\t\t/// <summary>Converts integer number to an Index.</summary>\n\t\tpublic static implicit operator Index(int value) => FromStart(value);\n\n\t\t/// <summary>Converts the value of the current Index object to its equivalent string representation.</summary>\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tif (IsFromEnd)\n\t\t\t\treturn \"^\" + ((uint)Value).ToString();\n\n\t\t\treturn ((uint)Value).ToString();\n\t\t}\n\t}\n\n\t/// <summary>Represent a range has start and end indexes.</summary>\n\t/// <remarks>\n\t/// Range is used by the C# compiler to support the range syntax.\n\t/// <code>\n\t/// int[] someArray = new int[5] { 1, 2, 3, 4, 5 };\n\t/// int[] subArray1 = someArray[0..2]; // { 1, 2 }\n\t/// int[] subArray2 = someArray[1..^0]; // { 2, 3, 4, 5 }\n\t/// </code>\n\t/// </remarks>\n\tinternal readonly struct Range : IEquatable<Range>\n\t{\n\t\t/// <summary>Represent the inclusive start index of the Range.</summary>\n\t\tpublic Index Start { get; }\n\n\t\t/// <summary>Represent the exclusive end index of the Range.</summary>\n\t\tpublic Index End { get; }\n\n\t\t/// <summary>Construct a Range object using the start and end indexes.</summary>\n\t\t/// <param name=\"start\">Represent the inclusive start index of the range.</param>\n\t\t/// <param name=\"end\">Represent the exclusive end index of the range.</param>\n\t\tpublic Range(Index start, Index end)\n\t\t{\n\t\t\tStart = start;\n\t\t\tEnd = end;\n\t\t}\n\n\t\t/// <summary>Indicates whether the current Range object is equal to another object of the same type.</summary>\n\t\t/// <param name=\"value\">An object to compare with this object</param>\n\t\tpublic override bool Equals(object? value) =>\n\t\t\tvalue is Range r &&\n\t\t\tr.Start.Equals(Start) &&\n\t\t\tr.End.Equals(End);\n\n\t\t/// <summary>Indicates whether the current Range object is equal to another Range object.</summary>\n\t\t/// <param name=\"other\">An object to compare with this object</param>\n\t\tpublic bool Equals(Range other) => other.Start.Equals(Start) && other.End.Equals(End);\n\n\t\t/// <summary>Returns the hash code for this instance.</summary>\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn Start.GetHashCode() * 31 + End.GetHashCode();\n\t\t}\n\n\t\t/// <summary>Converts the value of the current Range object to its equivalent string representation.</summary>\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn Start + \"..\" + End;\n\t\t}\n\n\t\t/// <summary>Create a Range object starting from start index to the end of the collection.</summary>\n\t\tpublic static Range StartAt(Index start) => new Range(start, Index.End);\n\n\t\t/// <summary>Create a Range object starting from first element in the collection to the end Index.</summary>\n\t\tpublic static Range EndAt(Index end) => new Range(Index.Start, end);\n\n\t\t/// <summary>Create a Range object starting from first element to the end.</summary>\n\t\tpublic static Range All => new Range(Index.Start, Index.End);\n\n\t\t/// <summary>Calculate the start offset and length of range object using a collection length.</summary>\n\t\t/// <param name=\"length\">The length of the collection that the range will be used with. length has to be a positive value.</param>\n\t\t/// <remarks>\n\t\t/// For performance reason, we don't validate the input length parameter against negative values.\n\t\t/// It is expected Range will be used with collections which always have non negative length/count.\n\t\t/// We validate the range is inside the length scope though.\n\t\t/// </remarks>\n\t\t[MethodImpl(MethodImplOptions.AggressiveInlining)]\n\t\tpublic (int Offset, int Length) GetOffsetAndLength(int length)\n\t\t{\n\t\t\tint start;\n\t\t\tvar startIndex = Start;\n\t\t\tif (startIndex.IsFromEnd)\n\t\t\t\tstart = length - startIndex.Value;\n\t\t\telse\n\t\t\t\tstart = startIndex.Value;\n\n\t\t\tint end;\n\t\t\tvar endIndex = End;\n\t\t\tif (endIndex.IsFromEnd)\n\t\t\t\tend = length - endIndex.Value;\n\t\t\telse\n\t\t\t\tend = endIndex.Value;\n\n\t\t\tif ((uint)end > (uint)length || (uint)start > (uint)end)\n\t\t\t{\n\t\t\t\tthrow new ArgumentOutOfRangeException(nameof(length));\n\t\t\t}\n\n\t\t\treturn (start, end - start);\n\t\t}\n\t}\n}\n\nnamespace System.Runtime.CompilerServices\n{\n\tinternal static class RuntimeHelpers\n\t{\n\t\t/// <summary>\n\t\t/// Slices the specified array using the specified range.\n\t\t/// </summary>\n\t\tpublic static T[] GetSubArray<T>(T[] array, Range range)\n\t\t{\n\t\t\tif (array == null)\n\t\t\t{\n\t\t\t\tthrow new ArgumentNullException(nameof(array));\n\t\t\t}\n\n\t\t\t(int offset, int length) = range.GetOffsetAndLength(array.Length);\n\n\t\t\tif (default(T) != null || typeof(T[]) == array.GetType())\n\t\t\t{\n\t\t\t\t// We know the type of the array to be exactly T[].\n\n\t\t\t\tif (length == 0)\n\t\t\t\t{\n\t\t\t\t\treturn Array.Empty<T>();\n\t\t\t\t}\n\n\t\t\t\tvar dest = new T[length];\n\t\t\t\tArray.Copy(array, offset, dest, 0, length);\n\t\t\t\treturn dest;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// The array is actually a U[] where U:T.\n\t\t\t\tvar dest = (T[])Array.CreateInstance(array.GetType().GetElementType(), length);\n\t\t\t\tArray.Copy(array, offset, dest, 0, length);\n\t\t\t\treturn dest;\n\t\t\t}\n\t\t}\n\t}\n}\n\n#endif\n"
  },
  {
    "path": "TSLib/dnc2_compat/info.txt",
    "content": "Since netstandard2.0 does not contain a lot of features wich are required for\nC# 8 or available in with netstandard2.1 / dotnet core 3.+ this folder\nprovides preprocessor-conditionals to supply them.\n\nThe folder can be completely deleted once netstandard2.0 is not targeted\nanymore.\n"
  },
  {
    "path": "TSLib/obj/Debug/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v3.1\", FrameworkDisplayName = \"\")]\n"
  },
  {
    "path": "TSLib/obj/Debug/netcoreapp3.1/TSLib.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Debug\")]\n[assembly: System.Reflection.AssemblyCopyrightAttribute(\"Splamy, Flakebi, TSLib Contributors\")]\n[assembly: System.Reflection.AssemblyDescriptionAttribute(\"\\n      A free and open source TeamSpeak 3 and 5 client library.\\n      Can connect\" +\n    \" as normal voice or query client and is optimized for performance.\\n    \")]\n[assembly: System.Reflection.AssemblyFileVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyInformationalVersionAttribute(\"1.1.0\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TSLib/obj/Debug/netcoreapp3.1/TSLib.AssemblyInfoInputs.cache",
    "content": "2ff3ef079d87000ac18187eaa94cbfde54c93cad\n"
  },
  {
    "path": "TSLib/obj/Debug/netcoreapp3.1/TSLib.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TSLib\nbuild_property.ProjectDir = G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\\n"
  },
  {
    "path": "TSLib/obj/Debug/netcoreapp3.1/TSLib.csproj.CoreCompileInputs.cache",
    "content": "ffffd03aad5d6c3afe005e27ac3e8402eeec43f7\n"
  },
  {
    "path": "TSLib/obj/Debug/netcoreapp3.1/TSLib.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netcoreapp3.1\\TSLib.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netcoreapp3.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netcoreapp3.1\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netcoreapp3.1\\TSLib.deps.json\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netcoreapp3.1\\TSLib.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netcoreapp3.1\\TSLib.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.csproj.AssemblyReference.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.AssemblyInfoInputs.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.AssemblyInfo.cs\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.csproj.CoreCompileInputs.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netcoreapp3.1\\TSLib.pdb\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETStandard,Version=v2.0\", FrameworkDisplayName = \"\")]\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.0/NuGet/2C8E6E8C03FF0327F78E3CB90559803756F36314/Nullable/1.2.1/Nullable/NullableAttributes.cs",
    "content": "// <auto-generated>\n//   This code file has automatically been added by the \"Nullable\" NuGet package (https://www.nuget.org/packages/Nullable).\n//   Please see https://github.com/manuelroemer/Nullable for more information.\n//\n//   IMPORTANT:\n//   DO NOT DELETE THIS FILE if you are using a \"packages.config\" file to manage your NuGet references.\n//   Consider migrating to PackageReferences instead:\n//   https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference\n//   Migrating brings the following benefits:\n//   * The \"Nullable\" folder and the \"NullableAttributes.cs\" files don't appear in your project.\n//   * The added files are immutable and can therefore not be modified by coincidence.\n//   * Updating/Uninstalling the package will work flawlessly.\n// </auto-generated>\n\n#region License\n// MIT License\n// \n// Copyright (c) 2019 Manuel Römer\n// \n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n#endregion\n\n#if !NULLABLE_ATTRIBUTES_DISABLE\n#nullable enable\n#pragma warning disable\n\nnamespace System.Diagnostics.CodeAnalysis\n{\n    using global::System;\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that <see langword=\"null\"/> is allowed as an input even if the\n    ///     corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class AllowNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"AllowNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public AllowNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that <see langword=\"null\"/> is disallowed as an input even if the\n    ///     corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DisallowNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DisallowNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public DisallowNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that a method that will never return under any circumstance.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Method, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DoesNotReturnAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DoesNotReturnAttribute\"/> class.\n        /// </summary>\n        ///\n#endif\n        public DoesNotReturnAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that the method will not return if the associated <see cref=\"Boolean\"/>\n    ///     parameter is passed the specified value.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DoesNotReturnIfAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the condition parameter value.\n        ///     Code after the method is considered unreachable by diagnostics if the argument\n        ///     to the associated parameter matches this value.\n        /// </summary>\n#endif\n        public bool ParameterValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DoesNotReturnIfAttribute\"/>\n        ///     class with the specified parameter value.\n        /// </summary>\n        /// <param name=\"parameterValue\">\n        ///     The condition parameter value.\n        ///     Code after the method is considered unreachable by diagnostics if the argument\n        ///     to the associated parameter matches this value.\n        /// </param>\n#endif\n        public DoesNotReturnIfAttribute(bool parameterValue)\n        {\n            ParameterValue = parameterValue;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that an output may be <see langword=\"null\"/> even if the\n    ///     corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | \n        AttributeTargets.Property | AttributeTargets.ReturnValue, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class MaybeNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"MaybeNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public MaybeNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that when a method returns <see cref=\"ReturnValue\"/>, \n    ///     the parameter may be <see langword=\"null\"/> even if the corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class MaybeNullWhenAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the return value condition.\n        ///     If the method returns this value, the associated parameter may be <see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public bool ReturnValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///      Initializes the attribute with the specified return value condition.\n        /// </summary>\n        /// <param name=\"returnValue\">\n        ///     The return value condition.\n        ///     If the method returns this value, the associated parameter may be <see langword=\"null\"/>.\n        /// </param>\n#endif\n        public MaybeNullWhenAttribute(bool returnValue)\n        {\n            ReturnValue = returnValue;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that an output is not <see langword=\"null\"/> even if the\n    ///     corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | \n        AttributeTargets.Property | AttributeTargets.ReturnValue, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"NotNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public NotNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that the output will be non-<see langword=\"null\"/> if the\n    ///     named parameter is non-<see langword=\"null\"/>.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, \n        AllowMultiple = true, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullIfNotNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the associated parameter name.\n        ///     The output will be non-<see langword=\"null\"/> if the argument to the\n        ///     parameter specified is non-<see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public string ParameterName { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes the attribute with the associated parameter name.\n        /// </summary>\n        /// <param name=\"parameterName\">\n        ///     The associated parameter name.\n        ///     The output will be non-<see langword=\"null\"/> if the argument to the\n        ///     parameter specified is non-<see langword=\"null\"/>.\n        /// </param>\n#endif\n        public NotNullIfNotNullAttribute(string parameterName)\n        {\n            // .NET Core 3.0 doesn't throw an ArgumentNullException, even though this is\n            // tagged as non-null.\n            // Follow this behavior here.\n            ParameterName = parameterName;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that when a method returns <see cref=\"ReturnValue\"/>,\n    ///     the parameter will not be <see langword=\"null\"/> even if the corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullWhenAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the return value condition.\n        ///     If the method returns this value, the associated parameter will not be <see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public bool ReturnValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes the attribute with the specified return value condition.\n        /// </summary>\n        /// <param name=\"returnValue\">\n        ///     The return value condition.\n        ///     If the method returns this value, the associated parameter will not be <see langword=\"null\"/>.\n        /// </param>\n#endif\n        public NotNullWhenAttribute(bool returnValue)\n        {\n            ReturnValue = returnValue;\n        }\n    }\n}\n\n#pragma warning enable\n#nullable restore\n#endif // NULLABLE_ATTRIBUTES_DISABLE\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.0/NuGet/7BA94E4E53727142735FA3B08F79617CD03664FD/Nullable/1.2.1/Nullable/NullableAttributes.cs",
    "content": "// <auto-generated>\n//   This code file has automatically been added by the \"Nullable\" NuGet package (https://www.nuget.org/packages/Nullable).\n//   Please see https://github.com/manuelroemer/Nullable for more information.\n//\n//   IMPORTANT:\n//   DO NOT DELETE THIS FILE if you are using a \"packages.config\" file to manage your NuGet references.\n//   Consider migrating to PackageReferences instead:\n//   https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference\n//   Migrating brings the following benefits:\n//   * The \"Nullable\" folder and the \"NullableAttributes.cs\" files don't appear in your project.\n//   * The added files are immutable and can therefore not be modified by coincidence.\n//   * Updating/Uninstalling the package will work flawlessly.\n// </auto-generated>\n\n#region License\n// MIT License\n// \n// Copyright (c) 2019 Manuel Römer\n// \n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n#endregion\n\n#if !NULLABLE_ATTRIBUTES_DISABLE\n#nullable enable\n#pragma warning disable\n\nnamespace System.Diagnostics.CodeAnalysis\n{\n    using global::System;\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that <see langword=\"null\"/> is allowed as an input even if the\n    ///     corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class AllowNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"AllowNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public AllowNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that <see langword=\"null\"/> is disallowed as an input even if the\n    ///     corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DisallowNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DisallowNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public DisallowNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that a method that will never return under any circumstance.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Method, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DoesNotReturnAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DoesNotReturnAttribute\"/> class.\n        /// </summary>\n        ///\n#endif\n        public DoesNotReturnAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that the method will not return if the associated <see cref=\"Boolean\"/>\n    ///     parameter is passed the specified value.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DoesNotReturnIfAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the condition parameter value.\n        ///     Code after the method is considered unreachable by diagnostics if the argument\n        ///     to the associated parameter matches this value.\n        /// </summary>\n#endif\n        public bool ParameterValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DoesNotReturnIfAttribute\"/>\n        ///     class with the specified parameter value.\n        /// </summary>\n        /// <param name=\"parameterValue\">\n        ///     The condition parameter value.\n        ///     Code after the method is considered unreachable by diagnostics if the argument\n        ///     to the associated parameter matches this value.\n        /// </param>\n#endif\n        public DoesNotReturnIfAttribute(bool parameterValue)\n        {\n            ParameterValue = parameterValue;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that an output may be <see langword=\"null\"/> even if the\n    ///     corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | \n        AttributeTargets.Property | AttributeTargets.ReturnValue, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class MaybeNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"MaybeNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public MaybeNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that when a method returns <see cref=\"ReturnValue\"/>, \n    ///     the parameter may be <see langword=\"null\"/> even if the corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class MaybeNullWhenAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the return value condition.\n        ///     If the method returns this value, the associated parameter may be <see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public bool ReturnValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///      Initializes the attribute with the specified return value condition.\n        /// </summary>\n        /// <param name=\"returnValue\">\n        ///     The return value condition.\n        ///     If the method returns this value, the associated parameter may be <see langword=\"null\"/>.\n        /// </param>\n#endif\n        public MaybeNullWhenAttribute(bool returnValue)\n        {\n            ReturnValue = returnValue;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that an output is not <see langword=\"null\"/> even if the\n    ///     corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | \n        AttributeTargets.Property | AttributeTargets.ReturnValue, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"NotNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public NotNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that the output will be non-<see langword=\"null\"/> if the\n    ///     named parameter is non-<see langword=\"null\"/>.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, \n        AllowMultiple = true, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullIfNotNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the associated parameter name.\n        ///     The output will be non-<see langword=\"null\"/> if the argument to the\n        ///     parameter specified is non-<see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public string ParameterName { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes the attribute with the associated parameter name.\n        /// </summary>\n        /// <param name=\"parameterName\">\n        ///     The associated parameter name.\n        ///     The output will be non-<see langword=\"null\"/> if the argument to the\n        ///     parameter specified is non-<see langword=\"null\"/>.\n        /// </param>\n#endif\n        public NotNullIfNotNullAttribute(string parameterName)\n        {\n            // .NET Core 3.0 doesn't throw an ArgumentNullException, even though this is\n            // tagged as non-null.\n            // Follow this behavior here.\n            ParameterName = parameterName;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that when a method returns <see cref=\"ReturnValue\"/>,\n    ///     the parameter will not be <see langword=\"null\"/> even if the corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullWhenAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the return value condition.\n        ///     If the method returns this value, the associated parameter will not be <see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public bool ReturnValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes the attribute with the specified return value condition.\n        /// </summary>\n        /// <param name=\"returnValue\">\n        ///     The return value condition.\n        ///     If the method returns this value, the associated parameter will not be <see langword=\"null\"/>.\n        /// </param>\n#endif\n        public NotNullWhenAttribute(bool returnValue)\n        {\n            ReturnValue = returnValue;\n        }\n    }\n}\n\n#pragma warning enable\n#nullable restore\n#endif // NULLABLE_ATTRIBUTES_DISABLE\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.0/TSLib.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Debug\")]\n[assembly: System.Reflection.AssemblyCopyrightAttribute(\"Splamy, Flakebi, TSLib Contributors\")]\n[assembly: System.Reflection.AssemblyDescriptionAttribute(\"\\n      A free and open source TeamSpeak 3 and 5 client library.\\n      Can connect\" +\n    \" as normal voice or query client and is optimized for performance.\\n    \")]\n[assembly: System.Reflection.AssemblyFileVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyInformationalVersionAttribute(\"1.1.0\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.0/TSLib.AssemblyInfoInputs.cache",
    "content": "2ff3ef079d87000ac18187eaa94cbfde54c93cad\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.0/TSLib.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TSLib\nbuild_property.ProjectDir = G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.0/TSLib.csproj.CoreCompileInputs.cache",
    "content": "e3b073d87aad04aa8978486c82341498240963e0\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.0/TSLib.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.0\\TSLib.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.0\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.0\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\NuGet\\2C8E6E8C03FF0327F78E3CB90559803756F36314\\Nullable\\1.2.1\\Nullable\\NullableAttributes.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.0\\TSLib.deps.json\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.0\\TSLib.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.0\\TSLib.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.AssemblyInfoInputs.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.AssemblyInfo.cs\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.csproj.CoreCompileInputs.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.0\\TSLib.pdb\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETStandard,Version=v2.1\", FrameworkDisplayName = \"\")]\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.1/TSLib.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Debug\")]\n[assembly: System.Reflection.AssemblyCopyrightAttribute(\"Splamy, Flakebi, TSLib Contributors\")]\n[assembly: System.Reflection.AssemblyDescriptionAttribute(\"\\n      A free and open source TeamSpeak 3 and 5 client library.\\n      Can connect\" +\n    \" as normal voice or query client and is optimized for performance.\\n    \")]\n[assembly: System.Reflection.AssemblyFileVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyInformationalVersionAttribute(\"1.1.0\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.1/TSLib.AssemblyInfoInputs.cache",
    "content": "2ff3ef079d87000ac18187eaa94cbfde54c93cad\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.1/TSLib.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TSLib\nbuild_property.ProjectDir = G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.1/TSLib.csproj.CoreCompileInputs.cache",
    "content": "f8cbaf6212d4764a126254fb61ee67b84cf27574\n"
  },
  {
    "path": "TSLib/obj/Debug/netstandard2.1/TSLib.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.1\\TSLib.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.1\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.1\\TSLib.deps.json\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.1\\TSLib.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Debug\\netstandard2.1\\TSLib.pdb\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.csproj.AssemblyReference.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.AssemblyInfoInputs.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.AssemblyInfo.cs\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.csproj.CoreCompileInputs.cache\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.dll\nG:\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Debug\\netstandard2.1\\TSLib.pdb\n"
  },
  {
    "path": "TSLib/obj/Release/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v3.1\", FrameworkDisplayName = \".NET Core 3.1\")]\n"
  },
  {
    "path": "TSLib/obj/Release/netcoreapp3.1/TSLib.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Release\")]\n[assembly: System.Reflection.AssemblyCopyrightAttribute(\"Splamy, Flakebi, TSLib Contributors\")]\n[assembly: System.Reflection.AssemblyDescriptionAttribute(\"\\n      A free and open source TeamSpeak 3 and 5 client library.\\n      Can connect\" +\n    \" as normal voice or query client and is optimized for performance.\\n    \")]\n[assembly: System.Reflection.AssemblyFileVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyInformationalVersionAttribute(\"1.1.0\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TSLib/obj/Release/netcoreapp3.1/TSLib.AssemblyInfoInputs.cache",
    "content": "d05c9d59824d457289a7f8adc4d2a85d4364458f\n"
  },
  {
    "path": "TSLib/obj/Release/netcoreapp3.1/TSLib.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TSLib\nbuild_property.ProjectDir = G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\\n"
  },
  {
    "path": "TSLib/obj/Release/netcoreapp3.1/TSLib.csproj.CoreCompileInputs.cache",
    "content": "2c1b64bc0bb50d2247d91321b7ba02226ea6861a\n"
  },
  {
    "path": "TSLib/obj/Release/netcoreapp3.1/TSLib.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netcoreapp3.1\\TSLib.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netcoreapp3.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netcoreapp3.1\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netcoreapp3.1\\TSLib.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netcoreapp3.1\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netcoreapp3.1\\TSLib.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netcoreapp3.1\\TSLib.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netcoreapp3.1\\TSLib.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netcoreapp3.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netcoreapp3.1\\TSLib.pdb\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETStandard,Version=v2.0\", FrameworkDisplayName = \".NET Standard 2.0\")]\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.0/NuGet/2C8E6E8C03FF0327F78E3CB90559803756F36314/Nullable/1.2.1/Nullable/NullableAttributes.cs",
    "content": "// <auto-generated>\n//   This code file has automatically been added by the \"Nullable\" NuGet package (https://www.nuget.org/packages/Nullable).\n//   Please see https://github.com/manuelroemer/Nullable for more information.\n//\n//   IMPORTANT:\n//   DO NOT DELETE THIS FILE if you are using a \"packages.config\" file to manage your NuGet references.\n//   Consider migrating to PackageReferences instead:\n//   https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference\n//   Migrating brings the following benefits:\n//   * The \"Nullable\" folder and the \"NullableAttributes.cs\" files don't appear in your project.\n//   * The added files are immutable and can therefore not be modified by coincidence.\n//   * Updating/Uninstalling the package will work flawlessly.\n// </auto-generated>\n\n#region License\n// MIT License\n// \n// Copyright (c) 2019 Manuel Römer\n// \n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n#endregion\n\n#if !NULLABLE_ATTRIBUTES_DISABLE\n#nullable enable\n#pragma warning disable\n\nnamespace System.Diagnostics.CodeAnalysis\n{\n    using global::System;\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that <see langword=\"null\"/> is allowed as an input even if the\n    ///     corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class AllowNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"AllowNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public AllowNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that <see langword=\"null\"/> is disallowed as an input even if the\n    ///     corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DisallowNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DisallowNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public DisallowNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that a method that will never return under any circumstance.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Method, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DoesNotReturnAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DoesNotReturnAttribute\"/> class.\n        /// </summary>\n        ///\n#endif\n        public DoesNotReturnAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that the method will not return if the associated <see cref=\"Boolean\"/>\n    ///     parameter is passed the specified value.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DoesNotReturnIfAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the condition parameter value.\n        ///     Code after the method is considered unreachable by diagnostics if the argument\n        ///     to the associated parameter matches this value.\n        /// </summary>\n#endif\n        public bool ParameterValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DoesNotReturnIfAttribute\"/>\n        ///     class with the specified parameter value.\n        /// </summary>\n        /// <param name=\"parameterValue\">\n        ///     The condition parameter value.\n        ///     Code after the method is considered unreachable by diagnostics if the argument\n        ///     to the associated parameter matches this value.\n        /// </param>\n#endif\n        public DoesNotReturnIfAttribute(bool parameterValue)\n        {\n            ParameterValue = parameterValue;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that an output may be <see langword=\"null\"/> even if the\n    ///     corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | \n        AttributeTargets.Property | AttributeTargets.ReturnValue, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class MaybeNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"MaybeNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public MaybeNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that when a method returns <see cref=\"ReturnValue\"/>, \n    ///     the parameter may be <see langword=\"null\"/> even if the corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class MaybeNullWhenAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the return value condition.\n        ///     If the method returns this value, the associated parameter may be <see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public bool ReturnValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///      Initializes the attribute with the specified return value condition.\n        /// </summary>\n        /// <param name=\"returnValue\">\n        ///     The return value condition.\n        ///     If the method returns this value, the associated parameter may be <see langword=\"null\"/>.\n        /// </param>\n#endif\n        public MaybeNullWhenAttribute(bool returnValue)\n        {\n            ReturnValue = returnValue;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that an output is not <see langword=\"null\"/> even if the\n    ///     corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | \n        AttributeTargets.Property | AttributeTargets.ReturnValue, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"NotNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public NotNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that the output will be non-<see langword=\"null\"/> if the\n    ///     named parameter is non-<see langword=\"null\"/>.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, \n        AllowMultiple = true, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullIfNotNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the associated parameter name.\n        ///     The output will be non-<see langword=\"null\"/> if the argument to the\n        ///     parameter specified is non-<see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public string ParameterName { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes the attribute with the associated parameter name.\n        /// </summary>\n        /// <param name=\"parameterName\">\n        ///     The associated parameter name.\n        ///     The output will be non-<see langword=\"null\"/> if the argument to the\n        ///     parameter specified is non-<see langword=\"null\"/>.\n        /// </param>\n#endif\n        public NotNullIfNotNullAttribute(string parameterName)\n        {\n            // .NET Core 3.0 doesn't throw an ArgumentNullException, even though this is\n            // tagged as non-null.\n            // Follow this behavior here.\n            ParameterName = parameterName;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that when a method returns <see cref=\"ReturnValue\"/>,\n    ///     the parameter will not be <see langword=\"null\"/> even if the corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullWhenAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the return value condition.\n        ///     If the method returns this value, the associated parameter will not be <see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public bool ReturnValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes the attribute with the specified return value condition.\n        /// </summary>\n        /// <param name=\"returnValue\">\n        ///     The return value condition.\n        ///     If the method returns this value, the associated parameter will not be <see langword=\"null\"/>.\n        /// </param>\n#endif\n        public NotNullWhenAttribute(bool returnValue)\n        {\n            ReturnValue = returnValue;\n        }\n    }\n}\n\n#pragma warning enable\n#nullable restore\n#endif // NULLABLE_ATTRIBUTES_DISABLE\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.0/NuGet/7BA94E4E53727142735FA3B08F79617CD03664FD/Nullable/1.2.1/Nullable/NullableAttributes.cs",
    "content": "// <auto-generated>\n//   This code file has automatically been added by the \"Nullable\" NuGet package (https://www.nuget.org/packages/Nullable).\n//   Please see https://github.com/manuelroemer/Nullable for more information.\n//\n//   IMPORTANT:\n//   DO NOT DELETE THIS FILE if you are using a \"packages.config\" file to manage your NuGet references.\n//   Consider migrating to PackageReferences instead:\n//   https://docs.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference\n//   Migrating brings the following benefits:\n//   * The \"Nullable\" folder and the \"NullableAttributes.cs\" files don't appear in your project.\n//   * The added files are immutable and can therefore not be modified by coincidence.\n//   * Updating/Uninstalling the package will work flawlessly.\n// </auto-generated>\n\n#region License\n// MIT License\n// \n// Copyright (c) 2019 Manuel Römer\n// \n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n#endregion\n\n#if !NULLABLE_ATTRIBUTES_DISABLE\n#nullable enable\n#pragma warning disable\n\nnamespace System.Diagnostics.CodeAnalysis\n{\n    using global::System;\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that <see langword=\"null\"/> is allowed as an input even if the\n    ///     corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class AllowNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"AllowNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public AllowNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that <see langword=\"null\"/> is disallowed as an input even if the\n    ///     corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DisallowNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DisallowNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public DisallowNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that a method that will never return under any circumstance.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Method, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DoesNotReturnAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DoesNotReturnAttribute\"/> class.\n        /// </summary>\n        ///\n#endif\n        public DoesNotReturnAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that the method will not return if the associated <see cref=\"Boolean\"/>\n    ///     parameter is passed the specified value.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class DoesNotReturnIfAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the condition parameter value.\n        ///     Code after the method is considered unreachable by diagnostics if the argument\n        ///     to the associated parameter matches this value.\n        /// </summary>\n#endif\n        public bool ParameterValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"DoesNotReturnIfAttribute\"/>\n        ///     class with the specified parameter value.\n        /// </summary>\n        /// <param name=\"parameterValue\">\n        ///     The condition parameter value.\n        ///     Code after the method is considered unreachable by diagnostics if the argument\n        ///     to the associated parameter matches this value.\n        /// </param>\n#endif\n        public DoesNotReturnIfAttribute(bool parameterValue)\n        {\n            ParameterValue = parameterValue;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that an output may be <see langword=\"null\"/> even if the\n    ///     corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | \n        AttributeTargets.Property | AttributeTargets.ReturnValue, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class MaybeNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"MaybeNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public MaybeNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that when a method returns <see cref=\"ReturnValue\"/>, \n    ///     the parameter may be <see langword=\"null\"/> even if the corresponding type disallows it.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class MaybeNullWhenAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the return value condition.\n        ///     If the method returns this value, the associated parameter may be <see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public bool ReturnValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///      Initializes the attribute with the specified return value condition.\n        /// </summary>\n        /// <param name=\"returnValue\">\n        ///     The return value condition.\n        ///     If the method returns this value, the associated parameter may be <see langword=\"null\"/>.\n        /// </param>\n#endif\n        public MaybeNullWhenAttribute(bool returnValue)\n        {\n            ReturnValue = returnValue;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that an output is not <see langword=\"null\"/> even if the\n    ///     corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Field | AttributeTargets.Parameter | \n        AttributeTargets.Property | AttributeTargets.ReturnValue, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Initializes a new instance of the <see cref=\"NotNullAttribute\"/> class.\n        /// </summary>\n#endif\n        public NotNullAttribute() { }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that the output will be non-<see langword=\"null\"/> if the\n    ///     named parameter is non-<see langword=\"null\"/>.\n    /// </summary>\n#endif\n    [AttributeUsage(\n        AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, \n        AllowMultiple = true, \n        Inherited = false\n    )]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullIfNotNullAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the associated parameter name.\n        ///     The output will be non-<see langword=\"null\"/> if the argument to the\n        ///     parameter specified is non-<see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public string ParameterName { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes the attribute with the associated parameter name.\n        /// </summary>\n        /// <param name=\"parameterName\">\n        ///     The associated parameter name.\n        ///     The output will be non-<see langword=\"null\"/> if the argument to the\n        ///     parameter specified is non-<see langword=\"null\"/>.\n        /// </param>\n#endif\n        public NotNullIfNotNullAttribute(string parameterName)\n        {\n            // .NET Core 3.0 doesn't throw an ArgumentNullException, even though this is\n            // tagged as non-null.\n            // Follow this behavior here.\n            ParameterName = parameterName;\n        }\n    }\n\n#if DEBUG\n    /// <summary>\n    ///     Specifies that when a method returns <see cref=\"ReturnValue\"/>,\n    ///     the parameter will not be <see langword=\"null\"/> even if the corresponding type allows it.\n    /// </summary>\n#endif\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n#if !NULLABLE_ATTRIBUTES_INCLUDE_IN_CODE_COVERAGE\n    [ExcludeFromCodeCoverage, DebuggerNonUserCode]\n#endif\n    internal sealed class NotNullWhenAttribute : Attribute\n    {\n#if DEBUG\n        /// <summary>\n        ///     Gets the return value condition.\n        ///     If the method returns this value, the associated parameter will not be <see langword=\"null\"/>.\n        /// </summary>\n#endif\n        public bool ReturnValue { get; }\n\n#if DEBUG\n        /// <summary>\n        ///     Initializes the attribute with the specified return value condition.\n        /// </summary>\n        /// <param name=\"returnValue\">\n        ///     The return value condition.\n        ///     If the method returns this value, the associated parameter will not be <see langword=\"null\"/>.\n        /// </param>\n#endif\n        public NotNullWhenAttribute(bool returnValue)\n        {\n            ReturnValue = returnValue;\n        }\n    }\n}\n\n#pragma warning enable\n#nullable restore\n#endif // NULLABLE_ATTRIBUTES_DISABLE\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.0/TSLib.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Release\")]\n[assembly: System.Reflection.AssemblyCopyrightAttribute(\"Splamy, Flakebi, TSLib Contributors\")]\n[assembly: System.Reflection.AssemblyDescriptionAttribute(\"\\n      A free and open source TeamSpeak 3 and 5 client library.\\n      Can connect\" +\n    \" as normal voice or query client and is optimized for performance.\\n    \")]\n[assembly: System.Reflection.AssemblyFileVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyInformationalVersionAttribute(\"1.1.0\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.0/TSLib.AssemblyInfoInputs.cache",
    "content": "d05c9d59824d457289a7f8adc4d2a85d4364458f\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.0/TSLib.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TSLib\nbuild_property.ProjectDir = G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.0/TSLib.csproj.CoreCompileInputs.cache",
    "content": "762be8033dcfe89c4c681d66484f55153f94a449\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.0/TSLib.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netstandard2.0\\TSLib.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netstandard2.0\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netstandard2.0\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.0\\NuGet\\2C8E6E8C03FF0327F78E3CB90559803756F36314\\Nullable\\1.2.1\\Nullable\\NullableAttributes.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.0\\TSLib.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.0\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.0\\TSLib.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.0\\TSLib.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.0\\TSLib.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.0\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.0\\TSLib.pdb\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.1/.NETStandard,Version=v2.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETStandard,Version=v2.1\", FrameworkDisplayName = \".NET Standard 2.1\")]\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.1/TSLib.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Release\")]\n[assembly: System.Reflection.AssemblyCopyrightAttribute(\"Splamy, Flakebi, TSLib Contributors\")]\n[assembly: System.Reflection.AssemblyDescriptionAttribute(\"\\n      A free and open source TeamSpeak 3 and 5 client library.\\n      Can connect\" +\n    \" as normal voice or query client and is optimized for performance.\\n    \")]\n[assembly: System.Reflection.AssemblyFileVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyInformationalVersionAttribute(\"1.1.0\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"TSLib\")]\n[assembly: System.Reflection.AssemblyVersionAttribute(\"1.1.0.0\")]\n[assembly: System.Reflection.AssemblyMetadataAttribute(\"RepositoryUrl\", \"https://github.com/Splamy/TS3AudioBot.git\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.1/TSLib.AssemblyInfoInputs.cache",
    "content": "d05c9d59824d457289a7f8adc4d2a85d4364458f\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.1/TSLib.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = TSLib\nbuild_property.ProjectDir = G:\\TS3DEV\\TS3AudioBot-master\\TSLib\\\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.1/TSLib.csproj.CoreCompileInputs.cache",
    "content": "5118785d175062d06e24b2dfada985f027f63aa7\n"
  },
  {
    "path": "TSLib/obj/Release/netstandard2.1/TSLib.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netstandard2.1\\TSLib.deps.json\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netstandard2.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\bin\\Release\\netstandard2.1\\TSLib.pdb\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.1\\TSLib.csproj.AssemblyReference.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.1\\TSLib.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.1\\TSLib.AssemblyInfoInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.1\\TSLib.AssemblyInfo.cs\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.1\\TSLib.csproj.CoreCompileInputs.cache\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.1\\TSLib.dll\nC:\\Users\\13336\\OneDrive\\桌面\\TS3DEV\\TS3AudioBot-master\\TSLib\\obj\\Release\\netstandard2.1\\TSLib.pdb\n"
  },
  {
    "path": "TSLib/obj/TSLib.csproj.nuget.dgspec.json",
    "content": "{\n  \"format\": 1,\n  \"restore\": {\n    \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {}\n  },\n  \"projects\": {\n    \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n      \"version\": \"1.1.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"projectName\": \"Splamy.TSLib\",\n        \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\obj\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"crossTargeting\": true,\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\",\n          \"netstandard2.0\",\n          \"netstandard2.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.0\": {\n            \"targetAlias\": \"netstandard2.0\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.1\": {\n            \"targetAlias\": \"netstandard2.1\",\n            \"projectReferences\": {}\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.0\": {\n          \"targetAlias\": \"netstandard2.0\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NETStandard.Library\": {\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[2.0.3, )\",\n              \"autoReferenced\": true\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            },\n            \"System.Memory\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.5.4, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.1\": {\n          \"targetAlias\": \"netstandard2.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"NETStandard.Library\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "TSLib/obj/TSLib.csproj.nuget.g.props",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <RestoreSuccess Condition=\" '$(RestoreSuccess)' == '' \">True</RestoreSuccess>\n    <RestoreTool Condition=\" '$(RestoreTool)' == '' \">NuGet</RestoreTool>\n    <ProjectAssetsFile Condition=\" '$(ProjectAssetsFile)' == '' \">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>\n    <NuGetPackageRoot Condition=\" '$(NuGetPackageRoot)' == '' \">$(UserProfile)\\.nuget\\packages\\</NuGetPackageRoot>\n    <NuGetPackageFolders Condition=\" '$(NuGetPackageFolders)' == '' \">C:\\Users\\Saopig\\.nuget\\packages\\</NuGetPackageFolders>\n    <NuGetProjectStyle Condition=\" '$(NuGetProjectStyle)' == '' \">PackageReference</NuGetProjectStyle>\n    <NuGetToolVersion Condition=\" '$(NuGetToolVersion)' == '' \">5.11.4</NuGetToolVersion>\n  </PropertyGroup>\n  <ItemGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <SourceRoot Include=\"C:\\Users\\Saopig\\.nuget\\packages\\\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "TSLib/obj/TSLib.csproj.nuget.g.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n  </PropertyGroup>\n  <ImportGroup Condition=\" '$(TargetFramework)' == 'netstandard2.0' AND '$(ExcludeRestorePackageImports)' != 'true' \">\n    <Import Project=\"$(NuGetPackageRoot)netstandard.library\\2.0.3\\build\\netstandard2.0\\NETStandard.Library.targets\" Condition=\"Exists('$(NuGetPackageRoot)netstandard.library\\2.0.3\\build\\netstandard2.0\\NETStandard.Library.targets')\" />\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "TSLib/obj/project.assets.json",
    "content": "{\n  \"version\": 3,\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        }\n      },\n      \"Nullable/1.2.1\": {\n        \"type\": \"package\",\n        \"contentFiles\": {\n          \"contentFiles/cs/netstandard2.1/_._\": {\n            \"buildAction\": \"None\",\n            \"codeLanguage\": \"cs\",\n            \"copyToOutput\": false\n          }\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {}\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/System.IO.Pipelines.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {}\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"linux\"\n          },\n          \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"osx\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {}\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {}\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {}\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netcoreapp1.1/_._\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {}\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      }\n    },\n    \".NETStandard,Version=v2.0\": {\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"NETStandard.Library/2.0.3\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"build\": {\n          \"build/netstandard2.0/NETStandard.Library.targets\": {}\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        }\n      },\n      \"Nullable/1.2.1\": {\n        \"type\": \"package\",\n        \"contentFiles\": {\n          \"contentFiles/cs/netstandard2.0/Nullable/NullableAttributes.cs.pp\": {\n            \"buildAction\": \"Compile\",\n            \"codeLanguage\": \"cs\",\n            \"copyToOutput\": false,\n            \"ppOutputPath\": \"Nullable/NullableAttributes.cs\"\n          }\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Buffers/4.5.1\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Buffers.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Buffers.dll\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {}\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.4\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.IO.Pipelines.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.IO.Pipelines.dll\": {}\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.4.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Memory.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Memory.dll\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"linux\"\n          },\n          \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"osx\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {}\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {}\n        }\n      },\n      \"System.Numerics.Vectors/4.4.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Numerics.Vectors.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Numerics.Vectors.dll\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {}\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {}\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {}\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {}\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {}\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      }\n    },\n    \".NETStandard,Version=v2.1\": {\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"Microsoft.NETCore.Platforms/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        }\n      },\n      \"Nullable/1.2.1\": {\n        \"type\": \"package\",\n        \"contentFiles\": {\n          \"contentFiles/cs/netstandard2.1/_._\": {\n            \"buildAction\": \"None\",\n            \"codeLanguage\": \"cs\",\n            \"copyToOutput\": false\n          }\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Buffers/4.5.1\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Buffers.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Buffers.dll\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {}\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.4\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.IO.Pipelines.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.IO.Pipelines.dll\": {}\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Buffers\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.4.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Memory.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Memory.dll\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"linux\"\n          },\n          \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"osx\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {}\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {}\n        }\n      },\n      \"System.Numerics.Vectors/4.4.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Numerics.Vectors.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Numerics.Vectors.dll\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {}\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {}\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {}\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {}\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {}\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"sha512\": \"i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"type\": \"package\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"heijden.dns.portable.2.0.19.nupkg.sha512\",\n        \"heijden.dns.portable.nuspec\",\n        \"lib/netstandard1.3/Heijden.Dns.Portable.dll\"\n      ]\n    },\n    \"Microsoft.NETCore.Platforms/1.1.0\": {\n      \"sha512\": \"kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.platforms/1.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.platforms.1.1.0.nupkg.sha512\",\n        \"microsoft.netcore.platforms.nuspec\",\n        \"runtime.json\"\n      ]\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"sha512\": \"aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n        \"microsoft.netcore.targets.nuspec\",\n        \"runtime.json\"\n      ]\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"sha512\": \"9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/Microsoft.Win32.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n        \"microsoft.win32.primitives.nuspec\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\"\n      ]\n    },\n    \"NETStandard.Library/2.0.3\": {\n      \"sha512\": \"st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==\",\n      \"type\": \"package\",\n      \"path\": \"netstandard.library/2.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"build/netstandard2.0/NETStandard.Library.targets\",\n        \"build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll\",\n        \"build/netstandard2.0/ref/System.AppContext.dll\",\n        \"build/netstandard2.0/ref/System.Collections.Concurrent.dll\",\n        \"build/netstandard2.0/ref/System.Collections.NonGeneric.dll\",\n        \"build/netstandard2.0/ref/System.Collections.Specialized.dll\",\n        \"build/netstandard2.0/ref/System.Collections.dll\",\n        \"build/netstandard2.0/ref/System.ComponentModel.Composition.dll\",\n        \"build/netstandard2.0/ref/System.ComponentModel.EventBasedAsync.dll\",\n        \"build/netstandard2.0/ref/System.ComponentModel.Primitives.dll\",\n        \"build/netstandard2.0/ref/System.ComponentModel.TypeConverter.dll\",\n        \"build/netstandard2.0/ref/System.ComponentModel.dll\",\n        \"build/netstandard2.0/ref/System.Console.dll\",\n        \"build/netstandard2.0/ref/System.Core.dll\",\n        \"build/netstandard2.0/ref/System.Data.Common.dll\",\n        \"build/netstandard2.0/ref/System.Data.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.Contracts.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.Debug.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.FileVersionInfo.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.Process.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.StackTrace.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.TextWriterTraceListener.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.Tools.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.TraceSource.dll\",\n        \"build/netstandard2.0/ref/System.Diagnostics.Tracing.dll\",\n        \"build/netstandard2.0/ref/System.Drawing.Primitives.dll\",\n        \"build/netstandard2.0/ref/System.Drawing.dll\",\n        \"build/netstandard2.0/ref/System.Dynamic.Runtime.dll\",\n        \"build/netstandard2.0/ref/System.Globalization.Calendars.dll\",\n        \"build/netstandard2.0/ref/System.Globalization.Extensions.dll\",\n        \"build/netstandard2.0/ref/System.Globalization.dll\",\n        \"build/netstandard2.0/ref/System.IO.Compression.FileSystem.dll\",\n        \"build/netstandard2.0/ref/System.IO.Compression.ZipFile.dll\",\n        \"build/netstandard2.0/ref/System.IO.Compression.dll\",\n        \"build/netstandard2.0/ref/System.IO.FileSystem.DriveInfo.dll\",\n        \"build/netstandard2.0/ref/System.IO.FileSystem.Primitives.dll\",\n        \"build/netstandard2.0/ref/System.IO.FileSystem.Watcher.dll\",\n        \"build/netstandard2.0/ref/System.IO.FileSystem.dll\",\n        \"build/netstandard2.0/ref/System.IO.IsolatedStorage.dll\",\n        \"build/netstandard2.0/ref/System.IO.MemoryMappedFiles.dll\",\n        \"build/netstandard2.0/ref/System.IO.Pipes.dll\",\n        \"build/netstandard2.0/ref/System.IO.UnmanagedMemoryStream.dll\",\n        \"build/netstandard2.0/ref/System.IO.dll\",\n        \"build/netstandard2.0/ref/System.Linq.Expressions.dll\",\n        \"build/netstandard2.0/ref/System.Linq.Parallel.dll\",\n        \"build/netstandard2.0/ref/System.Linq.Queryable.dll\",\n        \"build/netstandard2.0/ref/System.Linq.dll\",\n        \"build/netstandard2.0/ref/System.Net.Http.dll\",\n        \"build/netstandard2.0/ref/System.Net.NameResolution.dll\",\n        \"build/netstandard2.0/ref/System.Net.NetworkInformation.dll\",\n        \"build/netstandard2.0/ref/System.Net.Ping.dll\",\n        \"build/netstandard2.0/ref/System.Net.Primitives.dll\",\n        \"build/netstandard2.0/ref/System.Net.Requests.dll\",\n        \"build/netstandard2.0/ref/System.Net.Security.dll\",\n        \"build/netstandard2.0/ref/System.Net.Sockets.dll\",\n        \"build/netstandard2.0/ref/System.Net.WebHeaderCollection.dll\",\n        \"build/netstandard2.0/ref/System.Net.WebSockets.Client.dll\",\n        \"build/netstandard2.0/ref/System.Net.WebSockets.dll\",\n        \"build/netstandard2.0/ref/System.Net.dll\",\n        \"build/netstandard2.0/ref/System.Numerics.dll\",\n        \"build/netstandard2.0/ref/System.ObjectModel.dll\",\n        \"build/netstandard2.0/ref/System.Reflection.Extensions.dll\",\n        \"build/netstandard2.0/ref/System.Reflection.Primitives.dll\",\n        \"build/netstandard2.0/ref/System.Reflection.dll\",\n        \"build/netstandard2.0/ref/System.Resources.Reader.dll\",\n        \"build/netstandard2.0/ref/System.Resources.ResourceManager.dll\",\n        \"build/netstandard2.0/ref/System.Resources.Writer.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.CompilerServices.VisualC.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.Extensions.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.Handles.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.InteropServices.RuntimeInformation.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.InteropServices.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.Numerics.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.Serialization.Formatters.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.Serialization.Json.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.Serialization.Primitives.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.Serialization.Xml.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.Serialization.dll\",\n        \"build/netstandard2.0/ref/System.Runtime.dll\",\n        \"build/netstandard2.0/ref/System.Security.Claims.dll\",\n        \"build/netstandard2.0/ref/System.Security.Cryptography.Algorithms.dll\",\n        \"build/netstandard2.0/ref/System.Security.Cryptography.Csp.dll\",\n        \"build/netstandard2.0/ref/System.Security.Cryptography.Encoding.dll\",\n        \"build/netstandard2.0/ref/System.Security.Cryptography.Primitives.dll\",\n        \"build/netstandard2.0/ref/System.Security.Cryptography.X509Certificates.dll\",\n        \"build/netstandard2.0/ref/System.Security.Principal.dll\",\n        \"build/netstandard2.0/ref/System.Security.SecureString.dll\",\n        \"build/netstandard2.0/ref/System.ServiceModel.Web.dll\",\n        \"build/netstandard2.0/ref/System.Text.Encoding.Extensions.dll\",\n        \"build/netstandard2.0/ref/System.Text.Encoding.dll\",\n        \"build/netstandard2.0/ref/System.Text.RegularExpressions.dll\",\n        \"build/netstandard2.0/ref/System.Threading.Overlapped.dll\",\n        \"build/netstandard2.0/ref/System.Threading.Tasks.Parallel.dll\",\n        \"build/netstandard2.0/ref/System.Threading.Tasks.dll\",\n        \"build/netstandard2.0/ref/System.Threading.Thread.dll\",\n        \"build/netstandard2.0/ref/System.Threading.ThreadPool.dll\",\n        \"build/netstandard2.0/ref/System.Threading.Timer.dll\",\n        \"build/netstandard2.0/ref/System.Threading.dll\",\n        \"build/netstandard2.0/ref/System.Transactions.dll\",\n        \"build/netstandard2.0/ref/System.ValueTuple.dll\",\n        \"build/netstandard2.0/ref/System.Web.dll\",\n        \"build/netstandard2.0/ref/System.Windows.dll\",\n        \"build/netstandard2.0/ref/System.Xml.Linq.dll\",\n        \"build/netstandard2.0/ref/System.Xml.ReaderWriter.dll\",\n        \"build/netstandard2.0/ref/System.Xml.Serialization.dll\",\n        \"build/netstandard2.0/ref/System.Xml.XDocument.dll\",\n        \"build/netstandard2.0/ref/System.Xml.XPath.XDocument.dll\",\n        \"build/netstandard2.0/ref/System.Xml.XPath.dll\",\n        \"build/netstandard2.0/ref/System.Xml.XmlDocument.dll\",\n        \"build/netstandard2.0/ref/System.Xml.XmlSerializer.dll\",\n        \"build/netstandard2.0/ref/System.Xml.dll\",\n        \"build/netstandard2.0/ref/System.dll\",\n        \"build/netstandard2.0/ref/mscorlib.dll\",\n        \"build/netstandard2.0/ref/netstandard.dll\",\n        \"build/netstandard2.0/ref/netstandard.xml\",\n        \"lib/netstandard1.0/_._\",\n        \"netstandard.library.2.0.3.nupkg.sha512\",\n        \"netstandard.library.nuspec\"\n      ]\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"sha512\": \"6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"type\": \"package\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.md\",\n        \"lib/net20/Newtonsoft.Json.dll\",\n        \"lib/net20/Newtonsoft.Json.xml\",\n        \"lib/net35/Newtonsoft.Json.dll\",\n        \"lib/net35/Newtonsoft.Json.xml\",\n        \"lib/net40/Newtonsoft.Json.dll\",\n        \"lib/net40/Newtonsoft.Json.xml\",\n        \"lib/net45/Newtonsoft.Json.dll\",\n        \"lib/net45/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.0/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.3/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.3/Newtonsoft.Json.xml\",\n        \"lib/netstandard2.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard2.0/Newtonsoft.Json.xml\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"newtonsoft.json.12.0.3.nupkg.sha512\",\n        \"newtonsoft.json.nuspec\",\n        \"packageIcon.png\"\n      ]\n    },\n    \"NLog/4.7.3\": {\n      \"sha512\": \"3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"type\": \"package\",\n      \"path\": \"nlog/4.7.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/monoandroid44/NLog.dll\",\n        \"lib/monoandroid44/NLog.xml\",\n        \"lib/net35/NLog.dll\",\n        \"lib/net35/NLog.xml\",\n        \"lib/net40-client/NLog.dll\",\n        \"lib/net40-client/NLog.xml\",\n        \"lib/net45/NLog.dll\",\n        \"lib/net45/NLog.xml\",\n        \"lib/netstandard1.3/NLog.dll\",\n        \"lib/netstandard1.3/NLog.xml\",\n        \"lib/netstandard1.5/NLog.dll\",\n        \"lib/netstandard1.5/NLog.xml\",\n        \"lib/netstandard2.0/NLog.dll\",\n        \"lib/netstandard2.0/NLog.xml\",\n        \"lib/sl4/NLog.dll\",\n        \"lib/sl4/NLog.xml\",\n        \"lib/sl5/NLog.dll\",\n        \"lib/sl5/NLog.xml\",\n        \"lib/wp8/NLog.dll\",\n        \"lib/wp8/NLog.xml\",\n        \"lib/xamarinios10/NLog.dll\",\n        \"lib/xamarinios10/NLog.xml\",\n        \"nlog.4.7.3.nupkg.sha512\",\n        \"nlog.nuspec\"\n      ]\n    },\n    \"Nullable/1.2.1\": {\n      \"sha512\": \"rbwda6vhaQCfjJEXFLkUU/ERXPkLVRp+TUlLzvKsB3pCsrnh1dB5qvX5VZh0Fn+Seag1WdeZBG2MybtUlUuiJg==\",\n      \"type\": \"package\",\n      \"path\": \"nullable/1.2.1\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"content/net20/Nullable/NullableAttributes.cs.pp\",\n        \"content/net40/Nullable/NullableAttributes.cs.pp\",\n        \"content/netstandard1.0/Nullable/NullableAttributes.cs.pp\",\n        \"content/netstandard2.0/Nullable/NullableAttributes.cs.pp\",\n        \"content/netstandard2.1/_._\",\n        \"contentFiles/cs/net20/Nullable/NullableAttributes.cs.pp\",\n        \"contentFiles/cs/net40/Nullable/NullableAttributes.cs.pp\",\n        \"contentFiles/cs/netstandard1.0/Nullable/NullableAttributes.cs.pp\",\n        \"contentFiles/cs/netstandard2.0/Nullable/NullableAttributes.cs.pp\",\n        \"contentFiles/cs/netstandard2.1/_._\",\n        \"icon.png\",\n        \"nullable.1.2.1.nupkg.sha512\",\n        \"nullable.nuspec\"\n      ]\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"sha512\": \"RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"type\": \"package\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/BouncyCastle.Crypto.dll\",\n        \"lib/net40/BouncyCastle.Crypto.xml\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.dll\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.xml\",\n        \"portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n        \"portable.bouncycastle.nuspec\"\n      ]\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"sha512\": \"c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"runtime.native.system.4.3.0.nupkg.sha512\",\n        \"runtime.native.system.nuspec\"\n      ]\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"sha512\": \"Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"type\": \"package\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net46/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.0/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.1/Chaos.NaCl.dll\",\n        \"lib/netstandard1.1/Chaos.NaCl.dll\",\n        \"lib/netstandard2.0/Chaos.NaCl.dll\",\n        \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n        \"splamy.ed25519.toolkit.nuspec\"\n      ]\n    },\n    \"System.Buffers/4.5.1\": {\n      \"sha512\": \"Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==\",\n      \"type\": \"package\",\n      \"path\": \"system.buffers/4.5.1\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.Buffers.dll\",\n        \"lib/net461/System.Buffers.xml\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.1/System.Buffers.dll\",\n        \"lib/netstandard1.1/System.Buffers.xml\",\n        \"lib/netstandard2.0/System.Buffers.dll\",\n        \"lib/netstandard2.0/System.Buffers.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"ref/net45/System.Buffers.dll\",\n        \"ref/net45/System.Buffers.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.Buffers.dll\",\n        \"ref/netstandard1.1/System.Buffers.xml\",\n        \"ref/netstandard2.0/System.Buffers.dll\",\n        \"ref/netstandard2.0/System.Buffers.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"system.buffers.4.5.1.nupkg.sha512\",\n        \"system.buffers.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Collections/4.3.0\": {\n      \"sha512\": \"3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Collections.dll\",\n        \"ref/netcore50/System.Collections.xml\",\n        \"ref/netcore50/de/System.Collections.xml\",\n        \"ref/netcore50/es/System.Collections.xml\",\n        \"ref/netcore50/fr/System.Collections.xml\",\n        \"ref/netcore50/it/System.Collections.xml\",\n        \"ref/netcore50/ja/System.Collections.xml\",\n        \"ref/netcore50/ko/System.Collections.xml\",\n        \"ref/netcore50/ru/System.Collections.xml\",\n        \"ref/netcore50/zh-hans/System.Collections.xml\",\n        \"ref/netcore50/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.0/System.Collections.dll\",\n        \"ref/netstandard1.0/System.Collections.xml\",\n        \"ref/netstandard1.0/de/System.Collections.xml\",\n        \"ref/netstandard1.0/es/System.Collections.xml\",\n        \"ref/netstandard1.0/fr/System.Collections.xml\",\n        \"ref/netstandard1.0/it/System.Collections.xml\",\n        \"ref/netstandard1.0/ja/System.Collections.xml\",\n        \"ref/netstandard1.0/ko/System.Collections.xml\",\n        \"ref/netstandard1.0/ru/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.3/System.Collections.dll\",\n        \"ref/netstandard1.3/System.Collections.xml\",\n        \"ref/netstandard1.3/de/System.Collections.xml\",\n        \"ref/netstandard1.3/es/System.Collections.xml\",\n        \"ref/netstandard1.3/fr/System.Collections.xml\",\n        \"ref/netstandard1.3/it/System.Collections.xml\",\n        \"ref/netstandard1.3/ja/System.Collections.xml\",\n        \"ref/netstandard1.3/ko/System.Collections.xml\",\n        \"ref/netstandard1.3/ru/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Collections.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.collections.4.3.0.nupkg.sha512\",\n        \"system.collections.nuspec\"\n      ]\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"sha512\": \"ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Diagnostics.Debug.dll\",\n        \"ref/netcore50/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.debug.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.debug.nuspec\"\n      ]\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"sha512\": \"rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Diagnostics.Tracing.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.tracing.nuspec\"\n      ]\n    },\n    \"System.Globalization/4.3.0\": {\n      \"sha512\": \"kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"type\": \"package\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Globalization.dll\",\n        \"ref/netcore50/System.Globalization.xml\",\n        \"ref/netcore50/de/System.Globalization.xml\",\n        \"ref/netcore50/es/System.Globalization.xml\",\n        \"ref/netcore50/fr/System.Globalization.xml\",\n        \"ref/netcore50/it/System.Globalization.xml\",\n        \"ref/netcore50/ja/System.Globalization.xml\",\n        \"ref/netcore50/ko/System.Globalization.xml\",\n        \"ref/netcore50/ru/System.Globalization.xml\",\n        \"ref/netcore50/zh-hans/System.Globalization.xml\",\n        \"ref/netcore50/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.0/System.Globalization.dll\",\n        \"ref/netstandard1.0/System.Globalization.xml\",\n        \"ref/netstandard1.0/de/System.Globalization.xml\",\n        \"ref/netstandard1.0/es/System.Globalization.xml\",\n        \"ref/netstandard1.0/fr/System.Globalization.xml\",\n        \"ref/netstandard1.0/it/System.Globalization.xml\",\n        \"ref/netstandard1.0/ja/System.Globalization.xml\",\n        \"ref/netstandard1.0/ko/System.Globalization.xml\",\n        \"ref/netstandard1.0/ru/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.3/System.Globalization.dll\",\n        \"ref/netstandard1.3/System.Globalization.xml\",\n        \"ref/netstandard1.3/de/System.Globalization.xml\",\n        \"ref/netstandard1.3/es/System.Globalization.xml\",\n        \"ref/netstandard1.3/fr/System.Globalization.xml\",\n        \"ref/netstandard1.3/it/System.Globalization.xml\",\n        \"ref/netstandard1.3/ja/System.Globalization.xml\",\n        \"ref/netstandard1.3/ko/System.Globalization.xml\",\n        \"ref/netstandard1.3/ru/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Globalization.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.globalization.4.3.0.nupkg.sha512\",\n        \"system.globalization.nuspec\"\n      ]\n    },\n    \"System.IO/4.3.0\": {\n      \"sha512\": \"3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"type\": \"package\",\n      \"path\": \"system.io/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.IO.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.IO.dll\",\n        \"ref/netcore50/System.IO.dll\",\n        \"ref/netcore50/System.IO.xml\",\n        \"ref/netcore50/de/System.IO.xml\",\n        \"ref/netcore50/es/System.IO.xml\",\n        \"ref/netcore50/fr/System.IO.xml\",\n        \"ref/netcore50/it/System.IO.xml\",\n        \"ref/netcore50/ja/System.IO.xml\",\n        \"ref/netcore50/ko/System.IO.xml\",\n        \"ref/netcore50/ru/System.IO.xml\",\n        \"ref/netcore50/zh-hans/System.IO.xml\",\n        \"ref/netcore50/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.0/System.IO.dll\",\n        \"ref/netstandard1.0/System.IO.xml\",\n        \"ref/netstandard1.0/de/System.IO.xml\",\n        \"ref/netstandard1.0/es/System.IO.xml\",\n        \"ref/netstandard1.0/fr/System.IO.xml\",\n        \"ref/netstandard1.0/it/System.IO.xml\",\n        \"ref/netstandard1.0/ja/System.IO.xml\",\n        \"ref/netstandard1.0/ko/System.IO.xml\",\n        \"ref/netstandard1.0/ru/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.3/System.IO.dll\",\n        \"ref/netstandard1.3/System.IO.xml\",\n        \"ref/netstandard1.3/de/System.IO.xml\",\n        \"ref/netstandard1.3/es/System.IO.xml\",\n        \"ref/netstandard1.3/fr/System.IO.xml\",\n        \"ref/netstandard1.3/it/System.IO.xml\",\n        \"ref/netstandard1.3/ja/System.IO.xml\",\n        \"ref/netstandard1.3/ko/System.IO.xml\",\n        \"ref/netstandard1.3/ru/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.5/System.IO.dll\",\n        \"ref/netstandard1.5/System.IO.xml\",\n        \"ref/netstandard1.5/de/System.IO.xml\",\n        \"ref/netstandard1.5/es/System.IO.xml\",\n        \"ref/netstandard1.5/fr/System.IO.xml\",\n        \"ref/netstandard1.5/it/System.IO.xml\",\n        \"ref/netstandard1.5/ja/System.IO.xml\",\n        \"ref/netstandard1.5/ko/System.IO.xml\",\n        \"ref/netstandard1.5/ru/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hant/System.IO.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.4.3.0.nupkg.sha512\",\n        \"system.io.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"sha512\": \"3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"sha512\": \"6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.Primitives.dll\",\n        \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.primitives.nuspec\"\n      ]\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"sha512\": \"rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.IO.Pipelines.dll\",\n        \"lib/net461/System.IO.Pipelines.xml\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.dll\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.xml\",\n        \"lib/netstandard1.3/System.IO.Pipelines.dll\",\n        \"lib/netstandard1.3/System.IO.Pipelines.xml\",\n        \"lib/netstandard2.0/System.IO.Pipelines.dll\",\n        \"lib/netstandard2.0/System.IO.Pipelines.xml\",\n        \"ref/net461/System.IO.Pipelines.dll\",\n        \"ref/net461/System.IO.Pipelines.xml\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.dll\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.xml\",\n        \"system.io.pipelines.4.7.2.nupkg.sha512\",\n        \"system.io.pipelines.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Linq/4.3.0\": {\n      \"sha512\": \"5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"type\": \"package\",\n      \"path\": \"system.linq/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net463/System.Linq.dll\",\n        \"lib/netcore50/System.Linq.dll\",\n        \"lib/netstandard1.6/System.Linq.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net463/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.xml\",\n        \"ref/netcore50/de/System.Linq.xml\",\n        \"ref/netcore50/es/System.Linq.xml\",\n        \"ref/netcore50/fr/System.Linq.xml\",\n        \"ref/netcore50/it/System.Linq.xml\",\n        \"ref/netcore50/ja/System.Linq.xml\",\n        \"ref/netcore50/ko/System.Linq.xml\",\n        \"ref/netcore50/ru/System.Linq.xml\",\n        \"ref/netcore50/zh-hans/System.Linq.xml\",\n        \"ref/netcore50/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.0/System.Linq.dll\",\n        \"ref/netstandard1.0/System.Linq.xml\",\n        \"ref/netstandard1.0/de/System.Linq.xml\",\n        \"ref/netstandard1.0/es/System.Linq.xml\",\n        \"ref/netstandard1.0/fr/System.Linq.xml\",\n        \"ref/netstandard1.0/it/System.Linq.xml\",\n        \"ref/netstandard1.0/ja/System.Linq.xml\",\n        \"ref/netstandard1.0/ko/System.Linq.xml\",\n        \"ref/netstandard1.0/ru/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.6/System.Linq.dll\",\n        \"ref/netstandard1.6/System.Linq.xml\",\n        \"ref/netstandard1.6/de/System.Linq.xml\",\n        \"ref/netstandard1.6/es/System.Linq.xml\",\n        \"ref/netstandard1.6/fr/System.Linq.xml\",\n        \"ref/netstandard1.6/it/System.Linq.xml\",\n        \"ref/netstandard1.6/ja/System.Linq.xml\",\n        \"ref/netstandard1.6/ko/System.Linq.xml\",\n        \"ref/netstandard1.6/ru/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hant/System.Linq.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.linq.4.3.0.nupkg.sha512\",\n        \"system.linq.nuspec\"\n      ]\n    },\n    \"System.Memory/4.5.4\": {\n      \"sha512\": \"1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"type\": \"package\",\n      \"path\": \"system.memory/4.5.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.Memory.dll\",\n        \"lib/net461/System.Memory.xml\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.1/System.Memory.dll\",\n        \"lib/netstandard1.1/System.Memory.xml\",\n        \"lib/netstandard2.0/System.Memory.dll\",\n        \"lib/netstandard2.0/System.Memory.xml\",\n        \"ref/netcoreapp2.1/_._\",\n        \"system.memory.4.5.4.nupkg.sha512\",\n        \"system.memory.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"sha512\": \"zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net46/System.Net.NetworkInformation.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net46/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/de/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/es/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/it/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/net46/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"system.net.networkinformation.4.3.0.nupkg.sha512\",\n        \"system.net.networkinformation.nuspec\"\n      ]\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"sha512\": \"qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Net.Primitives.dll\",\n        \"ref/netcore50/System.Net.Primitives.xml\",\n        \"ref/netcore50/de/System.Net.Primitives.xml\",\n        \"ref/netcore50/es/System.Net.Primitives.xml\",\n        \"ref/netcore50/fr/System.Net.Primitives.xml\",\n        \"ref/netcore50/it/System.Net.Primitives.xml\",\n        \"ref/netcore50/ja/System.Net.Primitives.xml\",\n        \"ref/netcore50/ko/System.Net.Primitives.xml\",\n        \"ref/netcore50/ru/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/System.Net.Primitives.dll\",\n        \"ref/netstandard1.0/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/System.Net.Primitives.dll\",\n        \"ref/netstandard1.1/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/System.Net.Primitives.dll\",\n        \"ref/netstandard1.3/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.primitives.4.3.0.nupkg.sha512\",\n        \"system.net.primitives.nuspec\"\n      ]\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"sha512\": \"m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Net.Sockets.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/de/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/es/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/it/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Sockets.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.sockets.4.3.0.nupkg.sha512\",\n        \"system.net.sockets.nuspec\"\n      ]\n    },\n    \"System.Numerics.Vectors/4.4.0\": {\n      \"sha512\": \"UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.numerics.vectors/4.4.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Numerics.Vectors.dll\",\n        \"lib/net46/System.Numerics.Vectors.xml\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Numerics.Vectors.dll\",\n        \"ref/net46/System.Numerics.Vectors.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.numerics.vectors.4.4.0.nupkg.sha512\",\n        \"system.numerics.vectors.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Reflection/4.3.0\": {\n      \"sha512\": \"KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Reflection.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.xml\",\n        \"ref/netcore50/de/System.Reflection.xml\",\n        \"ref/netcore50/es/System.Reflection.xml\",\n        \"ref/netcore50/fr/System.Reflection.xml\",\n        \"ref/netcore50/it/System.Reflection.xml\",\n        \"ref/netcore50/ja/System.Reflection.xml\",\n        \"ref/netcore50/ko/System.Reflection.xml\",\n        \"ref/netcore50/ru/System.Reflection.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.0/System.Reflection.dll\",\n        \"ref/netstandard1.0/System.Reflection.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.3/System.Reflection.dll\",\n        \"ref/netstandard1.3/System.Reflection.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.5/System.Reflection.dll\",\n        \"ref/netstandard1.5/System.Reflection.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.4.3.0.nupkg.sha512\",\n        \"system.reflection.nuspec\"\n      ]\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"sha512\": \"5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Reflection.Primitives.dll\",\n        \"ref/netcore50/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/de/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/es/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/fr/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/it/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ja/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ko/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ru/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.dll\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.primitives.4.3.0.nupkg.sha512\",\n        \"system.reflection.primitives.nuspec\"\n      ]\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"sha512\": \"/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"type\": \"package\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Resources.ResourceManager.dll\",\n        \"ref/netcore50/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/de/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/es/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/it/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.dll\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/de/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/es/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/it/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n        \"system.resources.resourcemanager.nuspec\"\n      ]\n    },\n    \"System.Runtime/4.3.0\": {\n      \"sha512\": \"JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.dll\",\n        \"lib/portable-net45+win8+wp80+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.xml\",\n        \"ref/netcore50/de/System.Runtime.xml\",\n        \"ref/netcore50/es/System.Runtime.xml\",\n        \"ref/netcore50/fr/System.Runtime.xml\",\n        \"ref/netcore50/it/System.Runtime.xml\",\n        \"ref/netcore50/ja/System.Runtime.xml\",\n        \"ref/netcore50/ko/System.Runtime.xml\",\n        \"ref/netcore50/ru/System.Runtime.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.0/System.Runtime.dll\",\n        \"ref/netstandard1.0/System.Runtime.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.2/System.Runtime.dll\",\n        \"ref/netstandard1.2/System.Runtime.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.3/System.Runtime.dll\",\n        \"ref/netstandard1.3/System.Runtime.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.5/System.Runtime.dll\",\n        \"ref/netstandard1.5/System.Runtime.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.xml\",\n        \"ref/portable-net45+win8+wp80+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.4.3.0.nupkg.sha512\",\n        \"system.runtime.nuspec\"\n      ]\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.5.3\": {\n      \"sha512\": \"3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.5.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/net461/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/net461/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/net461/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512\",\n        \"system.runtime.compilerservices.unsafe.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"sha512\": \"guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/de/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/es/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/fr/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/it/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ja/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ko/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ru/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.extensions.4.3.0.nupkg.sha512\",\n        \"system.runtime.extensions.nuspec\"\n      ]\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"sha512\": \"OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/_._\",\n        \"ref/netstandard1.3/System.Runtime.Handles.dll\",\n        \"ref/netstandard1.3/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.handles.4.3.0.nupkg.sha512\",\n        \"system.runtime.handles.nuspec\"\n      ]\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"sha512\": \"uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.InteropServices.dll\",\n        \"lib/net463/System.Runtime.InteropServices.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.InteropServices.dll\",\n        \"ref/net463/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/de/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/es/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/it/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netcoreapp1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.interopservices.4.3.0.nupkg.sha512\",\n        \"system.runtime.interopservices.nuspec\"\n      ]\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"sha512\": \"P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Claims.dll\",\n        \"lib/netstandard1.3/System.Security.Claims.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/de/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/es/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/it/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Claims.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.claims.4.3.0.nupkg.sha512\",\n        \"system.security.claims.nuspec\"\n      ]\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"sha512\": \"I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Security.Principal.dll\",\n        \"lib/netstandard1.0/System.Security.Principal.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Security.Principal.dll\",\n        \"ref/netcore50/System.Security.Principal.xml\",\n        \"ref/netcore50/de/System.Security.Principal.xml\",\n        \"ref/netcore50/es/System.Security.Principal.xml\",\n        \"ref/netcore50/fr/System.Security.Principal.xml\",\n        \"ref/netcore50/it/System.Security.Principal.xml\",\n        \"ref/netcore50/ja/System.Security.Principal.xml\",\n        \"ref/netcore50/ko/System.Security.Principal.xml\",\n        \"ref/netcore50/ru/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hans/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hant/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/System.Security.Principal.dll\",\n        \"ref/netstandard1.0/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/de/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/es/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/fr/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/it/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ja/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ko/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ru/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Security.Principal.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.principal.4.3.0.nupkg.sha512\",\n        \"system.security.principal.nuspec\"\n      ]\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"sha512\": \"HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Security.Principal.Windows.dll\",\n        \"ref/net46/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/de/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/es/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/it/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/net46/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"system.security.principal.windows.4.3.0.nupkg.sha512\",\n        \"system.security.principal.windows.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"sha512\": \"BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Text.Encoding.dll\",\n        \"ref/netcore50/System.Text.Encoding.xml\",\n        \"ref/netcore50/de/System.Text.Encoding.xml\",\n        \"ref/netcore50/es/System.Text.Encoding.xml\",\n        \"ref/netcore50/fr/System.Text.Encoding.xml\",\n        \"ref/netcore50/it/System.Text.Encoding.xml\",\n        \"ref/netcore50/ja/System.Text.Encoding.xml\",\n        \"ref/netcore50/ko/System.Text.Encoding.xml\",\n        \"ref/netcore50/ru/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/System.Text.Encoding.dll\",\n        \"ref/netstandard1.0/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/System.Text.Encoding.dll\",\n        \"ref/netstandard1.3/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Text.Encoding.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.text.encoding.4.3.0.nupkg.sha512\",\n        \"system.text.encoding.nuspec\"\n      ]\n    },\n    \"System.Threading/4.3.0\": {\n      \"sha512\": \"VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Threading.dll\",\n        \"lib/netstandard1.3/System.Threading.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.dll\",\n        \"ref/netcore50/System.Threading.xml\",\n        \"ref/netcore50/de/System.Threading.xml\",\n        \"ref/netcore50/es/System.Threading.xml\",\n        \"ref/netcore50/fr/System.Threading.xml\",\n        \"ref/netcore50/it/System.Threading.xml\",\n        \"ref/netcore50/ja/System.Threading.xml\",\n        \"ref/netcore50/ko/System.Threading.xml\",\n        \"ref/netcore50/ru/System.Threading.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.0/System.Threading.dll\",\n        \"ref/netstandard1.0/System.Threading.xml\",\n        \"ref/netstandard1.0/de/System.Threading.xml\",\n        \"ref/netstandard1.0/es/System.Threading.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.xml\",\n        \"ref/netstandard1.0/it/System.Threading.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.3/System.Threading.dll\",\n        \"ref/netstandard1.3/System.Threading.xml\",\n        \"ref/netstandard1.3/de/System.Threading.xml\",\n        \"ref/netstandard1.3/es/System.Threading.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.xml\",\n        \"ref/netstandard1.3/it/System.Threading.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Threading.dll\",\n        \"system.threading.4.3.0.nupkg.sha512\",\n        \"system.threading.nuspec\"\n      ]\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"sha512\": \"m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Threading.Overlapped.dll\",\n        \"ref/net46/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/net46/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netcore50/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"system.threading.overlapped.4.3.0.nupkg.sha512\",\n        \"system.threading.overlapped.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"sha512\": \"LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.Tasks.dll\",\n        \"ref/netcore50/System.Threading.Tasks.xml\",\n        \"ref/netcore50/de/System.Threading.Tasks.xml\",\n        \"ref/netcore50/es/System.Threading.Tasks.xml\",\n        \"ref/netcore50/fr/System.Threading.Tasks.xml\",\n        \"ref/netcore50/it/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ja/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ko/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ru/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.0/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.3/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.4.3.0.nupkg.sha512\",\n        \"system.threading.tasks.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks.Extensions/4.5.4\": {\n      \"sha512\": \"zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks.extensions/4.5.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net461/System.Threading.Tasks.Extensions.dll\",\n        \"lib/net461/System.Threading.Tasks.Extensions.xml\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/netcoreapp2.1/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.extensions.4.5.4.nupkg.sha512\",\n        \"system.threading.tasks.extensions.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"sha512\": \"OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.Thread.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.Thread.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Thread.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.thread.4.3.0.nupkg.sha512\",\n        \"system.threading.thread.nuspec\"\n      ]\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"sha512\": \"k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.ThreadPool.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/de/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/es/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/it/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.threadpool.4.3.0.nupkg.sha512\",\n        \"system.threading.threadpool.nuspec\"\n      ]\n    }\n  },\n  \"projectFileDependencyGroups\": {\n    \".NETCoreApp,Version=v3.1\": [\n      \"Heijden.Dns.Portable >= 2.0.19\",\n      \"NLog >= 4.7.3\",\n      \"Newtonsoft.Json >= 12.0.3\",\n      \"Nullable >= 1.2.1\",\n      \"Portable.BouncyCastle >= 1.8.6.7\",\n      \"Splamy.Ed25519.Toolkit >= 1.0.3\",\n      \"System.IO.Pipelines >= 4.7.2\"\n    ],\n    \".NETStandard,Version=v2.0\": [\n      \"Heijden.Dns.Portable >= 2.0.19\",\n      \"NETStandard.Library >= 2.0.3\",\n      \"NLog >= 4.7.3\",\n      \"Newtonsoft.Json >= 12.0.3\",\n      \"Nullable >= 1.2.1\",\n      \"Portable.BouncyCastle >= 1.8.6.7\",\n      \"Splamy.Ed25519.Toolkit >= 1.0.3\",\n      \"System.IO.Pipelines >= 4.7.2\",\n      \"System.Memory >= 4.5.4\"\n    ],\n    \".NETStandard,Version=v2.1\": [\n      \"Heijden.Dns.Portable >= 2.0.19\",\n      \"NLog >= 4.7.3\",\n      \"Newtonsoft.Json >= 12.0.3\",\n      \"Nullable >= 1.2.1\",\n      \"Portable.BouncyCastle >= 1.8.6.7\",\n      \"Splamy.Ed25519.Toolkit >= 1.0.3\",\n      \"System.IO.Pipelines >= 4.7.2\"\n    ]\n  },\n  \"packageFolders\": {\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\": {}\n  },\n  \"project\": {\n    \"version\": \"1.1.0\",\n    \"restore\": {\n      \"projectUniqueName\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n      \"projectName\": \"Splamy.TSLib\",\n      \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n      \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n      \"outputPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\obj\\\\\",\n      \"projectStyle\": \"PackageReference\",\n      \"crossTargeting\": true,\n      \"configFilePaths\": [\n        \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n        \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n      ],\n      \"originalTargetFrameworks\": [\n        \"netcoreapp3.1\",\n        \"netstandard2.0\",\n        \"netstandard2.1\"\n      ],\n      \"sources\": {\n        \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n        \"https://api.nuget.org/v3/index.json\": {}\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"projectReferences\": {}\n        },\n        \"netstandard2.0\": {\n          \"targetAlias\": \"netstandard2.0\",\n          \"projectReferences\": {}\n        },\n        \"netstandard2.1\": {\n          \"targetAlias\": \"netstandard2.1\",\n          \"projectReferences\": {}\n        }\n      },\n      \"warningProperties\": {\n        \"warnAsError\": [\n          \"NU1605\"\n        ]\n      }\n    },\n    \"frameworks\": {\n      \"netcoreapp3.1\": {\n        \"targetAlias\": \"netcoreapp3.1\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.0.19, )\"\n          },\n          \"NLog\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.3, )\"\n          },\n          \"Newtonsoft.Json\": {\n            \"target\": \"Package\",\n            \"version\": \"[12.0.3, )\"\n          },\n          \"Nullable\": {\n            \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n            \"suppressParent\": \"All\",\n            \"target\": \"Package\",\n            \"version\": \"[1.2.1, )\"\n          },\n          \"Portable.BouncyCastle\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.8.6.7, )\"\n          },\n          \"Splamy.Ed25519.Toolkit\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.0.3, )\"\n          },\n          \"System.IO.Pipelines\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.2, )\"\n          }\n        },\n        \"imports\": [\n          \"net461\",\n          \"net462\",\n          \"net47\",\n          \"net471\",\n          \"net472\",\n          \"net48\"\n        ],\n        \"assetTargetFallback\": true,\n        \"warn\": true,\n        \"frameworkReferences\": {\n          \"Microsoft.NETCore.App\": {\n            \"privateAssets\": \"all\"\n          }\n        },\n        \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n      },\n      \"netstandard2.0\": {\n        \"targetAlias\": \"netstandard2.0\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.0.19, )\"\n          },\n          \"NETStandard.Library\": {\n            \"suppressParent\": \"All\",\n            \"target\": \"Package\",\n            \"version\": \"[2.0.3, )\",\n            \"autoReferenced\": true\n          },\n          \"NLog\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.3, )\"\n          },\n          \"Newtonsoft.Json\": {\n            \"target\": \"Package\",\n            \"version\": \"[12.0.3, )\"\n          },\n          \"Nullable\": {\n            \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n            \"suppressParent\": \"All\",\n            \"target\": \"Package\",\n            \"version\": \"[1.2.1, )\"\n          },\n          \"Portable.BouncyCastle\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.8.6.7, )\"\n          },\n          \"Splamy.Ed25519.Toolkit\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.0.3, )\"\n          },\n          \"System.IO.Pipelines\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.2, )\"\n          },\n          \"System.Memory\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.5.4, )\"\n          }\n        },\n        \"imports\": [\n          \"net461\",\n          \"net462\",\n          \"net47\",\n          \"net471\",\n          \"net472\",\n          \"net48\"\n        ],\n        \"assetTargetFallback\": true,\n        \"warn\": true,\n        \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n      },\n      \"netstandard2.1\": {\n        \"targetAlias\": \"netstandard2.1\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": {\n            \"target\": \"Package\",\n            \"version\": \"[2.0.19, )\"\n          },\n          \"NLog\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.3, )\"\n          },\n          \"Newtonsoft.Json\": {\n            \"target\": \"Package\",\n            \"version\": \"[12.0.3, )\"\n          },\n          \"Nullable\": {\n            \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n            \"suppressParent\": \"All\",\n            \"target\": \"Package\",\n            \"version\": \"[1.2.1, )\"\n          },\n          \"Portable.BouncyCastle\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.8.6.7, )\"\n          },\n          \"Splamy.Ed25519.Toolkit\": {\n            \"target\": \"Package\",\n            \"version\": \"[1.0.3, )\"\n          },\n          \"System.IO.Pipelines\": {\n            \"target\": \"Package\",\n            \"version\": \"[4.7.2, )\"\n          }\n        },\n        \"imports\": [\n          \"net461\",\n          \"net462\",\n          \"net47\",\n          \"net471\",\n          \"net472\",\n          \"net48\"\n        ],\n        \"assetTargetFallback\": true,\n        \"warn\": true,\n        \"frameworkReferences\": {\n          \"NETStandard.Library\": {\n            \"privateAssets\": \"all\"\n          }\n        },\n        \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "TSLib/obj/project.nuget.cache",
    "content": "{\n  \"version\": 2,\n  \"dgSpecHash\": \"gzDxPutRi2zFvilYnwsXJdGmFGc+JCEyUEpFzyB993VplkBs3Ll4ddgmBxLDrc7Ev6bT0PDIWWdiZgu8wFRpwg==\",\n  \"success\": true,\n  \"projectFilePath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n  \"expectedPackageFiles\": [\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\heijden.dns.portable\\\\2.0.19\\\\heijden.dns.portable.2.0.19.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.netcore.platforms\\\\1.1.0\\\\microsoft.netcore.platforms.1.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.netcore.targets\\\\1.1.0\\\\microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.win32.primitives\\\\4.3.0\\\\microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\netstandard.library\\\\2.0.3\\\\netstandard.library.2.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\newtonsoft.json\\\\12.0.3\\\\newtonsoft.json.12.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\nlog\\\\4.7.3\\\\nlog.4.7.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\nullable\\\\1.2.1\\\\nullable.1.2.1.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\portable.bouncycastle\\\\1.8.6.7\\\\portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\runtime.native.system\\\\4.3.0\\\\runtime.native.system.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\splamy.ed25519.toolkit\\\\1.0.3\\\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.buffers\\\\4.5.1\\\\system.buffers.4.5.1.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.collections\\\\4.3.0\\\\system.collections.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.diagnostics.debug\\\\4.3.0\\\\system.diagnostics.debug.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.diagnostics.tracing\\\\4.3.0\\\\system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.globalization\\\\4.3.0\\\\system.globalization.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io\\\\4.3.0\\\\system.io.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.filesystem\\\\4.3.0\\\\system.io.filesystem.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.filesystem.primitives\\\\4.3.0\\\\system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.pipelines\\\\4.7.2\\\\system.io.pipelines.4.7.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.linq\\\\4.3.0\\\\system.linq.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.memory\\\\4.5.4\\\\system.memory.4.5.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.networkinformation\\\\4.3.0\\\\system.net.networkinformation.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.primitives\\\\4.3.0\\\\system.net.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.sockets\\\\4.3.0\\\\system.net.sockets.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.numerics.vectors\\\\4.4.0\\\\system.numerics.vectors.4.4.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection\\\\4.3.0\\\\system.reflection.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection.primitives\\\\4.3.0\\\\system.reflection.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.resources.resourcemanager\\\\4.3.0\\\\system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime\\\\4.3.0\\\\system.runtime.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.compilerservices.unsafe\\\\4.5.3\\\\system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.extensions\\\\4.3.0\\\\system.runtime.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.handles\\\\4.3.0\\\\system.runtime.handles.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.interopservices\\\\4.3.0\\\\system.runtime.interopservices.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.claims\\\\4.3.0\\\\system.security.claims.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.principal\\\\4.3.0\\\\system.security.principal.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.principal.windows\\\\4.3.0\\\\system.security.principal.windows.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.text.encoding\\\\4.3.0\\\\system.text.encoding.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading\\\\4.3.0\\\\system.threading.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.overlapped\\\\4.3.0\\\\system.threading.overlapped.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.tasks\\\\4.3.0\\\\system.threading.tasks.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.tasks.extensions\\\\4.5.4\\\\system.threading.tasks.extensions.4.5.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.thread\\\\4.3.0\\\\system.threading.thread.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.threadpool\\\\4.3.0\\\\system.threading.threadpool.4.3.0.nupkg.sha512\"\n  ],\n  \"logs\": []\n}"
  },
  {
    "path": "YunBot.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Numerics;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TS3AudioBot;\nusing TS3AudioBot.Audio;\nusing TS3AudioBot.CommandSystem;\nusing TS3AudioBot.Playlists;\nusing TS3AudioBot.Plugins;\nusing TS3AudioBot.ResourceFactories;\nusing TS3AudioBot.Sessions;\nusing TSLib.Full;\n//{ get; set; }\npublic class ArtistsItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public string picUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n    /// <summary>\n    /// \n    /// </summary>\n    public long albumSize;\n    /// <summary>\n    /// \n    /// </summary>\n    public long picId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string fansGroup;\n    /// <summary>\n    /// \n    /// </summary>\n    public string img1v1Url;\n    /// <summary>\n    /// \n    /// </summary>\n    public long img1v1;\n    /// <summary>\n    /// \n    /// </summary>\n    public string trans;\n}\n\npublic class Artist\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public string picUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n    /// <summary>\n    /// \n    /// </summary>\n    public long albumSize;\n    /// <summary>\n    /// \n    /// </summary>\n    public long picId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string fansGroup;\n    /// <summary>\n    /// \n    /// </summary>\n    public string img1v1Url;\n    /// <summary>\n    /// \n    /// </summary>\n    public long img1v1;\n    /// <summary>\n    /// \n    /// </summary>\n    public string trans;\n}\n\npublic class Album\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// 海阔天空\n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public Artist artist;\n    /// <summary>\n    /// \n    /// </summary>\n    public long publishTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public long copyrightId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long status;\n    /// <summary>\n    /// \n    /// </summary>\n    public long picId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long mark;\n}\n\npublic class SongsItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id { get; set; }\n    /// <summary>\n    /// 海阔天空\n    /// </summary>\n    public string name { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ArtistsItem> artists;\n    /// <summary>\n    /// \n    /// </summary>\n    public Album album;\n    /// <summary>\n    /// \n    /// </summary>\n    public long duration;\n    /// <summary>\n    /// \n    /// </summary>\n    public long copyrightId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long status;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n    /// <summary>\n    /// \n    /// </summary>\n    public long rtype;\n    /// <summary>\n    /// \n    /// </summary>\n    public long ftype;\n    /// <summary>\n    /// \n    /// </summary>\n    public long mvid;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long mark;\n}\n\npublic class Result\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public List<SongsItem> songs { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public bool hasMore;\n    /// <summary>\n    /// \n    /// </summary>\n    public long songCount;\n}\n\npublic class yunSearchSong\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public Result result { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public long code;\n}\n\npublic class FreeTrialInfo\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long start;\n    /// <summary>\n    /// \n    /// </summary>\n    public long end;\n}\n\npublic class FreeTrialPrivilege\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public bool resConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool userConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public string listenType;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cannotListenReason;\n}\n\npublic class FreeTimeTrialPrivilege\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public bool resConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool userConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public long type;\n    /// <summary>\n    /// \n    /// </summary>\n    public long remalongime;\n}\n\npublic class DataItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string url { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public long br;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public string md5;\n    /// <summary>\n    /// \n    /// </summary>\n    public long code;\n    /// <summary>\n    /// \n    /// </summary>\n    public long expi;\n    /// <summary>\n    /// \n    /// </summary>\n    public string type;\n    /// <summary>\n    /// \n    /// </summary>\n    public double gain;\n    /// <summary>\n    /// \n    /// </summary>\n    public double peak;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public string uf;\n    /// <summary>\n    /// \n    /// </summary>\n    public long payed;\n    /// <summary>\n    /// \n    /// </summary>\n    public long flag;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool canExtend;\n    /// <summary>\n    /// \n    /// </summary>\n    public FreeTrialInfo freeTrialInfo;\n    /// <summary>\n    /// \n    /// </summary>\n    public string level;\n    /// <summary>\n    /// \n    /// </summary>\n    public string encodeType;\n    /// <summary>\n    /// \n    /// </summary>\n    public FreeTrialPrivilege freeTrialPrivilege;\n    /// <summary>\n    /// \n    /// </summary>\n    public FreeTimeTrialPrivilege freeTimeTrialPrivilege;\n    /// <summary>\n    /// \n    /// </summary>\n    public long urlSource;\n    /// <summary>\n    /// \n    /// </summary>\n    public long rightSource;\n    /// <summary>\n    /// \n    /// </summary>\n    public string podcastCtrp;\n    /// <summary>\n    /// \n    /// </summary>\n    public string effectTypes;\n    /// <summary>\n    /// \n    /// </summary>\n    public long time;\n}\n\npublic class musicURL\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public List<DataItem> data { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public long code { get; set; }\n}\n\npublic class ArItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> tns;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n}\n\npublic class Al\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public string picUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> tns;\n    /// <summary>\n    /// \n    /// </summary>\n    public long pic;\n}\n\npublic class H\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long br;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fid;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public long vd;\n    /// <summary>\n    /// \n    /// </summary>\n    public long sr;\n}\n\npublic class M\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long br;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fid;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public long vd;\n    /// <summary>\n    /// \n    /// </summary>\n    public long sr;\n}\n\npublic class L\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long br;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fid;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public long vd;\n    /// <summary>\n    /// \n    /// </summary>\n    public long sr;\n}\n\npublic class SongsItems\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public long id { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public long pst;\n    /// <summary>\n    /// \n    /// </summary>\n    public long t;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ArItem> ar;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> alia;\n    /// <summary>\n    /// \n    /// </summary>\n    public long pop;\n    /// <summary>\n    /// \n    /// </summary>\n    public long st;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rt;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public long v;\n    /// <summary>\n    /// \n    /// </summary>\n    public string crbt;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cf;\n    /// <summary>\n    /// \n    /// </summary>\n    public Al al;\n    /// <summary>\n    /// \n    /// </summary>\n    public long dt;\n    /// <summary>\n    /// \n    /// </summary>\n    public H h;\n    /// <summary>\n    /// \n    /// </summary>\n    public M m;\n    /// <summary>\n    /// \n    /// </summary>\n    public L l;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? sq;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? hr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? a;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cd;\n    /// <summary>\n    /// \n    /// </summary>\n    public long no;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? rtUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long ftype;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> rtUrls;\n    /// <summary>\n    /// \n    /// </summary>\n    public long djId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long copyright;\n    /// <summary>\n    /// \n    /// </summary>\n    public long s_id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long mark;\n    /// <summary>\n    /// \n    /// </summary>\n    public long originCoverType;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? originSongSimpleData;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? tagPicList;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool resourceState;\n    /// <summary>\n    /// \n    /// </summary>\n    public long version;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? songJumpInfo;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? entertainmentTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? awardTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public long single;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool noCopyrightRcmd;\n    /// <summary>\n    /// \n    /// </summary>\n    public long mst;\n    /// <summary>\n    /// \n    /// </summary>\n    public long cp;\n    /// <summary>\n    /// \n    /// </summary>\n    public long rtype;\n    /// <summary>\n    /// \n    /// </summary>\n    public string? rurl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long mv;\n    /// <summary>\n    /// \n    /// </summary>\n    public long publishTime;\n}\n\npublic class FreeTrial\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public bool resConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool userConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public string listenType;\n}\n\npublic class ChargeInfoListItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long rate;\n    /// <summary>\n    /// \n    /// </summary>\n    public string chargeUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string chargeMessage;\n    /// <summary>\n    /// \n    /// </summary>\n    public long chargeType;\n}\n\npublic class PrivilegesItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public long payed;\n    /// <summary>\n    /// \n    /// </summary>\n    public long st;\n    /// <summary>\n    /// \n    /// </summary>\n    public long pl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long dl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long sp;\n    /// <summary>\n    /// \n    /// </summary>\n    public long cp;\n    /// <summary>\n    /// \n    /// </summary>\n    public long subp;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool cs;\n    /// <summary>\n    /// \n    /// </summary>\n    public long maxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fl;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool toast;\n    /// <summary>\n    /// \n    /// </summary>\n    public long flag;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool preSell;\n    /// <summary>\n    /// \n    /// </summary>\n    public long playMaxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public long downloadMaxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string maxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string playMaxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string downloadMaxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string plLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string dlLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string flLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rscl;\n    /// <summary>\n    /// \n    /// </summary>\n    public FreeTrial freeTrialPrivilege;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ChargeInfoListItem> chargeInfoList;\n}\n\npublic class GeDan\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public List<SongsItems> songs { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public List<PrivilegesItem> privileges;\n    /// <summary>\n    /// \n    /// </summary>\n    public long code;\n}\n\n\npublic class Creator\n{\n    /// <summary>\n    /// 淋雨丶伞\n    /// </summary>\n    public string nickname;\n    /// <summary>\n    /// \n    /// </summary>\n    public long userId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long userType;\n    /// <summary>\n    /// \n    /// </summary>\n    public string avatarUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long authStatus;\n    /// <summary>\n    /// \n    /// </summary>\n    public string expertTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public string experts;\n}\n\npublic class ArtistsItems\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long picId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long img1v1Id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string briefDesc;\n    /// <summary>\n    /// \n    /// </summary>\n    public string picUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string img1v1Url;\n    /// <summary>\n    /// \n    /// </summary>\n    public long albumSize;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n    /// <summary>\n    /// \n    /// </summary>\n    public string trans;\n    /// <summary>\n    /// \n    /// </summary>\n    public long musicSize;\n}\n\npublic class Artists\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long picId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long img1v1Id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string briefDesc;\n    /// <summary>\n    /// \n    /// </summary>\n    public string picUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string img1v1Url;\n    /// <summary>\n    /// \n    /// </summary>\n    public long albumSize;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n    /// <summary>\n    /// \n    /// </summary>\n    public string trans;\n    /// <summary>\n    /// \n    /// </summary>\n    public long musicSize;\n}\n\npublic class ArtistsItemss\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long picId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long img1v1Id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string briefDesc;\n    /// <summary>\n    /// \n    /// </summary>\n    public string picUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string img1v1Url;\n    /// <summary>\n    /// \n    /// </summary>\n    public long albumSize;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n    /// <summary>\n    /// \n    /// </summary>\n    public string trans;\n    /// <summary>\n    /// \n    /// </summary>\n    public long musicSize;\n}\n\npublic class Albums\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string idStr;\n    /// <summary>\n    /// 专辑\n    /// </summary>\n    public string type;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public long picId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string blurPicUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long companyId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long pic;\n    /// <summary>\n    /// \n    /// </summary>\n    public string picUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long publishTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public string description;\n    /// <summary>\n    /// \n    /// </summary>\n    public string tags;\n    /// <summary>\n    /// 独立发行\n    /// </summary>\n    public string company;\n    /// <summary>\n    /// \n    /// </summary>\n    public string briefDesc;\n    /// <summary>\n    /// \n    /// </summary>\n    public Artist artist;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> songs;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n    /// <summary>\n    /// \n    /// </summary>\n    public long status;\n    /// <summary>\n    /// \n    /// </summary>\n    public long copyrightId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string commentThreadId;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ArtistsItemss> artists;\n}\n\npublic class BMusic\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public string extension;\n    /// <summary>\n    /// \n    /// </summary>\n    public long sr;\n    /// <summary>\n    /// \n    /// </summary>\n    public long dfsId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long bitrate;\n    /// <summary>\n    /// \n    /// </summary>\n    public long playTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public long volumeDelta;\n}\n\npublic class HMusic\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public string extension;\n    /// <summary>\n    /// \n    /// </summary>\n    public long sr;\n    /// <summary>\n    /// \n    /// </summary>\n    public long dfsId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long bitrate;\n    /// <summary>\n    /// \n    /// </summary>\n    public long playTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public long volumeDelta;\n}\n\npublic class MMusic\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public string extension;\n    /// <summary>\n    /// \n    /// </summary>\n    public long sr;\n    /// <summary>\n    /// \n    /// </summary>\n    public long dfsId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long bitrate;\n    /// <summary>\n    /// \n    /// </summary>\n    public long playTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public long volumeDelta;\n}\n\npublic class LMusic\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long size;\n    /// <summary>\n    /// \n    /// </summary>\n    public string extension;\n    /// <summary>\n    /// \n    /// </summary>\n    public long sr;\n    /// <summary>\n    /// \n    /// </summary>\n    public long dfsId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long bitrate;\n    /// <summary>\n    /// \n    /// </summary>\n    public long playTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public long volumeDelta;\n}\n\npublic class Track\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long position;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n    /// <summary>\n    /// \n    /// </summary>\n    public long status;\n    /// <summary>\n    /// \n    /// </summary>\n    public long fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public long copyrightId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string disc;\n    /// <summary>\n    /// \n    /// </summary>\n    public long no;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ArtistsItemss> artists;\n    /// <summary>\n    /// \n    /// </summary>\n    public Albums album;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool starred;\n    /// <summary>\n    /// \n    /// </summary>\n    public long popularity;\n    /// <summary>\n    /// \n    /// </summary>\n    public long score;\n    /// <summary>\n    /// \n    /// </summary>\n    public long starredNum;\n    /// <summary>\n    /// \n    /// </summary>\n    public long duration;\n    /// <summary>\n    /// \n    /// </summary>\n    public long playedNum;\n    /// <summary>\n    /// \n    /// </summary>\n    public long dayPlays;\n    /// <summary>\n    /// \n    /// </summary>\n    public long hearTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public string ringtone;\n    /// <summary>\n    /// \n    /// </summary>\n    public string crbt;\n    /// <summary>\n    /// \n    /// </summary>\n    public string audition;\n    /// <summary>\n    /// \n    /// </summary>\n    public string copyFrom;\n    /// <summary>\n    /// \n    /// </summary>\n    public string commentThreadId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rtUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long ftype;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> rtUrls;\n    /// <summary>\n    /// \n    /// </summary>\n    public long copyright;\n    /// <summary>\n    /// \n    /// </summary>\n    public long rtype;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rurl;\n    /// <summary>\n    /// \n    /// </summary>\n    public BMusic bMusic;\n    /// <summary>\n    /// \n    /// </summary>\n    public string mp3Url;\n    /// <summary>\n    /// \n    /// </summary>\n    public long mvid;\n    /// <summary>\n    /// \n    /// </summary>\n    public HMusic hMusic;\n    /// <summary>\n    /// \n    /// </summary>\n    public MMusic mMusic;\n    /// <summary>\n    /// \n    /// </summary>\n    public LMusic lMusic;\n}\n\npublic class PlaylistsItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id { get; set; }\n    /// <summary>\n    /// 『纯音乐』有些歌只能一个人戴耳机听\n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public string coverImgUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public Creator creator;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool subscribed;\n    /// <summary>\n    /// \n    /// </summary>\n    public long trackCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public long userId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long playCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public long bookCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public long specialType;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> officialTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public string action;\n    /// <summary>\n    /// \n    /// </summary>\n    public string actionType;\n    /// <summary>\n    /// \n    /// </summary>\n    public string recommendText;\n    /// <summary>\n    /// \n    /// </summary>\n    public string score;\n    /// <summary>\n    /// 平时收集的一些纯音乐做了整理，希望大家喜欢\n    /// </summary>\n    public string description;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool highQuality;\n    /// <summary>\n    /// \n    /// </summary>\n    public Track track;\n    /// <summary>\n    /// alg_search_rec_playlist_tab_basic_rewrite_{\"hit\":\"Name\",\"id\":\"有些歌只能一个人戴耳机听\",\"type\":\"basic\"}\n    /// </summary>\n    public string alg;\n}\n\npublic class Results\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public List<PlaylistsItem> playlists { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public bool hasMore;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> hlWords;\n    /// <summary>\n    /// \n    /// </summary>\n    public long playlistCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public string searchQcReminder;\n}\n\npublic class SearchGedan\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public Results result { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public long code;\n}\n\npublic class Data\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int code;\n    /// <summary>\n    /// \n    /// </summary>\n    public string unikey { get; set; }\n}\n\npublic class LoginKey\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public Data data { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public int code;\n}\n\npublic class Datas\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string qrurl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string qrimg { get; set; }\n}\n\npublic class LoginImg\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int code;\n    /// <summary>\n    /// \n    /// </summary>\n    public Datas data { get; set; }\n}\n\npublic class Status1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long code { get; set; }\n    /// <summary>\n    /// 等待扫码\n    /// </summary>\n    public string? message { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public string? cookie { get; set; }\n}\n\n\n//如果好用，请收藏地址，帮忙分享。\npublic class SubscribersItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string defaultAvatar;\n    /// <summary>\n    /// \n    /// </summary>\n    public int province;\n    /// <summary>\n    /// \n    /// </summary>\n    public int authStatus;\n    /// <summary>\n    /// \n    /// </summary>\n    public string followed;\n    /// <summary>\n    /// \n    /// </summary>\n    public string avatarUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int accountStatus;\n    /// <summary>\n    /// \n    /// </summary>\n    public int gender;\n    /// <summary>\n    /// \n    /// </summary>\n    public int city;\n    /// <summary>\n    /// \n    /// </summary>\n    public int birthday;\n    /// <summary>\n    /// \n    /// </summary>\n    public long userId;\n    /// <summary>\n    /// \n    /// </summary>\n    public int userType;\n    /// <summary>\n    /// 神明懿2104\n    /// </summary>\n    public string nickname;\n    /// <summary>\n    /// \n    /// </summary>\n    public string signature;\n    /// <summary>\n    /// \n    /// </summary>\n    public string description;\n    /// <summary>\n    /// \n    /// </summary>\n    public string detailDescription;\n    /// <summary>\n    /// \n    /// </summary>\n    public int avatarImgId;\n    /// <summary>\n    /// \n    /// </summary>\n    public int backgroundImgId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string backgroundUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int authority;\n    /// <summary>\n    /// \n    /// </summary>\n    public string mutual;\n    /// <summary>\n    /// \n    /// </summary>\n    public string expertTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public string experts;\n    /// <summary>\n    /// \n    /// </summary>\n    public int djStatus;\n    /// <summary>\n    /// \n    /// </summary>\n    public int vipType;\n    /// <summary>\n    /// \n    /// </summary>\n    public string remarkName;\n    /// <summary>\n    /// \n    /// </summary>\n    public int authenticationTypes;\n    /// <summary>\n    /// \n    /// </summary>\n    public string avatarDetail;\n    /// <summary>\n    /// \n    /// </summary>\n    public string avatarImgIdStr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string backgroundImgIdStr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string anchor;\n    /// <summary>\n    /// \n    /// </summary>\n    public string avatarImgId_str;\n}\n\npublic class AvatarDetail\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int userType;\n    /// <summary>\n    /// \n    /// </summary>\n    public int identityLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string identityIconUrl;\n}\n\npublic class Creators\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string defaultAvatar;\n    /// <summary>\n    /// \n    /// </summary>\n    public int province;\n    /// <summary>\n    /// \n    /// </summary>\n    public int authStatus;\n    /// <summary>\n    /// \n    /// </summary>\n    public string followed;\n    /// <summary>\n    /// \n    /// </summary>\n    public string avatarUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int accountStatus;\n    /// <summary>\n    /// \n    /// </summary>\n    public int gender;\n    /// <summary>\n    /// \n    /// </summary>\n    public int city;\n    /// <summary>\n    /// \n    /// </summary>\n    public int birthday;\n    /// <summary>\n    /// \n    /// </summary>\n    public long userId;\n    /// <summary>\n    /// \n    /// </summary>\n    public int userType;\n    /// <summary>\n    /// 岩酱岩酱岩酱\n    /// </summary>\n    public string nickname;\n    /// <summary>\n    /// 这里是岩酱\n    /// </summary>\n    public string signature;\n    /// <summary>\n    /// \n    /// </summary>\n    public string description;\n    /// <summary>\n    /// \n    /// </summary>\n    public string detailDescription;\n    /// <summary>\n    /// \n    /// </summary>\n    public int avatarImgId;\n    /// <summary>\n    /// \n    /// </summary>\n    public int backgroundImgId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string backgroundUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int authority;\n    /// <summary>\n    /// \n    /// </summary>\n    public string mutual;\n    /// <summary>\n    /// \n    /// </summary>\n    public string expertTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public string experts;\n    /// <summary>\n    /// \n    /// </summary>\n    public int djStatus;\n    /// <summary>\n    /// \n    /// </summary>\n    public int vipType;\n    /// <summary>\n    /// \n    /// </summary>\n    public string remarkName;\n    /// <summary>\n    /// \n    /// </summary>\n    public int authenticationTypes;\n    /// <summary>\n    /// \n    /// </summary>\n    public AvatarDetail avatarDetail;\n    /// <summary>\n    /// \n    /// </summary>\n    public string avatarImgIdStr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string backgroundImgIdStr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string anchor;\n    /// <summary>\n    /// \n    /// </summary>\n    public string avatarImgId_str;\n}\n\npublic class Sq\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int br;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fid;\n    /// <summary>\n    /// \n    /// </summary>\n    public int size;\n    /// <summary>\n    /// \n    /// </summary>\n    public int vd;\n    /// <summary>\n    /// \n    /// </summary>\n    public int sr;\n}\n\npublic class TracksItem\n{\n    /// <summary>\n    /// Reunion In The Wind(重逢风中）\n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public int id;\n    /// <summary>\n    /// \n    /// </summary>\n    public int pst;\n    /// <summary>\n    /// \n    /// </summary>\n    public int t;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ArItem> ar;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> alia;\n    /// <summary>\n    /// \n    /// </summary>\n    public int pop;\n    /// <summary>\n    /// \n    /// </summary>\n    public int st;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rt;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public int v;\n    /// <summary>\n    /// \n    /// </summary>\n    public string crbt;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cf;\n    /// <summary>\n    /// \n    /// </summary>\n    public Al al;\n    /// <summary>\n    /// \n    /// </summary>\n    public int dt;\n    /// <summary>\n    /// \n    /// </summary>\n    public H h;\n    /// <summary>\n    /// \n    /// </summary>\n    public M m;\n    /// <summary>\n    /// \n    /// </summary>\n    public L l;\n    /// <summary>\n    /// \n    /// </summary>\n    public Sq sq;\n    /// <summary>\n    /// \n    /// </summary>\n    public string hr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string a;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cd;\n    /// <summary>\n    /// \n    /// </summary>\n    public int no;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rtUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int ftype;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> rtUrls;\n    /// <summary>\n    /// \n    /// </summary>\n    public int djId;\n    /// <summary>\n    /// \n    /// </summary>\n    public int copyright;\n    /// <summary>\n    /// \n    /// </summary>\n    public int s_id;\n    /// <summary>\n    /// \n    /// </summary>\n    public int mark;\n    /// <summary>\n    /// \n    /// </summary>\n    public int originCoverType;\n\n    /// <summary>\n    /// \n    /// </summary>\n    public string originSongSimpleData;\n    /// <summary>\n    /// \n    /// </summary>\n    public string tagPicList;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool resourceState;\n    /// <summary>\n    /// \n    /// </summary>\n    public int version;\n    /// <summary>\n    /// \n    /// </summary>\n    public string songJumpInfo;\n    /// <summary>\n    /// \n    /// </summary>\n    public string entertainmentTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public int single;\n    /// <summary>\n    /// \n    /// </summary>\n    public string noCopyrightRcmd;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rurl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int mst;\n    /// <summary>\n    /// \n    /// </summary>\n    public int cp;\n    /// <summary>\n    /// \n    /// </summary>\n    public int mv;\n    /// <summary>\n    /// \n    /// </summary>\n    public int rtype;\n    /// <summary>\n    /// \n    /// </summary>\n    public long publishTime;\n}\n\npublic class TrackIdsItem\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int id;\n    /// <summary>\n    /// \n    /// </summary>\n    public int v;\n    /// <summary>\n    /// \n    /// </summary>\n    public int t;\n    /// <summary>\n    /// \n    /// </summary>\n    public int at;\n    /// <summary>\n    /// \n    /// </summary>\n    public string alg;\n    /// <summary>\n    /// \n    /// </summary>\n    public int uid;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rcmdReason;\n    /// <summary>\n    /// \n    /// </summary>\n    public string sc;\n    /// <summary>\n    /// \n    /// </summary>\n    public string f;\n    /// <summary>\n    /// \n    /// </summary>\n    public string sr;\n}\n\npublic class Playlist\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// 睡觉听的纯音乐（与君梦中相会）\n    /// </summary>\n    public string name { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public long coverImgId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string coverImgUrl { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public string coverImgId_str;\n    /// <summary>\n    /// \n    /// </summary>\n    public int adType;\n    /// <summary>\n    /// \n    /// </summary>\n    public long userId;\n    /// <summary>\n    /// \n    /// </summary>\n    public int createTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public int status;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool opRecommend;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool highQuality;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool newImported;\n    /// <summary>\n    /// \n    /// </summary>\n    public int updateTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public int trackCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public int specialType;\n    /// <summary>\n    /// \n    /// </summary>\n    public int privacy;\n    /// <summary>\n    /// \n    /// </summary>\n    public int trackUpdateTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public string commentThreadId;\n    /// <summary>\n    /// \n    /// </summary>\n    public int playCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public long trackNumberUpdateTime;\n    /// <summary>\n    /// \n    /// </summary>\n    public int subscribedCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public int cloudTrackCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool ordered;\n    /// <summary>\n    /// \n    /// </summary>\n    public string description;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> tags;\n    /// <summary>\n    /// \n    /// </summary>\n    public string updateFrequency;\n    /// <summary>\n    /// \n    /// </summary>\n    public int backgroundCoverId;\n    /// <summary>\n    /// \n    /// </summary>\n    public string backgroundCoverUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int titleImage;\n    /// <summary>\n    /// \n    /// </summary>\n    public string titleImageUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string englishTitle;\n    /// <summary>\n    /// \n    /// </summary>\n    public string officialPlaylistType;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool copied;\n    /// <summary>\n    /// \n    /// </summary>\n    public string relateResType;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<SubscribersItem> subscribers;\n    /// <summary>\n    /// \n    /// </summary>\n    public bool subscribed;\n    /// <summary>\n    /// \n    /// </summary>\n    public Creators creator;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<TracksItem> tracks;\n    /// <summary>\n    /// \n    /// </summary>\n    public string videoIds;\n    /// <summary>\n    /// \n    /// </summary>\n    public string videos;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<TrackIdsItem> trackIds;\n    /// <summary>\n    /// \n    /// </summary>\n    public string bannedTrackIds;\n    /// <summary>\n    /// \n    /// </summary>\n    public string mvResourceInfos;\n    /// <summary>\n    /// \n    /// </summary>\n    public int shareCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public int commentCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public string remixVideo;\n    /// <summary>\n    /// \n    /// </summary>\n    public string sharedUsers;\n    /// <summary>\n    /// \n    /// </summary>\n    public string historySharedUsers;\n    /// <summary>\n    /// \n    /// </summary>\n    public string gradeStatus;\n    /// <summary>\n    /// \n    /// </summary>\n    public string score;\n    /// <summary>\n    /// \n    /// </summary>\n    public string algTags;\n}\n\npublic class FreeTrialPrivileges\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string resConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public string userConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public string listenType;\n}\n\npublic class ChargeInfoListItems\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int rate;\n    /// <summary>\n    /// \n    /// </summary>\n    public string chargeUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string chargeMessage;\n    /// <summary>\n    /// \n    /// </summary>\n    public int chargeType;\n}\n\npublic class PrivilegesItems\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int id;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public int payed;\n    /// <summary>\n    /// \n    /// </summary>\n    public int realPayed;\n    /// <summary>\n    /// \n    /// </summary>\n    public int st;\n    /// <summary>\n    /// \n    /// </summary>\n    public int pl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int dl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int sp;\n    /// <summary>\n    /// \n    /// </summary>\n    public int cp;\n    /// <summary>\n    /// \n    /// </summary>\n    public int subp;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cs;\n    /// <summary>\n    /// \n    /// </summary>\n    public int maxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string pc;\n    /// <summary>\n    /// \n    /// </summary>\n    public string toast;\n    /// <summary>\n    /// \n    /// </summary>\n    public int flag;\n    /// <summary>\n    /// \n    /// </summary>\n    public string paidBigBang;\n    /// <summary>\n    /// \n    /// </summary>\n    public string preSell;\n    /// <summary>\n    /// \n    /// </summary>\n    public int playMaxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public int downloadMaxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string maxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string playMaxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string downloadMaxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string plLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string dlLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string flLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rscl;\n    /// <summary>\n    /// \n    /// </summary>\n    public FreeTrialPrivileges freeTrialPrivilege;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ChargeInfoListItems> chargeInfoList;\n}\n\npublic class GedanDetail\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long code;\n    /// <summary>\n    /// \n    /// </summary>\n    public string relatedVideos;\n    /// <summary>\n    /// \n    /// </summary>\n    public Playlist playlist { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public string urls;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<PrivilegesItems> privileges;\n    /// <summary>\n    /// \n    /// </summary>\n    public string sharedPrivilege;\n    /// <summary>\n    /// \n    /// </summary>\n    public string resEntrance;\n    /// <summary>\n    /// \n    /// </summary>\n    public string fromUsers;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fromUserCount;\n    /// <summary>\n    /// \n    /// </summary>\n    public string songFromUsers;\n}\n\n\npublic class musicCheck\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public bool success;\n    /// <summary>\n    /// \n    /// </summary>\n    public string message;\n}\n\npublic class ArItem1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int id;\n    /// <summary>\n    /// \n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> tns;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> @alias;\n}\n\npublic class Al1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int id;\n    /// <summary>\n    /// 海阔天空\n    /// </summary>\n    public string name;\n    /// <summary>\n    /// \n    /// </summary>\n    public string picUrl { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> tns;\n    /// <summary>\n    /// \n    /// </summary>\n    public string pic_str;\n    /// <summary>\n    /// \n    /// </summary>\n    public long pic;\n}\n\npublic class H1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int br;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fid;\n    /// <summary>\n    /// \n    /// </summary>\n    public int size;\n    /// <summary>\n    /// \n    /// </summary>\n    public int vd;\n    /// <summary>\n    /// \n    /// </summary>\n    public int sr;\n}\n\npublic class M1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int br;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fid;\n    /// <summary>\n    /// \n    /// </summary>\n    public int size;\n    /// <summary>\n    /// \n    /// </summary>\n    public int vd;\n    /// <summary>\n    /// \n    /// </summary>\n    public int sr;\n}\n\npublic class L1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int br;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fid;\n    /// <summary>\n    /// \n    /// </summary>\n    public int size;\n    /// <summary>\n    /// \n    /// </summary>\n    public int vd;\n    /// <summary>\n    /// \n    /// </summary>\n    public int sr;\n}\n\npublic class Sq1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public int br;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fid;\n    /// <summary>\n    /// \n    /// </summary>\n    public int size;\n    /// <summary>\n    /// \n    /// </summary>\n    public int vd;\n    /// <summary>\n    /// \n    /// </summary>\n    public int sr;\n}\n\npublic class SongsItem1\n{\n    /// <summary>\n    /// 海阔天空\n    /// </summary>\n    public string name { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public int pst;\n    /// <summary>\n    /// \n    /// </summary>\n    public int t;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ArItem1> ar;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> alia;\n    /// <summary>\n    /// \n    /// </summary>\n    public int pop;\n    /// <summary>\n    /// \n    /// </summary>\n    public int st;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rt;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public int v;\n    /// <summary>\n    /// \n    /// </summary>\n    public string crbt;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cf;\n    /// <summary>\n    /// \n    /// </summary>\n    public Al1 al { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public int dt;\n    /// <summary>\n    /// \n    /// </summary>\n    public H1 h;\n    /// <summary>\n    /// \n    /// </summary>\n    public M1 m;\n    /// <summary>\n    /// \n    /// </summary>\n    public L1 l;\n    /// <summary>\n    /// \n    /// </summary>\n    public Sq1 sq;\n\n    /// <summary>\n    /// \n    /// </summary>\n    public string? hr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string a;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cd;\n    /// <summary>\n    /// \n    /// </summary>\n    public int no;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rtUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int ftype;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<string> rtUrls;\n    /// <summary>\n    /// \n    /// </summary>\n    public long djId;\n    /// <summary>\n    /// \n    /// </summary>\n    public long copyright;\n    /// <summary>\n    /// \n    /// </summary>\n    public long s_id;\n    /// <summary>\n    /// \n    /// </summary>\n    public long mark;\n    /// <summary>\n    /// \n    /// </summary>\n    public int originCoverType;\n    /// <summary>\n    /// \n    /// </summary>\n    public string originSongSimpleData;\n    /// <summary>\n    /// \n    /// </summary>\n    public string tagPicList;\n    /// <summary>\n    /// \n    /// </summary>\n    public string resourceState;\n    /// <summary>\n    /// \n    /// </summary>\n    public int version;\n    /// <summary>\n    /// \n    /// </summary>\n    public string songJumpInfo;\n    /// <summary>\n    /// \n    /// </summary>\n    public string entertainmentTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public string awardTags;\n    /// <summary>\n    /// \n    /// </summary>\n    public int single;\n    /// <summary>\n    /// \n    /// </summary>\n    public string noCopyrightRcmd;\n    /// <summary>\n    /// \n    /// </summary>\n    public int mv;\n    /// <summary>\n    /// \n    /// </summary>\n    public int mst;\n    /// <summary>\n    /// \n    /// </summary>\n    public int cp;\n    /// <summary>\n    /// \n    /// </summary>\n    public int rtype;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rurl;\n    /// <summary>\n    /// \n    /// </summary>\n    public long publishTime;\n}\n\npublic class FreeTrialPrivilege1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public string resConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public string userConsumable;\n    /// <summary>\n    /// \n    /// </summary>\n    public string listenType;\n}\n\npublic class ChargeInfoListItem1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long rate;\n    /// <summary>\n    /// \n    /// </summary>\n    public string chargeUrl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string chargeMessage;\n    /// <summary>\n    /// \n    /// </summary>\n    public int chargeType;\n}\n\npublic class PrivilegesItem1\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public long id;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fee;\n    /// <summary>\n    /// \n    /// </summary>\n    public int payed;\n    /// <summary>\n    /// \n    /// </summary>\n    public int st;\n    /// <summary>\n    /// \n    /// </summary>\n    public int pl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int dl;\n    /// <summary>\n    /// \n    /// </summary>\n    public int sp;\n    /// <summary>\n    /// \n    /// </summary>\n    public int cp;\n    /// <summary>\n    /// \n    /// </summary>\n    public int subp;\n    /// <summary>\n    /// \n    /// </summary>\n    public string cs;\n    /// <summary>\n    /// \n    /// </summary>\n    public int maxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public int fl;\n    /// <summary>\n    /// \n    /// </summary>\n    public string toast;\n    /// <summary>\n    /// \n    /// </summary>\n    public int flag;\n    /// <summary>\n    /// \n    /// </summary>\n    public string preSell;\n    /// <summary>\n    /// \n    /// </summary>\n    public int playMaxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public int downloadMaxbr;\n    /// <summary>\n    /// \n    /// </summary>\n    public string maxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string playMaxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string downloadMaxBrLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string plLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string dlLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string flLevel;\n    /// <summary>\n    /// \n    /// </summary>\n    public string rscl;\n    /// <summary>\n    /// \n    /// </summary>\n    public FreeTrialPrivilege1 freeTrialPrivilege;\n    /// <summary>\n    /// \n    /// </summary>\n    public List<ChargeInfoListItem1> chargeInfoList;\n}\n\npublic class MusicDetail\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public List<SongsItem1> songs { get; set; }\n    /// <summary>\n    /// \n    /// </summary>\n    public List<PrivilegesItem1> privileges;\n    /// <summary>\n    /// \n    /// </summary>\n    public int code;\n}\n\nclass IniFile   // ini设置文件读取\n{\n    string Path;\n    string EXE = Assembly.GetExecutingAssembly().GetName().Name;\n\n    [DllImport(\"kernel32\", CharSet = CharSet.Unicode)]\n    static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);\n\n    [DllImport(\"kernel32\", CharSet = CharSet.Unicode)]\n    static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);\n\n    public IniFile(string IniPath = null)\n    {\n        Path = new FileInfo(IniPath ?? EXE + \".ini\").FullName;\n    }\n\n    public string Read(string Key, string Section = null)\n    {\n        var RetVal = new StringBuilder(6000);\n        GetPrivateProfileString(Section ?? EXE, Key, \"\", RetVal, 6000, Path);\n        return RetVal.ToString();\n    }\n\n    public void Write(string Key, string Value, string Section = null)\n    {\n        WritePrivateProfileString(Section ?? EXE, Key, Value, Path);\n    }\n\n    public void DeleteKey(string Key, string Section = null)\n    {\n        Write(Key, null, Section ?? EXE);\n    }\n\n    public void DeleteSection(string Section = null)\n    {\n        Write(null, null, Section ?? EXE);\n    }\n\n    public bool KeyExists(string Key, string Section = null)\n    {\n        return Read(Key, Section).Length > 0;\n    }\n}\n\npublic class YunPlgun : IBotPlugin /* or ICorePlugin */\n{\n    static IniFile MyIni = new IniFile(\"plugins/YunSettings.ini\");\n    PlayManager playManager;\n    Ts3Client ts3Client;\n    InvokerData invoker;\n    PlaylistManager playlistManager;\n    ResolveContext resourceFactory;\n    private TsFullClient tsClient;\n    PlayManager tempplayManager;\n    InvokerData tempinvoker;\n    Ts3Client tempts3Client;\n    public static string cookies1;\n    public static bool isEventnotadded = true;\n    public static int playMode;\n    public static int randomPotsition = 0;\n    Player player;\n    public static ArrayList SongQueue = new ArrayList();\n    SemaphoreSlim slimlock = new SemaphoreSlim(1, 1);\n    public static string WangYiYunAPI_Address;\n    public async void Initialize()\n    {\n        this.playManager = playManager;\n        this.ts3Client = ts3Client;\n        this.playlistManager = playlistManager;\n        this.invoker = invoker;\n        this.resourceFactory = resourceFactory;\n        this.tsClient = tsClient;\n        this.player = player;\n        var playMode_temp = MyIni.Read(\"playMode\");\n        var cookies1_temp = MyIni.Read(\"cookies1\");\n        var WangYiYunAPI_Address_temp = MyIni.Read(\"WangYiYunAPI_Address\");\n        if (playMode_temp == \"\")\n        {\n            playMode = 0;\n        } else\n        {\n            playMode = int.Parse(MyIni.Read(\"playMode\"));\n        }\n       if (cookies1_temp == \"\")\n        {\n            cookies1 = \"\";\n        } else\n        {\n            cookies1 = MyIni.Read(\"cookies1\");\n        }\n        if (WangYiYunAPI_Address_temp == \"\")\n        {\n            WangYiYunAPI_Address = \"https://127.0.0.1:3000\";\n        } else\n        {\n            WangYiYunAPI_Address = MyIni.Read(\"WangYiYunAPI_Address\");\n        }\n        Console.WriteLine(\"Yun Plugin loaded\");\n        Console.WriteLine(playMode);\n        Console.WriteLine(cookies1);\n        Console.WriteLine(WangYiYunAPI_Address);\n    }\n\n    public PlayManager GetplayManager()\n    {\n        return this.tempplayManager;\n    }\n\n    public void setPlplayManager(PlayManager playManager)\n    {\n        this.tempplayManager = playManager;\n    }\n    public InvokerData getinvoker()\n    {\n        return this.tempinvoker;\n    }\n\n    public void setInvoker(InvokerData invoker)\n    {\n        this.tempinvoker = invoker;\n    }\n\n    public void setTs3Client(Ts3Client ts3Client)\n    {\n        this.tempts3Client = ts3Client;\n    }\n\n    public Ts3Client GetTs3Client()\n    {\n        return this.tempts3Client;\n    }\n\n    public async Task AudioService_Playstoped(object? sender, EventArgs e) //当上一首音乐播放完触发\n    {\n        await slimlock.WaitAsync();\n        try\n        {\n            Console.WriteLine(\"上一首歌结束\");\n            if (playMode == 0)\n            {\n                var invoker = getinvoker();\n                var playManager = GetplayManager();\n                var ts3Client = GetTs3Client();\n                if (SongQueue.Count == 0)\n                {\n                    return;\n                }\n\n                SongQueue.RemoveAt(0);\n                string nextsong = (string)SongQueue[0];\n                Console.WriteLine(SongQueue.Count.ToString());\n                Console.WriteLine(nextsong);\n                string musicurl = getMusicUrl(nextsong, true);\n                Console.WriteLine(\"url:\" + musicurl);\n                await MainCommands.CommandPlay(playManager, invoker, musicurl);\n                string musicname = getMusicName(nextsong);\n                ts3Client.SendChannelMessage(\"正在播放音乐：\" + musicname);\n            }\n\n            if (playMode == 1)\n            {\n                var invoker = getinvoker();\n                var playManager = GetplayManager();\n                var ts3Client = GetTs3Client();\n                if (SongQueue.Count == 0)\n                {\n                    return;\n                }\n                string prevSong = (string)SongQueue[0];\n                SongQueue.RemoveAt(0);\n                string nextsong = (string)SongQueue[0];\n                SongQueue.Add(prevSong);\n                Console.WriteLine(SongQueue.Count.ToString());\n                Console.WriteLine(nextsong);\n                string musicurl = getMusicUrl(nextsong, true);\n                Console.WriteLine(\"url:\" + musicurl);\n                await MainCommands.CommandPlay(playManager, invoker, musicurl);\n                string musicname = getMusicName(nextsong);\n                ts3Client.SendChannelMessage(\"正在播放音乐：\" + musicname);\n            }\n\n            if (playMode == 2)\n            {\n                Random ran = new Random();\n                var invoker = getinvoker();\n                var playManager = GetplayManager();\n                var ts3Client = GetTs3Client();\n                if (SongQueue.Count == 0)\n                {\n                    return;\n                }\n                string prevSong = (string)SongQueue[randomPotsition];\n                SongQueue.RemoveAt(randomPotsition);\n                randomPotsition = ran.Next(0, SongQueue.Count - 1);\n                string nextsong = (string)SongQueue[randomPotsition];\n                Console.WriteLine(SongQueue.Count.ToString());\n                Console.WriteLine(nextsong);\n                string musicurl = getMusicUrl(nextsong, true);\n                Console.WriteLine(\"url:\" + musicurl);\n                await MainCommands.CommandPlay(playManager, invoker, musicurl);\n                string musicname = getMusicName(nextsong);\n                ts3Client.SendChannelMessage(\"正在播放音乐：\" + musicname);\n            }\n\n            if (playMode == 3)\n            {\n                Random ran = new Random();\n                var invoker = getinvoker();\n                var playManager = GetplayManager();\n                var ts3Client = GetTs3Client();\n                if (SongQueue.Count == 0)\n                {\n                    return;\n                }\n                string prevSong = (string)SongQueue[randomPotsition];\n                SongQueue.RemoveAt(randomPotsition);\n                randomPotsition = ran.Next(0, SongQueue.Count - 1);\n                string nextsong = (string)SongQueue[randomPotsition];\n                SongQueue.Add(prevSong);\n                Console.WriteLine(SongQueue.Count.ToString());\n                Console.WriteLine(nextsong);\n                string musicurl = getMusicUrl(nextsong, true);\n                Console.WriteLine(\"url:\" + musicurl);\n                await MainCommands.CommandPlay(playManager, invoker, musicurl);\n                string musicname = getMusicName(nextsong);\n                ts3Client.SendChannelMessage(\"正在播放音乐：\" + musicname);\n            }\n        }\n        finally\n        {\n            slimlock.Release();\n        }\n    }\n\n    [Command(\"yun mode\")]\n    public async Task<string> playmode(int mode)\n    {\n        playMode = mode;\n        MyIni.Write(\"playMode\", mode.ToString());\n        if (mode == 0)\n        {\n            return (\"当前播放模式为顺序播放\");\n        }\n\n        else if (mode == 1)\n        {\n            return (\"当前播放模式为顺序循环\");\n        }\n\n        else if (mode == 2)\n        {\n            return (\"当前播放模式为随机播放\");\n        }\n\n        else if (mode == 3)\n        {\n            return (\"当前播放模式为随机循环\");\n        }\n\n        else\n        {\n            return (\"请输入正确的播放模式\");\n        }\n    }\n\n    [Command(\"yun gedanid\")]\n    public async Task<string> playgedan(long id, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client, Player player)\n    {\n        if (isEventnotadded)\n        {\n            player.OnSongEnd += AudioService_Playstoped;\n            Console.WriteLine(\"event added\");\n            isEventnotadded = false;\n        }\n        SongQueue.Clear();\n        setInvoker(invoker);\n        setPlplayManager(playManager);\n        setTs3Client(ts3Client);\n        string strid = id.ToString();\n        string url = WangYiYunAPI_Address + \"/playlist/detail?id=\" + strid;\n        string json = HttpGet(url);\n        GedanDetail gedanDetail = JsonSerializer.Deserialize<GedanDetail>(json);\n        string gedanname = gedanDetail.playlist.name;\n        string imgurl = gedanDetail.playlist.coverImgUrl;\n        MainCommands.CommandBotDescriptionSet(ts3Client, gedanname);\n        MainCommands.CommandBotAvatarSet(ts3Client, imgurl);\n        await genList(id, SongQueue, ts3Client);\n        string firstmusicid;\n        if (playMode == 2 || playMode == 3)\n        {\n            Random ran = new Random();\n            randomPotsition = ran.Next(0, SongQueue.Count - 1);\n            firstmusicid = (string)SongQueue[randomPotsition];\n        }\n        else\n        {\n            randomPotsition = 0;\n            firstmusicid = (string)SongQueue[randomPotsition];\n        }\n        SongQueue.RemoveAt(randomPotsition);\n        string musicurl = getMusicUrl(firstmusicid, true);\n        Console.WriteLine(firstmusicid);\n        await MainCommands.CommandPlay(playManager, invoker, musicurl);\n        ts3Client.SendChannelMessage(\"正在播放音乐：\" + getMusicName(firstmusicid));\n        return (\"开始播放歌单\");\n    }\n\n    [Command(\"yun gedan\")]\n    public async Task<string> CommandGedan(string name, PlaylistManager playlistManager, ResolveContext resourceFactory, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client, Player player)\n    {\n        string urlSearch = WangYiYunAPI_Address + \"/search?keywords=\" + name + \"&limit=1&type=1000\";\n        string json = HttpGet(urlSearch);\n        SearchGedan searchgedan = JsonSerializer.Deserialize<SearchGedan>(json);\n        long gedanid = searchgedan.result.playlists[0].id;\n        if (isEventnotadded)\n        {\n            player.OnSongEnd += AudioService_Playstoped;\n            Console.WriteLine(\"event added\");\n            isEventnotadded = false;\n        }\n        SongQueue.Clear();\n        setInvoker(invoker);\n        setPlplayManager(playManager);\n        setTs3Client(ts3Client);\n        string strid = gedanid.ToString();\n        string url = WangYiYunAPI_Address + \"/playlist/detail?id=\" + strid;\n        string jsons = HttpGet(url);\n        GedanDetail gedanDetail = JsonSerializer.Deserialize<GedanDetail>(jsons);\n        string gedanname = gedanDetail.playlist.name;\n        string imgurl = gedanDetail.playlist.coverImgUrl;\n        MainCommands.CommandBotDescriptionSet(ts3Client, gedanname);\n        MainCommands.CommandBotAvatarSet(ts3Client, imgurl);\n        await genList(gedanid, SongQueue, ts3Client);\n        string firstmusicid;\n        if (playMode == 2 || playMode == 3)\n        {\n            Random ran = new Random();\n            randomPotsition = ran.Next(0, SongQueue.Count - 1);\n            firstmusicid = (string)SongQueue[randomPotsition];\n        }\n        else\n        {\n            randomPotsition = 0;\n            firstmusicid = (string)SongQueue[randomPotsition];\n        }\n        SongQueue.RemoveAt(randomPotsition);\n        string musicurl = getMusicUrl(firstmusicid, true);\n        Console.WriteLine(firstmusicid);\n        await MainCommands.CommandPlay(playManager, invoker, musicurl);\n        ts3Client.SendChannelMessage(\"正在播放音乐：\" + getMusicName(firstmusicid));\n        return (\"开始播放歌单\");\n    }\n\n    [Command(\"yun play\")]\n    public async Task<string> CommandYunPlay(string arguments, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client)\n    {\n        setInvoker(invoker);\n        setPlplayManager(playManager);\n        setTs3Client(ts3Client);\n        string urlSearch = WangYiYunAPI_Address + \"/search?keywords=\" + arguments + \"&limit=1\";\n        string Searchjson = HttpGet(urlSearch);\n        yunSearchSong? yunSearchSong = JsonSerializer.Deserialize<yunSearchSong>(Searchjson);\n        long firstmusicid = yunSearchSong.result.songs[0].id;\n        string firstmusicname = yunSearchSong.result.songs[0].name;\n        Console.WriteLine(firstmusicid + firstmusicname);\n        string musicurl = getMusicUrl(firstmusicid, true);\n        string musicdetailurl = WangYiYunAPI_Address + \"/song/detail?ids=\" + firstmusicid.ToString();\n        string musicdetailjson = HttpGet(musicdetailurl);\n        MusicDetail musicDetail = JsonSerializer.Deserialize<MusicDetail>(musicdetailjson);\n        string musicimgurl = musicDetail.songs[0].al.picUrl;\n        string musicname = musicDetail.songs[0].name;\n        MainCommands.CommandBotAvatarSet(ts3Client, musicimgurl);\n        MainCommands.CommandBotDescriptionSet(ts3Client, musicname);\n        Console.WriteLine(musicurl);\n        if (musicurl != \"error\")\n        {\n            MainCommands.CommandPlay(playManager, invoker, musicurl);\n            MainCommands.CommandBotDescriptionSet(ts3Client, firstmusicname);\n            ts3Client.SendChannelMessage(\"正在播放音乐：\" + firstmusicname);\n            string result = \"正在播放音乐：\" + firstmusicname;\n            return (result);\n        }\n        return (\"发生未知错误\");\n    }\n\n    [Command(\"yun playid\")]\n    public async Task<string> CommandYunPlayId(long arguments, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client)\n    {\n        setInvoker(invoker);\n        setPlplayManager(playManager);\n        setTs3Client(ts3Client);\n        string musicurl = getMusicUrl(arguments, true);\n        string musicdetailurl = WangYiYunAPI_Address + \"/song/detail?ids=\" + arguments;\n        string musicdetailjson = HttpGet(musicdetailurl);\n        MusicDetail musicDetail = JsonSerializer.Deserialize<MusicDetail>(musicdetailjson);\n        string musicimgurl = musicDetail.songs[0].al.picUrl;\n        string musicname = musicDetail.songs[0].name;\n        MainCommands.CommandBotAvatarSet(ts3Client, musicimgurl);\n        MainCommands.CommandBotDescriptionSet(ts3Client, musicname);\n        Console.WriteLine(musicurl);\n        if (musicurl != \"error\")\n        {\n            MainCommands.CommandPlay(playManager, invoker, musicurl);\n            ts3Client.SendChannelMessage(\"正在播放音乐id为：\" + arguments.ToString());\n            string result = \"正在播放音乐id为：\" + arguments.ToString();\n            return (result);\n        }\n        return (\"发生未知错误\");\n    }\n\n    [Command(\"yun add\")]\n    public async Task<string> CommandYunAdd(string arguments, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client)\n    {\n        setInvoker(invoker);\n        setPlplayManager(playManager);\n        setTs3Client(ts3Client);\n        string urlSearch = WangYiYunAPI_Address + \"/search?keywords=\" + arguments + \"&limit=1\";\n        string Searchjson = HttpGet(urlSearch);\n        yunSearchSong? yunSearchSong = JsonSerializer.Deserialize<yunSearchSong>(Searchjson);\n        long firstmusicid = yunSearchSong.result.songs[0].id;\n        string firstmusicname = yunSearchSong.result.songs[0].name;\n        Console.WriteLine(firstmusicid + firstmusicname);\n        string musicurl = getMusicUrl(firstmusicid, true);\n        string musicdetailurl = WangYiYunAPI_Address + \"/song/detail?ids=\" + firstmusicid.ToString();\n        string musicdetailjson = HttpGet(musicdetailurl);\n        MusicDetail musicDetail = JsonSerializer.Deserialize<MusicDetail>(musicdetailjson);\n        string musicimgurl = musicDetail.songs[0].al.picUrl;\n        string musicname = musicDetail.songs[0].name;\n        MainCommands.CommandBotAvatarSet(ts3Client, musicimgurl);\n        MainCommands.CommandBotDescriptionSet(ts3Client, musicname);\n        Console.WriteLine(musicurl);\n        if (musicurl != \"error\")\n        {\n            MainCommands.CommandAdd(playManager, invoker, musicurl);\n            MainCommands.CommandBotDescriptionSet(ts3Client, firstmusicname);\n            ts3Client.SendChannelMessage(\"以下音乐已经添加到播放列表中：\" + firstmusicname);\n            string result = \"以下音乐已经添加到播放列表中：\" + firstmusicname;\n            return (result);\n        }\n        return (\"发生未知错误\");\n    }\n\n    [Command(\"yun addid\")]\n    public async Task<string> CommandYunAddId(long arguments, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client)\n    {\n        setInvoker(invoker);\n        setPlplayManager(playManager);\n        setTs3Client(ts3Client);\n        string musicurl = getMusicUrl(arguments, true);\n        Console.WriteLine(musicurl);\n        string musicdetailurl = WangYiYunAPI_Address + \"/song/detail?ids=\" + arguments;\n        string musicdetailjson = HttpGet(musicdetailurl);\n        MusicDetail musicDetail = JsonSerializer.Deserialize<MusicDetail>(musicdetailjson);\n        string musicimgurl = musicDetail.songs[0].al.picUrl;\n        string musicname = musicDetail.songs[0].name;\n        await MainCommands.CommandBotAvatarSet(ts3Client, musicimgurl);\n        await MainCommands.CommandBotDescriptionSet(ts3Client, musicname);\n        if (musicurl != \"error\")\n        {\n            MainCommands.CommandAdd(playManager, invoker, musicurl);\n            ts3Client.SendChannelMessage(\"以下id的音乐已经添加到播放列表中：\" + arguments.ToString());\n            string result = \"以下id的音乐已经添加到播放列表中：\" + arguments.ToString();\n            return (result);\n        }\n        return (\"发生未知错误\");\n    }\n\n    [Command(\"yun next\")]\n    public async Task<string> CommandYunNext(PlaylistManager playlistManager, ResolveContext resourceFactory, PlayManager playManager, InvokerData invoker, Ts3Client ts3Client)\n    {\n        setInvoker(invoker);\n        setPlplayManager(playManager);\n        setTs3Client(ts3Client);\n        if (playManager.IsPlaying && SongQueue.Count >= 1)\n        {\n            await playManager.Stop();\n            if (SongQueue.Count == 0)\n            {\n                return (\"播放列表为空\");\n            }\n\n            if (playMode == 2 || playMode == 3)\n            {\n                Random ran = new Random();\n                randomPotsition = ran.Next(0, SongQueue.Count - 1);\n                string nextsong = (string)SongQueue[randomPotsition];\n                SongQueue.RemoveAt(randomPotsition);\n                if (playMode == 3)\n                {\n                    SongQueue.Add(nextsong);\n                }\n                Console.WriteLine(SongQueue.Count.ToString());\n                Console.WriteLine(nextsong);\n                string musicurl = getMusicUrl(nextsong, true);\n                string musicname = getMusicName(nextsong);\n                await ts3Client.SendChannelMessage(\"正在播放音乐：\"+musicname);\n                await MainCommands.CommandPlay(playManager, invoker, musicurl);\n                return (\"开始播放下一首音乐\");\n            }\n            else\n            {\n                string nextsong = (string)SongQueue[0];\n                SongQueue.RemoveAt(0);\n                if (playMode == 1)\n                {\n                    SongQueue.Add(nextsong);\n                }\n                Console.WriteLine(SongQueue.Count.ToString());\n                Console.WriteLine(nextsong);\n                string musicurl = getMusicUrl(nextsong, true);\n                string musicname = getMusicName(nextsong);\n                await ts3Client.SendChannelMessage(\"正在播放音乐：\" + musicname);\n                await MainCommands.CommandPlay(playManager, invoker, musicurl);\n                return (\"开始播放下一首音乐\");\n            }\n        }\n        else\n        {\n            return (\"无法播放下一首音乐\");\n        }\n    }\n\n    [Command(\"yun login\")]\n    public static async Task<string> CommanloginAsync(Ts3Client ts3Client, TsFullClient tsClient)\n    {\n        string url1 = WangYiYunAPI_Address + \"/login/qr/key\" + \"?timestamp=\" + GetTimeStamp();\n        string json1 = HttpGet(url1);\n        Console.WriteLine(json1);\n        LoginKey loginKey = JsonSerializer.Deserialize<LoginKey>(json1);\n        string key = loginKey.data.unikey;\n        string url2 = WangYiYunAPI_Address + \"/login/qr/create?key=\" + key + \"&qrimg=true&timestamp=\" + GetTimeStamp();\n        string json2 = HttpGet(url2);\n        LoginImg loginImg = JsonSerializer.Deserialize<LoginImg>(json2);\n        string base64String = loginImg.data.qrimg;\n        await ts3Client.SendChannelMessage(\"正在生成二维码\");\n        await ts3Client.SendChannelMessage(loginImg.data.qrimg);\n        Console.WriteLine(base64String);\n        string[] img = base64String.Split(\",\");\n        byte[] bytes = Convert.FromBase64String(img[1]);\n        Stream stream = new MemoryStream(bytes);\n        await tsClient.UploadAvatar(stream);\n        await ts3Client.ChangeDescription(\"请用网易云APP扫描二维码登陆\");\n        int i = 0;\n        long code;\n        string result;\n        while (true)\n        {\n            string url3 = WangYiYunAPI_Address + \"/login/qr/check?key=\" + key + \"&timestamp=\" + GetTimeStamp();\n            string json3 = HttpGet(url3);\n            Console.WriteLine(json3);\n            Status1 status1 = JsonSerializer.Deserialize<Status1>(json3);\n            code = status1.code;\n            cookies1 = getCookies();\n            cookies1 = status1.cookie;\n            changeCookies(cookies1);\n            i = i + 1;\n            Thread.Sleep(1000);\n            if (i == 120)\n            {\n                result = \"登陆失败或者超时\";\n                await ts3Client.SendChannelMessage(\"登陆失败或者超时\");\n                break;\n            }\n            if (code == 803)\n            {\n                result = \"登陆成功\";\n                await ts3Client.SendChannelMessage(\"登陆成功\");\n                break;\n            }\n        }\n        await tsClient.DeleteAvatar();\n        changeCookies(cookies1);\n        MyIni.Write(\"cookies1\", cookies1);\n        return result;\n    }\n\n    //以下全是功能性函数\n    public static string getMusicUrl(long id, bool usingcookie = false) //获得歌曲URL\n    {\n        string cookie = getCookies();\n        string url;\n        if (usingcookie && cookie != \"\")\n        {\n            url = WangYiYunAPI_Address + \"/song/url?id=\" + id.ToString() + \"&cookie=\" + cookie;\n        }\n        else\n        {\n            url = WangYiYunAPI_Address + \"/song/url?id=\" + id.ToString();\n        }\n        string musicurljson = HttpGet(url);\n        musicURL musicurl = JsonSerializer.Deserialize<musicURL>(musicurljson);\n        long code = musicurl.code;\n        string mp3 = musicurl.data[0].url;\n        return mp3;\n    }\n\n    public static string getMusicUrl(string id, bool usingcookie = false)//获得歌曲URL\n    {\n        string cookie = getCookies();\n        string url;\n        if (usingcookie && cookie != \"\")\n        {\n            url = WangYiYunAPI_Address + \"/song/url?id=\" + id + \"&cookie=\" + cookie;\n        }\n        else\n        {\n            url = WangYiYunAPI_Address + \"/song/url?id=\" + id;\n        }\n        string musicurljson = HttpGet(url);\n        musicURL musicurl = JsonSerializer.Deserialize<musicURL>(musicurljson);\n        string mp3 = musicurl.data[0].url;\n        return mp3;\n    }\n\n    public static string getMusicName(long arguments)//获得歌曲名称\n    {\n        string musicurl = getMusicUrl(arguments, true);\n        Console.WriteLine(musicurl);\n        string musicdetailurl = WangYiYunAPI_Address + \"/song/detail?ids=\" + arguments;\n        string musicdetailjson = HttpGet(musicdetailurl);\n        MusicDetail musicDetail = JsonSerializer.Deserialize<MusicDetail>(musicdetailjson);\n        string musicname = musicDetail.songs[0].name;\n        return musicname;\n    }\n\n    public static string getMusicName(string arguments)//获得歌曲名称\n    {\n        string musicurl = getMusicUrl(arguments, true);\n        Console.WriteLine(musicurl);\n        string musicdetailurl = WangYiYunAPI_Address + \"/song/detail?ids=\" + arguments;\n        string musicdetailjson = HttpGet(musicdetailurl);\n        MusicDetail musicDetail = JsonSerializer.Deserialize<MusicDetail>(musicdetailjson);\n        string musicname = musicDetail.songs[0].name;\n        return musicname;\n    }\n\n    public static string HttpGet(string url)//Http请求\n    {\n        //ServicePolongManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);\n        Encoding encoding = Encoding.UTF8;\n        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);\n        request.Method = \"GET\";\n        request.Accept = \"text/html, application/xhtml+xml, */*\";\n        request.ContentType = \"application/json\";\n\n        HttpWebResponse response = (HttpWebResponse)request.GetResponse();\n        using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))\n        {\n            return reader.ReadToEnd();\n        }\n    }\n\n    public static string getCookies() //读取cookie\n    {\n        return cookies1;\n    }\n\n    public static void changeCookies(string newcookies) //更改cookie\n    {\n        cookies1 = newcookies;\n    }\n\n    public static string GetTimeStamp() //获得时间戳\n    {\n        TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);\n        return Convert.ToInt64(ts.TotalSeconds).ToString();\n    }\n\n    public static async Task genList(long id, ArrayList SongQueue, Ts3Client ts3Client) //生成歌单\n    {\n        string gedanid = id.ToString();\n        string url = WangYiYunAPI_Address + \"/playlist/track/all?id=\" + gedanid;\n        string gedanjson = HttpGet(url);\n        GeDan Gedans = JsonSerializer.Deserialize<GeDan>(gedanjson);\n        long numOfSongs = Gedans.songs.Count();\n        if (numOfSongs > 100)\n        {\n            Console.WriteLine(\"警告歌单过大，可能需要一定的时间生成\");\n        }\n        for (int i = 0; i < numOfSongs; i++)\n        {\n            long musicid = Gedans.songs[i].id;\n            if (musicid > 0)\n            {\n                SongQueue.Add(musicid.ToString());\n            }\n        }\n    }\n\n\n    public void Dispose()\n    {\n        SongQueue.Clear();\n    }\n}"
  },
  {
    "path": "obj/ClassLibrary4.csproj.nuget.dgspec.json",
    "content": "{\n  \"format\": 1,\n  \"restore\": {\n    \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\ClassLibrary4.csproj\": {}\n  },\n  \"projects\": {\n    \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\ClassLibrary4.csproj\": {\n      \"version\": \"1.0.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\ClassLibrary4.csproj\",\n        \"projectName\": \"YunBot\",\n        \"projectPath\": \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\ClassLibrary4.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\obj\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {\n              \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {\n                \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\"\n              },\n              \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n                \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n              }\n            }\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        }\n      }\n    },\n    \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {\n      \"version\": \"1.0.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n        \"projectName\": \"TS3AudioBot\",\n        \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\obj\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {\n              \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n                \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n              }\n            }\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"CliWrap\": {\n              \"target\": \"Package\",\n              \"version\": \"[3.1.0, )\"\n            },\n            \"CommandLineParser\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.8.0, )\"\n            },\n            \"LiteDB\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.1.4, )\"\n            },\n            \"Microsoft.AspNetCore.Cors\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.AspNetCore.Server.Kestrel\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.AspNetCore.StaticFiles\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.2.0, )\"\n            },\n            \"Microsoft.CodeAnalysis.CSharp\": {\n              \"include\": \"Runtime, Compile, Build, Native, ContentFiles, BuildTransitive\",\n              \"target\": \"Package\",\n              \"version\": \"[3.7.0, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Nett\": {\n              \"target\": \"Package\",\n              \"version\": \"[0.15.0, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"PlaylistsNET\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.1.2, )\"\n            },\n            \"SixLabors.ImageSharp\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.0, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        }\n      }\n    },\n    \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n      \"version\": \"1.1.0\",\n      \"restore\": {\n        \"projectUniqueName\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"projectName\": \"Splamy.TSLib\",\n        \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n        \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n        \"outputPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\obj\\\\\",\n        \"projectStyle\": \"PackageReference\",\n        \"crossTargeting\": true,\n        \"configFilePaths\": [\n          \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n          \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n        ],\n        \"originalTargetFrameworks\": [\n          \"netcoreapp3.1\",\n          \"netstandard2.0\",\n          \"netstandard2.1\"\n        ],\n        \"sources\": {\n          \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n          \"https://api.nuget.org/v3/index.json\": {}\n        },\n        \"frameworks\": {\n          \"netcoreapp3.1\": {\n            \"targetAlias\": \"netcoreapp3.1\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.0\": {\n            \"targetAlias\": \"netstandard2.0\",\n            \"projectReferences\": {}\n          },\n          \"netstandard2.1\": {\n            \"targetAlias\": \"netstandard2.1\",\n            \"projectReferences\": {}\n          }\n        },\n        \"warningProperties\": {\n          \"warnAsError\": [\n            \"NU1605\"\n          ]\n        }\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"Microsoft.NETCore.App\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.0\": {\n          \"targetAlias\": \"netstandard2.0\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NETStandard.Library\": {\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[2.0.3, )\",\n              \"autoReferenced\": true\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            },\n            \"System.Memory\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.5.4, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        },\n        \"netstandard2.1\": {\n          \"targetAlias\": \"netstandard2.1\",\n          \"dependencies\": {\n            \"Heijden.Dns.Portable\": {\n              \"target\": \"Package\",\n              \"version\": \"[2.0.19, )\"\n            },\n            \"NLog\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.3, )\"\n            },\n            \"Newtonsoft.Json\": {\n              \"target\": \"Package\",\n              \"version\": \"[12.0.3, )\"\n            },\n            \"Nullable\": {\n              \"include\": \"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive\",\n              \"suppressParent\": \"All\",\n              \"target\": \"Package\",\n              \"version\": \"[1.2.1, )\"\n            },\n            \"Portable.BouncyCastle\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.8.6.7, )\"\n            },\n            \"Splamy.Ed25519.Toolkit\": {\n              \"target\": \"Package\",\n              \"version\": \"[1.0.3, )\"\n            },\n            \"System.IO.Pipelines\": {\n              \"target\": \"Package\",\n              \"version\": \"[4.7.2, )\"\n            }\n          },\n          \"imports\": [\n            \"net461\",\n            \"net462\",\n            \"net47\",\n            \"net471\",\n            \"net472\",\n            \"net48\"\n          ],\n          \"assetTargetFallback\": true,\n          \"warn\": true,\n          \"frameworkReferences\": {\n            \"NETStandard.Library\": {\n              \"privateAssets\": \"all\"\n            }\n          },\n          \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "obj/ClassLibrary4.csproj.nuget.g.props",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <RestoreSuccess Condition=\" '$(RestoreSuccess)' == '' \">True</RestoreSuccess>\n    <RestoreTool Condition=\" '$(RestoreTool)' == '' \">NuGet</RestoreTool>\n    <ProjectAssetsFile Condition=\" '$(ProjectAssetsFile)' == '' \">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>\n    <NuGetPackageRoot Condition=\" '$(NuGetPackageRoot)' == '' \">$(UserProfile)\\.nuget\\packages\\</NuGetPackageRoot>\n    <NuGetPackageFolders Condition=\" '$(NuGetPackageFolders)' == '' \">C:\\Users\\Saopig\\.nuget\\packages\\</NuGetPackageFolders>\n    <NuGetProjectStyle Condition=\" '$(NuGetProjectStyle)' == '' \">PackageReference</NuGetProjectStyle>\n    <NuGetToolVersion Condition=\" '$(NuGetToolVersion)' == '' \">5.11.4</NuGetToolVersion>\n  </PropertyGroup>\n  <ItemGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <SourceRoot Include=\"C:\\Users\\Saopig\\.nuget\\packages\\\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(ExcludeRestorePackageImports)' != 'true' \">\n    <PkgMicrosoft_CodeAnalysis_Analyzers Condition=\" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' \">C:\\Users\\Saopig\\.nuget\\packages\\microsoft.codeanalysis.analyzers\\3.0.0</PkgMicrosoft_CodeAnalysis_Analyzers>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "obj/ClassLibrary4.csproj.nuget.g.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "obj/Debug/netcoreapp3.0/ClassLibrary4.csproj.FileListAbsolute.txt",
    "content": ""
  },
  {
    "path": "obj/Debug/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs",
    "content": "// <autogenerated />\nusing System;\nusing System.Reflection;\n[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(\".NETCoreApp,Version=v3.1\", FrameworkDisplayName = \"\")]\n"
  },
  {
    "path": "obj/Debug/netcoreapp3.1/ClassLibrary4.AssemblyInfo.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nusing System;\nusing System.Reflection;\n\n[assembly: System.Reflection.AssemblyCompanyAttribute(\"YunBot\")]\n[assembly: System.Reflection.AssemblyConfigurationAttribute(\"Debug\")]\n[assembly: System.Reflection.AssemblyFileVersionAttribute(\"1.0.0.0\")]\n[assembly: System.Reflection.AssemblyInformationalVersionAttribute(\"1.0.0\")]\n[assembly: System.Reflection.AssemblyProductAttribute(\"YunBot\")]\n[assembly: System.Reflection.AssemblyTitleAttribute(\"YunBot\")]\n[assembly: System.Reflection.AssemblyVersionAttribute(\"1.0.0.0\")]\n\n// 由 MSBuild WriteCodeFragment 类生成。\n\n"
  },
  {
    "path": "obj/Debug/netcoreapp3.1/ClassLibrary4.AssemblyInfoInputs.cache",
    "content": "bccab723f9c417e391763d19aee94312261e8633\n"
  },
  {
    "path": "obj/Debug/netcoreapp3.1/ClassLibrary4.GeneratedMSBuildEditorConfig.editorconfig",
    "content": "is_global = true\nbuild_property.RootNamespace = ClassLibrary4\nbuild_property.ProjectDir = C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\\n"
  },
  {
    "path": "obj/Debug/netcoreapp3.1/ClassLibrary4.csproj.CopyComplete",
    "content": ""
  },
  {
    "path": "obj/Debug/netcoreapp3.1/ClassLibrary4.csproj.CoreCompileInputs.cache",
    "content": "d73a8a7dbbf58e381775d4094925e5bb305ad7f3\n"
  },
  {
    "path": "obj/Debug/netcoreapp3.1/ClassLibrary4.csproj.FileListAbsolute.txt",
    "content": "C:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.deps.json\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.json\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.runtimeconfig.dev.json\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.exe\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\lib\\x64\\libopus.dll\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\lib\\x86\\libopus.dll\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\YunBot.deps.json\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\YunBot.dll\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\YunBot.pdb\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.dll\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TSLib.dll\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.pdb\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TS3AudioBot.dll.config\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\bin\\Debug\\netcoreapp3.1\\TSLib.pdb\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\Debug\\netcoreapp3.1\\ClassLibrary4.csproj.AssemblyReference.cache\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\Debug\\netcoreapp3.1\\ClassLibrary4.GeneratedMSBuildEditorConfig.editorconfig\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\Debug\\netcoreapp3.1\\ClassLibrary4.AssemblyInfoInputs.cache\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\Debug\\netcoreapp3.1\\ClassLibrary4.AssemblyInfo.cs\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\Debug\\netcoreapp3.1\\ClassLibrary4.csproj.CoreCompileInputs.cache\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\Debug\\netcoreapp3.1\\ClassLibrary4.csproj.CopyComplete\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\Debug\\netcoreapp3.1\\YunBot.dll\nC:\\Users\\Saopig\\source\\repos\\ClassLibrary4\\obj\\Debug\\netcoreapp3.1\\YunBot.pdb\n"
  },
  {
    "path": "obj/project.assets.json",
    "content": "{\n  \"version\": 3,\n  \"targets\": {\n    \".NETCoreApp,Version=v3.1\": {\n      \"CliWrap/3.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/CliWrap.dll\": {}\n        }\n      },\n      \"CommandLineParser/2.8.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/CommandLine.dll\": {}\n        }\n      },\n      \"Heijden.Dns.Portable/2.0.19\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Net.NetworkInformation\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/Heijden.Dns.Portable.dll\": {}\n        }\n      },\n      \"LiteDB/4.1.4\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.TypeExtensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/LiteDB.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.IO.Pipelines\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Cors/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.EnvironmentVariables\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.FileExtensions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Diagnostics.DiagnosticSource\": \"4.5.0\",\n          \"System.Reflection.Metadata\": \"1.6.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Server.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Hosting.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Http/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.ObjectPool\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Features\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Https\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.WebUtilities\": \"2.2.0\",\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Memory\": \"4.5.1\",\n          \"System.Numerics.Vectors\": \"4.5.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\",\n          \"System.Security.Cryptography.Cng\": \"4.5.0\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Http.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Core\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Connections.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.AspNetCore.Hosting.Abstractions\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Http.Extensions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.WebEncoders\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\": {}\n        }\n      },\n      \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Net.Http.Headers\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\": {}\n        }\n      },\n      \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n        \"type\": \"package\",\n        \"build\": {\n          \"build/_._\": {}\n        }\n      },\n      \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Analyzers\": \"3.0.0\",\n          \"System.Collections.Immutable\": \"1.5.0\",\n          \"System.Memory\": \"4.5.4\",\n          \"System.Reflection.Metadata\": \"1.6.0\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.7.0\",\n          \"System.Text.Encoding.CodePages\": \"4.5.1\",\n          \"System.Threading.Tasks.Extensions\": \"4.5.3\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\": {}\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.CodeAnalysis.Common\": \"[3.7.0]\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\": {}\n        },\n        \"resource\": {\n          \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"cs\"\n          },\n          \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"de\"\n          },\n          \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"es\"\n          },\n          \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"fr\"\n          },\n          \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"it\"\n          },\n          \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ja\"\n          },\n          \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ko\"\n          },\n          \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pl\"\n          },\n          \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"pt-BR\"\n          },\n          \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"ru\"\n          },\n          \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"tr\"\n          },\n          \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hans\"\n          },\n          \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\": {\n            \"locale\": \"zh-Hant\"\n          }\n        }\n      },\n      \"Microsoft.Extensions.Configuration/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Physical\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileSystemGlobbing\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.FileProviders.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Logging/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Configuration.Binder\": \"2.2.0\",\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Logging.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Options/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.ComponentModel.Annotations\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.Primitives/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Memory\": \"4.5.1\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.1\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\": {}\n        }\n      },\n      \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.DependencyInjection.Abstractions\": \"2.2.0\",\n          \"Microsoft.Extensions.Options\": \"2.2.0\",\n          \"System.Text.Encodings.Web\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\": {}\n        }\n      },\n      \"Microsoft.Net.Http.Headers/2.2.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.Extensions.Primitives\": \"2.2.0\",\n          \"System.Buffers\": \"4.5.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\": {}\n        }\n      },\n      \"Microsoft.NETCore.Platforms/2.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.NETCore.Targets/1.1.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"Microsoft.Win32.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"Nett/0.15.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Nett.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Nett.dll\": {}\n        }\n      },\n      \"Newtonsoft.Json/12.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/Newtonsoft.Json.dll\": {}\n        }\n      },\n      \"NLog/4.7.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/NLog.dll\": {}\n        }\n      },\n      \"PlaylistsNET/1.1.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/PlaylistsNET.dll\": {}\n        }\n      },\n      \"Portable.BouncyCastle/1.8.6.7\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/BouncyCastle.Crypto.dll\": {}\n        }\n      },\n      \"runtime.native.System/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"lib/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/_._\": {}\n        }\n      },\n      \"SixLabors.ImageSharp/1.0.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\": {}\n        }\n      },\n      \"Splamy.Ed25519.Toolkit/1.0.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/Chaos.NaCl.dll\": {}\n        }\n      },\n      \"System.Buffers/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Collections/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Collections.Immutable/1.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Collections.Immutable.dll\": {}\n        }\n      },\n      \"System.ComponentModel.Annotations/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Diagnostics.Debug/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\": {}\n        }\n      },\n      \"System.Diagnostics.Tracing/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Globalization/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.IO.dll\": {}\n        }\n      },\n      \"System.IO.FileSystem/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        }\n      },\n      \"System.IO.FileSystem.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\": {}\n        }\n      },\n      \"System.IO.Pipelines/4.7.2\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/System.IO.Pipelines.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp3.0/System.IO.Pipelines.dll\": {}\n        }\n      },\n      \"System.Linq/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.6/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.6/System.Linq.dll\": {}\n        }\n      },\n      \"System.Memory/4.5.4\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Net.NetworkInformation/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Tracing\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.IO.FileSystem\": \"4.3.0\",\n          \"System.IO.FileSystem.Primitives\": \"4.3.0\",\n          \"System.Linq\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Net.Sockets\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Principal.Windows\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\",\n          \"System.Threading.Overlapped\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\",\n          \"System.Threading.Thread\": \"4.3.0\",\n          \"System.Threading.ThreadPool\": \"4.3.0\",\n          \"runtime.native.System\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.NetworkInformation.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"linux\"\n          },\n          \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"osx\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Net.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Primitives.dll\": {}\n        }\n      },\n      \"System.Net.Sockets/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Net.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Net.Sockets.dll\": {}\n        }\n      },\n      \"System.Numerics.Vectors/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/_._\": {}\n        }\n      },\n      \"System.Reflection/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.dll\": {}\n        }\n      },\n      \"System.Reflection.Metadata/1.6.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Reflection.Metadata.dll\": {}\n        }\n      },\n      \"System.Reflection.Primitives/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/System.Reflection.Primitives.dll\": {}\n        }\n      },\n      \"System.Reflection.TypeExtensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\": {}\n        }\n      },\n      \"System.Resources.ResourceManager/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        }\n      },\n      \"System.Runtime/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/System.Runtime.dll\": {}\n        }\n      },\n      \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\": {}\n        }\n      },\n      \"System.Runtime.Extensions/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.5/_._\": {}\n        }\n      },\n      \"System.Runtime.Handles/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Runtime.Handles.dll\": {}\n        }\n      },\n      \"System.Runtime.InteropServices/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Reflection.Primitives\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netcoreapp1.1/_._\": {}\n        }\n      },\n      \"System.Security.Claims/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Collections\": \"4.3.0\",\n          \"System.Globalization\": \"4.3.0\",\n          \"System.IO\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Security.Claims.dll\": {}\n        }\n      },\n      \"System.Security.Cryptography.Cng/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Security.Principal/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.0/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.0/System.Security.Principal.dll\": {}\n        }\n      },\n      \"System.Security.Principal.Windows/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.Win32.Primitives\": \"4.3.0\",\n          \"System.Collections\": \"4.3.0\",\n          \"System.Diagnostics.Debug\": \"4.3.0\",\n          \"System.Reflection\": \"4.3.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Extensions\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\",\n          \"System.Runtime.InteropServices\": \"4.3.0\",\n          \"System.Security.Claims\": \"4.3.0\",\n          \"System.Security.Principal\": \"4.3.0\",\n          \"System.Text.Encoding\": \"4.3.0\",\n          \"System.Threading\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encoding/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Text.Encoding.dll\": {}\n        }\n      },\n      \"System.Text.Encoding.CodePages/4.5.1\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"2.1.2\",\n          \"System.Runtime.CompilerServices.Unsafe\": \"4.5.2\"\n        },\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Text.Encodings.Web/4.5.0\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard2.0/System.Text.Encodings.Web.dll\": {}\n        }\n      },\n      \"System.Threading/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Threading.Tasks\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.dll\": {}\n        }\n      },\n      \"System.Threading.Overlapped/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"System.Resources.ResourceManager\": \"4.3.0\",\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtimeTargets\": {\n          \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"unix\"\n          },\n          \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\": {\n            \"assetType\": \"runtime\",\n            \"rid\": \"win\"\n          }\n        }\n      },\n      \"System.Threading.Tasks/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"Microsoft.NETCore.Platforms\": \"1.1.0\",\n          \"Microsoft.NETCore.Targets\": \"1.1.0\",\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/System.Threading.Tasks.dll\": {}\n        }\n      },\n      \"System.Threading.Tasks.Extensions/4.5.3\": {\n        \"type\": \"package\",\n        \"compile\": {\n          \"ref/netcoreapp2.1/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netcoreapp2.1/_._\": {}\n        }\n      },\n      \"System.Threading.Thread/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.Thread.dll\": {}\n        }\n      },\n      \"System.Threading.ThreadPool/4.3.0\": {\n        \"type\": \"package\",\n        \"dependencies\": {\n          \"System.Runtime\": \"4.3.0\",\n          \"System.Runtime.Handles\": \"4.3.0\"\n        },\n        \"compile\": {\n          \"ref/netstandard1.3/_._\": {}\n        },\n        \"runtime\": {\n          \"lib/netstandard1.3/System.Threading.ThreadPool.dll\": {}\n        }\n      },\n      \"Splamy.TSLib/1.1.0\": {\n        \"type\": \"project\",\n        \"framework\": \".NETCoreApp,Version=v3.1\",\n        \"dependencies\": {\n          \"Heijden.Dns.Portable\": \"2.0.19\",\n          \"NLog\": \"4.7.3\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"Portable.BouncyCastle\": \"1.8.6.7\",\n          \"Splamy.Ed25519.Toolkit\": \"1.0.3\",\n          \"System.IO.Pipelines\": \"4.7.2\"\n        },\n        \"compile\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        },\n        \"runtime\": {\n          \"bin/placeholder/Splamy.TSLib.dll\": {}\n        }\n      },\n      \"TS3AudioBot/1.0.0\": {\n        \"type\": \"project\",\n        \"framework\": \".NETCoreApp,Version=v3.1\",\n        \"dependencies\": {\n          \"CliWrap\": \"3.1.0\",\n          \"CommandLineParser\": \"2.8.0\",\n          \"LiteDB\": \"4.1.4\",\n          \"Microsoft.AspNetCore.Cors\": \"2.2.0\",\n          \"Microsoft.AspNetCore.Server.Kestrel\": \"2.2.0\",\n          \"Microsoft.AspNetCore.StaticFiles\": \"2.2.0\",\n          \"Microsoft.CodeAnalysis.CSharp\": \"3.7.0\",\n          \"NLog\": \"4.7.3\",\n          \"Nett\": \"0.15.0\",\n          \"Newtonsoft.Json\": \"12.0.3\",\n          \"PlaylistsNET\": \"1.1.2\",\n          \"SixLabors.ImageSharp\": \"1.0.0\",\n          \"Splamy.TSLib\": \"1.1.0\"\n        },\n        \"compile\": {\n          \"bin/placeholder/TS3AudioBot.dll\": {}\n        },\n        \"runtime\": {\n          \"bin/placeholder/TS3AudioBot.dll\": {}\n        }\n      }\n    }\n  },\n  \"libraries\": {\n    \"CliWrap/3.1.0\": {\n      \"sha512\": \"vbQ+rpxRgdkWBHmZXl8De4PYzKTOxa37Tfz6Zb01OP8f7eFBOjCj5IY2+Ghb81pPMA6rCDPrYEbod1EzbcFG2w==\",\n      \"type\": \"package\",\n      \"path\": \"cliwrap/3.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"cliwrap.3.1.0.nupkg.sha512\",\n        \"cliwrap.nuspec\",\n        \"favicon.png\",\n        \"lib/net461/CliWrap.dll\",\n        \"lib/net461/CliWrap.xml\",\n        \"lib/netcoreapp3.0/CliWrap.dll\",\n        \"lib/netcoreapp3.0/CliWrap.xml\",\n        \"lib/netstandard2.0/CliWrap.dll\",\n        \"lib/netstandard2.0/CliWrap.xml\",\n        \"lib/netstandard2.1/CliWrap.dll\",\n        \"lib/netstandard2.1/CliWrap.xml\"\n      ]\n    },\n    \"CommandLineParser/2.8.0\": {\n      \"sha512\": \"eco2HlKQBY4Joz9odHigzGpVzv6pjsXnY5lziioMveQxr+i2Z7xYcIOMeZTgYiqnMtMAbXMXsVhrNfWO5vJS8Q==\",\n      \"type\": \"package\",\n      \"path\": \"commandlineparser/2.8.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"CommandLine20.png\",\n        \"License.md\",\n        \"README.md\",\n        \"commandlineparser.2.8.0.nupkg.sha512\",\n        \"commandlineparser.nuspec\",\n        \"lib/net40/CommandLine.dll\",\n        \"lib/net40/CommandLine.xml\",\n        \"lib/net45/CommandLine.dll\",\n        \"lib/net45/CommandLine.xml\",\n        \"lib/net461/CommandLine.dll\",\n        \"lib/net461/CommandLine.xml\",\n        \"lib/netstandard2.0/CommandLine.dll\",\n        \"lib/netstandard2.0/CommandLine.xml\"\n      ]\n    },\n    \"Heijden.Dns.Portable/2.0.19\": {\n      \"sha512\": \"i540bJyh6vIypQP1ZKLES3KETxRBK0tPXRiNS8/0diy5za4GF2x9odXzLEslolldxdLVCZsM33YjC4/O2EOnhw==\",\n      \"type\": \"package\",\n      \"path\": \"heijden.dns.portable/2.0.19\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"heijden.dns.portable.2.0.19.nupkg.sha512\",\n        \"heijden.dns.portable.nuspec\",\n        \"lib/netstandard1.3/Heijden.Dns.Portable.dll\"\n      ]\n    },\n    \"LiteDB/4.1.4\": {\n      \"sha512\": \"g4g9JlHzRBZl+Gd2UbiRdszZ7t8wozU2wX7+5xY5uE79tmcgcDhha+ubAP84G1VLbwQmhBGCzRfIx+epLmJciQ==\",\n      \"type\": \"package\",\n      \"path\": \"litedb/4.1.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net35/LiteDB.dll\",\n        \"lib/net35/LiteDB.xml\",\n        \"lib/net40/LiteDB.dll\",\n        \"lib/net40/LiteDB.xml\",\n        \"lib/netstandard1.3/LiteDB.dll\",\n        \"lib/netstandard1.3/LiteDB.xml\",\n        \"lib/netstandard2.0/LiteDB.dll\",\n        \"lib/netstandard2.0/LiteDB.xml\",\n        \"litedb.4.1.4.nupkg.sha512\",\n        \"litedb.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Connections.Abstractions/2.2.0\": {\n      \"sha512\": \"Aqr/16Cu5XmGv7mLKJvXRxhhd05UJ7cTTSaUV4MZ3ynAzfgWjsAdpIU8FWuxwAjmVdmI8oOWuVDrbs+sRkhKnA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.connections.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Connections.Abstractions.xml\",\n        \"microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.connections.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Cors/2.2.0\": {\n      \"sha512\": \"LFlTM3ThS3ZCILuKnjy8HyK9/IlDh3opogdbCVx6tMGyDzTQBgMPXLjGDLtMk5QmLDCcP3l1TO3z/+1viA8GUg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.cors/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Cors.xml\",\n        \"microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.cors.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting/2.2.0\": {\n      \"sha512\": \"7t4RbUGugpHtQmzAkc9fpDdYJg6t/jcB2VVnjensVYbZFnLDU8pNrG0hrekk1DQG7P2UzpSqKLzDsFF0/lkkbw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.xml\",\n        \"microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting.Abstractions/2.2.0\": {\n      \"sha512\": \"ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Abstractions.xml\",\n        \"microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Hosting.Server.Abstractions/2.2.0\": {\n      \"sha512\": \"1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.hosting.server.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml\",\n        \"microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.hosting.server.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http/2.2.0\": {\n      \"sha512\": \"YogBSMotWPAS/X5967pZ+yyWPQkThxhmzAwyCHCSSldzYBkW5W5d6oPfBaPqQOnSHYTpSOSOkpZoAce0vwb6+A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.xml\",\n        \"microsoft.aspnetcore.http.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Abstractions/2.2.0\": {\n      \"sha512\": \"Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Abstractions.xml\",\n        \"microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Extensions/2.2.0\": {\n      \"sha512\": \"2DgZ9rWrJtuR7RYiew01nGRzuQBDaGHGmK56Rk54vsLLsCdzuFUPqbDTJCS1qJQWTbmbIQ9wGIOjpxA1t0l7/w==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.extensions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Extensions.xml\",\n        \"microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.extensions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Http.Features/2.2.0\": {\n      \"sha512\": \"ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.http.features/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Http.Features.xml\",\n        \"microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.http.features.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel/2.2.0\": {\n      \"sha512\": \"D0vGB8Tp0UNMiAhT+pwAVeqDDx2OFrfpu/plwm0WhA+1DZvTLc99eDwGISL6LAY8x7a12lhl9w7/m+VdoyDu8Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.xml\",\n        \"microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Core/2.2.0\": {\n      \"sha512\": \"F6/Vesd3ODq/ISbHfcvfRf7IzRtTvrNX8VA36Knm5e7bteJhoRA2GKQUVQ+neoO1njLvaQKnjcA3rdCZ6AF6cg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.core/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Core.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Core.xml\",\n        \"microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.core.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Https/2.2.0\": {\n      \"sha512\": \"nEH5mU6idUYS3/+9BKw2stMOM25ZdGwIH4P4kyj6PVkMPgQUTkBQ7l/ScPkepdhejcOlPa+g3+M4dYsSYPUJ8g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.https/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Https.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Https.xml\",\n        \"microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.https.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions/2.2.0\": {\n      \"sha512\": \"j1ai2CG8BGp4mYf2TWSFjjy1pRgW9XbqhdR4EOVvrlFVbcpEPfXNIPEdjkcgK+txWCupGzkFnFF8oZsASMtmyw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.xml\",\n        \"microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.transport.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets/2.2.0\": {\n      \"sha512\": \"qTACI0wePgAKCH+YKrMgChyfqJpjwgGZEtSuwBw6TjWLQ66THGasleia/7EZz2t2eAjwWxw8RA/D8ODrBqpj9A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.server.kestrel.transport.sockets/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\",\n        \"lib/netcoreapp2.1/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.xml\",\n        \"microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.server.kestrel.transport.sockets.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.StaticFiles/2.2.0\": {\n      \"sha512\": \"byZDrjir6Co5EoWbraQyG0qbPCUG6XgGYQstipMF9lucOAjq/mqnIyt8B8iMWnin/ghZoOln9Y01af4rUAwOhA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.staticfiles/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.StaticFiles.xml\",\n        \"microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.staticfiles.nuspec\"\n      ]\n    },\n    \"Microsoft.AspNetCore.WebUtilities/2.2.0\": {\n      \"sha512\": \"9ErxAAKaDzxXASB/b5uLEkLgUWv1QbeVxyJYEHQwMaxXOeFFVkQxiq8RyfVcifLU7NR0QY0p3acqx4ZpYfhHDg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.aspnetcore.webutilities/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.dll\",\n        \"lib/netstandard2.0/Microsoft.AspNetCore.WebUtilities.xml\",\n        \"microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\",\n        \"microsoft.aspnetcore.webutilities.nuspec\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.Analyzers/3.0.0\": {\n      \"sha512\": \"ojG5pGAhTPmjxRGTNvuszO3H8XPZqksDwr9xLd4Ae/JBjZZdl6GuoLk7uLMf+o7yl5wO0TAqoWcEKkEWqrZE5g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.analyzers/3.0.0\",\n      \"hasTools\": true,\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"EULA.rtf\",\n        \"ThirdPartyNotices.rtf\",\n        \"analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll\",\n        \"analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll\",\n        \"analyzers/dotnet/cs/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/de/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/es/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/it/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/cs/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll\",\n        \"analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll\",\n        \"analyzers/dotnet/vb/cs/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/de/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/es/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/fr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/it/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ja/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ko/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/pl/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/pt-BR/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/ru/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/tr/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/zh-Hans/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"analyzers/dotnet/vb/zh-Hant/Microsoft.CodeAnalysis.Analyzers.resources.dll\",\n        \"build/Microsoft.CodeAnalysis.Analyzers.props\",\n        \"build/Microsoft.CodeAnalysis.Analyzers.targets\",\n        \"documentation/Analyzer Configuration.md\",\n        \"documentation/Microsoft.CodeAnalysis.Analyzers.md\",\n        \"documentation/Microsoft.CodeAnalysis.Analyzers.sarif\",\n        \"editorconfig/AllRulesDefault/.editorconfig\",\n        \"editorconfig/AllRulesDisabled/.editorconfig\",\n        \"editorconfig/AllRulesEnabled/.editorconfig\",\n        \"editorconfig/CorrectnessRulesDefault/.editorconfig\",\n        \"editorconfig/CorrectnessRulesEnabled/.editorconfig\",\n        \"editorconfig/DataflowRulesDefault/.editorconfig\",\n        \"editorconfig/DataflowRulesEnabled/.editorconfig\",\n        \"editorconfig/LibraryRulesDefault/.editorconfig\",\n        \"editorconfig/LibraryRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCompatibilityRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCompatibilityRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCorrectnessRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisCorrectnessRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDesignRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDesignRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDocumentationRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisDocumentationRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisLocalizationRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisLocalizationRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisPerformanceRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisPerformanceRulesEnabled/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesDefault/.editorconfig\",\n        \"editorconfig/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled/.editorconfig\",\n        \"editorconfig/PortedFromFxCopRulesDefault/.editorconfig\",\n        \"editorconfig/PortedFromFxCopRulesEnabled/.editorconfig\",\n        \"microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.analyzers.nuspec\",\n        \"rulesets/AllRulesDefault.ruleset\",\n        \"rulesets/AllRulesDisabled.ruleset\",\n        \"rulesets/AllRulesEnabled.ruleset\",\n        \"rulesets/CorrectnessRulesDefault.ruleset\",\n        \"rulesets/CorrectnessRulesEnabled.ruleset\",\n        \"rulesets/DataflowRulesDefault.ruleset\",\n        \"rulesets/DataflowRulesEnabled.ruleset\",\n        \"rulesets/LibraryRulesDefault.ruleset\",\n        \"rulesets/LibraryRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCompatibilityRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCompatibilityRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCorrectnessRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisCorrectnessRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDesignRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDesignRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDocumentationRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisDocumentationRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisLocalizationRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisLocalizationRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisPerformanceRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisPerformanceRulesEnabled.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesDefault.ruleset\",\n        \"rulesets/MicrosoftCodeAnalysisReleaseTrackingRulesEnabled.ruleset\",\n        \"rulesets/PortedFromFxCopRulesDefault.ruleset\",\n        \"rulesets/PortedFromFxCopRulesEnabled.ruleset\",\n        \"tools/install.ps1\",\n        \"tools/uninstall.ps1\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.Common/3.7.0\": {\n      \"sha512\": \"SFEdnbw8204hTlde3JePYSIpNX58h/MMXa7LctUsUDigWMR8Ar9gE8LnsLqAIFM0O33JEuQbJ0G4Sat+cPGldw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.common/3.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"ThirdPartyNotices.rtf\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.pdb\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.xml\",\n        \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.pdb\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.xml\",\n        \"lib/netstandard2.0/cs/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/de/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/es/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/fr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/it/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ja/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ko/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/pl/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/ru/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/tr/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll\",\n        \"lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll\",\n        \"microsoft.codeanalysis.common.3.7.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.common.nuspec\"\n      ]\n    },\n    \"Microsoft.CodeAnalysis.CSharp/3.7.0\": {\n      \"sha512\": \"sKi5PIVy9nVDerkbplY6OQhJBNzEO4XJsMGrnmb6KFEa6K1ulGCHIv6NtDjdUQ/dGrouU3OExc3yzww0COD76w==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.codeanalysis.csharp/3.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"ThirdPartyNotices.rtf\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.pdb\",\n        \"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.xml\",\n        \"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.pdb\",\n        \"lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.xml\",\n        \"lib/netstandard2.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"lib/netstandard2.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll\",\n        \"microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\",\n        \"microsoft.codeanalysis.csharp.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration/2.2.0\": {\n      \"sha512\": \"nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.xml\",\n        \"microsoft.extensions.configuration.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.Abstractions/2.2.0\": {\n      \"sha512\": \"65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml\",\n        \"microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.Binder/2.2.0\": {\n      \"sha512\": \"vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.binder/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml\",\n        \"microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.binder.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.EnvironmentVariables/2.2.0\": {\n      \"sha512\": \"gIqt9PkKO01hZ0zmHnWrZ1E45MDreZTVoyDbL1kMWKtDgxxWTJpYtESTEcgpvR1uB1iex1zKGYzJpOMgmuP5TQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.environmentvariables/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.xml\",\n        \"microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.environmentvariables.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Configuration.FileExtensions/2.2.0\": {\n      \"sha512\": \"H1qCpWBC8Ed4tguTR/qYkbb3F6DI5Su3t8xyFo3/5MzAd8PwPpHzgX8X04KbBxKmk173Pb64x7xMHarczVFQUA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.configuration.fileextensions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.xml\",\n        \"microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.configuration.fileextensions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.DependencyInjection/2.2.0\": {\n      \"sha512\": \"MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.dependencyinjection/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net461/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/net461/Microsoft.Extensions.DependencyInjection.xml\",\n        \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.xml\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml\",\n        \"microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.dependencyinjection.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0\": {\n      \"sha512\": \"f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.dependencyinjection.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml\",\n        \"microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.dependencyinjection.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileProviders.Abstractions/2.2.0\": {\n      \"sha512\": \"EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.fileproviders.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Abstractions.xml\",\n        \"microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.fileproviders.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileProviders.Physical/2.2.0\": {\n      \"sha512\": \"tbDHZnBJkjYd9NjlRZ9ondDiv1Te3KYCTW2RWpR1B0e1Z8+EnFRo7qNnHkkSCixLdlPZzhjlX24d/PixQ7w2dA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.fileproviders.physical/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileProviders.Physical.xml\",\n        \"microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.fileproviders.physical.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.FileSystemGlobbing/2.2.0\": {\n      \"sha512\": \"ZSsHZp3PyW6vk37tDEdypjgGlNtpJ0EixBMOfUod2Thx7GtwfFSAQXUQx8a8BN8vfWKGGMbp7jPWdoHx/At4wQ==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.filesystemglobbing/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.FileSystemGlobbing.xml\",\n        \"microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.filesystemglobbing.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Hosting.Abstractions/2.2.0\": {\n      \"sha512\": \"+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.hosting.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Hosting.Abstractions.xml\",\n        \"microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.hosting.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Logging/2.2.0\": {\n      \"sha512\": \"Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.logging/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.xml\",\n        \"microsoft.extensions.logging.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.logging.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Logging.Abstractions/2.2.0\": {\n      \"sha512\": \"B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.logging.abstractions/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml\",\n        \"microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.logging.abstractions.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.ObjectPool/2.2.0\": {\n      \"sha512\": \"gA8H7uQOnM5gb+L0uTNjViHYr+hRDqCdfugheGo/MxQnuHzmhhzCBTIPm19qL1z1Xe0NEMabfcOBGv9QghlZ8g==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.objectpool/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml\",\n        \"microsoft.extensions.objectpool.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.objectpool.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Options/2.2.0\": {\n      \"sha512\": \"UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.options/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Options.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Options.xml\",\n        \"microsoft.extensions.options.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.options.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.Primitives/2.2.0\": {\n      \"sha512\": \"azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.primitives/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.Primitives.xml\",\n        \"microsoft.extensions.primitives.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.primitives.nuspec\"\n      ]\n    },\n    \"Microsoft.Extensions.WebEncoders/2.2.0\": {\n      \"sha512\": \"V8XcqYcpcdBAxUhLeyYcuKmxu4CtNQA9IphTnARpQGhkop4A93v2XgM3AtaVVJo3H2cDWxWM6aeO8HxkifREqw==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.extensions.webencoders/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.dll\",\n        \"lib/netstandard2.0/Microsoft.Extensions.WebEncoders.xml\",\n        \"microsoft.extensions.webencoders.2.2.0.nupkg.sha512\",\n        \"microsoft.extensions.webencoders.nuspec\"\n      ]\n    },\n    \"Microsoft.Net.Http.Headers/2.2.0\": {\n      \"sha512\": \"iZNkjYqlo8sIOI0bQfpsSoMTmB/kyvmV2h225ihyZT33aTp48ZpF6qYnXxzSXmHt8DpBAwBTX+1s1UFLbYfZKg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.net.http.headers/2.2.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/netstandard2.0/Microsoft.Net.Http.Headers.dll\",\n        \"lib/netstandard2.0/Microsoft.Net.Http.Headers.xml\",\n        \"microsoft.net.http.headers.2.2.0.nupkg.sha512\",\n        \"microsoft.net.http.headers.nuspec\"\n      ]\n    },\n    \"Microsoft.NETCore.Platforms/2.1.2\": {\n      \"sha512\": \"mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.platforms/2.1.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.platforms.2.1.2.nupkg.sha512\",\n        \"microsoft.netcore.platforms.nuspec\",\n        \"runtime.json\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"Microsoft.NETCore.Targets/1.1.0\": {\n      \"sha512\": \"aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.netcore.targets/1.1.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n        \"microsoft.netcore.targets.nuspec\",\n        \"runtime.json\"\n      ]\n    },\n    \"Microsoft.Win32.Primitives/4.3.0\": {\n      \"sha512\": \"9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==\",\n      \"type\": \"package\",\n      \"path\": \"microsoft.win32.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/Microsoft.Win32.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n        \"microsoft.win32.primitives.nuspec\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.dll\",\n        \"ref/netstandard1.3/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\"\n      ]\n    },\n    \"Nett/0.15.0\": {\n      \"sha512\": \"/0SoN9ugPKfmLndtKy3gaRxOlzji94/yrNgQLe45/1ZgExj0BaVozbXD+oWD8E6MCLvTs+YWzmn315mQOXGCcw==\",\n      \"type\": \"package\",\n      \"path\": \"nett/0.15.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/Nett.dll\",\n        \"lib/net40/Nett.xml\",\n        \"lib/netstandard2.0/Nett.dll\",\n        \"lib/netstandard2.0/Nett.xml\",\n        \"nett.0.15.0.nupkg.sha512\",\n        \"nett.nuspec\"\n      ]\n    },\n    \"Newtonsoft.Json/12.0.3\": {\n      \"sha512\": \"6mgjfnRB4jKMlzHSl+VD+oUc1IebOZabkbyWj2RiTgWwYPPuaK1H97G1sHqGwPlS5npiF5Q0OrxN1wni2n5QWg==\",\n      \"type\": \"package\",\n      \"path\": \"newtonsoft.json/12.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.md\",\n        \"lib/net20/Newtonsoft.Json.dll\",\n        \"lib/net20/Newtonsoft.Json.xml\",\n        \"lib/net35/Newtonsoft.Json.dll\",\n        \"lib/net35/Newtonsoft.Json.xml\",\n        \"lib/net40/Newtonsoft.Json.dll\",\n        \"lib/net40/Newtonsoft.Json.xml\",\n        \"lib/net45/Newtonsoft.Json.dll\",\n        \"lib/net45/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.0/Newtonsoft.Json.xml\",\n        \"lib/netstandard1.3/Newtonsoft.Json.dll\",\n        \"lib/netstandard1.3/Newtonsoft.Json.xml\",\n        \"lib/netstandard2.0/Newtonsoft.Json.dll\",\n        \"lib/netstandard2.0/Newtonsoft.Json.xml\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net40+sl5+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/Newtonsoft.Json.xml\",\n        \"newtonsoft.json.12.0.3.nupkg.sha512\",\n        \"newtonsoft.json.nuspec\",\n        \"packageIcon.png\"\n      ]\n    },\n    \"NLog/4.7.3\": {\n      \"sha512\": \"3pAikzwpKWki/ARyxp5tIKsSMgioyuDHuopPWorHBDUBt1vodh4zOOh5G7A3W09M3lC7TgiopjZZ18KePgIpMA==\",\n      \"type\": \"package\",\n      \"path\": \"nlog/4.7.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/monoandroid44/NLog.dll\",\n        \"lib/monoandroid44/NLog.xml\",\n        \"lib/net35/NLog.dll\",\n        \"lib/net35/NLog.xml\",\n        \"lib/net40-client/NLog.dll\",\n        \"lib/net40-client/NLog.xml\",\n        \"lib/net45/NLog.dll\",\n        \"lib/net45/NLog.xml\",\n        \"lib/netstandard1.3/NLog.dll\",\n        \"lib/netstandard1.3/NLog.xml\",\n        \"lib/netstandard1.5/NLog.dll\",\n        \"lib/netstandard1.5/NLog.xml\",\n        \"lib/netstandard2.0/NLog.dll\",\n        \"lib/netstandard2.0/NLog.xml\",\n        \"lib/sl4/NLog.dll\",\n        \"lib/sl4/NLog.xml\",\n        \"lib/sl5/NLog.dll\",\n        \"lib/sl5/NLog.xml\",\n        \"lib/wp8/NLog.dll\",\n        \"lib/wp8/NLog.xml\",\n        \"lib/xamarinios10/NLog.dll\",\n        \"lib/xamarinios10/NLog.xml\",\n        \"nlog.4.7.3.nupkg.sha512\",\n        \"nlog.nuspec\"\n      ]\n    },\n    \"PlaylistsNET/1.1.2\": {\n      \"sha512\": \"IGzVterTV49b9FjzY7gMUcxnzOvVDj6L07pjB821m+k2iHWazy/OhIvDCvGSMx1cvkY9ZBajXpQO5uUCZY51vw==\",\n      \"type\": \"package\",\n      \"path\": \"playlistsnet/1.1.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net45/PlaylistsNET.dll\",\n        \"lib/netstandard1.4/PlaylistsNET.dll\",\n        \"lib/netstandard2.0/PlaylistsNET.dll\",\n        \"playlistsnet.1.1.2.nupkg.sha512\",\n        \"playlistsnet.nuspec\"\n      ]\n    },\n    \"Portable.BouncyCastle/1.8.6.7\": {\n      \"sha512\": \"RBCAkzkBkur4w1YXFpwVdYvdm4ez7PUNyl5DsqPKDe0QSoH9xt6Mwzy1NSFSrrw4T7bCkxi06nSHCuBEuMEgfw==\",\n      \"type\": \"package\",\n      \"path\": \"portable.bouncycastle/1.8.6.7\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net40/BouncyCastle.Crypto.dll\",\n        \"lib/net40/BouncyCastle.Crypto.xml\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.dll\",\n        \"lib/netstandard2.0/BouncyCastle.Crypto.xml\",\n        \"portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n        \"portable.bouncycastle.nuspec\"\n      ]\n    },\n    \"runtime.native.System/4.3.0\": {\n      \"sha512\": \"c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==\",\n      \"type\": \"package\",\n      \"path\": \"runtime.native.system/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/netstandard1.0/_._\",\n        \"runtime.native.system.4.3.0.nupkg.sha512\",\n        \"runtime.native.system.nuspec\"\n      ]\n    },\n    \"SixLabors.ImageSharp/1.0.0\": {\n      \"sha512\": \"8amvsk8NXnCxZV0lvJppAZJknViWgBOO/2V59IGR6DVoD13mSmG+/Z9eg5IwrHQuRHp5RD9lfXBXDZyk8rTKDg==\",\n      \"type\": \"package\",\n      \"path\": \"sixlabors.imagesharp/1.0.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net472/SixLabors.ImageSharp.dll\",\n        \"lib/net472/SixLabors.ImageSharp.xml\",\n        \"lib/netcoreapp2.1/SixLabors.ImageSharp.dll\",\n        \"lib/netcoreapp2.1/SixLabors.ImageSharp.xml\",\n        \"lib/netcoreapp3.1/SixLabors.ImageSharp.dll\",\n        \"lib/netcoreapp3.1/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard1.3/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard1.3/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard2.0/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard2.0/SixLabors.ImageSharp.xml\",\n        \"lib/netstandard2.1/SixLabors.ImageSharp.dll\",\n        \"lib/netstandard2.1/SixLabors.ImageSharp.xml\",\n        \"sixlabors.imagesharp.1.0.0.nupkg.sha512\",\n        \"sixlabors.imagesharp.128.png\",\n        \"sixlabors.imagesharp.nuspec\"\n      ]\n    },\n    \"Splamy.Ed25519.Toolkit/1.0.3\": {\n      \"sha512\": \"Kygx3Rtc1m/sTqOD10oCHaBFleAJJEy/mnM3RXGF1wJZEngtfsbm+KWrfRTFlc69/yISLc1DdOJhOOqTk2h40g==\",\n      \"type\": \"package\",\n      \"path\": \"splamy.ed25519.toolkit/1.0.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"lib/net46/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.0/Chaos.NaCl.dll\",\n        \"lib/netcoreapp2.1/Chaos.NaCl.dll\",\n        \"lib/netstandard1.1/Chaos.NaCl.dll\",\n        \"lib/netstandard2.0/Chaos.NaCl.dll\",\n        \"splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n        \"splamy.ed25519.toolkit.nuspec\"\n      ]\n    },\n    \"System.Buffers/4.5.0\": {\n      \"sha512\": \"pL2ChpaRRWI/p4LXyy4RgeWlYF2sgfj/pnVMvBqwNFr5cXg7CXNnWZWxrOONLg8VGdFB8oB+EG2Qw4MLgTOe+A==\",\n      \"type\": \"package\",\n      \"path\": \"system.buffers/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.1/System.Buffers.dll\",\n        \"lib/netstandard1.1/System.Buffers.xml\",\n        \"lib/netstandard2.0/System.Buffers.dll\",\n        \"lib/netstandard2.0/System.Buffers.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"ref/net45/System.Buffers.dll\",\n        \"ref/net45/System.Buffers.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.Buffers.dll\",\n        \"ref/netstandard1.1/System.Buffers.xml\",\n        \"ref/netstandard2.0/System.Buffers.dll\",\n        \"ref/netstandard2.0/System.Buffers.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"system.buffers.4.5.0.nupkg.sha512\",\n        \"system.buffers.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Collections/4.3.0\": {\n      \"sha512\": \"3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Collections.dll\",\n        \"ref/netcore50/System.Collections.xml\",\n        \"ref/netcore50/de/System.Collections.xml\",\n        \"ref/netcore50/es/System.Collections.xml\",\n        \"ref/netcore50/fr/System.Collections.xml\",\n        \"ref/netcore50/it/System.Collections.xml\",\n        \"ref/netcore50/ja/System.Collections.xml\",\n        \"ref/netcore50/ko/System.Collections.xml\",\n        \"ref/netcore50/ru/System.Collections.xml\",\n        \"ref/netcore50/zh-hans/System.Collections.xml\",\n        \"ref/netcore50/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.0/System.Collections.dll\",\n        \"ref/netstandard1.0/System.Collections.xml\",\n        \"ref/netstandard1.0/de/System.Collections.xml\",\n        \"ref/netstandard1.0/es/System.Collections.xml\",\n        \"ref/netstandard1.0/fr/System.Collections.xml\",\n        \"ref/netstandard1.0/it/System.Collections.xml\",\n        \"ref/netstandard1.0/ja/System.Collections.xml\",\n        \"ref/netstandard1.0/ko/System.Collections.xml\",\n        \"ref/netstandard1.0/ru/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Collections.xml\",\n        \"ref/netstandard1.3/System.Collections.dll\",\n        \"ref/netstandard1.3/System.Collections.xml\",\n        \"ref/netstandard1.3/de/System.Collections.xml\",\n        \"ref/netstandard1.3/es/System.Collections.xml\",\n        \"ref/netstandard1.3/fr/System.Collections.xml\",\n        \"ref/netstandard1.3/it/System.Collections.xml\",\n        \"ref/netstandard1.3/ja/System.Collections.xml\",\n        \"ref/netstandard1.3/ko/System.Collections.xml\",\n        \"ref/netstandard1.3/ru/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Collections.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Collections.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.collections.4.3.0.nupkg.sha512\",\n        \"system.collections.nuspec\"\n      ]\n    },\n    \"System.Collections.Immutable/1.5.0\": {\n      \"sha512\": \"EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.collections.immutable/1.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/System.Collections.Immutable.dll\",\n        \"lib/netstandard1.0/System.Collections.Immutable.xml\",\n        \"lib/netstandard1.3/System.Collections.Immutable.dll\",\n        \"lib/netstandard1.3/System.Collections.Immutable.xml\",\n        \"lib/netstandard2.0/System.Collections.Immutable.dll\",\n        \"lib/netstandard2.0/System.Collections.Immutable.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml\",\n        \"system.collections.immutable.1.5.0.nupkg.sha512\",\n        \"system.collections.immutable.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.ComponentModel.Annotations/4.5.0\": {\n      \"sha512\": \"UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==\",\n      \"type\": \"package\",\n      \"path\": \"system.componentmodel.annotations/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net461/System.ComponentModel.Annotations.dll\",\n        \"lib/netcore50/System.ComponentModel.Annotations.dll\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.4/System.ComponentModel.Annotations.dll\",\n        \"lib/netstandard2.0/System.ComponentModel.Annotations.dll\",\n        \"lib/portable-net45+win8/_._\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/win8/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net461/System.ComponentModel.Annotations.dll\",\n        \"ref/net461/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/System.ComponentModel.Annotations.dll\",\n        \"ref/netcore50/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.1/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.1/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.3/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard1.4/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/de/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/es/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/it/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml\",\n        \"ref/netstandard2.0/System.ComponentModel.Annotations.dll\",\n        \"ref/netstandard2.0/System.ComponentModel.Annotations.xml\",\n        \"ref/portable-net45+win8/_._\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/win8/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.componentmodel.annotations.4.5.0.nupkg.sha512\",\n        \"system.componentmodel.annotations.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Diagnostics.Debug/4.3.0\": {\n      \"sha512\": \"ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.debug/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Diagnostics.Debug.dll\",\n        \"ref/netcore50/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.0/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.debug.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.debug.nuspec\"\n      ]\n    },\n    \"System.Diagnostics.DiagnosticSource/4.5.0\": {\n      \"sha512\": \"eIHRELiYDQvsMToML81QFkXEEYXUSUT2F28t1SGrevWqP+epFdw80SyAXIKTXOHrIEXReFOEnEr7XlGiC2GgOg==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.diagnosticsource/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net45/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/net45/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/net46/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/net46/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml\",\n        \"lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll\",\n        \"lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml\",\n        \"system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\",\n        \"system.diagnostics.diagnosticsource.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Diagnostics.Tracing/4.3.0\": {\n      \"sha512\": \"rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==\",\n      \"type\": \"package\",\n      \"path\": \"system.diagnostics.tracing/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Diagnostics.Tracing.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.dll\",\n        \"ref/netcore50/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.1/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.2/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.3/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.dll\",\n        \"ref/netstandard1.5/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/de/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/es/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/it/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n        \"system.diagnostics.tracing.nuspec\"\n      ]\n    },\n    \"System.Globalization/4.3.0\": {\n      \"sha512\": \"kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==\",\n      \"type\": \"package\",\n      \"path\": \"system.globalization/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Globalization.dll\",\n        \"ref/netcore50/System.Globalization.xml\",\n        \"ref/netcore50/de/System.Globalization.xml\",\n        \"ref/netcore50/es/System.Globalization.xml\",\n        \"ref/netcore50/fr/System.Globalization.xml\",\n        \"ref/netcore50/it/System.Globalization.xml\",\n        \"ref/netcore50/ja/System.Globalization.xml\",\n        \"ref/netcore50/ko/System.Globalization.xml\",\n        \"ref/netcore50/ru/System.Globalization.xml\",\n        \"ref/netcore50/zh-hans/System.Globalization.xml\",\n        \"ref/netcore50/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.0/System.Globalization.dll\",\n        \"ref/netstandard1.0/System.Globalization.xml\",\n        \"ref/netstandard1.0/de/System.Globalization.xml\",\n        \"ref/netstandard1.0/es/System.Globalization.xml\",\n        \"ref/netstandard1.0/fr/System.Globalization.xml\",\n        \"ref/netstandard1.0/it/System.Globalization.xml\",\n        \"ref/netstandard1.0/ja/System.Globalization.xml\",\n        \"ref/netstandard1.0/ko/System.Globalization.xml\",\n        \"ref/netstandard1.0/ru/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Globalization.xml\",\n        \"ref/netstandard1.3/System.Globalization.dll\",\n        \"ref/netstandard1.3/System.Globalization.xml\",\n        \"ref/netstandard1.3/de/System.Globalization.xml\",\n        \"ref/netstandard1.3/es/System.Globalization.xml\",\n        \"ref/netstandard1.3/fr/System.Globalization.xml\",\n        \"ref/netstandard1.3/it/System.Globalization.xml\",\n        \"ref/netstandard1.3/ja/System.Globalization.xml\",\n        \"ref/netstandard1.3/ko/System.Globalization.xml\",\n        \"ref/netstandard1.3/ru/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Globalization.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Globalization.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.globalization.4.3.0.nupkg.sha512\",\n        \"system.globalization.nuspec\"\n      ]\n    },\n    \"System.IO/4.3.0\": {\n      \"sha512\": \"3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==\",\n      \"type\": \"package\",\n      \"path\": \"system.io/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.IO.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.IO.dll\",\n        \"ref/netcore50/System.IO.dll\",\n        \"ref/netcore50/System.IO.xml\",\n        \"ref/netcore50/de/System.IO.xml\",\n        \"ref/netcore50/es/System.IO.xml\",\n        \"ref/netcore50/fr/System.IO.xml\",\n        \"ref/netcore50/it/System.IO.xml\",\n        \"ref/netcore50/ja/System.IO.xml\",\n        \"ref/netcore50/ko/System.IO.xml\",\n        \"ref/netcore50/ru/System.IO.xml\",\n        \"ref/netcore50/zh-hans/System.IO.xml\",\n        \"ref/netcore50/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.0/System.IO.dll\",\n        \"ref/netstandard1.0/System.IO.xml\",\n        \"ref/netstandard1.0/de/System.IO.xml\",\n        \"ref/netstandard1.0/es/System.IO.xml\",\n        \"ref/netstandard1.0/fr/System.IO.xml\",\n        \"ref/netstandard1.0/it/System.IO.xml\",\n        \"ref/netstandard1.0/ja/System.IO.xml\",\n        \"ref/netstandard1.0/ko/System.IO.xml\",\n        \"ref/netstandard1.0/ru/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.0/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.3/System.IO.dll\",\n        \"ref/netstandard1.3/System.IO.xml\",\n        \"ref/netstandard1.3/de/System.IO.xml\",\n        \"ref/netstandard1.3/es/System.IO.xml\",\n        \"ref/netstandard1.3/fr/System.IO.xml\",\n        \"ref/netstandard1.3/it/System.IO.xml\",\n        \"ref/netstandard1.3/ja/System.IO.xml\",\n        \"ref/netstandard1.3/ko/System.IO.xml\",\n        \"ref/netstandard1.3/ru/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.xml\",\n        \"ref/netstandard1.5/System.IO.dll\",\n        \"ref/netstandard1.5/System.IO.xml\",\n        \"ref/netstandard1.5/de/System.IO.xml\",\n        \"ref/netstandard1.5/es/System.IO.xml\",\n        \"ref/netstandard1.5/fr/System.IO.xml\",\n        \"ref/netstandard1.5/it/System.IO.xml\",\n        \"ref/netstandard1.5/ja/System.IO.xml\",\n        \"ref/netstandard1.5/ko/System.IO.xml\",\n        \"ref/netstandard1.5/ru/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hans/System.IO.xml\",\n        \"ref/netstandard1.5/zh-hant/System.IO.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.4.3.0.nupkg.sha512\",\n        \"system.io.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem/4.3.0\": {\n      \"sha512\": \"3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.nuspec\"\n      ]\n    },\n    \"System.IO.FileSystem.Primitives/4.3.0\": {\n      \"sha512\": \"6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.filesystem.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.IO.FileSystem.Primitives.dll\",\n        \"lib/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.dll\",\n        \"ref/netstandard1.3/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n        \"system.io.filesystem.primitives.nuspec\"\n      ]\n    },\n    \"System.IO.Pipelines/4.7.2\": {\n      \"sha512\": \"rGIIhoY3lUdn9rWeuGdgeZZ0P+SpJ1wZI5g8TnXqgvuhFgUP7iP9Nt5FZebYInQZQxqnwjPxdYYBE5l/8PJmqQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.io.pipelines/4.7.2\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"Icon.png\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.IO.Pipelines.dll\",\n        \"lib/net461/System.IO.Pipelines.xml\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.dll\",\n        \"lib/netcoreapp3.0/System.IO.Pipelines.xml\",\n        \"lib/netstandard1.3/System.IO.Pipelines.dll\",\n        \"lib/netstandard1.3/System.IO.Pipelines.xml\",\n        \"lib/netstandard2.0/System.IO.Pipelines.dll\",\n        \"lib/netstandard2.0/System.IO.Pipelines.xml\",\n        \"ref/net461/System.IO.Pipelines.dll\",\n        \"ref/net461/System.IO.Pipelines.xml\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.dll\",\n        \"ref/netcoreapp2.0/System.IO.Pipelines.xml\",\n        \"system.io.pipelines.4.7.2.nupkg.sha512\",\n        \"system.io.pipelines.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Linq/4.3.0\": {\n      \"sha512\": \"5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==\",\n      \"type\": \"package\",\n      \"path\": \"system.linq/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net463/System.Linq.dll\",\n        \"lib/netcore50/System.Linq.dll\",\n        \"lib/netstandard1.6/System.Linq.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net463/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.dll\",\n        \"ref/netcore50/System.Linq.xml\",\n        \"ref/netcore50/de/System.Linq.xml\",\n        \"ref/netcore50/es/System.Linq.xml\",\n        \"ref/netcore50/fr/System.Linq.xml\",\n        \"ref/netcore50/it/System.Linq.xml\",\n        \"ref/netcore50/ja/System.Linq.xml\",\n        \"ref/netcore50/ko/System.Linq.xml\",\n        \"ref/netcore50/ru/System.Linq.xml\",\n        \"ref/netcore50/zh-hans/System.Linq.xml\",\n        \"ref/netcore50/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.0/System.Linq.dll\",\n        \"ref/netstandard1.0/System.Linq.xml\",\n        \"ref/netstandard1.0/de/System.Linq.xml\",\n        \"ref/netstandard1.0/es/System.Linq.xml\",\n        \"ref/netstandard1.0/fr/System.Linq.xml\",\n        \"ref/netstandard1.0/it/System.Linq.xml\",\n        \"ref/netstandard1.0/ja/System.Linq.xml\",\n        \"ref/netstandard1.0/ko/System.Linq.xml\",\n        \"ref/netstandard1.0/ru/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Linq.xml\",\n        \"ref/netstandard1.6/System.Linq.dll\",\n        \"ref/netstandard1.6/System.Linq.xml\",\n        \"ref/netstandard1.6/de/System.Linq.xml\",\n        \"ref/netstandard1.6/es/System.Linq.xml\",\n        \"ref/netstandard1.6/fr/System.Linq.xml\",\n        \"ref/netstandard1.6/it/System.Linq.xml\",\n        \"ref/netstandard1.6/ja/System.Linq.xml\",\n        \"ref/netstandard1.6/ko/System.Linq.xml\",\n        \"ref/netstandard1.6/ru/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hans/System.Linq.xml\",\n        \"ref/netstandard1.6/zh-hant/System.Linq.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.linq.4.3.0.nupkg.sha512\",\n        \"system.linq.nuspec\"\n      ]\n    },\n    \"System.Memory/4.5.4\": {\n      \"sha512\": \"1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==\",\n      \"type\": \"package\",\n      \"path\": \"system.memory/4.5.4\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/net461/System.Memory.dll\",\n        \"lib/net461/System.Memory.xml\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.1/System.Memory.dll\",\n        \"lib/netstandard1.1/System.Memory.xml\",\n        \"lib/netstandard2.0/System.Memory.dll\",\n        \"lib/netstandard2.0/System.Memory.xml\",\n        \"ref/netcoreapp2.1/_._\",\n        \"system.memory.4.5.4.nupkg.sha512\",\n        \"system.memory.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Net.NetworkInformation/4.3.0\": {\n      \"sha512\": \"zNVmWVry0pAu7lcrRBhwwU96WUdbsrGL3azyzsbXmVNptae1+Za+UgOe9Z6s8iaWhPn7/l4wQqhC56HZWq7tkg==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.networkinformation/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net46/System.Net.NetworkInformation.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net46/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.dll\",\n        \"ref/netcore50/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/de/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/es/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/it/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netcore50/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.0/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"ref/netstandard1.3/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/de/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/es/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/fr/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/it/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ja/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ko/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/ru/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.NetworkInformation.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.NetworkInformation.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/linux/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/osx/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/net46/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netcore50/System.Net.NetworkInformation.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Net.NetworkInformation.dll\",\n        \"system.net.networkinformation.4.3.0.nupkg.sha512\",\n        \"system.net.networkinformation.nuspec\"\n      ]\n    },\n    \"System.Net.Primitives/4.3.0\": {\n      \"sha512\": \"qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Net.Primitives.dll\",\n        \"ref/netcore50/System.Net.Primitives.xml\",\n        \"ref/netcore50/de/System.Net.Primitives.xml\",\n        \"ref/netcore50/es/System.Net.Primitives.xml\",\n        \"ref/netcore50/fr/System.Net.Primitives.xml\",\n        \"ref/netcore50/it/System.Net.Primitives.xml\",\n        \"ref/netcore50/ja/System.Net.Primitives.xml\",\n        \"ref/netcore50/ko/System.Net.Primitives.xml\",\n        \"ref/netcore50/ru/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/System.Net.Primitives.dll\",\n        \"ref/netstandard1.0/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/System.Net.Primitives.dll\",\n        \"ref/netstandard1.1/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/System.Net.Primitives.dll\",\n        \"ref/netstandard1.3/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/de/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/es/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/it/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Primitives.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.primitives.4.3.0.nupkg.sha512\",\n        \"system.net.primitives.nuspec\"\n      ]\n    },\n    \"System.Net.Sockets/4.3.0\": {\n      \"sha512\": \"m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==\",\n      \"type\": \"package\",\n      \"path\": \"system.net.sockets/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Net.Sockets.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.dll\",\n        \"ref/netstandard1.3/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/de/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/es/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/fr/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/it/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ja/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ko/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/ru/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Net.Sockets.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Net.Sockets.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.net.sockets.4.3.0.nupkg.sha512\",\n        \"system.net.sockets.nuspec\"\n      ]\n    },\n    \"System.Numerics.Vectors/4.5.0\": {\n      \"sha512\": \"QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.numerics.vectors/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Numerics.Vectors.dll\",\n        \"lib/net46/System.Numerics.Vectors.xml\",\n        \"lib/netcoreapp2.0/_._\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"lib/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/System.Numerics.Vectors.dll\",\n        \"ref/net45/System.Numerics.Vectors.xml\",\n        \"ref/net46/System.Numerics.Vectors.dll\",\n        \"ref/net46/System.Numerics.Vectors.xml\",\n        \"ref/netcoreapp2.0/_._\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard1.0/System.Numerics.Vectors.xml\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.dll\",\n        \"ref/netstandard2.0/System.Numerics.Vectors.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.numerics.vectors.4.5.0.nupkg.sha512\",\n        \"system.numerics.vectors.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Reflection/4.3.0\": {\n      \"sha512\": \"KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Reflection.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.dll\",\n        \"ref/netcore50/System.Reflection.xml\",\n        \"ref/netcore50/de/System.Reflection.xml\",\n        \"ref/netcore50/es/System.Reflection.xml\",\n        \"ref/netcore50/fr/System.Reflection.xml\",\n        \"ref/netcore50/it/System.Reflection.xml\",\n        \"ref/netcore50/ja/System.Reflection.xml\",\n        \"ref/netcore50/ko/System.Reflection.xml\",\n        \"ref/netcore50/ru/System.Reflection.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.0/System.Reflection.dll\",\n        \"ref/netstandard1.0/System.Reflection.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.3/System.Reflection.dll\",\n        \"ref/netstandard1.3/System.Reflection.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.xml\",\n        \"ref/netstandard1.5/System.Reflection.dll\",\n        \"ref/netstandard1.5/System.Reflection.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.4.3.0.nupkg.sha512\",\n        \"system.reflection.nuspec\"\n      ]\n    },\n    \"System.Reflection.Metadata/1.6.0\": {\n      \"sha512\": \"COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.metadata/1.6.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.1/System.Reflection.Metadata.dll\",\n        \"lib/netstandard1.1/System.Reflection.Metadata.xml\",\n        \"lib/netstandard2.0/System.Reflection.Metadata.dll\",\n        \"lib/netstandard2.0/System.Reflection.Metadata.xml\",\n        \"lib/portable-net45+win8/System.Reflection.Metadata.dll\",\n        \"lib/portable-net45+win8/System.Reflection.Metadata.xml\",\n        \"system.reflection.metadata.1.6.0.nupkg.sha512\",\n        \"system.reflection.metadata.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Reflection.Primitives/4.3.0\": {\n      \"sha512\": \"5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.primitives/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Reflection.Primitives.dll\",\n        \"ref/netcore50/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/de/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/es/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/fr/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/it/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ja/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ko/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/ru/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netcore50/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.dll\",\n        \"ref/netstandard1.0/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/de/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/es/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/fr/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/it/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ja/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ko/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/ru/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.reflection.primitives.4.3.0.nupkg.sha512\",\n        \"system.reflection.primitives.nuspec\"\n      ]\n    },\n    \"System.Reflection.TypeExtensions/4.3.0\": {\n      \"sha512\": \"7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==\",\n      \"type\": \"package\",\n      \"path\": \"system.reflection.typeextensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Reflection.TypeExtensions.dll\",\n        \"lib/net462/System.Reflection.TypeExtensions.dll\",\n        \"lib/netcore50/System.Reflection.TypeExtensions.dll\",\n        \"lib/netstandard1.5/System.Reflection.TypeExtensions.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Reflection.TypeExtensions.dll\",\n        \"ref/net462/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.3/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.3/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/System.Reflection.TypeExtensions.dll\",\n        \"ref/netstandard1.5/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll\",\n        \"system.reflection.typeextensions.4.3.0.nupkg.sha512\",\n        \"system.reflection.typeextensions.nuspec\"\n      ]\n    },\n    \"System.Resources.ResourceManager/4.3.0\": {\n      \"sha512\": \"/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==\",\n      \"type\": \"package\",\n      \"path\": \"system.resources.resourcemanager/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Resources.ResourceManager.dll\",\n        \"ref/netcore50/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/de/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/es/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/it/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netcore50/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.dll\",\n        \"ref/netstandard1.0/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/de/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/es/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/fr/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/it/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ja/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ko/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/ru/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n        \"system.resources.resourcemanager.nuspec\"\n      ]\n    },\n    \"System.Runtime/4.3.0\": {\n      \"sha512\": \"JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.dll\",\n        \"lib/portable-net45+win8+wp80+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.dll\",\n        \"ref/netcore50/System.Runtime.xml\",\n        \"ref/netcore50/de/System.Runtime.xml\",\n        \"ref/netcore50/es/System.Runtime.xml\",\n        \"ref/netcore50/fr/System.Runtime.xml\",\n        \"ref/netcore50/it/System.Runtime.xml\",\n        \"ref/netcore50/ja/System.Runtime.xml\",\n        \"ref/netcore50/ko/System.Runtime.xml\",\n        \"ref/netcore50/ru/System.Runtime.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.0/System.Runtime.dll\",\n        \"ref/netstandard1.0/System.Runtime.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.2/System.Runtime.dll\",\n        \"ref/netstandard1.2/System.Runtime.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.3/System.Runtime.dll\",\n        \"ref/netstandard1.3/System.Runtime.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.xml\",\n        \"ref/netstandard1.5/System.Runtime.dll\",\n        \"ref/netstandard1.5/System.Runtime.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.xml\",\n        \"ref/portable-net45+win8+wp80+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.4.3.0.nupkg.sha512\",\n        \"system.runtime.nuspec\"\n      ]\n    },\n    \"System.Runtime.CompilerServices.Unsafe/4.7.0\": {\n      \"sha512\": \"IpU1lcHz8/09yDr9N+Juc7SCgNUz+RohkCQI+KsWKR67XxpFr8Z6c8t1iENCXZuRuNCc4HBwme/MDHNVCwyAKg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.compilerservices.unsafe/4.7.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll\",\n        \"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml\",\n        \"system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\",\n        \"system.runtime.compilerservices.unsafe.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Runtime.Extensions/4.3.0\": {\n      \"sha512\": \"guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.extensions/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.dll\",\n        \"ref/netcore50/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/de/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/es/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/fr/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/it/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ja/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ko/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/ru/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.0/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.3/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.dll\",\n        \"ref/netstandard1.5/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.extensions.4.3.0.nupkg.sha512\",\n        \"system.runtime.extensions.nuspec\"\n      ]\n    },\n    \"System.Runtime.Handles/4.3.0\": {\n      \"sha512\": \"OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.handles/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/_._\",\n        \"ref/netstandard1.3/System.Runtime.Handles.dll\",\n        \"ref/netstandard1.3/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.handles.4.3.0.nupkg.sha512\",\n        \"system.runtime.handles.nuspec\"\n      ]\n    },\n    \"System.Runtime.InteropServices/4.3.0\": {\n      \"sha512\": \"uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.runtime.interopservices/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/net462/System.Runtime.InteropServices.dll\",\n        \"lib/net463/System.Runtime.InteropServices.dll\",\n        \"lib/portable-net45+win8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/net462/System.Runtime.InteropServices.dll\",\n        \"ref/net463/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.dll\",\n        \"ref/netcore50/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/de/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/es/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/it/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netcore50/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netcoreapp1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.1/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.2/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.3/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.dll\",\n        \"ref/netstandard1.5/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/de/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/es/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/fr/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/it/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ja/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ko/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/ru/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml\",\n        \"ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml\",\n        \"ref/portable-net45+win8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.runtime.interopservices.4.3.0.nupkg.sha512\",\n        \"system.runtime.interopservices.nuspec\"\n      ]\n    },\n    \"System.Security.Claims/4.3.0\": {\n      \"sha512\": \"P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.claims/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Claims.dll\",\n        \"lib/netstandard1.3/System.Security.Claims.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.dll\",\n        \"ref/netstandard1.3/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/de/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/es/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/it/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Claims.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Claims.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.claims.4.3.0.nupkg.sha512\",\n        \"system.security.claims.nuspec\"\n      ]\n    },\n    \"System.Security.Cryptography.Cng/4.5.0\": {\n      \"sha512\": \"WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.cryptography.cng/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Security.Cryptography.Cng.dll\",\n        \"lib/net461/System.Security.Cryptography.Cng.dll\",\n        \"lib/net462/System.Security.Cryptography.Cng.dll\",\n        \"lib/net47/System.Security.Cryptography.Cng.dll\",\n        \"lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.3/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"lib/netstandard2.0/System.Security.Cryptography.Cng.dll\",\n        \"lib/uap10.0.16299/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Security.Cryptography.Cng.dll\",\n        \"ref/net461/System.Security.Cryptography.Cng.dll\",\n        \"ref/net461/System.Security.Cryptography.Cng.xml\",\n        \"ref/net462/System.Security.Cryptography.Cng.dll\",\n        \"ref/net462/System.Security.Cryptography.Cng.xml\",\n        \"ref/net47/System.Security.Cryptography.Cng.dll\",\n        \"ref/net47/System.Security.Cryptography.Cng.xml\",\n        \"ref/netcoreapp2.0/System.Security.Cryptography.Cng.dll\",\n        \"ref/netcoreapp2.0/System.Security.Cryptography.Cng.xml\",\n        \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"ref/netcoreapp2.1/System.Security.Cryptography.Cng.xml\",\n        \"ref/netstandard1.3/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard2.0/System.Security.Cryptography.Cng.dll\",\n        \"ref/netstandard2.0/System.Security.Cryptography.Cng.xml\",\n        \"ref/uap10.0.16299/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/net47/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netcoreapp2.0/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll\",\n        \"runtimes/win/lib/uap10.0.16299/_._\",\n        \"system.security.cryptography.cng.4.5.0.nupkg.sha512\",\n        \"system.security.cryptography.cng.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Security.Principal/4.3.0\": {\n      \"sha512\": \"I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Security.Principal.dll\",\n        \"lib/netstandard1.0/System.Security.Principal.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Security.Principal.dll\",\n        \"ref/netcore50/System.Security.Principal.xml\",\n        \"ref/netcore50/de/System.Security.Principal.xml\",\n        \"ref/netcore50/es/System.Security.Principal.xml\",\n        \"ref/netcore50/fr/System.Security.Principal.xml\",\n        \"ref/netcore50/it/System.Security.Principal.xml\",\n        \"ref/netcore50/ja/System.Security.Principal.xml\",\n        \"ref/netcore50/ko/System.Security.Principal.xml\",\n        \"ref/netcore50/ru/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hans/System.Security.Principal.xml\",\n        \"ref/netcore50/zh-hant/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/System.Security.Principal.dll\",\n        \"ref/netstandard1.0/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/de/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/es/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/fr/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/it/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ja/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ko/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/ru/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Security.Principal.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Security.Principal.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.security.principal.4.3.0.nupkg.sha512\",\n        \"system.security.principal.nuspec\"\n      ]\n    },\n    \"System.Security.Principal.Windows/4.3.0\": {\n      \"sha512\": \"HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==\",\n      \"type\": \"package\",\n      \"path\": \"system.security.principal.windows/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Security.Principal.Windows.dll\",\n        \"ref/net46/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"ref/netstandard1.3/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/de/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/es/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/fr/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/it/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ja/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ko/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/ru/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/net46/System.Security.Principal.Windows.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll\",\n        \"system.security.principal.windows.4.3.0.nupkg.sha512\",\n        \"system.security.principal.windows.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding/4.3.0\": {\n      \"sha512\": \"BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Text.Encoding.dll\",\n        \"ref/netcore50/System.Text.Encoding.xml\",\n        \"ref/netcore50/de/System.Text.Encoding.xml\",\n        \"ref/netcore50/es/System.Text.Encoding.xml\",\n        \"ref/netcore50/fr/System.Text.Encoding.xml\",\n        \"ref/netcore50/it/System.Text.Encoding.xml\",\n        \"ref/netcore50/ja/System.Text.Encoding.xml\",\n        \"ref/netcore50/ko/System.Text.Encoding.xml\",\n        \"ref/netcore50/ru/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netcore50/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/System.Text.Encoding.dll\",\n        \"ref/netstandard1.0/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/System.Text.Encoding.dll\",\n        \"ref/netstandard1.3/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/de/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/es/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/fr/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/it/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ja/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ko/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/ru/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Text.Encoding.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Text.Encoding.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.text.encoding.4.3.0.nupkg.sha512\",\n        \"system.text.encoding.nuspec\"\n      ]\n    },\n    \"System.Text.Encoding.CodePages/4.5.1\": {\n      \"sha512\": \"4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encoding.codepages/4.5.1\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Text.Encoding.CodePages.dll\",\n        \"lib/net461/System.Text.Encoding.CodePages.dll\",\n        \"lib/netstandard1.3/System.Text.Encoding.CodePages.dll\",\n        \"lib/netstandard2.0/System.Text.Encoding.CodePages.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/win/lib/net461/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netcoreapp2.0/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll\",\n        \"runtimes/win/lib/netstandard2.0/System.Text.Encoding.CodePages.dll\",\n        \"system.text.encoding.codepages.4.5.1.nupkg.sha512\",\n        \"system.text.encoding.codepages.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Text.Encodings.Web/4.5.0\": {\n      \"sha512\": \"Xg4G4Indi4dqP1iuAiMSwpiWS54ZghzR644OtsRCm/m/lBMG8dUBhLVN7hLm8NNrNTR+iGbshCPTwrvxZPlm4g==\",\n      \"type\": \"package\",\n      \"path\": \"system.text.encodings.web/4.5.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/netstandard1.0/System.Text.Encodings.Web.dll\",\n        \"lib/netstandard1.0/System.Text.Encodings.Web.xml\",\n        \"lib/netstandard2.0/System.Text.Encodings.Web.dll\",\n        \"lib/netstandard2.0/System.Text.Encodings.Web.xml\",\n        \"system.text.encodings.web.4.5.0.nupkg.sha512\",\n        \"system.text.encodings.web.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading/4.3.0\": {\n      \"sha512\": \"VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/netcore50/System.Threading.dll\",\n        \"lib/netstandard1.3/System.Threading.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.dll\",\n        \"ref/netcore50/System.Threading.xml\",\n        \"ref/netcore50/de/System.Threading.xml\",\n        \"ref/netcore50/es/System.Threading.xml\",\n        \"ref/netcore50/fr/System.Threading.xml\",\n        \"ref/netcore50/it/System.Threading.xml\",\n        \"ref/netcore50/ja/System.Threading.xml\",\n        \"ref/netcore50/ko/System.Threading.xml\",\n        \"ref/netcore50/ru/System.Threading.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.0/System.Threading.dll\",\n        \"ref/netstandard1.0/System.Threading.xml\",\n        \"ref/netstandard1.0/de/System.Threading.xml\",\n        \"ref/netstandard1.0/es/System.Threading.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.xml\",\n        \"ref/netstandard1.0/it/System.Threading.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.xml\",\n        \"ref/netstandard1.3/System.Threading.dll\",\n        \"ref/netstandard1.3/System.Threading.xml\",\n        \"ref/netstandard1.3/de/System.Threading.xml\",\n        \"ref/netstandard1.3/es/System.Threading.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.xml\",\n        \"ref/netstandard1.3/it/System.Threading.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"runtimes/aot/lib/netcore50/System.Threading.dll\",\n        \"system.threading.4.3.0.nupkg.sha512\",\n        \"system.threading.nuspec\"\n      ]\n    },\n    \"System.Threading.Overlapped/4.3.0\": {\n      \"sha512\": \"m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.overlapped/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/net46/System.Threading.Overlapped.dll\",\n        \"ref/net46/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"ref/netstandard1.3/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml\",\n        \"runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/net46/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netcore50/System.Threading.Overlapped.dll\",\n        \"runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll\",\n        \"system.threading.overlapped.4.3.0.nupkg.sha512\",\n        \"system.threading.overlapped.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks/4.3.0\": {\n      \"sha512\": \"LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net45/_._\",\n        \"lib/portable-net45+win8+wp8+wpa81/_._\",\n        \"lib/win8/_._\",\n        \"lib/wp80/_._\",\n        \"lib/wpa81/_._\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net45/_._\",\n        \"ref/netcore50/System.Threading.Tasks.dll\",\n        \"ref/netcore50/System.Threading.Tasks.xml\",\n        \"ref/netcore50/de/System.Threading.Tasks.xml\",\n        \"ref/netcore50/es/System.Threading.Tasks.xml\",\n        \"ref/netcore50/fr/System.Threading.Tasks.xml\",\n        \"ref/netcore50/it/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ja/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ko/System.Threading.Tasks.xml\",\n        \"ref/netcore50/ru/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netcore50/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.0/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/System.Threading.Tasks.dll\",\n        \"ref/netstandard1.3/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml\",\n        \"ref/portable-net45+win8+wp8+wpa81/_._\",\n        \"ref/win8/_._\",\n        \"ref/wp80/_._\",\n        \"ref/wpa81/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.4.3.0.nupkg.sha512\",\n        \"system.threading.tasks.nuspec\"\n      ]\n    },\n    \"System.Threading.Tasks.Extensions/4.5.3\": {\n      \"sha512\": \"+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.tasks.extensions/4.5.3\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"LICENSE.TXT\",\n        \"THIRD-PARTY-NOTICES.TXT\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/netcoreapp2.1/_._\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard1.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.dll\",\n        \"lib/netstandard2.0/System.Threading.Tasks.Extensions.xml\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll\",\n        \"lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/netcoreapp2.1/_._\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.tasks.extensions.4.5.3.nupkg.sha512\",\n        \"system.threading.tasks.extensions.nuspec\",\n        \"useSharedDesignerContext.txt\",\n        \"version.txt\"\n      ]\n    },\n    \"System.Threading.Thread/4.3.0\": {\n      \"sha512\": \"OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.thread/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.Thread.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.Thread.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.dll\",\n        \"ref/netstandard1.3/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/de/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/es/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/it/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.Thread.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.Thread.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.thread.4.3.0.nupkg.sha512\",\n        \"system.threading.thread.nuspec\"\n      ]\n    },\n    \"System.Threading.ThreadPool/4.3.0\": {\n      \"sha512\": \"k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==\",\n      \"type\": \"package\",\n      \"path\": \"system.threading.threadpool/4.3.0\",\n      \"files\": [\n        \".nupkg.metadata\",\n        \".signature.p7s\",\n        \"ThirdPartyNotices.txt\",\n        \"dotnet_library_license.txt\",\n        \"lib/MonoAndroid10/_._\",\n        \"lib/MonoTouch10/_._\",\n        \"lib/net46/System.Threading.ThreadPool.dll\",\n        \"lib/netcore50/_._\",\n        \"lib/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"lib/xamarinios10/_._\",\n        \"lib/xamarinmac20/_._\",\n        \"lib/xamarintvos10/_._\",\n        \"lib/xamarinwatchos10/_._\",\n        \"ref/MonoAndroid10/_._\",\n        \"ref/MonoTouch10/_._\",\n        \"ref/net46/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.dll\",\n        \"ref/netstandard1.3/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/de/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/es/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/fr/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/it/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ja/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ko/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/ru/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml\",\n        \"ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml\",\n        \"ref/xamarinios10/_._\",\n        \"ref/xamarinmac20/_._\",\n        \"ref/xamarintvos10/_._\",\n        \"ref/xamarinwatchos10/_._\",\n        \"system.threading.threadpool.4.3.0.nupkg.sha512\",\n        \"system.threading.threadpool.nuspec\"\n      ]\n    },\n    \"Splamy.TSLib/1.1.0\": {\n      \"type\": \"project\",\n      \"path\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\",\n      \"msbuildProject\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n    },\n    \"TS3AudioBot/1.0.0\": {\n      \"type\": \"project\",\n      \"path\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\",\n      \"msbuildProject\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\"\n    }\n  },\n  \"projectFileDependencyGroups\": {\n    \".NETCoreApp,Version=v3.1\": [\n      \"Splamy.TSLib >= 1.1.0\",\n      \"TS3AudioBot >= 1.0.0\"\n    ]\n  },\n  \"packageFolders\": {\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\": {}\n  },\n  \"project\": {\n    \"version\": \"1.0.0\",\n    \"restore\": {\n      \"projectUniqueName\": \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\ClassLibrary4.csproj\",\n      \"projectName\": \"YunBot\",\n      \"projectPath\": \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\ClassLibrary4.csproj\",\n      \"packagesPath\": \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\\",\n      \"outputPath\": \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\obj\\\\\",\n      \"projectStyle\": \"PackageReference\",\n      \"configFilePaths\": [\n        \"C:\\\\Users\\\\Saopig\\\\AppData\\\\Roaming\\\\NuGet\\\\NuGet.Config\",\n        \"C:\\\\Program Files (x86)\\\\NuGet\\\\Config\\\\Microsoft.VisualStudio.Offline.config\"\n      ],\n      \"originalTargetFrameworks\": [\n        \"netcoreapp3.1\"\n      ],\n      \"sources\": {\n        \"C:\\\\Program Files (x86)\\\\Microsoft SDKs\\\\NuGetPackages\\\\\": {},\n        \"https://api.nuget.org/v3/index.json\": {}\n      },\n      \"frameworks\": {\n        \"netcoreapp3.1\": {\n          \"targetAlias\": \"netcoreapp3.1\",\n          \"projectReferences\": {\n            \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\": {\n              \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TS3AudioBot\\\\TS3AudioBot.csproj\"\n            },\n            \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\": {\n              \"projectPath\": \"G:\\\\TS3DEV\\\\TS3AudioBot-master\\\\TSLib\\\\TSLib.csproj\"\n            }\n          }\n        }\n      },\n      \"warningProperties\": {\n        \"warnAsError\": [\n          \"NU1605\"\n        ]\n      }\n    },\n    \"frameworks\": {\n      \"netcoreapp3.1\": {\n        \"targetAlias\": \"netcoreapp3.1\",\n        \"imports\": [\n          \"net461\",\n          \"net462\",\n          \"net47\",\n          \"net471\",\n          \"net472\",\n          \"net48\"\n        ],\n        \"assetTargetFallback\": true,\n        \"warn\": true,\n        \"frameworkReferences\": {\n          \"Microsoft.NETCore.App\": {\n            \"privateAssets\": \"all\"\n          }\n        },\n        \"runtimeIdentifierGraphPath\": \"C:\\\\Program Files\\\\dotnet\\\\sdk\\\\5.0.416\\\\RuntimeIdentifierGraph.json\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "obj/project.nuget.cache",
    "content": "{\n  \"version\": 2,\n  \"dgSpecHash\": \"pnQ6NJtIspPocDo9pXa2zhiiOXgyT2kdgFOvP8mP0A6KgmFR5CVfZwajnBewYIe6WSeHhIojg8fh2TaTL75FRg==\",\n  \"success\": true,\n  \"projectFilePath\": \"C:\\\\Users\\\\Saopig\\\\source\\\\repos\\\\ClassLibrary4\\\\ClassLibrary4.csproj\",\n  \"expectedPackageFiles\": [\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\cliwrap\\\\3.1.0\\\\cliwrap.3.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\commandlineparser\\\\2.8.0\\\\commandlineparser.2.8.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\heijden.dns.portable\\\\2.0.19\\\\heijden.dns.portable.2.0.19.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\litedb\\\\4.1.4\\\\litedb.4.1.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.connections.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.connections.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.cors\\\\2.2.0\\\\microsoft.aspnetcore.cors.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting\\\\2.2.0\\\\microsoft.aspnetcore.hosting.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.hosting.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.hosting.server.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.hosting.server.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http\\\\2.2.0\\\\microsoft.aspnetcore.http.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.http.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.extensions\\\\2.2.0\\\\microsoft.aspnetcore.http.extensions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.http.features\\\\2.2.0\\\\microsoft.aspnetcore.http.features.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.core\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.core.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.https\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.https.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.transport.abstractions\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.transport.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.server.kestrel.transport.sockets\\\\2.2.0\\\\microsoft.aspnetcore.server.kestrel.transport.sockets.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.staticfiles\\\\2.2.0\\\\microsoft.aspnetcore.staticfiles.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.aspnetcore.webutilities\\\\2.2.0\\\\microsoft.aspnetcore.webutilities.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.analyzers\\\\3.0.0\\\\microsoft.codeanalysis.analyzers.3.0.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.common\\\\3.7.0\\\\microsoft.codeanalysis.common.3.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.codeanalysis.csharp\\\\3.7.0\\\\microsoft.codeanalysis.csharp.3.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration\\\\2.2.0\\\\microsoft.extensions.configuration.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.abstractions\\\\2.2.0\\\\microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.binder\\\\2.2.0\\\\microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.environmentvariables\\\\2.2.0\\\\microsoft.extensions.configuration.environmentvariables.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.configuration.fileextensions\\\\2.2.0\\\\microsoft.extensions.configuration.fileextensions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.dependencyinjection\\\\2.2.0\\\\microsoft.extensions.dependencyinjection.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.dependencyinjection.abstractions\\\\2.2.0\\\\microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.fileproviders.abstractions\\\\2.2.0\\\\microsoft.extensions.fileproviders.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.fileproviders.physical\\\\2.2.0\\\\microsoft.extensions.fileproviders.physical.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.filesystemglobbing\\\\2.2.0\\\\microsoft.extensions.filesystemglobbing.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.hosting.abstractions\\\\2.2.0\\\\microsoft.extensions.hosting.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.logging\\\\2.2.0\\\\microsoft.extensions.logging.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.logging.abstractions\\\\2.2.0\\\\microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.objectpool\\\\2.2.0\\\\microsoft.extensions.objectpool.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.options\\\\2.2.0\\\\microsoft.extensions.options.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.primitives\\\\2.2.0\\\\microsoft.extensions.primitives.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.extensions.webencoders\\\\2.2.0\\\\microsoft.extensions.webencoders.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.net.http.headers\\\\2.2.0\\\\microsoft.net.http.headers.2.2.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.netcore.platforms\\\\2.1.2\\\\microsoft.netcore.platforms.2.1.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.netcore.targets\\\\1.1.0\\\\microsoft.netcore.targets.1.1.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\microsoft.win32.primitives\\\\4.3.0\\\\microsoft.win32.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\nett\\\\0.15.0\\\\nett.0.15.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\newtonsoft.json\\\\12.0.3\\\\newtonsoft.json.12.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\nlog\\\\4.7.3\\\\nlog.4.7.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\playlistsnet\\\\1.1.2\\\\playlistsnet.1.1.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\portable.bouncycastle\\\\1.8.6.7\\\\portable.bouncycastle.1.8.6.7.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\runtime.native.system\\\\4.3.0\\\\runtime.native.system.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\sixlabors.imagesharp\\\\1.0.0\\\\sixlabors.imagesharp.1.0.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\splamy.ed25519.toolkit\\\\1.0.3\\\\splamy.ed25519.toolkit.1.0.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.buffers\\\\4.5.0\\\\system.buffers.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.collections\\\\4.3.0\\\\system.collections.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.collections.immutable\\\\1.5.0\\\\system.collections.immutable.1.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.componentmodel.annotations\\\\4.5.0\\\\system.componentmodel.annotations.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.diagnostics.debug\\\\4.3.0\\\\system.diagnostics.debug.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.diagnostics.diagnosticsource\\\\4.5.0\\\\system.diagnostics.diagnosticsource.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.diagnostics.tracing\\\\4.3.0\\\\system.diagnostics.tracing.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.globalization\\\\4.3.0\\\\system.globalization.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io\\\\4.3.0\\\\system.io.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.filesystem\\\\4.3.0\\\\system.io.filesystem.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.filesystem.primitives\\\\4.3.0\\\\system.io.filesystem.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.io.pipelines\\\\4.7.2\\\\system.io.pipelines.4.7.2.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.linq\\\\4.3.0\\\\system.linq.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.memory\\\\4.5.4\\\\system.memory.4.5.4.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.networkinformation\\\\4.3.0\\\\system.net.networkinformation.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.primitives\\\\4.3.0\\\\system.net.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.net.sockets\\\\4.3.0\\\\system.net.sockets.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.numerics.vectors\\\\4.5.0\\\\system.numerics.vectors.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection\\\\4.3.0\\\\system.reflection.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection.metadata\\\\1.6.0\\\\system.reflection.metadata.1.6.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection.primitives\\\\4.3.0\\\\system.reflection.primitives.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.reflection.typeextensions\\\\4.3.0\\\\system.reflection.typeextensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.resources.resourcemanager\\\\4.3.0\\\\system.resources.resourcemanager.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime\\\\4.3.0\\\\system.runtime.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.compilerservices.unsafe\\\\4.7.0\\\\system.runtime.compilerservices.unsafe.4.7.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.extensions\\\\4.3.0\\\\system.runtime.extensions.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.handles\\\\4.3.0\\\\system.runtime.handles.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.runtime.interopservices\\\\4.3.0\\\\system.runtime.interopservices.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.claims\\\\4.3.0\\\\system.security.claims.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.cryptography.cng\\\\4.5.0\\\\system.security.cryptography.cng.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.principal\\\\4.3.0\\\\system.security.principal.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.security.principal.windows\\\\4.3.0\\\\system.security.principal.windows.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.text.encoding\\\\4.3.0\\\\system.text.encoding.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.text.encoding.codepages\\\\4.5.1\\\\system.text.encoding.codepages.4.5.1.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.text.encodings.web\\\\4.5.0\\\\system.text.encodings.web.4.5.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading\\\\4.3.0\\\\system.threading.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.overlapped\\\\4.3.0\\\\system.threading.overlapped.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.tasks\\\\4.3.0\\\\system.threading.tasks.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.tasks.extensions\\\\4.5.3\\\\system.threading.tasks.extensions.4.5.3.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.thread\\\\4.3.0\\\\system.threading.thread.4.3.0.nupkg.sha512\",\n    \"C:\\\\Users\\\\Saopig\\\\.nuget\\\\packages\\\\system.threading.threadpool\\\\4.3.0\\\\system.threading.threadpool.4.3.0.nupkg.sha512\"\n  ],\n  \"logs\": []\n}"
  }
]