[
  {
    "path": ".gitignore",
    "content": "# Build results\n\n[Dd]ebug/\n[Rr]elease/\nx64/\napp.publish/\n[Bb]in/\n[Oo]bj/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# Visual Studio\n*.suo\n*.user\n*.sln.docstates\n*.sln.ide/\nproject.lock.json\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n\n#GhostDoc\n*.GhostDoc.xml\n\n# NuGet Packages Directory\npackages/\n\n# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Mac crap\n.DS_Store\n\n\n####################\n#\n#  Current Project\n#\n####################\n\n.vs/\nartifacts/\n*.log\n/test/BenchmarkTest/BenchmarkDotNet.Artifacts\n"
  },
  {
    "path": "BloomFilter.NetCore.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31903.59\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{8D22B289-3A76-4399-BDA3-FD1B699B2F13}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"test\", \"test\", \"{BFDF8E72-A7F7-4894-8782-74BB34438F99}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Demo\", \"test\\Demo\\Demo.csproj\", \"{42A8F6A2-7CE7-493F-B3A7-07A1753F5285}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BloomFilter\", \"src\\BloomFilter\\BloomFilter.csproj\", \"{E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BloomFilterTest\", \"test\\BloomFilterTest\\BloomFilterTest.csproj\", \"{24193FBE-88A5-4C26-9996-341DEBE0CA80}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"PerformanceTest\", \"test\\PerformanceTest\\PerformanceTest.csproj\", \"{D46EEAAF-36FD-4297-9381-1845C93D13C4}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BloomFilter.Redis\", \"src\\BloomFilter.Redis\\BloomFilter.Redis.csproj\", \"{4A858860-7405-43F4-9132-0DF40BADBDAD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BloomFilter.Redis.Test\", \"test\\BloomFilter.Redis.Test\\BloomFilter.Redis.Test.csproj\", \"{C02DC47A-7258-4B59-AAB4-DFA208DE9B36}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BenchmarkTest\", \"test\\BenchmarkTest\\BenchmarkTest.csproj\", \"{CFB47A7F-580A-4F4B-940D-03D99EE70C41}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BloomFilter.CSRedis\", \"src\\BloomFilter.CSRedis\\BloomFilter.CSRedis.csproj\", \"{903B0A3A-1753-47CA-ADBC-B4379FF8F372}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BloomFilter.EasyCaching\", \"src\\BloomFilter.EasyCaching\\BloomFilter.EasyCaching.csproj\", \"{C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BloomFilter.FreeRedis\", \"src\\BloomFilter.FreeRedis\\BloomFilter.FreeRedis.csproj\", \"{311303FD-7ABA-4C7D-AA5C-90E265FA04A7}\"\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{42A8F6A2-7CE7-493F-B3A7-07A1753F5285}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{42A8F6A2-7CE7-493F-B3A7-07A1753F5285}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{42A8F6A2-7CE7-493F-B3A7-07A1753F5285}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{42A8F6A2-7CE7-493F-B3A7-07A1753F5285}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{24193FBE-88A5-4C26-9996-341DEBE0CA80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{24193FBE-88A5-4C26-9996-341DEBE0CA80}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{24193FBE-88A5-4C26-9996-341DEBE0CA80}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{24193FBE-88A5-4C26-9996-341DEBE0CA80}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D46EEAAF-36FD-4297-9381-1845C93D13C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D46EEAAF-36FD-4297-9381-1845C93D13C4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D46EEAAF-36FD-4297-9381-1845C93D13C4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D46EEAAF-36FD-4297-9381-1845C93D13C4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4A858860-7405-43F4-9132-0DF40BADBDAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4A858860-7405-43F4-9132-0DF40BADBDAD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4A858860-7405-43F4-9132-0DF40BADBDAD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4A858860-7405-43F4-9132-0DF40BADBDAD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C02DC47A-7258-4B59-AAB4-DFA208DE9B36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C02DC47A-7258-4B59-AAB4-DFA208DE9B36}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C02DC47A-7258-4B59-AAB4-DFA208DE9B36}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C02DC47A-7258-4B59-AAB4-DFA208DE9B36}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CFB47A7F-580A-4F4B-940D-03D99EE70C41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CFB47A7F-580A-4F4B-940D-03D99EE70C41}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CFB47A7F-580A-4F4B-940D-03D99EE70C41}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CFB47A7F-580A-4F4B-940D-03D99EE70C41}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{903B0A3A-1753-47CA-ADBC-B4379FF8F372}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{903B0A3A-1753-47CA-ADBC-B4379FF8F372}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{903B0A3A-1753-47CA-ADBC-B4379FF8F372}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{903B0A3A-1753-47CA-ADBC-B4379FF8F372}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{311303FD-7ABA-4C7D-AA5C-90E265FA04A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{311303FD-7ABA-4C7D-AA5C-90E265FA04A7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{311303FD-7ABA-4C7D-AA5C-90E265FA04A7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{311303FD-7ABA-4C7D-AA5C-90E265FA04A7}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{42A8F6A2-7CE7-493F-B3A7-07A1753F5285} = {BFDF8E72-A7F7-4894-8782-74BB34438F99}\n\t\t{E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13}\n\t\t{24193FBE-88A5-4C26-9996-341DEBE0CA80} = {BFDF8E72-A7F7-4894-8782-74BB34438F99}\n\t\t{D46EEAAF-36FD-4297-9381-1845C93D13C4} = {BFDF8E72-A7F7-4894-8782-74BB34438F99}\n\t\t{4A858860-7405-43F4-9132-0DF40BADBDAD} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13}\n\t\t{C02DC47A-7258-4B59-AAB4-DFA208DE9B36} = {BFDF8E72-A7F7-4894-8782-74BB34438F99}\n\t\t{CFB47A7F-580A-4F4B-940D-03D99EE70C41} = {BFDF8E72-A7F7-4894-8782-74BB34438F99}\n\t\t{903B0A3A-1753-47CA-ADBC-B4379FF8F372} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13}\n\t\t{C4AFDCB8-077D-463A-9EF9-D2F8723F01F4} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13}\n\t\t{311303FD-7ABA-4C7D-AA5C-90E265FA04A7} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {12D6ACDC-31C9-4A69-BE24-76E0F73E48A6}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Directory.Build.props",
    "content": "<Project>\n\n  <PropertyGroup>\n    <Version>$(Ver)</Version>\n    <PackageVersion>$(Ver)</PackageVersion>\n    <Copyright>2019-2023 v.la</Copyright>\n    <Authors>v.la@live.cn</Authors>\n    <Description>A bloom filter implementation</Description>\n    <Product>bloom filter</Product>\n\n    <PackageOutputPath>$(MSBuildThisFileDirectory)/artifacts</PackageOutputPath>\n    <PackageTags>Bloom;Filter;bloom-filter</PackageTags>\n    <LangVersion>latest</LangVersion>\n    <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>\n    <PackageIcon>icon.png</PackageIcon>\n    <PackageProjectUrl>https://github.com/vla/BloomFilter.NetCore</PackageProjectUrl>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <PackageLicenseType>MIT</PackageLicenseType>\n\n    <RepositoryUrl>git://github.com/vla/BloomFilter.NetCore</RepositoryUrl>\n    <RepositoryType>git</RepositoryType>\n    <RepositoryBranch>master</RepositoryBranch>\n    <PublishRepositoryUrl>true</PublishRepositoryUrl>\n\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' != 'Debug' \">\n    <Optimize>true</Optimize>\n  </PropertyGroup>\n\n  <PropertyGroup>\n\n    <SignAssembly>True</SignAssembly>\n    <DelaySign>False</DelaySign>\n    <AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)/sign.snk</AssemblyOriginatorKeyFile>\n  </PropertyGroup>\n\n\n  <ItemGroup>\n    <None Include=\"$(MSBuildThisFileDirectory)/icon.png\" Pack=\"true\" PackagePath=\"\"/>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "Directory.Packages.props",
    "content": "<Project>\n  <PropertyGroup>\n    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n    <CentralPackageTransitivePinningEnabled>false</CentralPackageTransitivePinningEnabled>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <!-- Core Dependencies -->\n    <PackageVersion Include=\"System.Runtime\" Version=\"4.3.1\" />\n    <PackageVersion Include=\"System.Memory\" Version=\"4.6.3\" />\n    <PackageVersion Include=\"System.Threading.Tasks.Extensions\" Version=\"4.6.3\" />\n\n    <!-- Redis Clients -->\n    <PackageVersion Include=\"StackExchange.Redis\" Version=\"2.9.32\" />\n    <PackageVersion Include=\"CSRedisCore\" Version=\"3.8.807\" />\n    <PackageVersion Include=\"FreeRedis\" Version=\"1.5.2\" />\n\n    <!-- EasyCaching -->\n    <PackageVersion Include=\"EasyCaching.Core\" Version=\"1.9.2\" />\n    <PackageVersion Include=\"EasyCaching.CSRedis\" Version=\"1.9.2\" />\n    <PackageVersion Include=\"EasyCaching.Serialization.Json\" Version=\"1.9.2\" />\n\n    <!-- Testing -->\n    <PackageVersion Include=\"FluentAssertions\" Version=\"8.8.0\" />\n    <PackageVersion Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.1\" />\n    <PackageVersion Include=\"xunit\" Version=\"2.9.3\" />\n    <PackageVersion Include=\"xunit.runner.visualstudio\" Version=\"3.1.5\" />\n\n    <!-- Benchmarking -->\n    <PackageVersion Include=\"BenchmarkDotNet\" Version=\"0.15.6\" />\n  </ItemGroup>\n\n  <ItemGroup Condition=\"'$(TargetFramework)' == 'net462'\">\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"6.0.0\" />\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\" Version=\"6.0.0\" />\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(TargetFramework)' == 'netstandard2.0'\">\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"6.0.0\" />\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\" Version=\"6.0.0\" />\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(TargetFramework)' == 'net6.0'\">\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"6.0.0\" />\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\" Version=\"6.0.0\" />\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(TargetFramework)' == 'net7.0'\">\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"7.0.0\" />\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\" Version=\"7.0.0\" />\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(TargetFramework)' == 'net8.0'\">\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"8.0.0\" />\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\" Version=\"8.0.0\" />\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(TargetFramework)' == 'net9.0'\">\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"9.0.0\" />\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\" Version=\"9.0.0\" />\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(TargetFramework)' == 'net10.0'\">\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"10.0.0\" />\n    <PackageVersion Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\" Version=\"10.0.0\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 v.la@live.cn\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# BloomFilter.NetCore\n\n[![License MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![.NET](https://img.shields.io/badge/.NET-6.0%20|%207.0%20|%208.0%20|%209.0%20|%2010.0-blue.svg)](https://dotnet.microsoft.com/)\n\nA high-performance, feature-complete Bloom filter library for .NET, supporting both in-memory and distributed Redis backends.\n\n[中文文档](README.zh-CN.md)\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Key Features](#key-features)\n- [Packages & Status](#packages--status)\n- [Architecture](#architecture)\n- [Core Functionality](#core-functionality)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Usage Examples](#usage-examples)\n  - [In-Memory Mode](#in-memory-mode)\n  - [Dependency Injection](#dependency-injection)\n  - [Redis Distributed Mode](#redis-distributed-mode)\n- [Hash Algorithms](#hash-algorithms)\n- [Performance Benchmarks](#performance-benchmarks)\n- [Advanced Usage](#advanced-usage)\n- [API Reference](#api-reference)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Overview\n\nBloomFilter.NetCore is an enterprise-grade Bloom filter library designed for the .NET ecosystem. A Bloom filter is a space-efficient probabilistic data structure used to test whether an element is a member of a set. Its core characteristics are:\n\n- **Space Efficient**: Extremely small memory footprint compared to traditional HashSets\n- **O(1) Time Complexity**: Both add and query operations execute in constant time\n- **Probabilistic**: May return false positives but never false negatives\n\nThis project provides two major implementation types:\n\n1. **In-Memory Bloom Filter (FilterMemory)**: BitArray-based in-memory implementation, suitable for single-process scenarios\n2. **Distributed Bloom Filter (FilterRedis series)**: Redis-backed distributed implementation, supports concurrent access from multiple applications\n\n### Primary Use Cases\n\n- **Cache Penetration Protection**: Prevent malicious queries for non-existent data from bypassing cache\n- **Deduplication**: URL deduplication, email deduplication, user ID deduplication, etc.\n- **Recommendation Systems**: Check if a user has seen specific content\n- **Web Crawlers**: Check if URLs have been crawled\n- **Distributed Systems**: Share state checks across multiple service instances\n- **Big Data**: Existence checks for massive datasets\n\n## Key Features\n\n### 🎯 Flexible Configuration\n\n- **Fully Configurable Parameters**: Bit array size (m), number of hash functions (k)\n- **Automatic Parameter Calculation**: Automatically calculate optimal parameters based on tolerable false positive rate (p) and expected element count (n)\n- **20+ Hash Algorithms**: Support for CRC, MD5, SHA, Murmur, LCGs, xxHash, or custom algorithms\n\n### ⚡ High Performance\n\n- **Fast Generation**: Bloom filter generation and operations are extremely fast\n- **Optimized Implementation**: Uses Span<T>, ReadOnlyMemory<T> for zero-copy operations\n- **Unsafe Code Optimization**: Uses unsafe code blocks in performance-critical paths\n- **Rejection Sampling**: Implements rejection sampling and hash chaining, considering avalanche effect for improved hash quality\n\n### 🔒 Concurrency Safe\n\n- **Thread-Safe**: Uses AsyncLock mechanism for safe multi-threaded concurrent access\n- **Async Support**: Comprehensive async/await support with async versions of all operations\n- **Distributed Locking**: Redis implementations support concurrent access across applications\n\n### 🌐 Multiple Backend Support\n\n- **StackExchange.Redis**: Officially recommended Redis client\n- **CSRedisCore**: High-performance Redis client\n- **FreeRedis**: Lightweight Redis client\n- **EasyCaching**: Supports EasyCaching abstraction layer, switchable cache providers\n\n### 📦 Modern .NET Support\n\n- **Multi-Framework Support**: net462, netstandard2.0, net6.0, net7.0, net8.0, net9.0, net10.0\n- **Dependency Injection**: Native support for Microsoft.Extensions.DependencyInjection\n- **Nullable Reference Types**: Enabled for improved code safety\n\n## Packages & Status\n\n| Package | NuGet | Description |\n|---------|-------|-------------|\n|**BloomFilter.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.NetCore)| Core package with in-memory Bloom filter |\n|**BloomFilter.Redis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.Redis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.Redis.NetCore)| StackExchange.Redis implementation |\n|**BloomFilter.CSRedis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.CSRedis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.CSRedis.NetCore)| CSRedisCore implementation |\n|**BloomFilter.FreeRedis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.FreeRedis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.FreeRedis.NetCore)| FreeRedis implementation |\n|**BloomFilter.EasyCaching.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.EasyCaching.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.EasyCaching.NetCore)| EasyCaching integration |\n\n## Architecture\n\n### Core Interface Layer\n\n```\nIBloomFilter (Interface)\n    ├── Add / AddAsync           - Add elements\n    ├── Contains / ContainsAsync - Check elements\n    ├── All / AllAsync           - Batch check\n    ├── Clear / ClearAsync       - Clear filter\n    └── ComputeHash              - Compute hash values\n```\n\n### Implementation Hierarchy\n\n```\nFilter (Abstract Base Class)\n    ├── FilterMemory (In-Memory)\n    │   └── Uses BitArray storage\n    │\n    └── Redis Series (Distributed)\n        ├── FilterRedis (StackExchange.Redis)\n        ├── FilterCSRedis (CSRedisCore)\n        ├── FilterFreeRedis (FreeRedis)\n        └── FilterEasyCachingRedis (EasyCaching)\n```\n\n### Configuration System\n\n```\nBloomFilterOptions\n    ├── FilterMemoryOptions      - In-memory mode configuration\n    ├── FilterRedisOptions       - StackExchange.Redis configuration\n    ├── FilterCSRedisOptions     - CSRedisCore configuration\n    ├── FilterFreeRedisOptions   - FreeRedis configuration\n    └── FilterEasyCachingOptions - EasyCaching configuration\n```\n\n## Core Functionality\n\n### Mathematical Model\n\nBloomFilter.NetCore implements the complete Bloom filter mathematical model:\n\n#### 1. Optimal Bit Array Size (m)\n\nGiven expected element count `n` and false positive rate `p`, calculate optimal bit array size:\n\n```\nm = -(n * ln(p)) / (ln(2)^2)\n```\n\n#### 2. Optimal Number of Hash Functions (k)\n\nGiven element count `n` and bit array size `m`, calculate optimal number of hash functions:\n\n```\nk = (m / n) * ln(2)\n```\n\n#### 3. Actual False Positive Rate (p)\n\nGiven inserted element count, number of hash functions, and bit array size, calculate actual false positive rate:\n\n```\np = (1 - e^(-k*n/m))^k\n```\n\nThese calculations are provided by static methods in the `Filter` base class:\n\n```csharp\n// Calculate optimal bit array size\nlong m = Filter.BestM(expectedElements, errorRate);\n\n// Calculate optimal number of hash functions\nint k = Filter.BestK(expectedElements, capacity);\n\n// Calculate optimal element count\nlong n = Filter.BestN(hashes, capacity);\n\n// Calculate actual false positive rate\ndouble p = Filter.BestP(hashes, capacity, insertedElements);\n```\n\n### Storage Mechanisms\n\n#### In-Memory Storage\n\n- **BitArray**: Uses .NET's BitArray as underlying storage\n- **Bucketing Strategy**: Automatically splits into multiple BitArrays when capacity exceeds 2GB (MaxInt = 2,147,483,640)\n- **Serialization Support**: Supports serialization/deserialization for persistence or transfer\n\n#### Redis Storage\n\n- **SETBIT/GETBIT**: Uses Redis bit operation commands\n- **Distributed Access**: Multiple application instances can concurrently access the same filter\n- **Persistence**: Leverages Redis persistence mechanisms for data safety\n\n### Concurrency Control\n\n```csharp\n// AsyncLock ensures thread safety\npublic class AsyncLock\n{\n    private readonly SemaphoreSlim _semaphore = new(1, 1);\n\n    public async ValueTask<IDisposable> LockAsync()\n    {\n        await _semaphore.WaitAsync();\n        return new Release(_semaphore);\n    }\n}\n```\n\n## Installation\n\n### Install via NuGet\n\n**In-Memory Mode (Core Package):**\n\n```bash\ndotnet add package BloomFilter.NetCore\n```\n\n**Redis Distributed Mode (Choose One):**\n\n```bash\n# StackExchange.Redis\ndotnet add package BloomFilter.Redis.NetCore\n\n# CSRedisCore\ndotnet add package BloomFilter.CSRedis.NetCore\n\n# FreeRedis\ndotnet add package BloomFilter.FreeRedis.NetCore\n\n# EasyCaching\ndotnet add package BloomFilter.EasyCaching.NetCore\n```\n\n## Quick Start\n\n### Simplest Example\n\n```csharp\nusing BloomFilter;\n\n// Create a Bloom filter: expect 10 million elements, 1% false positive rate\nvar bf = FilterBuilder.Build(10_000_000, 0.01);\n\n// Add elements\nbf.Add(\"user:123\");\nbf.Add(\"user:456\");\n\n// Check element existence\nConsole.WriteLine(bf.Contains(\"user:123\")); // True\nConsole.WriteLine(bf.Contains(\"user:789\")); // False (very small probability of True)\n\n// Clear filter\nbf.Clear();\n```\n\n### Async Operations\n\n```csharp\n// Async add\nawait bf.AddAsync(Encoding.UTF8.GetBytes(\"user:123\"));\n\n// Async check\nbool exists = await bf.ContainsAsync(Encoding.UTF8.GetBytes(\"user:123\"));\n\n// Batch async operations\nvar users = new[] {\n    Encoding.UTF8.GetBytes(\"user:1\"),\n    Encoding.UTF8.GetBytes(\"user:2\"),\n    Encoding.UTF8.GetBytes(\"user:3\")\n};\n\nawait bf.AddAsync(users);\nvar results = await bf.ContainsAsync(users);\n```\n\n### Fluent API (New in v3.0)\n\nv3.0 introduces a modern fluent API for building Bloom filters with improved discoverability and expressiveness:\n\n```csharp\n// In-Memory Fluent API\nvar filter = FilterBuilder.Create()\n    .WithName(\"UserFilter\")\n    .ExpectingElements(10_000_000)\n    .WithErrorRate(0.001)\n    .UsingHashMethod(HashMethod.XXHash3)\n    .BuildInMemory();\n\n// Redis Fluent API (StackExchange.Redis)\nvar redisFilter = FilterRedisBuilder.Create()\n    .WithRedisConnection(\"localhost:6379\")\n    .WithRedisKey(\"bloom:users\")\n    .WithName(\"UserFilter\")\n    .ExpectingElements(10_000_000)\n    .WithErrorRate(0.001)\n    .BuildRedis();\n\n// CSRedis Fluent API\nvar csredisFilter = FilterCSRedisBuilder.Create()\n    .WithRedisClient(csredisClient)\n    .WithRedisKey(\"bloom:users\")\n    .ExpectingElements(10_000_000)\n    .BuildCSRedis();\n\n// FreeRedis Fluent API\nvar freeRedisFilter = FilterFreeRedisBuilder.Create()\n    .WithRedisClient(redisClient)\n    .WithRedisKey(\"bloom:users\")\n    .ExpectingElements(10_000_000)\n    .BuildFreeRedis();\n\n// EasyCaching Fluent API\nvar easyCachingFilter = FilterEasyCachingBuilder.Create()\n    .WithRedisCachingProvider(provider)\n    .WithRedisKey(\"bloom:users\")\n    .ExpectingElements(10_000_000)\n    .BuildEasyCaching();\n\n// All common configuration methods:\n// - WithName(string) - Set filter name\n// - ExpectingElements(long) - Set expected element count\n// - WithErrorRate(double) - Set false positive rate (0-1)\n// - UsingHashMethod(HashMethod) - Use predefined hash algorithm\n// - UsingCustomHash(HashFunction) - Use custom hash function\n// - WithSerializer(IFilterMemorySerializer) - Set custom serializer (memory only)\n```\n\n**Why use Fluent API?**\n- 🔍 Better discoverability with IntelliSense\n- 📖 More readable and self-documenting code\n- ⛓️ Chainable method calls\n- 🎯 Type-safe configuration\n- ✅ Backward compatible - old static methods still work!\n\n## Usage Examples\n\n### In-Memory Mode\n\n#### Basic Usage\n\n```csharp\nusing BloomFilter;\n\npublic class UserService\n{\n    // Static shared Bloom filter\n    private static readonly IBloomFilter _bloomFilter =\n        FilterBuilder.Build(10_000_000, 0.01);\n\n    public void AddUser(string userId)\n    {\n        // Add user ID\n        _bloomFilter.Add(userId);\n    }\n\n    public bool MayExistUser(string userId)\n    {\n        // Check if user may exist\n        return _bloomFilter.Contains(userId);\n    }\n}\n```\n\n#### Custom Configuration\n\n```csharp\nusing BloomFilter;\n\n// Method 1: Specify hash algorithm\nvar bf1 = FilterBuilder.Build(\n    expectedElements: 1_000_000,\n    errorRate: 0.001,\n    hashMethod: HashMethod.Murmur3\n);\n\n// Method 2: Use custom hash function\nvar hashFunction = new Murmur128BitsX64();\nvar bf2 = FilterBuilder.Build(\n    expectedElements: 1_000_000,\n    errorRate: 0.001,\n    hashFunction: hashFunction\n);\n\n// Method 3: Manually specify parameters (advanced usage)\nvar bf3 = FilterBuilder.Build(\n    capacity: 9585059,      // Bit array size\n    hashes: 10,             // Number of hash functions\n    hashMethod: HashMethod.XXHash3\n);\n\n// Method 4: Use configuration object\nvar options = new FilterMemoryOptions\n{\n    Name = \"MyFilter\",\n    ExpectedElements = 5_000_000,\n    ErrorRate = 0.01,\n    Method = HashMethod.Murmur3\n};\nvar bf4 = FilterBuilder.Build(options);\n```\n\n### Dependency Injection\n\n#### ASP.NET Core Integration\n\n```csharp\nusing BloomFilter;\nusing Microsoft.Extensions.DependencyInjection;\n\npublic class Startup\n{\n    public void ConfigureServices(IServiceCollection services)\n    {\n        // Register Bloom filter service\n        services.AddBloomFilter(setupAction =>\n        {\n            setupAction.UseInMemory(options =>\n            {\n                options.Name = \"MainFilter\";\n                options.ExpectedElements = 10_000_000;\n                options.ErrorRate = 0.01;\n                options.Method = HashMethod.Murmur3;\n            });\n        });\n\n        services.AddControllers();\n    }\n}\n\n// Use in controller or service\npublic class UserController : ControllerBase\n{\n    private readonly IBloomFilter _bloomFilter;\n\n    public UserController(IBloomFilter bloomFilter)\n    {\n        _bloomFilter = bloomFilter;\n    }\n\n    [HttpPost(\"users/{userId}\")]\n    public IActionResult CheckUser(string userId)\n    {\n        if (_bloomFilter.Contains(userId))\n        {\n            // User may exist, continue to query database\n            return Ok(\"User may exist\");\n        }\n        else\n        {\n            // User definitely doesn't exist, no need to query database\n            return NotFound(\"User doesn't exist\");\n        }\n    }\n}\n```\n\n#### Multiple Filter Instances\n\n```csharp\nservices.AddBloomFilter(setupAction =>\n{\n    // User filter\n    setupAction.UseInMemory(options =>\n    {\n        options.Name = \"UserFilter\";\n        options.ExpectedElements = 10_000_000;\n        options.ErrorRate = 0.01;\n    });\n\n    // Email filter\n    setupAction.UseInMemory(options =>\n    {\n        options.Name = \"EmailFilter\";\n        options.ExpectedElements = 5_000_000;\n        options.ErrorRate = 0.001;\n    });\n});\n\n// Use factory to get specific filter\npublic class MyService\n{\n    private readonly IBloomFilter _userFilter;\n    private readonly IBloomFilter _emailFilter;\n\n    public MyService(IBloomFilterFactory factory)\n    {\n        _userFilter = factory.Get(\"UserFilter\");\n        _emailFilter = factory.Get(\"EmailFilter\");\n    }\n}\n```\n\n### Redis Distributed Mode\n\n#### StackExchange.Redis\n\n```csharp\nusing BloomFilter;\n\n// Method 1: Direct build\nvar bf = FilterRedisBuilder.Build(\n    redisHost: \"localhost:6379\",\n    name: \"DistributedFilter\",\n    expectedElements: 5_000_000,\n    errorRate: 0.001\n);\n\nbf.Add(\"item:123\");\nConsole.WriteLine(bf.Contains(\"item:123\")); // True\n\n// Method 2: Dependency injection\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseRedis(new FilterRedisOptions\n    {\n        Name = \"UserFilter\",\n        RedisKey = \"BloomFilter:Users\",\n        Endpoints = new List<string> { \"localhost:6379\" },\n        Database = 0,\n        ExpectedElements = 10_000_000,\n        ErrorRate = 0.01,\n        Method = HashMethod.Murmur3\n    });\n});\n\n// Method 3: Advanced configuration (master-slave, sentinel, cluster)\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseRedis(new FilterRedisOptions\n    {\n        Name = \"ProductFilter\",\n        RedisKey = \"BloomFilter:Products\",\n        Endpoints = new List<string>\n        {\n            \"redis-master:6379\",\n            \"redis-slave1:6379\",\n            \"redis-slave2:6379\"\n        },\n        Password = \"your-redis-password\",\n        Ssl = true,\n        ConnectTimeout = 5000,\n        SyncTimeout = 3000,\n        ExpectedElements = 20_000_000,\n        ErrorRate = 0.001\n    });\n});\n```\n\n#### CSRedisCore\n\n```csharp\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseCSRedis(new FilterCSRedisOptions\n    {\n        Name = \"OrderFilter\",\n        RedisKey = \"BloomFilter:Orders\",\n        ConnectionStrings = new List<string>\n        {\n            \"localhost:6379,password=123456,defaultDatabase=0,poolsize=50,prefix=myapp:\"\n        },\n        ExpectedElements = 5_000_000,\n        ErrorRate = 0.01\n    });\n});\n```\n\n#### FreeRedis\n\n```csharp\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseFreeRedis(new FilterFreeRedisOptions\n    {\n        Name = \"CartFilter\",\n        RedisKey = \"BloomFilter:Carts\",\n        ConnectionStrings = new List<string> { \"localhost:6379,password=123456\" },\n        ExpectedElements = 1_000_000,\n        ErrorRate = 0.01\n    });\n});\n```\n\n#### EasyCaching Integration\n\nEasyCaching provides a unified caching abstraction layer, allowing you to easily switch underlying cache implementations:\n\n```csharp\nusing EasyCaching.Core.Configurations;\nusing Microsoft.Extensions.DependencyInjection;\n\nvar services = new ServiceCollection();\n\n// 1. Configure EasyCaching\nservices.AddEasyCaching(options =>\n{\n    // Configure Redis provider\n    options.UseRedis(config =>\n    {\n        config.DBConfig.Endpoints.Add(new ServerEndPoint(\"127.0.0.1\", 6379));\n        config.DBConfig.Database = 0;\n    }, \"redis-provider-1\");\n\n    // Can configure multiple providers\n    options.UseRedis(config =>\n    {\n        config.DBConfig.Endpoints.Add(new ServerEndPoint(\"127.0.0.1\", 6379));\n        config.DBConfig.Database = 1;\n    }, \"redis-provider-2\");\n});\n\n// 2. Configure BloomFilter\nservices.AddBloomFilter(setupAction =>\n{\n    // Use first Redis provider\n    setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions\n    {\n        Name = \"BF1\",\n        RedisKey = \"BloomFilter1\",\n        ProviderName = \"redis-provider-1\",\n        ExpectedElements = 10_000_000,\n        ErrorRate = 0.01\n    });\n\n    // Use second Redis provider\n    setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions\n    {\n        Name = \"BF2\",\n        RedisKey = \"BloomFilter2\",\n        ProviderName = \"redis-provider-2\",\n        ExpectedElements = 5_000_000,\n        ErrorRate = 0.001\n    });\n});\n\nvar provider = services.BuildServiceProvider();\n\n// Use default filter\nvar bf = provider.GetService<IBloomFilter>();\nbf.Add(\"value1\");\n\n// Use named filter\nvar factory = provider.GetService<IBloomFilterFactory>();\nvar bf1 = factory.Get(\"BF1\");\nvar bf2 = factory.Get(\"BF2\");\n\nbf1.Add(\"item1\");\nbf2.Add(\"item2\");\n```\n\n### Real-World Application Scenarios\n\n#### 1. Cache Penetration Protection\n\n```csharp\npublic class ProductService\n{\n    private readonly IBloomFilter _bloomFilter;\n    private readonly ICache _cache;\n    private readonly IProductRepository _repository;\n\n    public ProductService(\n        IBloomFilter bloomFilter,\n        ICache cache,\n        IProductRepository repository)\n    {\n        _bloomFilter = bloomFilter;\n        _cache = cache;\n        _repository = repository;\n    }\n\n    public async Task<Product> GetProductAsync(string productId)\n    {\n        // First layer: Bloom filter\n        if (!_bloomFilter.Contains(productId))\n        {\n            // Product definitely doesn't exist, return null directly\n            return null;\n        }\n\n        // Second layer: Cache\n        var cached = await _cache.GetAsync<Product>(productId);\n        if (cached != null)\n        {\n            return cached;\n        }\n\n        // Third layer: Database\n        var product = await _repository.GetByIdAsync(productId);\n        if (product != null)\n        {\n            await _cache.SetAsync(productId, product);\n        }\n\n        return product;\n    }\n\n    public async Task CreateProductAsync(Product product)\n    {\n        // Save to database\n        await _repository.SaveAsync(product);\n\n        // Add to Bloom filter\n        _bloomFilter.Add(product.Id);\n\n        // Update cache\n        await _cache.SetAsync(product.Id, product);\n    }\n}\n```\n\n#### 2. URL Deduplication (Web Crawler)\n\n```csharp\npublic class WebCrawler\n{\n    private readonly IBloomFilter _visitedUrls;\n    private readonly Queue<string> _urlQueue;\n\n    public WebCrawler(IBloomFilter bloomFilter)\n    {\n        _visitedUrls = bloomFilter;\n        _urlQueue = new Queue<string>();\n    }\n\n    public async Task CrawlAsync(string startUrl)\n    {\n        _urlQueue.Enqueue(startUrl);\n\n        while (_urlQueue.Count > 0)\n        {\n            var url = _urlQueue.Dequeue();\n\n            // Check if already visited\n            if (_visitedUrls.Contains(url))\n            {\n                continue; // Skip already visited URLs\n            }\n\n            // Mark as visited\n            _visitedUrls.Add(url);\n\n            // Download page\n            var page = await DownloadPageAsync(url);\n\n            // Process page\n            await ProcessPageAsync(page);\n\n            // Extract new URLs\n            var newUrls = ExtractUrls(page);\n            foreach (var newUrl in newUrls)\n            {\n                if (!_visitedUrls.Contains(newUrl))\n                {\n                    _urlQueue.Enqueue(newUrl);\n                }\n            }\n        }\n    }\n}\n```\n\n#### 3. Distributed Deduplication (Multiple Instances)\n\n```csharp\n// Configure distributed Bloom filter\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseRedis(new FilterRedisOptions\n    {\n        Name = \"GlobalDeduplication\",\n        RedisKey = \"BF:Dedup\",\n        Endpoints = new List<string> { \"redis-cluster:6379\" },\n        ExpectedElements = 100_000_000,\n        ErrorRate = 0.0001\n    });\n});\n\n// Use across multiple service instances\npublic class MessageProcessor\n{\n    private readonly IBloomFilter _bloomFilter;\n\n    public async Task ProcessMessageAsync(Message message)\n    {\n        // All instances share the same Redis Bloom filter\n        if (await _bloomFilter.ContainsAsync(message.Id))\n        {\n            // Message already processed by another instance\n            return;\n        }\n\n        // Mark as processed\n        await _bloomFilter.AddAsync(message.Id);\n\n        // Process message\n        await HandleMessageAsync(message);\n    }\n}\n```\n\n## Hash Algorithms\n\nBloomFilter.NetCore supports 20+ hash algorithms, choose based on performance and accuracy requirements:\n\n### Algorithm Categories\n\n| Category | Algorithms | Characteristics | Use Cases |\n|----------|-----------|-----------------|-----------|\n| **LCG-based** | LCGWithFNV1<br>LCGWithFNV1a<br>LCGModifiedFNV1 | Extremely fast, lower quality | Extremely high performance requirements, can tolerate high false positive rates |\n| **RNG-based** | RNGWithFNV1<br>RNGWithFNV1a<br>RNGModifiedFNV1 | High quality, slower | Scenarios requiring high accuracy |\n| **Checksum** | CRC32<br>CRC64<br>Adler32 | Balanced performance and quality | General scenarios |\n| **Murmur Family** | Murmur3<br>Murmur32BitsX86<br>Murmur128BitsX64<br>Murmur128BitsX86 | **Recommended**, good performance, high quality | Recommended for production |\n| **Cryptographic** | SHA1<br>SHA256<br>SHA384<br>SHA512 | Highest quality, slowest | Scenarios requiring extreme security |\n| **XXHash Family** | XXHash32<br>XXHash64<br>XXHash3<br>XXHash128 | **Fastest**, excellent quality | First choice for high performance |\n\n### Selection Recommendations\n\n```csharp\n// Recommended: Default Murmur3 for production (balanced performance and quality)\nvar bf1 = FilterBuilder.Build(10_000_000, 0.01, HashMethod.Murmur3);\n\n// High Performance: Choose XXHash3 for extreme performance requirements\nvar bf2 = FilterBuilder.Build(10_000_000, 0.01, HashMethod.XXHash3);\n\n// High Precision: Choose SHA256 + lower errorRate for minimal false positive rate\nvar bf3 = FilterBuilder.Build(10_000_000, 0.0001, HashMethod.SHA256);\n\n// Distributed: Recommend XXHash64 for Redis (fast and good cross-language support)\nvar bf4 = FilterRedisBuilder.Build(\n    \"localhost:6379\",\n    \"MyFilter\",\n    10_000_000,\n    0.01,\n    HashMethod.XXHash64\n);\n```\n\n## Performance Benchmarks\n\n### Test Environment\n\n```\nBenchmarkDotNet=v0.13.5\nOS: Windows 11 (10.0.22621.1778/22H2)\nCPU: AMD Ryzen 7 5800X, 1 CPU, 16 logical cores, 8 physical cores\n.NET SDK: 7.0.304\nRuntime: .NET 7.0.7 (7.0.723.27404), X64 RyuJIT AVX2\n```\n\n### Performance Rankings (64-byte data)\n\n| Rank | Algorithm | Mean Time | Relative Speed |\n|------|-----------|-----------|----------------|\n| 🥇 1 | XXHash3 | 33.14 ns | Baseline (Fastest) |\n| 🥈 2 | XXHash128 | 36.01 ns | 1.09x |\n| 🥉 3 | CRC64 | 38.83 ns | 1.17x |\n| 4 | XXHash64 | 50.62 ns | 1.53x |\n| 5 | Murmur3 | 70.98 ns | 2.14x |\n| ... | ... | ... | ... |\n| 28 | SHA512 | 1,368.20 ns | 41.28x (Slowest) |\n\n### Complete Performance Data\n\n<details>\n<summary>Click to expand full benchmark results</summary>\n\n#### 64-byte Data\n\n| Algorithm | Mean Time | Error | StdDev | Allocated |\n|-----------|-----------|-------|--------|-----------|\n| XXHash3 | 33.14 ns | 0.295 ns | 0.276 ns | 80 B |\n| XXHash128 | 36.01 ns | 0.673 ns | 0.749 ns | 80 B |\n| CRC64 | 38.83 ns | 0.399 ns | 0.333 ns | 80 B |\n| XXHash64 | 50.62 ns | 0.756 ns | 0.670 ns | 80 B |\n| Murmur3 | 70.98 ns | 1.108 ns | 1.036 ns | 80 B |\n| XXHash32 | 73.15 ns | 0.526 ns | 0.466 ns | 80 B |\n| Murmur128BitsX64 | 80.15 ns | 0.783 ns | 0.653 ns | 120 B |\n| Murmur128BitsX86 | 82.73 ns | 1.211 ns | 1.011 ns | 120 B |\n| LCGWithFNV1 | 91.27 ns | 1.792 ns | 2.134 ns | 80 B |\n| CRC32 | 145.63 ns | 1.528 ns | 1.429 ns | 328 B |\n| Adler32 | 150.07 ns | 0.664 ns | 0.589 ns | 336 B |\n| RNGWithFNV1 | 445.32 ns | 8.463 ns | 9.747 ns | 384 B |\n| SHA256 | 922.30 ns | 4.478 ns | 3.739 ns | 496 B |\n| SHA1 | 1,045.67 ns | 6.411 ns | 5.997 ns | 464 B |\n| SHA384 | 1,173.67 ns | 5.050 ns | 3.942 ns | 456 B |\n| SHA512 | 1,368.20 ns | 10.967 ns | 9.722 ns | 504 B |\n\n#### 1 MB Data\n\n| Algorithm | Mean Time |\n|-----------|-----------|\n| XXHash3 | 30,258.92 ns (~30 μs) |\n| XXHash128 | 33,778.68 ns (~34 μs) |\n| CRC64 | 56,321.74 ns (~56 μs) |\n| XXHash64 | 100,570.79 ns (~101 μs) |\n| Murmur128BitsX64 | 163,915.44 ns (~164 μs) |\n| ... | ... |\n| SHA1 | 3,381,425.73 ns (~3.4 ms) |\n\n</details>\n\n### Performance Recommendations\n\n1. **General Scenarios**: Use `Murmur3` (default), balanced performance and quality\n2. **Extreme Performance**: Use `XXHash3`, 2x faster than Murmur3\n3. **Large Data**: Use `XXHash128` or `Murmur128BitsX64`, 128-bit output reduces collisions\n4. **Avoid**: LCG series (poor quality), SHA series (too slow)\n\n## Advanced Usage\n\n### Serialization and Deserialization\n\n```csharp\n// Export Bloom filter state\nvar bf = FilterBuilder.Build(1_000_000, 0.01);\nbf.Add(\"item1\");\nbf.Add(\"item2\");\n\n// Get internal state (for persistence)\nvar memory = (FilterMemory)bf;\nvar buckets = memory.Buckets; // BitArray[]\nvar bucketBytes = memory.BucketBytes; // byte[][]\n\n// Restore Bloom filter from state\nvar options = new FilterMemoryOptions\n{\n    Name = \"RestoredFilter\",\n    ExpectedElements = 1_000_000,\n    ErrorRate = 0.01,\n    Buckets = buckets // Or use BucketBytes\n};\nvar restoredBf = FilterBuilder.Build(options);\n\nConsole.WriteLine(restoredBf.Contains(\"item1\")); // True\n```\n\n### Batch Operations\n\n```csharp\n// Batch add\nvar items = Enumerable.Range(1, 10000)\n    .Select(i => Encoding.UTF8.GetBytes($\"user:{i}\"))\n    .ToArray();\n\nvar addResults = bf.Add(items);\nConsole.WriteLine($\"Successfully added: {addResults.Count(r => r)} elements\");\n\n// Batch check\nvar checkResults = bf.Contains(items);\nConsole.WriteLine($\"Exist: {checkResults.Count(r => r)} elements\");\n\n// Check if all elements exist\nbool allExist = bf.All(items);\n\n// Async batch operations\nvar asyncAddResults = await bf.AddAsync(items);\nvar asyncCheckResults = await bf.ContainsAsync(items);\nbool asyncAllExist = await bf.AllAsync(items);\n```\n\n### Custom Hash Function\n\n```csharp\nusing BloomFilter.HashAlgorithms;\n\n// Implement custom hash algorithm\npublic class MyCustomHash : HashFunction\n{\n    public override long ComputeHash(ReadOnlySpan<byte> data)\n    {\n        // Custom hash logic\n        long hash = 0;\n        foreach (var b in data)\n        {\n            hash = hash * 31 + b;\n        }\n        return hash;\n    }\n}\n\n// Use custom hash\nvar customHash = new MyCustomHash();\nvar bf = FilterBuilder.Build(1_000_000, 0.01, customHash);\n```\n\n### Calculate Actual False Positive Rate\n\n```csharp\nvar bf = FilterBuilder.Build(100_000, 0.01);\n\n// Add 50,000 elements\nfor (int i = 0; i < 50_000; i++)\n{\n    bf.Add($\"item:{i}\");\n}\n\n// Calculate theoretical false positive rate\nvar filter = (Filter)bf;\ndouble theoreticalErrorRate = Filter.BestP(\n    filter.Hashes,\n    filter.Capacity,\n    50_000\n);\n\nConsole.WriteLine($\"Theoretical error rate: {theoreticalErrorRate:P4}\");\n\n// Test actual false positive rate\nint falsePositives = 0;\nint testCount = 100_000;\n\nfor (int i = 50_000; i < 50_000 + testCount; i++)\n{\n    if (bf.Contains($\"item:{i}\"))\n    {\n        falsePositives++;\n    }\n}\n\ndouble actualErrorRate = (double)falsePositives / testCount;\nConsole.WriteLine($\"Actual error rate: {actualErrorRate:P4}\");\nConsole.WriteLine($\"False positives: {falsePositives} / {testCount}\");\n```\n\n### Monitoring and Statistics\n\n```csharp\npublic class BloomFilterMonitor\n{\n    private readonly IBloomFilter _filter;\n    private long _addCount;\n    private long _hitCount;\n    private long _missCount;\n\n    public BloomFilterMonitor(IBloomFilter filter)\n    {\n        _filter = filter;\n    }\n\n    public bool Add(string item)\n    {\n        Interlocked.Increment(ref _addCount);\n        return _filter.Add(item);\n    }\n\n    public bool Contains(string item)\n    {\n        var result = _filter.Contains(item);\n        if (result)\n            Interlocked.Increment(ref _hitCount);\n        else\n            Interlocked.Increment(ref _missCount);\n        return result;\n    }\n\n    public void PrintStats()\n    {\n        Console.WriteLine($\"Total adds: {_addCount}\");\n        Console.WriteLine($\"Hits: {_hitCount}\");\n        Console.WriteLine($\"Misses: {_missCount}\");\n        Console.WriteLine($\"Hit rate: {(double)_hitCount / (_hitCount + _missCount):P2}\");\n    }\n}\n```\n\n## API Reference\n\n### IBloomFilter Interface\n\n```csharp\npublic interface IBloomFilter : IDisposable\n{\n    // Properties\n    string Name { get; }\n\n    // Synchronous methods\n    bool Add(ReadOnlySpan<byte> data);\n    IList<bool> Add(IEnumerable<byte[]> elements);\n    bool Contains(ReadOnlySpan<byte> element);\n    IList<bool> Contains(IEnumerable<byte[]> elements);\n    bool All(IEnumerable<byte[]> elements);\n    void Clear();\n    long[] ComputeHash(ReadOnlySpan<byte> data);\n\n    // Asynchronous methods\n    ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data);\n    ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elements);\n    ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element);\n    ValueTask<IList<bool>> ContainsAsync(IEnumerable<byte[]> elements);\n    ValueTask<bool> AllAsync(IEnumerable<byte[]> elements);\n    ValueTask ClearAsync();\n}\n```\n\n### Filter Base Class\n\n```csharp\npublic abstract class Filter : IBloomFilter\n{\n    // Properties\n    public string Name { get; }\n    public HashFunction Hash { get; }\n    public long Capacity { get; }\n    public int Hashes { get; }\n    public long ExpectedElements { get; }\n    public double ErrorRate { get; }\n\n    // Static methods (mathematical calculations)\n    public static long BestM(long n, double p);\n    public static int BestK(long n, long m);\n    public static long BestN(int k, long m);\n    public static double BestP(int k, long m, long insertedElements);\n}\n```\n\n### FilterBuilder\n\n```csharp\npublic static class FilterBuilder\n{\n    // Using expected elements and error rate\n    public static IBloomFilter Build(long expectedElements, double errorRate);\n    public static IBloomFilter Build(long expectedElements, double errorRate, HashMethod method);\n    public static IBloomFilter Build(long expectedElements, double errorRate, HashFunction hash);\n\n    // Using capacity and number of hash functions\n    public static IBloomFilter Build(long capacity, int hashes, HashMethod method);\n    public static IBloomFilter Build(long capacity, int hashes, HashFunction hash);\n\n    // Using configuration object\n    public static IBloomFilter Build(FilterMemoryOptions options);\n}\n```\n\n### FilterRedisBuilder\n\n```csharp\npublic static class FilterRedisBuilder\n{\n    public static IBloomFilter Build(\n        string redisHost,\n        string name,\n        long expectedElements,\n        double errorRate,\n        HashMethod method = HashMethod.Murmur3);\n}\n```\n\n### Extension Methods\n\n```csharp\n// Service registration\npublic static class ServiceCollectionExtensions\n{\n    public static IServiceCollection AddBloomFilter(\n        this IServiceCollection services,\n        Action<BloomFilterOptions> setupAction);\n}\n\n// Configuration extensions\npublic static class BloomFilterOptionsExtensions\n{\n    public static BloomFilterOptions UseInMemory(\n        this BloomFilterOptions options,\n        Action<FilterMemoryOptions> setup = null);\n\n    public static BloomFilterOptions UseRedis(\n        this BloomFilterOptions options,\n        FilterRedisOptions setup);\n\n    public static BloomFilterOptions UseCSRedis(\n        this BloomFilterOptions options,\n        FilterCSRedisOptions setup);\n\n    public static BloomFilterOptions UseFreeRedis(\n        this BloomFilterOptions options,\n        FilterFreeRedisOptions setup);\n\n    public static BloomFilterOptions UseEasyCachingRedis(\n        this BloomFilterOptions options,\n        FilterEasyCachingRedisOptions setup);\n}\n```\n\n## Frequently Asked Questions (FAQ)\n\n### 1. What is the false positive rate of a Bloom filter?\n\nThe false positive rate is determined by the `errorRate` parameter you specify when creating the filter. For example:\n\n```csharp\n// 1% false positive rate\nvar bf = FilterBuilder.Build(1_000_000, 0.01);\n\n// 0.1% false positive rate (more accurate, but uses more memory)\nvar bf2 = FilterBuilder.Build(1_000_000, 0.001);\n```\n\n**Note**: Lower error rates require more memory space.\n\n### 2. How to choose expectedElements?\n\n`expectedElements` should be set to the number of elements you expect to add. If the actual number exceeds this, the false positive rate will increase.\n\nRecommendations:\n- Estimate actual element count\n- Add 20%-50% buffer\n- Monitor actual false positive rate regularly\n\n### 3. In-Memory vs Redis Mode - How to Choose?\n\n| Scenario | Recommended Mode | Reason |\n|----------|-----------------|---------|\n| Single-instance application | In-Memory | Highest performance, no network overhead |\n| Multi-instance application | Redis | Shared state, distributed support |\n| Persistence required | Redis | Redis provides persistence |\n| Temporary deduplication | In-Memory | Simple and fast |\n| Cross-service sharing | Redis | Multi-language access support |\n\n### 4. How to clear a Bloom filter?\n\n```csharp\n// Synchronous clear\nbf.Clear();\n\n// Asynchronous clear\nawait bf.ClearAsync();\n```\n\n**Note**: Clear operation deletes all data, use with caution!\n\n### 5. How much memory does a Bloom filter use?\n\nMemory usage depends on capacity (m):\n\n```\nMemory (bytes) = m / 8\n```\n\nExample calculation:\n\n```csharp\n// 10 million elements, 1% false positive rate\nvar bf = FilterBuilder.Build(10_000_000, 0.01);\nvar filter = (Filter)bf;\n\n// Calculate memory usage\nlong bits = filter.Capacity;\nlong bytes = bits / 8;\ndouble mb = bytes / (1024.0 * 1024.0);\n\nConsole.WriteLine($\"Bit array size: {bits:N0} bits\");\nConsole.WriteLine($\"Memory usage: {bytes:N0} bytes ({mb:F2} MB)\");\n// Output: approximately 11.4 MB\n```\n\n### 6. Can elements be deleted?\n\n**No**. Standard Bloom filters do not support deletion because:\n- Multiple elements may map to the same bits\n- Deleting one element may affect detection of other elements\n\nIf deletion is needed, consider:\n- Counting Bloom Filter\n- Cuckoo Filter\n\n### 7. Is it thread-safe?\n\nYes, BloomFilter.NetCore is thread-safe:\n\n```csharp\n// Multi-threaded concurrent access\nvar bf = FilterBuilder.Build(10_000_000, 0.01);\n\nParallel.For(0, 1000, i =>\n{\n    bf.Add($\"item:{i}\"); // Thread-safe\n});\n\nParallel.For(0, 1000, i =>\n{\n    var exists = bf.Contains($\"item:{i}\"); // Thread-safe\n});\n```\n\n### 8. How to monitor Redis connections?\n\n```csharp\n// Use StackExchange.Redis connection monitoring\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseRedis(new FilterRedisOptions\n    {\n        Name = \"MyFilter\",\n        RedisKey = \"BF:Key\",\n        Endpoints = new List<string> { \"localhost:6379\" },\n        // Enable connection logging\n        AbortOnConnectFail = false,\n        ConnectTimeout = 5000,\n        ConnectRetry = 3\n    });\n});\n\n// Get Redis connection information\nvar bf = serviceProvider.GetService<IBloomFilter>();\nif (bf is FilterRedis redisFilter)\n{\n    var connection = redisFilter.Connection;\n    Console.WriteLine($\"Connection status: {connection.IsConnected}\");\n    Console.WriteLine($\"Endpoints: {string.Join(\", \", connection.GetEndPoints())}\");\n}\n```\n\n## Contributing\n\nWe welcome community contributions!\n\n### How to Contribute\n\n1. Fork this repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Create a Pull Request\n\n### Development Guidelines\n\n```bash\n# Clone repository\ngit clone https://github.com/vla/BloomFilter.NetCore.git\ncd BloomFilter.NetCore\n\n# Restore dependencies\ndotnet restore\n\n# Build project\ndotnet build\n\n# Run tests\ndotnet test\n\n# Run benchmarks\ncd test/BenchmarkTest\ndotnet run -c Release\n```\n\n### Code Standards\n\n- Follow C# coding conventions\n- Add XML documentation comments\n- Write unit tests\n- Update relevant documentation\n\n## Acknowledgments\n\nThanks to all developers who contributed to this project!\n\nSpecial thanks to:\n- .NET Foundation\n- StackExchange.Redis team\n- All dependency library authors\n\nIf this project helps you, please give us a ⭐️ Star!\n"
  },
  {
    "path": "README.zh-CN.md",
    "content": "# BloomFilter.NetCore\n\n[![License MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![.NET](https://img.shields.io/badge/.NET-6.0%20|%207.0%20|%208.0%20|%209.0%20|%2010.0-blue.svg)](https://dotnet.microsoft.com/)\n\n一个高性能、功能完整的 .NET 布隆过滤器实现库，支持内存存储和多种 Redis 分布式后端。\n\n## 目录\n\n- [项目概述](#项目概述)\n- [主要特性](#主要特性)\n- [包和状态](#包和状态)\n- [整体架构](#整体架构)\n- [核心功能](#核心功能)\n- [安装](#安装)\n- [快速开始](#快速开始)\n- [使用示例](#使用示例)\n  - [内存模式](#内存模式)\n  - [依赖注入配置](#依赖注入配置)\n  - [Redis 分布式模式](#redis-分布式模式)\n- [哈希算法](#哈希算法)\n- [性能基准测试](#性能基准测试)\n- [高级用法](#高级用法)\n- [API 参考](#api-参考)\n- [贡献指南](#贡献指南)\n- [许可证](#许可证)\n\n## 项目概述\n\nBloomFilter.NetCore 是一个企业级的布隆过滤器库，专为 .NET 生态系统设计。布隆过滤器是一种空间效率极高的概率型数据结构,用于测试一个元素是否属于一个集合。它的核心特点是:\n\n- **空间高效**: 相比传统的 HashSet,占用空间极小\n- **时间复杂度 O(1)**: 添加和查询操作都是常数时间\n- **允许一定误报率**: 可能返回假阳性(false positive),但绝不会出现假阴性(false negative)\n\n本项目提供了两大类实现:\n\n1. **内存布隆过滤器 (FilterMemory)**: 基于 BitArray 的内存实现,适用于单进程场景\n2. **分布式布隆过滤器 (FilterRedis 系列)**: 基于 Redis 的分布式实现,支持多应用程序并发访问\n\n### 主要用途\n\n- **缓存穿透防护**: 防止恶意查询不存在的数据导致缓存击穿\n- **去重场景**: URL 去重、邮箱去重、用户 ID 去重等\n- **推荐系统**: 判断用户是否已看过某个内容\n- **爬虫系统**: 判断 URL 是否已被爬取\n- **分布式系统**: 多服务实例间共享状态判断\n- **大数据场景**: 海量数据的存在性判断\n\n## 主要特性\n\n### 🎯 灵活配置\n\n- **参数完全可配置**: 位数组大小 (m)、哈希函数数量 (k)\n- **自动参数计算**: 根据容忍的误报率 (p) 和预期元素数量 (n) 自动计算最优参数\n- **20+ 种哈希算法**: 支持 CRC、MD5、SHA、Murmur、LCGs、xxHash 等或自定义算法\n\n### ⚡ 高性能\n\n- **快速生成**: 布隆过滤器的生成和操作都极快\n- **优化实现**: 使用 Span<T>、ReadOnlyMemory<T> 等零拷贝技术\n- **不安全代码优化**: 在性能关键路径使用 unsafe 代码块\n- **拒绝采样**: 实现了拒绝采样和哈希链,考虑雪崩效应以提高哈希质量\n\n### 🔒 并发安全\n\n- **线程安全**: 使用 AsyncLock 机制确保多线程并发访问安全\n- **异步支持**: 全面的 async/await 支持,所有操作都有异步版本\n- **分布式锁**: Redis 实现支持跨应用程序的并发访问\n\n### 🌐 多后端支持\n\n- **StackExchange.Redis**: 官方推荐的 Redis 客户端\n- **CSRedisCore**: 高性能的 Redis 客户端\n- **FreeRedis**: 轻量级 Redis 客户端\n- **EasyCaching**: 支持 EasyCaching 抽象层,可切换多种缓存提供程序\n\n### 📦 现代 .NET 支持\n\n- **多框架支持**: net462, netstandard2.0, net6.0, net7.0, net8.0, net9.0, net10.0\n- **依赖注入**: 原生支持 Microsoft.Extensions.DependencyInjection\n- **可空引用类型**: 启用可空引用类型,提高代码安全性\n\n## 包和状态\n\n| 包名 | NuGet | 说明 |\n|------|-------|------|\n|**BloomFilter.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.NetCore)| 核心包,提供内存布隆过滤器 |\n|**BloomFilter.Redis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.Redis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.Redis.NetCore)| StackExchange.Redis 实现 |\n|**BloomFilter.CSRedis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.CSRedis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.CSRedis.NetCore)| CSRedisCore 实现 |\n|**BloomFilter.FreeRedis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.FreeRedis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.FreeRedis.NetCore)| FreeRedis 实现 |\n|**BloomFilter.EasyCaching.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.EasyCaching.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.EasyCaching.NetCore)| EasyCaching 集成 |\n\n## 整体架构\n\n### 核心接口层\n\n```\nIBloomFilter (接口)\n    ├── Add / AddAsync           - 添加元素\n    ├── Contains / ContainsAsync - 检查元素\n    ├── All / AllAsync           - 批量检查\n    ├── Clear / ClearAsync       - 清空过滤器\n    └── ComputeHash              - 计算哈希值\n```\n\n### 实现层次结构\n\n```\nFilter (抽象基类)\n    ├── FilterMemory (内存实现)\n    │   └── 使用 BitArray 存储\n    │\n    └── Redis 系列 (分布式实现)\n        ├── FilterRedis (StackExchange.Redis)\n        ├── FilterCSRedis (CSRedisCore)\n        ├── FilterFreeRedis (FreeRedis)\n        └── FilterEasyCachingRedis (EasyCaching)\n```\n\n### 配置系统\n\n```\nBloomFilterOptions\n    ├── FilterMemoryOptions      - 内存模式配置\n    ├── FilterRedisOptions       - StackExchange.Redis 配置\n    ├── FilterCSRedisOptions     - CSRedisCore 配置\n    ├── FilterFreeRedisOptions   - FreeRedis 配置\n    └── FilterEasyCachingOptions - EasyCaching 配置\n```\n\n## 核心功能\n\n### 数学模型\n\nBloomFilter.NetCore 实现了完整的布隆过滤器数学模型:\n\n#### 1. 最优位数组大小 (m)\n\n给定预期元素数 `n` 和误报率 `p`,计算最优的位数组大小:\n\n```\nm = -(n * ln(p)) / (ln(2)^2)\n```\n\n#### 2. 最优哈希函数数量 (k)\n\n给定元素数 `n` 和位数组大小 `m`,计算最优的哈希函数数量:\n\n```\nk = (m / n) * ln(2)\n```\n\n#### 3. 实际误报率 (p)\n\n给定已插入元素数、哈希函数数量和位数组大小,计算实际误报率:\n\n```\np = (1 - e^(-k*n/m))^k\n```\n\n这些计算由 `Filter` 基类提供的静态方法实现:\n\n```csharp\n// 计算最优位数组大小\nlong m = Filter.BestM(expectedElements, errorRate);\n\n// 计算最优哈希函数数量\nint k = Filter.BestK(expectedElements, capacity);\n\n// 计算最优元素数量\nlong n = Filter.BestN(hashes, capacity);\n\n// 计算实际误报率\ndouble p = Filter.BestP(hashes, capacity, insertedElements);\n```\n\n### 存储机制\n\n#### 内存存储\n\n- **BitArray**: 使用 .NET 的 BitArray 作为底层存储\n- **分桶策略**: 当容量超过 2GB (MaxInt = 2,147,483,640) 时,自动分成多个 BitArray\n- **序列化支持**: 支持序列化/反序列化以持久化或传输过滤器状态\n\n#### Redis 存储\n\n- **SETBIT/GETBIT**: 使用 Redis 的位操作命令\n- **分布式访问**: 多个应用实例可以并发访问同一个过滤器\n- **持久化**: 利用 Redis 的持久化机制保证数据安全\n\n### 并发控制\n\n```csharp\n// AsyncLock 确保线程安全\npublic class AsyncLock\n{\n    private readonly SemaphoreSlim _semaphore = new(1, 1);\n\n    public async ValueTask<IDisposable> LockAsync()\n    {\n        await _semaphore.WaitAsync();\n        return new Release(_semaphore);\n    }\n}\n```\n\n## 安装\n\n### 通过 NuGet 安装\n\n**内存模式 (核心包):**\n\n```bash\ndotnet add package BloomFilter.NetCore\n```\n\n**Redis 分布式模式 (选择一个):**\n\n```bash\n# StackExchange.Redis\ndotnet add package BloomFilter.Redis.NetCore\n\n# CSRedisCore\ndotnet add package BloomFilter.CSRedis.NetCore\n\n# FreeRedis\ndotnet add package BloomFilter.FreeRedis.NetCore\n\n# EasyCaching\ndotnet add package BloomFilter.EasyCaching.NetCore\n```\n\n## 快速开始\n\n### 最简单的示例\n\n```csharp\nusing BloomFilter;\n\n// 创建一个布隆过滤器:预期 1000 万元素,1% 误报率\nvar bf = FilterBuilder.Build(10_000_000, 0.01);\n\n// 添加元素\nbf.Add(\"user:123\");\nbf.Add(\"user:456\");\n\n// 检查元素是否存在\nConsole.WriteLine(bf.Contains(\"user:123\")); // True\nConsole.WriteLine(bf.Contains(\"user:789\")); // False (可能极小概率为 True)\n\n// 清空过滤器\nbf.Clear();\n```\n\n### 异步操作\n\n```csharp\n// 异步添加\nawait bf.AddAsync(Encoding.UTF8.GetBytes(\"user:123\"));\n\n// 异步检查\nbool exists = await bf.ContainsAsync(Encoding.UTF8.GetBytes(\"user:123\"));\n\n// 批量异步操作\nvar users = new[] {\n    Encoding.UTF8.GetBytes(\"user:1\"),\n    Encoding.UTF8.GetBytes(\"user:2\"),\n    Encoding.UTF8.GetBytes(\"user:3\")\n};\n\nawait bf.AddAsync(users);\nvar results = await bf.ContainsAsync(users);\n```\n\n### Fluent API（v3.0 新增）\n\nv3.0 引入了现代化的流式 API，提供更好的可发现性和表达力：\n\n```csharp\n// 内存模式 Fluent API\nvar filter = FilterBuilder.Create()\n    .WithName(\"UserFilter\")\n    .ExpectingElements(10_000_000)\n    .WithErrorRate(0.001)\n    .UsingHashMethod(HashMethod.XXHash3)\n    .BuildInMemory();\n\n// Redis Fluent API (StackExchange.Redis)\nvar redisFilter = FilterRedisBuilder.Create()\n    .WithRedisConnection(\"localhost:6379\")\n    .WithRedisKey(\"bloom:users\")\n    .WithName(\"UserFilter\")\n    .ExpectingElements(10_000_000)\n    .WithErrorRate(0.001)\n    .BuildRedis();\n\n// CSRedis Fluent API\nvar csredisFilter = FilterCSRedisBuilder.Create()\n    .WithRedisClient(csredisClient)\n    .WithRedisKey(\"bloom:users\")\n    .ExpectingElements(10_000_000)\n    .BuildCSRedis();\n\n// FreeRedis Fluent API\nvar freeRedisFilter = FilterFreeRedisBuilder.Create()\n    .WithRedisClient(redisClient)\n    .WithRedisKey(\"bloom:users\")\n    .ExpectingElements(10_000_000)\n    .BuildFreeRedis();\n\n// EasyCaching Fluent API\nvar easyCachingFilter = FilterEasyCachingBuilder.Create()\n    .WithRedisCachingProvider(provider)\n    .WithRedisKey(\"bloom:users\")\n    .ExpectingElements(10_000_000)\n    .BuildEasyCaching();\n\n// 所有通用配置方法：\n// - WithName(string) - 设置过滤器名称\n// - ExpectingElements(long) - 设置预期元素数量\n// - WithErrorRate(double) - 设置误报率 (0-1)\n// - UsingHashMethod(HashMethod) - 使用预定义哈希算法\n// - UsingCustomHash(HashFunction) - 使用自定义哈希函数\n// - WithSerializer(IFilterMemorySerializer) - 设置自定义序列化器（仅内存模式）\n```\n\n**为什么使用 Fluent API？**\n- 🔍 通过 IntelliSense 更好的可发现性\n- 📖 代码更易读、更自文档化\n- ⛓️ 可链式调用方法\n- 🎯 类型安全的配置\n- ✅ 向后兼容 - 旧的静态方法仍然可用！\n\n## 使用示例\n\n### 内存模式\n\n#### 基本用法\n\n```csharp\nusing BloomFilter;\n\npublic class UserService\n{\n    // 静态共享的布隆过滤器\n    private static readonly IBloomFilter _bloomFilter =\n        FilterBuilder.Build(10_000_000, 0.01);\n\n    public void AddUser(string userId)\n    {\n        // 添加用户 ID\n        _bloomFilter.Add(userId);\n    }\n\n    public bool MayExistUser(string userId)\n    {\n        // 检查用户是否可能存在\n        return _bloomFilter.Contains(userId);\n    }\n}\n```\n\n#### 自定义配置\n\n```csharp\nusing BloomFilter;\n\n// 方式 1: 指定哈希算法\nvar bf1 = FilterBuilder.Build(\n    expectedElements: 1_000_000,\n    errorRate: 0.001,\n    hashMethod: HashMethod.Murmur3\n);\n\n// 方式 2: 使用自定义哈希函数\nvar hashFunction = new Murmur128BitsX64();\nvar bf2 = FilterBuilder.Build(\n    expectedElements: 1_000_000,\n    errorRate: 0.001,\n    hashFunction: hashFunction\n);\n\n// 方式 3: 手动指定参数 (高级用法)\nvar bf3 = FilterBuilder.Build(\n    capacity: 9585059,      // 位数组大小\n    hashes: 10,             // 哈希函数数量\n    hashMethod: HashMethod.XXHash3\n);\n\n// 方式 4: 使用配置对象\nvar options = new FilterMemoryOptions\n{\n    Name = \"MyFilter\",\n    ExpectedElements = 5_000_000,\n    ErrorRate = 0.01,\n    Method = HashMethod.Murmur3\n};\nvar bf4 = FilterBuilder.Build(options);\n```\n\n### 依赖注入配置\n\n#### ASP.NET Core 集成\n\n```csharp\nusing BloomFilter;\nusing Microsoft.Extensions.DependencyInjection;\n\npublic class Startup\n{\n    public void ConfigureServices(IServiceCollection services)\n    {\n        // 注册布隆过滤器服务\n        services.AddBloomFilter(setupAction =>\n        {\n            setupAction.UseInMemory(options =>\n            {\n                options.Name = \"MainFilter\";\n                options.ExpectedElements = 10_000_000;\n                options.ErrorRate = 0.01;\n                options.Method = HashMethod.Murmur3;\n            });\n        });\n\n        services.AddControllers();\n    }\n}\n\n// 在控制器或服务中使用\npublic class UserController : ControllerBase\n{\n    private readonly IBloomFilter _bloomFilter;\n\n    public UserController(IBloomFilter bloomFilter)\n    {\n        _bloomFilter = bloomFilter;\n    }\n\n    [HttpPost(\"users/{userId}\")]\n    public IActionResult CheckUser(string userId)\n    {\n        if (_bloomFilter.Contains(userId))\n        {\n            // 用户可能存在,继续查询数据库\n            return Ok(\"用户可能存在\");\n        }\n        else\n        {\n            // 用户一定不存在,无需查询数据库\n            return NotFound(\"用户不存在\");\n        }\n    }\n}\n```\n\n#### 多个过滤器实例\n\n```csharp\nservices.AddBloomFilter(setupAction =>\n{\n    // 用户过滤器\n    setupAction.UseInMemory(options =>\n    {\n        options.Name = \"UserFilter\";\n        options.ExpectedElements = 10_000_000;\n        options.ErrorRate = 0.01;\n    });\n\n    // 邮箱过滤器\n    setupAction.UseInMemory(options =>\n    {\n        options.Name = \"EmailFilter\";\n        options.ExpectedElements = 5_000_000;\n        options.ErrorRate = 0.001;\n    });\n});\n\n// 使用工厂获取指定过滤器\npublic class MyService\n{\n    private readonly IBloomFilter _userFilter;\n    private readonly IBloomFilter _emailFilter;\n\n    public MyService(IBloomFilterFactory factory)\n    {\n        _userFilter = factory.Get(\"UserFilter\");\n        _emailFilter = factory.Get(\"EmailFilter\");\n    }\n}\n```\n\n### Redis 分布式模式\n\n#### StackExchange.Redis\n\n```csharp\nusing BloomFilter;\n\n// 方式 1: 直接构建\nvar bf = FilterRedisBuilder.Build(\n    redisHost: \"localhost:6379\",\n    name: \"DistributedFilter\",\n    expectedElements: 5_000_000,\n    errorRate: 0.001\n);\n\nbf.Add(\"item:123\");\nConsole.WriteLine(bf.Contains(\"item:123\")); // True\n\n// 方式 2: 依赖注入\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseRedis(new FilterRedisOptions\n    {\n        Name = \"UserFilter\",\n        RedisKey = \"BloomFilter:Users\",\n        Endpoints = new List<string> { \"localhost:6379\" },\n        Database = 0,\n        ExpectedElements = 10_000_000,\n        ErrorRate = 0.01,\n        Method = HashMethod.Murmur3\n    });\n});\n\n// 方式 3: 高级配置 (主从、哨兵、集群)\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseRedis(new FilterRedisOptions\n    {\n        Name = \"ProductFilter\",\n        RedisKey = \"BloomFilter:Products\",\n        Endpoints = new List<string>\n        {\n            \"redis-master:6379\",\n            \"redis-slave1:6379\",\n            \"redis-slave2:6379\"\n        },\n        Password = \"your-redis-password\",\n        Ssl = true,\n        ConnectTimeout = 5000,\n        SyncTimeout = 3000,\n        ExpectedElements = 20_000_000,\n        ErrorRate = 0.001\n    });\n});\n```\n\n#### CSRedisCore\n\n```csharp\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseCSRedis(new FilterCSRedisOptions\n    {\n        Name = \"OrderFilter\",\n        RedisKey = \"BloomFilter:Orders\",\n        ConnectionStrings = new List<string>\n        {\n            \"localhost:6379,password=123456,defaultDatabase=0,poolsize=50,prefix=myapp:\"\n        },\n        ExpectedElements = 5_000_000,\n        ErrorRate = 0.01\n    });\n});\n```\n\n#### FreeRedis\n\n```csharp\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseFreeRedis(new FilterFreeRedisOptions\n    {\n        Name = \"CartFilter\",\n        RedisKey = \"BloomFilter:Carts\",\n        ConnectionStrings = new List<string> { \"localhost:6379,password=123456\" },\n        ExpectedElements = 1_000_000,\n        ErrorRate = 0.01\n    });\n});\n```\n\n#### EasyCaching 集成\n\nEasyCaching 提供了统一的缓存抽象层,允许您轻松切换底层缓存实现:\n\n```csharp\nusing EasyCaching.Core.Configurations;\nusing Microsoft.Extensions.DependencyInjection;\n\nvar services = new ServiceCollection();\n\n// 1. 配置 EasyCaching\nservices.AddEasyCaching(options =>\n{\n    // 配置 Redis 提供程序\n    options.UseRedis(config =>\n    {\n        config.DBConfig.Endpoints.Add(new ServerEndPoint(\"127.0.0.1\", 6379));\n        config.DBConfig.Database = 0;\n    }, \"redis-provider-1\");\n\n    // 可以配置多个提供程序\n    options.UseRedis(config =>\n    {\n        config.DBConfig.Endpoints.Add(new ServerEndPoint(\"127.0.0.1\", 6379));\n        config.DBConfig.Database = 1;\n    }, \"redis-provider-2\");\n});\n\n// 2. 配置 BloomFilter\nservices.AddBloomFilter(setupAction =>\n{\n    // 使用第一个 Redis 提供程序\n    setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions\n    {\n        Name = \"BF1\",\n        RedisKey = \"BloomFilter1\",\n        ProviderName = \"redis-provider-1\",\n        ExpectedElements = 10_000_000,\n        ErrorRate = 0.01\n    });\n\n    // 使用第二个 Redis 提供程序\n    setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions\n    {\n        Name = \"BF2\",\n        RedisKey = \"BloomFilter2\",\n        ProviderName = \"redis-provider-2\",\n        ExpectedElements = 5_000_000,\n        ErrorRate = 0.001\n    });\n});\n\nvar provider = services.BuildServiceProvider();\n\n// 使用默认过滤器\nvar bf = provider.GetService<IBloomFilter>();\nbf.Add(\"value1\");\n\n// 使用指定名称的过滤器\nvar factory = provider.GetService<IBloomFilterFactory>();\nvar bf1 = factory.Get(\"BF1\");\nvar bf2 = factory.Get(\"BF2\");\n\nbf1.Add(\"item1\");\nbf2.Add(\"item2\");\n```\n\n### 实际应用场景\n\n#### 1. 防止缓存穿透\n\n```csharp\npublic class ProductService\n{\n    private readonly IBloomFilter _bloomFilter;\n    private readonly ICache _cache;\n    private readonly IProductRepository _repository;\n\n    public ProductService(\n        IBloomFilter bloomFilter,\n        ICache cache,\n        IProductRepository repository)\n    {\n        _bloomFilter = bloomFilter;\n        _cache = cache;\n        _repository = repository;\n    }\n\n    public async Task<Product> GetProductAsync(string productId)\n    {\n        // 第一层防护: 布隆过滤器\n        if (!_bloomFilter.Contains(productId))\n        {\n            // 商品一定不存在,直接返回 null\n            return null;\n        }\n\n        // 第二层: 缓存\n        var cached = await _cache.GetAsync<Product>(productId);\n        if (cached != null)\n        {\n            return cached;\n        }\n\n        // 第三层: 数据库\n        var product = await _repository.GetByIdAsync(productId);\n        if (product != null)\n        {\n            await _cache.SetAsync(productId, product);\n        }\n\n        return product;\n    }\n\n    public async Task CreateProductAsync(Product product)\n    {\n        // 保存到数据库\n        await _repository.SaveAsync(product);\n\n        // 添加到布隆过滤器\n        _bloomFilter.Add(product.Id);\n\n        // 更新缓存\n        await _cache.SetAsync(product.Id, product);\n    }\n}\n```\n\n#### 2. URL 去重 (爬虫系统)\n\n```csharp\npublic class WebCrawler\n{\n    private readonly IBloomFilter _visitedUrls;\n    private readonly Queue<string> _urlQueue;\n\n    public WebCrawler(IBloomFilter bloomFilter)\n    {\n        _visitedUrls = bloomFilter;\n        _urlQueue = new Queue<string>();\n    }\n\n    public async Task CrawlAsync(string startUrl)\n    {\n        _urlQueue.Enqueue(startUrl);\n\n        while (_urlQueue.Count > 0)\n        {\n            var url = _urlQueue.Dequeue();\n\n            // 检查是否已访问\n            if (_visitedUrls.Contains(url))\n            {\n                continue; // 跳过已访问的 URL\n            }\n\n            // 标记为已访问\n            _visitedUrls.Add(url);\n\n            // 抓取页面\n            var page = await DownloadPageAsync(url);\n\n            // 处理页面\n            await ProcessPageAsync(page);\n\n            // 提取新的 URL\n            var newUrls = ExtractUrls(page);\n            foreach (var newUrl in newUrls)\n            {\n                if (!_visitedUrls.Contains(newUrl))\n                {\n                    _urlQueue.Enqueue(newUrl);\n                }\n            }\n        }\n    }\n}\n```\n\n#### 3. 分布式去重 (多实例)\n\n```csharp\n// 配置分布式布隆过滤器\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseRedis(new FilterRedisOptions\n    {\n        Name = \"GlobalDeduplication\",\n        RedisKey = \"BF:Dedup\",\n        Endpoints = new List<string> { \"redis-cluster:6379\" },\n        ExpectedElements = 100_000_000,\n        ErrorRate = 0.0001\n    });\n});\n\n// 在多个服务实例中使用\npublic class MessageProcessor\n{\n    private readonly IBloomFilter _bloomFilter;\n\n    public async Task ProcessMessageAsync(Message message)\n    {\n        // 所有实例共享同一个 Redis 布隆过滤器\n        if (await _bloomFilter.ContainsAsync(message.Id))\n        {\n            // 消息已被其他实例处理\n            return;\n        }\n\n        // 标记为已处理\n        await _bloomFilter.AddAsync(message.Id);\n\n        // 处理消息\n        await HandleMessageAsync(message);\n    }\n}\n```\n\n## 哈希算法\n\nBloomFilter.NetCore 支持 20+ 种哈希算法,可根据性能和准确性需求选择:\n\n### 算法分类\n\n| 类别 | 算法 | 特点 | 适用场景 |\n|------|------|------|----------|\n| **LCG 类** | LCGWithFNV1<br>LCGWithFNV1a<br>LCGModifiedFNV1 | 极快,但质量较低 | 性能要求极高,可容忍高误报率 |\n| **RNG 类** | RNGWithFNV1<br>RNGWithFNV1a<br>RNGModifiedFNV1 | 质量高,但较慢 | 对准确性要求高的场景 |\n| **校验和** | CRC32<br>CRC64<br>Adler32 | 平衡性能和质量 | 通用场景 |\n| **Murmur 系列** | Murmur3<br>Murmur32BitsX86<br>Murmur128BitsX64<br>Murmur128BitsX86 | **推荐**,性能好,质量高 | 生产环境推荐 |\n| **加密哈希** | SHA1<br>SHA256<br>SHA384<br>SHA512 | 质量最高,但最慢 | 安全性要求极高的场景 |\n| **XXHash 系列** | XXHash32<br>XXHash64<br>XXHash3<br>XXHash128 | **最快**,质量优秀 | 高性能场景首选 |\n\n### 选择建议\n\n```csharp\n// 推荐: 生产环境默认选择 Murmur3 (平衡性能和质量)\nvar bf1 = FilterBuilder.Build(10_000_000, 0.01, HashMethod.Murmur3);\n\n// 高性能: 对性能要求极高,选择 XXHash3\nvar bf2 = FilterBuilder.Build(10_000_000, 0.01, HashMethod.XXHash3);\n\n// 高精度: 对误报率要求极低,选择 SHA256 + 更低的 errorRate\nvar bf3 = FilterBuilder.Build(10_000_000, 0.0001, HashMethod.SHA256);\n\n// 分布式: Redis 场景推荐 XXHash64 (速度快且跨语言支持好)\nvar bf4 = FilterRedisBuilder.Build(\n    \"localhost:6379\",\n    \"MyFilter\",\n    10_000_000,\n    0.01,\n    HashMethod.XXHash64\n);\n```\n\n## 性能基准测试\n\n### 测试环境\n\n```\nBenchmarkDotNet=v0.13.5\nOS: Windows 11 (10.0.22621.1778/22H2)\nCPU: AMD Ryzen 7 5800X, 1 CPU, 16 logical cores, 8 physical cores\n.NET SDK: 7.0.304\nRuntime: .NET 7.0.7 (7.0.723.27404), X64 RyuJIT AVX2\n```\n\n### 性能排名 (64 字节数据)\n\n| 排名 | 算法 | 平均时间 | 相对速度 |\n|------|------|----------|----------|\n| 🥇 1 | XXHash3 | 33.14 ns | 基准 (最快) |\n| 🥈 2 | XXHash128 | 36.01 ns | 1.09x |\n| 🥉 3 | CRC64 | 38.83 ns | 1.17x |\n| 4 | XXHash64 | 50.62 ns | 1.53x |\n| 5 | Murmur3 | 70.98 ns | 2.14x |\n| ... | ... | ... | ... |\n| 28 | SHA512 | 1,368.20 ns | 41.28x (最慢) |\n\n### 完整性能数据\n\n<details>\n<summary>点击展开完整基准测试结果</summary>\n\n#### 64 字节数据\n\n| 算法 | 平均时间 | 误差 | 标准差 | 内存分配 |\n|------|---------|------|--------|---------|\n| XXHash3 | 33.14 ns | 0.295 ns | 0.276 ns | 80 B |\n| XXHash128 | 36.01 ns | 0.673 ns | 0.749 ns | 80 B |\n| CRC64 | 38.83 ns | 0.399 ns | 0.333 ns | 80 B |\n| XXHash64 | 50.62 ns | 0.756 ns | 0.670 ns | 80 B |\n| Murmur3 | 70.98 ns | 1.108 ns | 1.036 ns | 80 B |\n| XXHash32 | 73.15 ns | 0.526 ns | 0.466 ns | 80 B |\n| Murmur128BitsX64 | 80.15 ns | 0.783 ns | 0.653 ns | 120 B |\n| Murmur128BitsX86 | 82.73 ns | 1.211 ns | 1.011 ns | 120 B |\n| LCGWithFNV1 | 91.27 ns | 1.792 ns | 2.134 ns | 80 B |\n| CRC32 | 145.63 ns | 1.528 ns | 1.429 ns | 328 B |\n| Adler32 | 150.07 ns | 0.664 ns | 0.589 ns | 336 B |\n| RNGWithFNV1 | 445.32 ns | 8.463 ns | 9.747 ns | 384 B |\n| SHA256 | 922.30 ns | 4.478 ns | 3.739 ns | 496 B |\n| SHA1 | 1,045.67 ns | 6.411 ns | 5.997 ns | 464 B |\n| SHA384 | 1,173.67 ns | 5.050 ns | 3.942 ns | 456 B |\n| SHA512 | 1,368.20 ns | 10.967 ns | 9.722 ns | 504 B |\n\n#### 1 MB 数据\n\n| 算法 | 平均时间 |\n|------|---------|\n| XXHash3 | 30,258.92 ns (~30 μs) |\n| XXHash128 | 33,778.68 ns (~34 μs) |\n| CRC64 | 56,321.74 ns (~56 μs) |\n| XXHash64 | 100,570.79 ns (~101 μs) |\n| Murmur128BitsX64 | 163,915.44 ns (~164 μs) |\n| ... | ... |\n| SHA1 | 3,381,425.73 ns (~3.4 ms) |\n\n</details>\n\n### 性能建议\n\n1. **通用场景**: 使用 `Murmur3` (默认),性能和质量平衡\n2. **极限性能**: 使用 `XXHash3`,比 Murmur3 快 2 倍\n3. **大数据**: 使用 `XXHash128` 或 `Murmur128BitsX64`,128 位输出减少碰撞\n4. **避免使用**: LCG 系列 (质量差)、SHA 系列 (太慢)\n\n## 高级用法\n\n### 序列化和反序列化\n\n```csharp\n// 导出布隆过滤器状态\nvar bf = FilterBuilder.Build(1_000_000, 0.01);\nbf.Add(\"item1\");\nbf.Add(\"item2\");\n\n// 获取内部状态 (用于持久化)\nvar memory = (FilterMemory)bf;\nvar buckets = memory.Buckets; // BitArray[]\nvar bucketBytes = memory.BucketBytes; // byte[][]\n\n// 从状态恢复布隆过滤器\nvar options = new FilterMemoryOptions\n{\n    Name = \"RestoredFilter\",\n    ExpectedElements = 1_000_000,\n    ErrorRate = 0.01,\n    Buckets = buckets // 或使用 BucketBytes\n};\nvar restoredBf = FilterBuilder.Build(options);\n\nConsole.WriteLine(restoredBf.Contains(\"item1\")); // True\n```\n\n### 批量操作\n\n```csharp\n// 批量添加\nvar items = Enumerable.Range(1, 10000)\n    .Select(i => Encoding.UTF8.GetBytes($\"user:{i}\"))\n    .ToArray();\n\nvar addResults = bf.Add(items);\nConsole.WriteLine($\"成功添加: {addResults.Count(r => r)} 个元素\");\n\n// 批量检查\nvar checkResults = bf.Contains(items);\nConsole.WriteLine($\"存在: {checkResults.Count(r => r)} 个元素\");\n\n// 检查所有元素是否都存在\nbool allExist = bf.All(items);\n\n// 异步批量操作\nvar asyncAddResults = await bf.AddAsync(items);\nvar asyncCheckResults = await bf.ContainsAsync(items);\nbool asyncAllExist = await bf.AllAsync(items);\n```\n\n### 自定义哈希函数\n\n```csharp\nusing BloomFilter.HashAlgorithms;\n\n// 实现自定义哈希算法\npublic class MyCustomHash : HashFunction\n{\n    public override long ComputeHash(ReadOnlySpan<byte> data)\n    {\n        // 自定义哈希逻辑\n        long hash = 0;\n        foreach (var b in data)\n        {\n            hash = hash * 31 + b;\n        }\n        return hash;\n    }\n}\n\n// 使用自定义哈希\nvar customHash = new MyCustomHash();\nvar bf = FilterBuilder.Build(1_000_000, 0.01, customHash);\n```\n\n### 计算实际误报率\n\n```csharp\nvar bf = FilterBuilder.Build(100_000, 0.01);\n\n// 添加 50,000 个元素\nfor (int i = 0; i < 50_000; i++)\n{\n    bf.Add($\"item:{i}\");\n}\n\n// 计算理论误报率\nvar filter = (Filter)bf;\ndouble theoreticalErrorRate = Filter.BestP(\n    filter.Hashes,\n    filter.Capacity,\n    50_000\n);\n\nConsole.WriteLine($\"理论误报率: {theoreticalErrorRate:P4}\");\n\n// 测试实际误报率\nint falsePositives = 0;\nint testCount = 100_000;\n\nfor (int i = 50_000; i < 50_000 + testCount; i++)\n{\n    if (bf.Contains($\"item:{i}\"))\n    {\n        falsePositives++;\n    }\n}\n\ndouble actualErrorRate = (double)falsePositives / testCount;\nConsole.WriteLine($\"实际误报率: {actualErrorRate:P4}\");\nConsole.WriteLine($\"误报数量: {falsePositives} / {testCount}\");\n```\n\n### 监控和统计\n\n```csharp\npublic class BloomFilterMonitor\n{\n    private readonly IBloomFilter _filter;\n    private long _addCount;\n    private long _hitCount;\n    private long _missCount;\n\n    public BloomFilterMonitor(IBloomFilter filter)\n    {\n        _filter = filter;\n    }\n\n    public bool Add(string item)\n    {\n        Interlocked.Increment(ref _addCount);\n        return _filter.Add(item);\n    }\n\n    public bool Contains(string item)\n    {\n        var result = _filter.Contains(item);\n        if (result)\n            Interlocked.Increment(ref _hitCount);\n        else\n            Interlocked.Increment(ref _missCount);\n        return result;\n    }\n\n    public void PrintStats()\n    {\n        Console.WriteLine($\"总添加: {_addCount}\");\n        Console.WriteLine($\"命中: {_hitCount}\");\n        Console.WriteLine($\"未命中: {_missCount}\");\n        Console.WriteLine($\"命中率: {(double)_hitCount / (_hitCount + _missCount):P2}\");\n    }\n}\n```\n\n## API 参考\n\n### IBloomFilter 接口\n\n```csharp\npublic interface IBloomFilter : IDisposable\n{\n    // 属性\n    string Name { get; }\n\n    // 同步方法\n    bool Add(ReadOnlySpan<byte> data);\n    IList<bool> Add(IEnumerable<byte[]> elements);\n    bool Contains(ReadOnlySpan<byte> element);\n    IList<bool> Contains(IEnumerable<byte[]> elements);\n    bool All(IEnumerable<byte[]> elements);\n    void Clear();\n    long[] ComputeHash(ReadOnlySpan<byte> data);\n\n    // 异步方法\n    ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data);\n    ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elements);\n    ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element);\n    ValueTask<IList<bool>> ContainsAsync(IEnumerable<byte[]> elements);\n    ValueTask<bool> AllAsync(IEnumerable<byte[]> elements);\n    ValueTask ClearAsync();\n}\n```\n\n### Filter 基类\n\n```csharp\npublic abstract class Filter : IBloomFilter\n{\n    // 属性\n    public string Name { get; }\n    public HashFunction Hash { get; }\n    public long Capacity { get; }\n    public int Hashes { get; }\n    public long ExpectedElements { get; }\n    public double ErrorRate { get; }\n\n    // 静态方法 (数学计算)\n    public static long BestM(long n, double p);\n    public static int BestK(long n, long m);\n    public static long BestN(int k, long m);\n    public static double BestP(int k, long m, long insertedElements);\n}\n```\n\n### FilterBuilder\n\n```csharp\npublic static class FilterBuilder\n{\n    // 使用预期元素数和误报率\n    public static IBloomFilter Build(long expectedElements, double errorRate);\n    public static IBloomFilter Build(long expectedElements, double errorRate, HashMethod method);\n    public static IBloomFilter Build(long expectedElements, double errorRate, HashFunction hash);\n\n    // 使用容量和哈希函数数量\n    public static IBloomFilter Build(long capacity, int hashes, HashMethod method);\n    public static IBloomFilter Build(long capacity, int hashes, HashFunction hash);\n\n    // 使用配置对象\n    public static IBloomFilter Build(FilterMemoryOptions options);\n}\n```\n\n### FilterRedisBuilder\n\n```csharp\npublic static class FilterRedisBuilder\n{\n    public static IBloomFilter Build(\n        string redisHost,\n        string name,\n        long expectedElements,\n        double errorRate,\n        HashMethod method = HashMethod.Murmur3);\n}\n```\n\n### 扩展方法\n\n```csharp\n// 服务注册\npublic static class ServiceCollectionExtensions\n{\n    public static IServiceCollection AddBloomFilter(\n        this IServiceCollection services,\n        Action<BloomFilterOptions> setupAction);\n}\n\n// 配置扩展\npublic static class BloomFilterOptionsExtensions\n{\n    public static BloomFilterOptions UseInMemory(\n        this BloomFilterOptions options,\n        Action<FilterMemoryOptions> setup = null);\n\n    public static BloomFilterOptions UseRedis(\n        this BloomFilterOptions options,\n        FilterRedisOptions setup);\n\n    public static BloomFilterOptions UseCSRedis(\n        this BloomFilterOptions options,\n        FilterCSRedisOptions setup);\n\n    public static BloomFilterOptions UseFreeRedis(\n        this BloomFilterOptions options,\n        FilterFreeRedisOptions setup);\n\n    public static BloomFilterOptions UseEasyCachingRedis(\n        this BloomFilterOptions options,\n        FilterEasyCachingRedisOptions setup);\n}\n```\n\n## 常见问题 (FAQ)\n\n### 1. 布隆过滤器的误报率是多少?\n\n误报率由您在创建时指定的 `errorRate` 参数决定。例如:\n\n```csharp\n// 1% 误报率\nvar bf = FilterBuilder.Build(1_000_000, 0.01);\n\n// 0.1% 误报率 (更准确,但占用更多内存)\nvar bf2 = FilterBuilder.Build(1_000_000, 0.001);\n```\n\n**注意**: 误报率越低,需要的内存空间越大。\n\n### 2. 如何选择 expectedElements?\n\n`expectedElements` 应设置为您预期要添加的元素数量。如果实际添加的元素超过这个数量,误报率会增加。\n\n建议:\n- 估算实际元素数量\n- 留出 20%-50% 的冗余\n- 定期监控实际误报率\n\n### 3. 内存模式 vs Redis 模式如何选择?\n\n| 场景 | 推荐模式 | 原因 |\n|------|---------|------|\n| 单实例应用 | 内存模式 | 性能最高,无网络开销 |\n| 多实例应用 | Redis 模式 | 共享状态,支持分布式 |\n| 需要持久化 | Redis 模式 | Redis 提供持久化 |\n| 临时去重 | 内存模式 | 简单快速 |\n| 跨服务共享 | Redis 模式 | 支持多语言访问 |\n\n### 4. 如何清空布隆过滤器?\n\n```csharp\n// 同步清空\nbf.Clear();\n\n// 异步清空\nawait bf.ClearAsync();\n```\n\n**注意**: 清空操作会删除所有数据,谨慎使用!\n\n### 5. 布隆过滤器占用多少内存?\n\n内存占用取决于容量 (m):\n\n```\n内存 (字节) = m / 8\n```\n\n示例计算:\n\n```csharp\n// 1000 万元素, 1% 误报率\nvar bf = FilterBuilder.Build(10_000_000, 0.01);\nvar filter = (Filter)bf;\n\n// 计算内存占用\nlong bits = filter.Capacity;\nlong bytes = bits / 8;\ndouble mb = bytes / (1024.0 * 1024.0);\n\nConsole.WriteLine($\"位数组大小: {bits:N0} bits\");\nConsole.WriteLine($\"内存占用: {bytes:N0} bytes ({mb:F2} MB)\");\n// 输出: 约 11.4 MB\n```\n\n### 6. 可以删除元素吗?\n\n**不可以**。标准布隆过滤器不支持删除操作,因为:\n- 多个元素可能映射到相同的位\n- 删除一个元素可能影响其他元素的检测\n\n如果需要删除功能,考虑使用:\n- Counting Bloom Filter (计数布隆过滤器)\n- Cuckoo Filter (布谷鸟过滤器)\n\n### 7. 线程安全吗?\n\n是的,BloomFilter.NetCore 是线程安全的:\n\n```csharp\n// 多线程并发访问\nvar bf = FilterBuilder.Build(10_000_000, 0.01);\n\nParallel.For(0, 1000, i =>\n{\n    bf.Add($\"item:{i}\"); // 线程安全\n});\n\nParallel.For(0, 1000, i =>\n{\n    var exists = bf.Contains($\"item:{i}\"); // 线程安全\n});\n```\n\n### 8. 如何监控 Redis 连接?\n\n```csharp\n// 使用 StackExchange.Redis 的连接监控\nservices.AddBloomFilter(setupAction =>\n{\n    setupAction.UseRedis(new FilterRedisOptions\n    {\n        Name = \"MyFilter\",\n        RedisKey = \"BF:Key\",\n        Endpoints = new List<string> { \"localhost:6379\" },\n        // 启用连接日志\n        AbortOnConnectFail = false,\n        ConnectTimeout = 5000,\n        ConnectRetry = 3\n    });\n});\n\n// 获取 Redis 连接信息\nvar bf = serviceProvider.GetService<IBloomFilter>();\nif (bf is FilterRedis redisFilter)\n{\n    var connection = redisFilter.Connection;\n    Console.WriteLine($\"连接状态: {connection.IsConnected}\");\n    Console.WriteLine($\"端点: {string.Join(\", \", connection.GetEndPoints())}\");\n}\n```\n\n## 贡献指南\n\n我们欢迎社区贡献!\n\n### 如何贡献\n\n1. Fork 本仓库\n2. 创建特性分支 (`git checkout -b feature/amazing-feature`)\n3. 提交更改 (`git commit -m 'Add amazing feature'`)\n4. 推送到分支 (`git push origin feature/amazing-feature`)\n5. 创建 Pull Request\n\n### 开发指南\n\n```bash\n# 克隆仓库\ngit clone https://github.com/vla/BloomFilter.NetCore.git\ncd BloomFilter.NetCore\n\n# 还原依赖\ndotnet restore\n\n# 构建项目\ndotnet build\n\n# 运行测试\ndotnet test\n\n# 运行基准测试\ncd test/BenchmarkTest\ndotnet run -c Release\n```\n\n### 代码规范\n\n- 遵循 C# 编码规范\n- 添加 XML 文档注释\n- 编写单元测试\n- 更新相关文档\n\n## 致谢\n\n感谢所有为本项目做出贡献的开发者!\n\n特别感谢:\n- .NET Foundation\n- StackExchange.Redis 团队\n- 所有依赖库的作者\n\n如果这个项目对您有帮助,请给我们一个 ⭐️ Star!\n"
  },
  {
    "path": "VERSION",
    "content": "3.0.0\n"
  },
  {
    "path": "build.cmd",
    "content": "set artifacts=%~dp0artifacts\n\nif exist %artifacts%  rd /q /s %artifacts%\n\nset /p ver=<VERSION\n\ndotnet restore src/BloomFilter\ndotnet restore src/BloomFilter.Redis\ndotnet restore src/BloomFilter.CSRedis\ndotnet restore src/BloomFilter.FreeRedis\ndotnet restore src/BloomFilter.EasyCaching\n\ndotnet pack src/BloomFilter -c release -p:Ver=%ver% -o %artifacts%\ndotnet pack src/BloomFilter.Redis -c release  -p:Ver=%ver% -o %artifacts%\ndotnet pack src/BloomFilter.CSRedis -c release  -p:Ver=%ver% -o %artifacts%\ndotnet pack src/BloomFilter.FreeRedis -c release  -p:Ver=%ver% -o %artifacts%\ndotnet pack src/BloomFilter.EasyCaching -c release  -p:Ver=%ver% -o %artifacts%\n\npause"
  },
  {
    "path": "build.sh",
    "content": "#!/usr/bin/env bash\nset -e\nbasepath=$(cd `dirname $0`; pwd)\nartifacts=${basepath}/artifacts\n\nif [[ -d ${artifacts} ]]; then\n   rm -rf ${artifacts}\nfi\n\nmkdir -p ${artifacts}\n\ndotnet build src/BloomFilter.Redis -f netstandard2.0 -c Release -o ${artifacts}/netstandard2.0\n\n"
  },
  {
    "path": "nuget_push.cmd",
    "content": "set /p ver=<VERSION\nset sourceUrl=-s https://www.nuget.org/api/v2/package\n\ndotnet nuget push artifacts/BloomFilter.NetCore.%ver%.nupkg %sourceUrl%\ndotnet nuget push artifacts/BloomFilter.Redis.NetCore.%ver%.nupkg %sourceUrl%\ndotnet nuget push artifacts/BloomFilter.CSRedis.NetCore.%ver%.nupkg %sourceUrl%\ndotnet nuget push artifacts/BloomFilter.FreeRedis.NetCore.%ver%.nupkg %sourceUrl%\ndotnet nuget push artifacts/BloomFilter.EasyCaching.NetCore.%ver%.nupkg %sourceUrl%\n"
  },
  {
    "path": "src/BloomFilter/Annotations.cs",
    "content": "\n#if NETSTANDARD2_0 || NETFRAMEWORK\n\nnamespace System.Diagnostics.CodeAnalysis;\n\n/// <summary>Specifies that null is allowed as an input even if the corresponding type disallows it.</summary>\n[AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)]\ninternal sealed class AllowNullAttribute : Attribute { }\n\n/// <summary>Specifies that null is disallowed as an input even if the corresponding type allows it.</summary>\n[AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)]\ninternal sealed class DisallowNullAttribute : Attribute { }\n\n/// <summary>Specifies that an output may be null even if the corresponding type disallows it.</summary>\n[AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]\ninternal sealed class MaybeNullAttribute : Attribute { }\n\n/// <summary>Specifies that an output will not be null even if the corresponding type allows it.</summary>\n[AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)]\ninternal sealed class NotNullAttribute : Attribute { }\n\n/// <summary>Specifies that when a method returns <see cref=\"ReturnValue\"/>, the parameter may be null even if the corresponding type disallows it.</summary>\n[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\ninternal sealed class MaybeNullWhenAttribute : Attribute\n{\n    /// <summary>Initializes the attribute with the specified return value condition.</summary>\n    /// <param name=\"returnValue\">\n    /// The return value condition. If the method returns this value, the associated parameter may be null.\n    /// </param>\n    public MaybeNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;\n\n    /// <summary>Gets the return value condition.</summary>\n    public bool ReturnValue { get; }\n}\n\n/// <summary>Specifies that when a method returns <see cref=\"ReturnValue\"/>, the parameter will not be null even if the corresponding type allows it.</summary>\n[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\ninternal sealed class NotNullWhenAttribute : Attribute\n{\n    /// <summary>Initializes the attribute with the specified return value condition.</summary>\n    /// <param name=\"returnValue\">\n    /// The return value condition. If the method returns this value, the associated parameter will not be null.\n    /// </param>\n    public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue;\n\n    /// <summary>Gets the return value condition.</summary>\n    public bool ReturnValue { get; }\n}\n\n/// <summary>Specifies that the output will be non-null if the named parameter is non-null.</summary>\n[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false)]\ninternal sealed class NotNullIfNotNullAttribute : Attribute\n{\n    /// <summary>Initializes the attribute with the associated parameter name.</summary>\n    /// <param name=\"parameterName\">\n    /// The associated parameter name.  The output will be non-null if the argument to the parameter specified is non-null.\n    /// </param>\n    public NotNullIfNotNullAttribute(string parameterName) => ParameterName = parameterName;\n\n    /// <summary>Gets the associated parameter name.</summary>\n    public string ParameterName { get; }\n}\n\n/// <summary>Applied to a method that will never return under any circumstance.</summary>\n[AttributeUsage(AttributeTargets.Method, Inherited = false)]\ninternal sealed class DoesNotReturnAttribute : Attribute { }\n\n/// <summary>Specifies that the method will not return if the associated Boolean parameter is passed the specified value.</summary>\n[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\ninternal sealed class DoesNotReturnIfAttribute : Attribute\n{\n    /// <summary>Initializes the attribute with the specified parameter value.</summary>\n    /// <param name=\"parameterValue\">\n    /// The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to\n    /// the associated parameter matches this value.\n    /// </param>\n    public DoesNotReturnIfAttribute(bool parameterValue) => ParameterValue = parameterValue;\n\n    /// <summary>Gets the condition parameter value.</summary>\n    public bool ParameterValue { get; }\n}\n\n\n/// <summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>\n[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]\ninternal sealed class MemberNotNullAttribute : Attribute\n{\n/// <summary>Initializes the attribute with a field or property member.</summary>\n/// <param name=\"member\">\n/// The field or property member that is promised to be not-null.\n/// </param>\npublic MemberNotNullAttribute(string member) => Members = new[] { member };\n\n/// <summary>Initializes the attribute with the list of field and property members.</summary>\n/// <param name=\"members\">\n/// The list of field and property members that are promised to be not-null.\n/// </param>\npublic MemberNotNullAttribute(params string[] members) => Members = members;\n\n/// <summary>Gets field or property member names.</summary>\npublic string[] Members { get; }\n}\n\n/// <summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>\n[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]\ninternal sealed class MemberNotNullWhenAttribute : Attribute\n{\n/// <summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>\n/// <param name=\"returnValue\">\n/// The return value condition. If the method returns this value, the associated parameter will not be null.\n/// </param>\n/// <param name=\"member\">\n/// The field or property member that is promised to be not-null.\n/// </param>\npublic MemberNotNullWhenAttribute(bool returnValue, string member)\n{\n    ReturnValue = returnValue;\n    Members = new[] { member };\n}\n\n/// <summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>\n/// <param name=\"returnValue\">\n/// The return value condition. If the method returns this value, the associated parameter will not be null.\n/// </param>\n/// <param name=\"members\">\n/// The list of field and property members that are promised to be not-null.\n/// </param>\npublic MemberNotNullWhenAttribute(bool returnValue, params string[] members)\n{\n    ReturnValue = returnValue;\n    Members = members;\n}\n\n/// <summary>Gets the return value condition.</summary>\npublic bool ReturnValue { get; }\n\n/// <summary>Gets field or property member names.</summary>\npublic string[] Members { get; }\n}\n#endif\n\n#if NETSTANDARD2_1\n\nnamespace System.Diagnostics.CodeAnalysis;\n\n/// <summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>\n[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]\ninternal sealed class MemberNotNullAttribute : Attribute\n{\n    /// <summary>Initializes the attribute with a field or property member.</summary>\n    /// <param name=\"member\">\n    /// The field or property member that is promised to be not-null.\n    /// </param>\n    public MemberNotNullAttribute(string member) => Members = new[] { member };\n\n    /// <summary>Initializes the attribute with the list of field and property members.</summary>\n    /// <param name=\"members\">\n    /// The list of field and property members that are promised to be not-null.\n    /// </param>\n    public MemberNotNullAttribute(params string[] members) => Members = members;\n\n    /// <summary>Gets field or property member names.</summary>\n    public string[] Members { get; }\n}\n\n/// <summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>\n[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]\ninternal sealed class MemberNotNullWhenAttribute : Attribute\n{\n    /// <summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>\n    /// <param name=\"returnValue\">\n    /// The return value condition. If the method returns this value, the associated parameter will not be null.\n    /// </param>\n    /// <param name=\"member\">\n    /// The field or property member that is promised to be not-null.\n    /// </param>\n    public MemberNotNullWhenAttribute(bool returnValue, string member)\n    {\n        ReturnValue = returnValue;\n        Members = new[] { member };\n    }\n\n    /// <summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>\n    /// <param name=\"returnValue\">\n    /// The return value condition. If the method returns this value, the associated parameter will not be null.\n    /// </param>\n    /// <param name=\"members\">\n    /// The list of field and property members that are promised to be not-null.\n    /// </param>\n    public MemberNotNullWhenAttribute(bool returnValue, params string[] members)\n    {\n        ReturnValue = returnValue;\n        Members = members;\n    }\n\n    /// <summary>Gets the return value condition.</summary>\n    public bool ReturnValue { get; }\n\n    /// <summary>Gets field or property member names.</summary>\n    public string[] Members { get; }\n}\n\n#endif"
  },
  {
    "path": "src/BloomFilter/AsyncLock.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// AsyncLock\n/// </summary>\ninternal readonly struct AsyncLock : IDisposable\n{\n    private readonly SemaphoreSlim _semaphore;\n    private readonly Releaser _releaser;\n    private readonly Task<Releaser> _releaserTask;\n\n    public int MaxCount { get; }\n\n    public AsyncLock() : this(1)\n    {\n    }\n\n    public AsyncLock(int maxCount = 1)\n    {\n        MaxCount = maxCount;\n        _semaphore = new SemaphoreSlim(maxCount);\n        _releaser = new Releaser(_semaphore);\n        _releaserTask = Task.FromResult(_releaser);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public Releaser Acquire()\n    {\n        _semaphore.Wait();\n        return _releaser;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public Task<Releaser> AcquireAsync(bool continueOnCapturedContext = false)\n    {\n        var acquireAsync = _semaphore.WaitAsync();\n        return Return(acquireAsync, continueOnCapturedContext);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void Dispose() => _semaphore.Dispose();\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private Task<Releaser> Return(Task acquireAsync, bool continueOnCapturedContext)\n    {\n        return acquireAsync.Status == TaskStatus.RanToCompletion\n            ? _releaserTask\n            : WaitForAcquireAsync(acquireAsync, continueOnCapturedContext);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private async Task<Releaser> WaitForAcquireAsync(Task acquireAsync, bool continueOnCapturedContext)\n    {\n        await acquireAsync.ConfigureAwait(continueOnCapturedContext);\n        return _releaser;\n    }\n\n    public readonly struct Releaser(SemaphoreSlim? semaphore) : IDisposable\n    {\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void Dispose() => semaphore?.Release();\n    }\n\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public int GetRemainingCount()\n    {\n        return MaxCount - _semaphore.CurrentCount;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public int GetCurrentCount()\n    {\n        return _semaphore.CurrentCount;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/BinaryHelper.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Numerics;\nusing System.Runtime.CompilerServices;\n\n#if NET6_0_OR_GREATER\nusing System.Buffers.Binary;\n#endif\n\nnamespace BloomFilter;\n\ninternal class BinaryHelper\n{\n    public static int BitToIntOne(BitArray bit, int from, int to)\n    {\n        const int size = 32;\n        int len = to - from;\n        int bitCount = bit.Count;\n        int result = 0;\n\n        for (int i = 0; i < len && i < bitCount && i < size; i++)\n        {\n            result = bit[i + from] ? result + (1 << i) : result;\n        }\n\n        return result;\n    }\n\n    /// <summary>\n    /// Perform rejection sampling on a 32-bit,\n    /// https://en.wikipedia.org/wiki/Rejection_sampling\n    /// </summary>\n    /// <param name=\"random\">The random.</param>\n    /// <param name=\"m\">integer output range.</param>\n    /// <returns></returns>\n    public static long Rejection(long random, long m)\n    {\n        var intMax = (long)uint.MaxValue;\n        random = Math.Abs(random);\n        if (random > (intMax - intMax % m) || random == uint.MinValue)\n            return -1;\n        return random % m;\n    }\n\n    public static uint NumberOfTrailingZeros(uint i)\n    {\n        // HD, Figure 5-14\n        uint y;\n        if (i == 0) return 32;\n        uint n = 31;\n        y = i << 16; if (y != 0) { n -= 16; i = y; }\n        y = i << 8; if (y != 0) { n -= 8; i = y; }\n        y = i << 4; if (y != 0) { n -= 4; i = y; }\n        y = i << 2; if (y != 0) { n -= 2; i = y; }\n        return n - ((i << 1) >> 31);\n    }\n\n    public static uint NumberOfLeadingZeros(uint i)\n    {\n        // HD, Figure 5-6\n        if (i == 0)\n            return 32;\n        uint n = 1;\n        if (i >> 16 == 0) { n += 16; i <<= 16; }\n        if (i >> 24 == 0) { n += 8; i <<= 8; }\n        if (i >> 28 == 0) { n += 4; i <<= 4; }\n        if (i >> 30 == 0) { n += 2; i <<= 2; }\n        n -= i >> 31;\n        return n;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static int RotateLeft(int i, int distance)\n    {\n#if NET6_0_OR_GREATER\n        return (int)BitOperations.RotateLeft((uint)i, distance);\n#else\n        return (i << distance) | (int)((uint)i >> -distance);\n#endif\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static uint RotateLeft(uint i, int distance)\n    {\n#if NET6_0_OR_GREATER\n        return BitOperations.RotateLeft(i, distance);\n#else\n        return (i << distance) | (i >> -distance);\n#endif\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static int RotateRight(int i, int distance)\n    {\n#if NET6_0_OR_GREATER\n        return (int)BitOperations.RotateRight((uint)i, distance);\n#else\n        return (int)((uint)i >> distance) | (i << -distance);\n#endif\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static uint RotateRight(uint i, int distance)\n    {\n#if NET6_0_OR_GREATER\n        return BitOperations.RotateRight(i, distance);\n#else\n        return (i >> distance) | (i << -distance);\n#endif\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static long RotateLeft(long i, int distance)\n    {\n#if NET6_0_OR_GREATER\n        return (long)BitOperations.RotateLeft((ulong)i, distance);\n#else\n        return (i << distance) | (long)((ulong)i >> -distance);\n#endif\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong RotateLeft(ulong i, int distance)\n    {\n#if NET6_0_OR_GREATER\n        return BitOperations.RotateLeft(i, distance);\n#else\n        return (i << distance) | (i >> -distance);\n#endif\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static long RotateRight(long i, int distance)\n    {\n#if NET6_0_OR_GREATER\n        return (long)BitOperations.RotateRight((ulong)i, distance);\n#else\n        return (long)((ulong)i >> distance) | (i << -distance);\n#endif\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong RotateRight(ulong i, int distance)\n    {\n#if NET6_0_OR_GREATER\n        return BitOperations.RotateRight(i, distance);\n#else\n        return (i >> distance) | (i << -distance);\n#endif\n    }\n\n    public static int RightMove(int value, int pos)\n    {\n        if (pos != 0)\n        {\n            var mask = 0x7fffffff;\n            value >>= 1;\n            value &= mask;\n            value >>= pos - 1;\n        }\n\n        return value;\n    }\n\n    public static long RightMove(long value, int pos)\n    {\n        if (pos != 0)\n        {\n            var mask = 0x7fffffff;\n            value >>= 1;\n            value &= mask;\n            value >>= pos - 1;\n        }\n\n        return value;\n    }\n\n    public static uint RightMove(uint value, int pos)\n    {\n        if (pos != 0)\n        {\n            uint mask = 0x7fffffff;\n            value >>= 1;\n            value &= mask;\n            value >>= pos - 1;\n        }\n\n        return value;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/BloomFilter.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\t<PropertyGroup>\n\t\t<AssemblyName>BloomFilter</AssemblyName>\n\t\t<AssemblyTitle>BloomFilter</AssemblyTitle>\n\t\t<PackageId>BloomFilter.NetCore</PackageId>\n\t\t<TargetFrameworks>net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>\n\t\t<AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n\t\t<GenerateDocumentationFile>true</GenerateDocumentationFile>\n\t\t<Nullable>enable</Nullable>\n\t\t<NullableReferenceTypes>true</NullableReferenceTypes>\n\t\t<NoWarn>$(NoWarn);CS1591</NoWarn>\n\t</PropertyGroup>\n\n\t<ItemGroup Condition=\" '$(TargetFramework)' == 'netstandard2.0' OR '$(TargetFramework)' == 'net462'  \">\n\t\t<PackageReference Include=\"System.Runtime\" />\n\t\t<PackageReference Include=\"System.Memory\" />\n\t\t<PackageReference Include=\"System.Threading.Tasks.Extensions\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<PackageReference Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\" />\n\t</ItemGroup>\n\t\n</Project>\n"
  },
  {
    "path": "src/BloomFilter/BloomFilterConstValue.cs",
    "content": "﻿namespace BloomFilter;\n\npublic class BloomFilterConstValue\n{\n    /// <summary>\n    /// The default name of the in-memory.\n    /// </summary>\n    public const string DefaultInMemoryName = \"DefaultInMemory\";\n\n    /// <summary>\n    /// The default name of the redis.\n    /// </summary>\n    public const string DefaultRedisName = \"DefaultRedis\";\n}"
  },
  {
    "path": "src/BloomFilter/BloomFilterExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// BloomFilterExtensions\n/// </summary>\npublic static class BloomFilterExtensions\n{\n    #region Byte\n\n    public static bool Add(this IBloomFilter bloomFilter, byte data) => bloomFilter.Add(new[] { data });\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, byte data) => bloomFilter.AddAsync(new[] { data });\n\n    public static bool Contains(this IBloomFilter bloomFilter, byte data) => bloomFilter.Contains(new[] { data });\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, byte data) => bloomFilter.ContainsAsync(new[] { data });\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<byte> elements) => bloomFilter.Add(elements.Select(data => new byte[] { data }));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<byte> elements) => bloomFilter.AddAsync(elements.Select(data => new byte[] { data }));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<byte> elements) => bloomFilter.Contains(elements.Select(data => new byte[] { data }));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<byte> elements) => bloomFilter.ContainsAsync(elements.Select(data => new byte[] { data }));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<byte> elements) => bloomFilter.All(elements.Select(data => new byte[] { data }));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<byte> elements) => bloomFilter.AllAsync(elements.Select(data => new byte[] { data }));\n\n    #endregion Byte\n\n    #region String\n\n    public static bool Add(this IBloomFilter bloomFilter, string data) => bloomFilter.Add(Encoding.UTF8.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, string data) => bloomFilter.AddAsync(Encoding.UTF8.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, string data) => bloomFilter.Contains(Encoding.UTF8.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, string data) => bloomFilter.ContainsAsync(Encoding.UTF8.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<string> elements) => bloomFilter.Add(elements.Select(data => Encoding.UTF8.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<string> elements) => bloomFilter.AddAsync(elements.Select(data => Encoding.UTF8.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<string> elements) => bloomFilter.Contains(elements.Select(data => Encoding.UTF8.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<string> elements) => bloomFilter.ContainsAsync(elements.Select(data => Encoding.UTF8.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<string> elements) => bloomFilter.All(elements.Select(data => Encoding.UTF8.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<string> elements) => bloomFilter.AllAsync(elements.Select(data => Encoding.UTF8.GetBytes(data)));\n\n    #endregion String\n\n    #region ReadOnlySpan<char>\n\n    public static bool Add(this IBloomFilter bloomFilter, ReadOnlySpan<char> data) => bloomFilter.Add(data.ToUtf8().Span);\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, ReadOnlyMemory<char> data) => bloomFilter.AddAsync(data.Span.ToUtf8());\n\n    public static bool Contains(this IBloomFilter bloomFilter, ReadOnlySpan<char> data) => bloomFilter.Contains(data.ToUtf8().Span);\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, ReadOnlyMemory<char> data) => bloomFilter.ContainsAsync(data.Span.ToUtf8());\n\n    #endregion String\n\n    #region Double\n\n    public static bool Add(this IBloomFilter bloomFilter, double data) => bloomFilter.Add(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, double data) => bloomFilter.AddAsync(BitConverter.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, double data) => bloomFilter.Contains(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, double data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<double> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<double> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<double> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<double> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<double> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<double> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    #endregion Double\n\n    #region Single\n\n    public static bool Add(this IBloomFilter bloomFilter, float data) => bloomFilter.Add(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, float data) => bloomFilter.AddAsync(BitConverter.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, float data) => bloomFilter.Contains(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, float data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<float> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<float> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<float> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<float> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<float> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<float> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    #endregion Single\n\n    #region Int16\n\n    public static bool Add(this IBloomFilter bloomFilter, short data) => bloomFilter.Add(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, short data) => bloomFilter.AddAsync(BitConverter.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, short data) => bloomFilter.Contains(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, short data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<short> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<short> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<short> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<short> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<short> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<short> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    #endregion Int16\n\n    #region Int32\n\n    public static bool Add(this IBloomFilter bloomFilter, int data) => bloomFilter.Add(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, int data) => bloomFilter.AddAsync(BitConverter.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, int data) => bloomFilter.Contains(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, int data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<int> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<int> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<int> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<int> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<int> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<int> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    #endregion Int32\n\n    #region Int64\n\n    public static bool Add(this IBloomFilter bloomFilter, long data) => bloomFilter.Add(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, long data) => bloomFilter.AddAsync(BitConverter.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, long data) => bloomFilter.Contains(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, long data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<long> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<long> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<long> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<long> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<long> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<long> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    #endregion Int64\n\n    #region UInt16\n\n    public static bool Add(this IBloomFilter bloomFilter, ushort data) => bloomFilter.Add(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, ushort data) => bloomFilter.AddAsync(BitConverter.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, ushort data) => bloomFilter.Contains(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, ushort data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<ushort> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<ushort> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<ushort> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<ushort> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<ushort> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<ushort> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    #endregion UInt16\n\n    #region UInt32\n\n    public static bool Add(this IBloomFilter bloomFilter, uint data) => bloomFilter.Add(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, uint data) => bloomFilter.AddAsync(BitConverter.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, uint data) => bloomFilter.Contains(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, uint data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<uint> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<uint> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<uint> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<uint> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<uint> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<uint> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    #endregion UInt32\n\n    #region UInt64\n\n    public static bool Add(this IBloomFilter bloomFilter, ulong data) => bloomFilter.Add(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, ulong data) => bloomFilter.AddAsync(BitConverter.GetBytes(data));\n\n    public static bool Contains(this IBloomFilter bloomFilter, ulong data) => bloomFilter.Contains(BitConverter.GetBytes(data));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, ulong data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<ulong> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<ulong> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<ulong> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<ulong> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<ulong> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<ulong> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data)));\n\n    #endregion UInt64\n\n    #region DateTime\n\n    public static bool Add(this IBloomFilter bloomFilter, DateTime data) => bloomFilter.Add(BitConverter.GetBytes(data.Ticks));\n\n    public static ValueTask<bool> AddAsync(this IBloomFilter bloomFilter, DateTime data) => bloomFilter.AddAsync(BitConverter.GetBytes(data.Ticks));\n\n    public static bool Contains(this IBloomFilter bloomFilter, DateTime data) => bloomFilter.Contains(BitConverter.GetBytes(data.Ticks));\n\n    public static ValueTask<bool> ContainsAsync(this IBloomFilter bloomFilter, DateTime data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data.Ticks));\n\n    public static IList<bool> Add(this IBloomFilter bloomFilter, IEnumerable<DateTime> elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data.Ticks)));\n\n    public static ValueTask<IList<bool>> AddAsync(this IBloomFilter bloomFilter, IEnumerable<DateTime> elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data.Ticks)));\n\n    public static IList<bool> Contains(this IBloomFilter bloomFilter, IEnumerable<DateTime> elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data.Ticks)));\n\n    public static ValueTask<IList<bool>> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable<DateTime> elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data.Ticks)));\n\n    public static bool All(this IBloomFilter bloomFilter, IEnumerable<DateTime> elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data.Ticks)));\n\n    public static ValueTask<bool> AllAsync(this IBloomFilter bloomFilter, IEnumerable<DateTime> elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data.Ticks)));\n\n    #endregion DateTime\n}"
  },
  {
    "path": "src/BloomFilter/Configurations/BloomFilterOptions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace BloomFilter.Configurations;\n\n/// <summary>\n/// BloomFilterOptions\n/// </summary>\npublic class BloomFilterOptions\n{\n    /// <summary>\n    /// Gets the extensions.\n    /// </summary>\n    /// <value>The extensions.</value>\n    internal IList<IBloomFilterOptionsExtension> Extensions { get; } = new List<IBloomFilterOptionsExtension>();\n\n    /// <summary>\n    /// Registers the extension.\n    /// </summary>\n    /// <param name=\"extension\">Extension.</param>\n    public void RegisterExtension(IBloomFilterOptionsExtension extension)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(extension);\n#else\n        if (extension == null) throw new ArgumentNullException(nameof(extension));\n#endif\n        Extensions.Add(extension);\n    }\n}"
  },
  {
    "path": "src/BloomFilter/Configurations/FilterMemoryOptions.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\n\nnamespace BloomFilter.Configurations;\n\npublic class FilterMemoryOptions\n{\n    /// <summary>\n    /// The Name\n    /// </summary>\n    public string Name { get; set; } = BloomFilterConstValue.DefaultInMemoryName;\n\n    /// <summary>\n    /// The expected elements\n    /// </summary>\n    public long ExpectedElements { get; set; } = 1_000_000;\n\n    /// <summary>\n    /// The error rate\n    /// </summary>\n    public double ErrorRate { get; set; } = 0.01;\n\n    /// <summary>\n    /// The Hash Method\n    /// </summary>\n    public HashMethod Method { get; set; } = HashMethod.Murmur3;\n\n    /// <summary>\n    /// Multiple bitmap\n    /// </summary>\n    public BitArray[]? Buckets { get; set; }\n\n    /// <summary>\n    /// Multiple bitmap from bytes\n    /// </summary>\n    public IList<byte[]>? BucketBytes { get; set; }\n}"
  },
  {
    "path": "src/BloomFilter/Configurations/FilterMemoryOptionsExtension.cs",
    "content": "﻿using System;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.DependencyInjection.Extensions;\n\nnamespace BloomFilter.Configurations;\n\npublic class FilterMemoryOptionsExtension : IBloomFilterOptionsExtension\n{\n    private readonly FilterMemoryOptions _options;\n    private readonly Type? _serializerType;\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterMemoryOptionsExtension\"/> class.\n    /// </summary>\n    /// <param name=\"options\">Configure.</param>\n    /// <param name=\"serializerType\"></param>\n    public FilterMemoryOptionsExtension(FilterMemoryOptions options, Type? serializerType = null)\n    {\n        _options = options;\n        _serializerType = serializerType;\n    }\n\n    public void AddServices(IServiceCollection services)\n    {\n        services.TryAddSingleton<IBloomFilterFactory, DefaultBloomFilterFactory>();\n\n        if (_serializerType is null)\n        {\n            services.TryAddSingleton<IFilterMemorySerializer, DefaultFilterMemorySerializer>();\n        }\n        else\n        {\n            services.TryAddSingleton(typeof(IFilterMemorySerializer), _serializerType);\n        }\n\n        services.AddSingleton<IBloomFilter, FilterMemory>(x =>\n        {\n            return new FilterMemory(_options, x.GetRequiredService<IFilterMemorySerializer>());\n        });\n    }\n}"
  },
  {
    "path": "src/BloomFilter/Configurations/IBloomFilterOptionsExtension.cs",
    "content": "﻿using Microsoft.Extensions.DependencyInjection;\n\nnamespace BloomFilter.Configurations;\n\n/// <summary>\n/// BloomFilter options extension.\n/// </summary>\npublic interface IBloomFilterOptionsExtension\n{\n    /// <summary>\n    /// Adds the services.\n    /// </summary>\n    /// <param name=\"services\">Services.</param>\n    void AddServices(IServiceCollection services);\n}"
  },
  {
    "path": "src/BloomFilter/DefaultBloomFilterFactory.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\n\nnamespace BloomFilter;\n\npublic class DefaultBloomFilterFactory : IBloomFilterFactory\n{\n    private readonly IEnumerable<IBloomFilter> _bloomFilters;\n\n    public DefaultBloomFilterFactory(IEnumerable<IBloomFilter> bloomFilters)\n    {\n        _bloomFilters = bloomFilters;\n    }\n\n    public IBloomFilter Get(string name)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(name);\n#else\n        if (name == null) throw new ArgumentNullException(nameof(name));\n#endif\n\n        var filter = _bloomFilters.FirstOrDefault(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase));\n\n        if (filter == null) throw new ArgumentException(\"can not find a match BloomFilter\");\n\n        return filter;\n    }\n\n    public bool TryGet(string name,\n#if NET5_0_OR_GREATER\n        [MaybeNullWhen(false)]\n#endif\n        out IBloomFilter bloomFilter)\n    {\n        bloomFilter = _bloomFilters.FirstOrDefault(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase));\n        return bloomFilter != null;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/DefaultFilterMemorySerializer.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.IO;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter;\n\npublic class DefaultFilterMemorySerializer : IFilterMemorySerializer\n{\n    public async ValueTask SerializeAsync(FilterMemorySerializerParam param, Stream stream)\n    {\n        byte[] nameBytes = Encoding.UTF8.GetBytes(param.Name ?? string.Empty);\n        await stream.WriteAsync(BitConverter.GetBytes(nameBytes.Length), 0, 4);\n        await stream.WriteAsync(nameBytes, 0, nameBytes.Length);\n\n        await stream.WriteAsync(BitConverter.GetBytes(param.ExpectedElements), 0, 8);\n        await stream.WriteAsync(BitConverter.GetBytes(param.ErrorRate), 0, 8);\n        await stream.WriteAsync(BitConverter.GetBytes((int)param.Method), 0, 4);\n\n        await stream.WriteAsync(BitConverter.GetBytes(param.Buckets.Length), 0, 4);\n        foreach (var bucket in param.Buckets)\n        {\n            byte[] bucketBytes = new byte[bucket.Length / 8 + Mod(bucket.Length)];\n            bucket.CopyTo(bucketBytes, 0);\n            await stream.WriteAsync(BitConverter.GetBytes(bucketBytes.Length), 0, 4).ConfigureAwait(false);\n            await stream.WriteAsync(bucketBytes, 0, bucketBytes.Length).ConfigureAwait(false);\n        }\n    }\n\n    public async ValueTask<FilterMemorySerializerParam> DeserializeAsync(Stream stream)\n    {\n        byte[] lengthBytes = new byte[4];\n        byte[] int64Bytes = new byte[8];\n\n        // Read name\n        await ReadExactlyAsync(stream, lengthBytes);\n        int nameLength = BitConverter.ToInt32(lengthBytes, 0);\n        byte[] nameBytes = new byte[nameLength];\n        await ReadExactlyAsync(stream, nameBytes);\n        string name = Encoding.UTF8.GetString(nameBytes);\n\n        // Read expected elements\n        await ReadExactlyAsync(stream, int64Bytes);\n        long expectedElements = BitConverter.ToInt64(int64Bytes, 0);\n\n        // Read error rate\n        await ReadExactlyAsync(stream, int64Bytes);\n        double errorRate = BitConverter.ToDouble(int64Bytes, 0);\n\n        // Read method\n        await ReadExactlyAsync(stream, lengthBytes);\n        HashMethod method = (HashMethod)BitConverter.ToInt32(lengthBytes, 0);\n\n        // Read buckets\n        await ReadExactlyAsync(stream, lengthBytes);\n        int bucketsLength = BitConverter.ToInt32(lengthBytes, 0);\n        var buckets = new BitArray[bucketsLength];\n\n        for (int i = 0; i < bucketsLength; i++)\n        {\n            await ReadExactlyAsync(stream, lengthBytes);\n            int bitArrayLength = BitConverter.ToInt32(lengthBytes, 0);\n\n            byte[] bucketBytes = new byte[bitArrayLength];\n            await ReadExactlyAsync(stream, bucketBytes);\n\n            buckets[i] = new BitArray(bucketBytes);\n        }\n\n        // Create param with object initializer (compatible with init properties)\n        return new FilterMemorySerializerParam\n        {\n            Name = name,\n            ExpectedElements = expectedElements,\n            ErrorRate = errorRate,\n            Method = method,\n            Buckets = buckets\n        };\n    }\n\n    private async Task ReadExactlyAsync(Stream stream, byte[] data)\n    {\n#if NET7_0_OR_GREATER\n        await stream.ReadExactlyAsync(data, 0, data.Length).ConfigureAwait(false);\n#else\n        await stream.ReadAsync(data, 0, data.Length).ConfigureAwait(false);\n#endif\n    }\n\n    private int Mod(int len) => len % 8 > 0 ? 1 : 0;\n}"
  },
  {
    "path": "src/BloomFilter/Filter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// Represents a Bloom filter and provides\n/// </summary>\n/// <seealso cref=\"IBloomFilter\" />\npublic abstract class Filter : IBloomFilter\n{\n    //256MB\n    protected const int MaxInt = 2_147_483_640;\n\n    /// <summary>\n    /// Gets the name specified by BloomFilter.\n    /// </summary>\n    public string Name { get; }\n\n    /// <summary>\n    /// <see cref=\"HashFunction\"/>\n    /// </summary>\n    public HashFunction Hash { get; private set; }\n\n    /// <summary>\n    /// the Capacity of the Bloom filter\n    /// </summary>\n    public long Capacity { get; private set; }\n\n    /// <summary>\n    /// number of hash functions\n    /// </summary>\n    public int Hashes { get; private set; }\n\n    /// <summary>\n    ///  the expected elements.\n    /// </summary>\n    public long ExpectedElements { get; private set; }\n\n    /// <summary>\n    /// the number of expected elements\n    /// </summary>\n    public double ErrorRate { get; private set; }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"Filter\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <exception cref=\"ArgumentOutOfRangeException\">\n    /// expectedElements - expectedElements must be > 0\n    /// or\n    /// errorRate\n    /// </exception>\n    /// <exception cref=\"ArgumentNullException\">hashFunction</exception>\n    public Filter(string name, long expectedElements, double errorRate, HashFunction hashFunction)\n    {\n        if (expectedElements < 1)\n            throw new ArgumentOutOfRangeException(\"expectedElements\", expectedElements, \"expectedElements must be > 0\");\n        if (errorRate >= 1 || errorRate <= 0)\n            throw new ArgumentOutOfRangeException(\"errorRate\", errorRate, string.Format(\"errorRate must be between 0 and 1, exclusive. Was {0}\", errorRate));\n\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(hashFunction);\n#else\n        if (hashFunction == null)\n            throw new ArgumentNullException(nameof(hashFunction));\n#endif\n\n        Name = name;\n        ExpectedElements = expectedElements;\n        ErrorRate = errorRate;\n        Hash = hashFunction;\n\n        Capacity = BestM(expectedElements, errorRate);\n        Hashes = BestK(expectedElements, Capacity);\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"Filter\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"capacity\">The capacity.</param>\n    /// <param name=\"hashes\">The hashes.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <exception cref=\"ArgumentOutOfRangeException\">\n    /// capacity - capacity must be > 0\n    /// or\n    /// hashes - hashes must be > 0\n    /// </exception>\n    /// <exception cref=\"ArgumentNullException\">hashFunction</exception>\n    public Filter(string name, long capacity, int hashes, HashFunction hashFunction)\n    {\n        if (capacity < 1)\n            throw new ArgumentOutOfRangeException(\"capacity\", capacity, \"capacity must be > 0\");\n        if (hashes < 1)\n            throw new ArgumentOutOfRangeException(\"hashes\", hashes, \"hashes must be > 0\");\n\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(hashFunction);\n#else\n        if (hashFunction == null)\n            throw new ArgumentNullException(nameof(hashFunction));\n#endif\n\n        Name = name;\n        Capacity = capacity;\n        Hashes = hashes;\n        Hash = hashFunction;\n\n        ExpectedElements = BestN(hashes, capacity);\n        ErrorRate = BestP(hashes, capacity, ExpectedElements);\n    }\n\n    protected void SetFilterParam(long expectedElements, double errorRate, HashMethod method)\n    {\n        if (expectedElements < 1)\n            throw new ArgumentOutOfRangeException(\"expectedElements\", expectedElements, \"expectedElements must be > 0\");\n        if (errorRate >= 1 || errorRate <= 0)\n            throw new ArgumentOutOfRangeException(\"errorRate\", errorRate, string.Format(\"errorRate must be between 0 and 1, exclusive. Was {0}\", errorRate));\n\n        ExpectedElements = expectedElements;\n        ErrorRate = errorRate;\n        Hash = HashFunction.Functions[method];\n\n        Capacity = BestM(expectedElements, errorRate);\n        Hashes = BestK(expectedElements, Capacity);\n    }\n\n    /// <summary>\n    /// Adds the passed value to the filter.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    public abstract bool Add(ReadOnlySpan<byte> data);\n\n    /// <summary>\n    /// Async Adds the passed value to the filter.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    public abstract ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data);\n\n    /// <summary>\n    /// Adds the specified elements.\n    /// </summary>\n    /// <param name=\"elements\">The elements.</param>\n    /// <returns></returns>\n    public abstract IList<bool> Add(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Async Adds the specified elements.\n    /// </summary>\n    /// <param name=\"elements\">The elements.</param>\n    /// <returns></returns>\n    public abstract ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Removes all elements from the filter\n    /// </summary>\n    public abstract void Clear();\n\n    /// <summary>\n    /// Async Removes all elements from the filter\n    /// </summary>\n    public abstract ValueTask ClearAsync();\n\n    /// <summary>\n    /// Tests whether an element is present in the filter\n    /// </summary>\n    /// <param name=\"element\"></param>\n    /// <returns></returns>\n    public abstract bool Contains(ReadOnlySpan<byte> element);\n\n    /// <summary>\n    /// Async Tests whether an element is present in the filter\n    /// </summary>\n    /// <param name=\"element\"></param>\n    /// <returns></returns>\n    public abstract ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element);\n\n    /// <summary>\n    /// Tests whether an elements is present in the filter\n    /// </summary>\n    /// <param name=\"elements\"></param>\n    /// <returns></returns>\n    public abstract IList<bool> Contains(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Async Tests whether an elements is present in the filter\n    /// </summary>\n    /// <param name=\"elements\"></param>\n    /// <returns></returns>\n    public abstract ValueTask<IList<bool>> ContainsAsync(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Alls the specified elements.\n    /// </summary>\n    /// <param name=\"elements\">The elements.</param>\n    /// <returns></returns>\n    public abstract bool All(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Async Alls the specified elements.\n    /// </summary>\n    /// <param name=\"elements\">The elements.</param>\n    /// <returns></returns>\n    public abstract ValueTask<bool> AllAsync(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    ///  Hashes the specified value.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    public long[] ComputeHash(ReadOnlySpan<byte> data)\n    {\n        return Hash.ComputeHash(data, Capacity, Hashes);\n    }\n\n    /// <summary>\n    /// Calculates the optimal size of the bloom filter in bits given expectedElements (expected\n    /// number of elements in bloom filter) and falsePositiveProbability (tolerable false positive rate).\n    /// </summary>\n    /// <param name=\"n\">Expected number of elements inserted in the bloom filter</param>\n    /// <param name=\"p\">Tolerable false positive rate</param>\n    /// <returns>the optimal siz of the bloom filter in bits</returns>\n    public static long BestM(long n, double p)\n    {\n        return (long)Math.Ceiling(-1 * (n * Math.Log(p)) / Math.Pow(Math.Log(2), 2));\n    }\n\n    /// <summary>\n    /// Calculates the optimal hashes (number of hash function) given expectedElements (expected number of\n    /// elements in bloom filter) and size (size of bloom filter in bits).\n    /// </summary>\n    /// <param name=\"n\">Expected number of elements inserted in the bloom filter</param>\n    /// <param name=\"m\">The size of the bloom filter in bits.</param>\n    /// <returns>the optimal amount of hash functions hashes</returns>\n    public static int BestK(long n, long m)\n    {\n        return (int)Math.Ceiling((Math.Log(2) * m) / n);\n    }\n\n    /// <summary>\n    /// Calculates the amount of elements a Bloom filter for which the given configuration of size and hashes is optimal.\n    /// </summary>\n    /// <param name=\"k\">number of hashes</param>\n    /// <param name=\"m\">The size of the bloom filter in bits.</param>\n    /// <returns>mount of elements a Bloom filter for which the given configuration of size and hashes is optimal</returns>\n    public static long BestN(int k, long m)\n    {\n        return (long)Math.Ceiling((Math.Log(2) * m) / k);\n    }\n\n    /// <summary>\n    /// Calculates the best-case (uniform hash function) false positive probability.\n    /// </summary>\n    /// <param name=\"k\"> number of hashes</param>\n    /// <param name=\"m\">The size of the bloom filter in bits.</param>\n    /// <param name=\"insertedElements\">number of elements inserted in the filter</param>\n    /// <returns>The calculated false positive probability</returns>\n    public static double BestP(int k, long m, double insertedElements)\n    {\n        return Math.Pow((1 - Math.Exp(-k * insertedElements / m)), k);\n    }\n\n    public override string ToString()\n    {\n        return $\"Capacity:{Capacity},Hashes:{Hashes},ExpectedElements:{ExpectedElements},ErrorRate:{ErrorRate}\";\n    }\n\n    protected static int LogMaxInt(long number, out int mod)\n    {\n        mod = (int)(number % MaxInt);\n        return (int)(number / MaxInt);\n    }\n\n    /// <summary>\n    /// Dispose\n    /// </summary>\n    public abstract void Dispose();\n}\n"
  },
  {
    "path": "src/BloomFilter/FilterBuilder.cs",
    "content": "﻿using System;\nusing BloomFilter.Configurations;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// BloomFilter Builder - Supports both static factory methods and fluent API\n/// </summary>\n/// <example>\n/// Static API:\n/// <code>\n/// var filter = FilterBuilder.Build(10_000_000, 0.001);\n/// </code>\n///\n/// Fluent API:\n/// <code>\n/// var filter = FilterBuilder.Create()\n///     .WithName(\"UserFilter\")\n///     .ExpectingElements(10_000_000)\n///     .WithErrorRate(0.001)\n///     .UsingHashMethod(HashMethod.XXHash3)\n///     .BuildInMemory();\n/// </code>\n/// </example>\npublic partial class FilterBuilder\n{\n    #region Fluent API - Instance Members\n\n    protected string _name = BloomFilterConstValue.DefaultInMemoryName;\n    protected long _expectedElements = 1_000_000;\n    protected double _errorRate = 0.01;\n    protected HashMethod _method = HashMethod.Murmur3;\n    protected HashFunction? _customHashFunction;\n    protected IFilterMemorySerializer? _customSerializer;\n\n    /// <summary>\n    /// Protected constructor for fluent API pattern and inheritance\n    /// </summary>\n    protected FilterBuilder() { }\n\n    /// <summary>\n    /// Creates a new Fluent Builder for Bloom Filter construction\n    /// </summary>\n    /// <returns>A new FilterBuilder instance</returns>\n    public static FilterBuilder Create() => new();\n\n    /// <summary>\n    /// Sets the name for the Bloom Filter\n    /// </summary>\n    /// <param name=\"name\">The filter name</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentException\">Thrown when name is null or whitespace</exception>\n    public FilterBuilder WithName(string name)\n    {\n#if NET8_0_OR_GREATER\n        ArgumentException.ThrowIfNullOrWhiteSpace(name);\n#else\n        if (string.IsNullOrWhiteSpace(name))\n            throw new ArgumentException(\"Name cannot be null or whitespace\", nameof(name));\n#endif\n        _name = name;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the expected number of elements to be added to the filter\n    /// </summary>\n    /// <param name=\"count\">The expected element count (must be > 0)</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentOutOfRangeException\">Thrown when count is less than or equal to 0</exception>\n    public FilterBuilder ExpectingElements(long count)\n    {\n        if (count <= 0)\n            throw new ArgumentOutOfRangeException(nameof(count), count, \"Expected elements must be greater than 0\");\n        _expectedElements = count;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the acceptable false positive rate (probability)\n    /// </summary>\n    /// <param name=\"rate\">The error rate (must be between 0 and 1, exclusive)</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentOutOfRangeException\">Thrown when rate is not between 0 and 1</exception>\n    public FilterBuilder WithErrorRate(double rate)\n    {\n        if (rate <= 0 || rate >= 1)\n            throw new ArgumentOutOfRangeException(nameof(rate), rate, \"Error rate must be between 0 and 1 (exclusive)\");\n        _errorRate = rate;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the hash method to use for hashing elements\n    /// </summary>\n    /// <param name=\"method\">The hash method</param>\n    /// <returns>The builder for method chaining</returns>\n    public FilterBuilder UsingHashMethod(HashMethod method)\n    {\n        _method = method;\n        _customHashFunction = null;\n        return this;\n    }\n\n    /// <summary>\n    /// Uses a custom hash function for hashing elements\n    /// </summary>\n    /// <param name=\"hashFunction\">The custom hash function</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when hashFunction is null</exception>\n    public FilterBuilder UsingCustomHash(HashFunction hashFunction)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(hashFunction);\n#else\n        if (hashFunction == null)\n            throw new ArgumentNullException(nameof(hashFunction));\n#endif\n        _customHashFunction = hashFunction;\n        return this;\n    }\n\n    /// <summary>\n    /// Uses a custom serializer for persisting the Bloom Filter\n    /// </summary>\n    /// <param name=\"serializer\">The custom serializer</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when serializer is null</exception>\n    public FilterBuilder WithSerializer(IFilterMemorySerializer serializer)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(serializer);\n#else\n        if (serializer == null)\n            throw new ArgumentNullException(nameof(serializer));\n#endif\n        _customSerializer = serializer;\n        return this;\n    }\n\n    /// <summary>\n    /// Builds an in-memory Bloom Filter with the configured settings\n    /// </summary>\n    /// <returns>A new IBloomFilter instance</returns>\n    public IBloomFilter BuildInMemory()\n    {\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n        var serializer = _customSerializer ?? new DefaultFilterMemorySerializer();\n\n        return new FilterMemory(_name, _expectedElements, _errorRate, hashFunction, serializer);\n    }\n\n    /// <summary>\n    /// Builds an in-memory Bloom Filter with explicit capacity and hash count (advanced usage)\n    /// </summary>\n    /// <param name=\"capacity\">The bit array capacity</param>\n    /// <param name=\"hashes\">The number of hash functions</param>\n    /// <returns>A new IBloomFilter instance</returns>\n    public IBloomFilter BuildInMemoryWithCapacity(long capacity, int hashes)\n    {\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n        var serializer = _customSerializer ?? new DefaultFilterMemorySerializer();\n\n        return new FilterMemory(_name, capacity, hashes, hashFunction, serializer);\n    }\n\n    #endregion\n\n    #region Static Factory Methods (Legacy API - Backward Compatible)\n\n    /// <summary>\n    /// Creates a BloomFilter for the specified expected element\n    /// </summary>\n    /// <param name=\"options\"><see cref=\"FilterMemoryOptions\"/></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(FilterMemoryOptions options)\n    {\n        return new FilterMemory(options, new DefaultFilterMemorySerializer());\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter for the specified expected element\n    /// </summary>\n    /// <param name=\"options\"><see cref=\"FilterMemoryOptions\"/></param>\n    /// <param name=\"filterMemorySerializer\"><see cref=\"IFilterMemorySerializer\"/></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(FilterMemoryOptions options, IFilterMemorySerializer filterMemorySerializer)\n    {\n        return new FilterMemory(options, filterMemorySerializer);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter for the specified expected element\n    /// </summary>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(long expectedElements, string name = BloomFilterConstValue.DefaultInMemoryName)\n    {\n        return Build(expectedElements, 0.01, name);\n    }\n\n    /// <summary>\n    ///Creates a BloomFilter for the specified expected element\n    /// </summary>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultInMemoryName)\n    {\n        return Build(expectedElements, 0.01, hashMethod, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter for the specified expected element\n    /// </summary>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultInMemoryName)\n    {\n        return Build(expectedElements, 0.01, hashFunction, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter for the specified expected element\n    /// </summary>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultInMemoryName)\n    {\n        return Build(expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter for the specified expected element\n    /// </summary>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <param name=\"filterMemorySerializer\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultInMemoryName, IFilterMemorySerializer? filterMemorySerializer = null)\n    {\n        return new FilterMemory(name, expectedElements, errorRate, HashFunction.Functions[hashMethod], filterMemorySerializer ?? new DefaultFilterMemorySerializer());\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter for the specified expected element\n    /// </summary>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <param name=\"filterMemorySerializer\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultInMemoryName, IFilterMemorySerializer? filterMemorySerializer = null)\n    {\n        return new FilterMemory(name, expectedElements, errorRate, hashFunction, filterMemorySerializer ?? new DefaultFilterMemorySerializer());\n    }\n\n    #endregion\n}"
  },
  {
    "path": "src/BloomFilter/FilterMemory.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing BloomFilter.Configurations;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// Bloom Filter In Mempory Implement\n/// </summary>\npublic class FilterMemory : Filter\n{\n    //The upper limit per bucket is 2147483640\n    private BitArray[] _buckets;\n\n    private readonly AsyncLock _asyncLock = new();\n    private readonly IFilterMemorySerializer _filterMemorySerializer;\n\n    private static readonly ValueTask Empty = new();\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterMemory\"/> class.\n    /// </summary>\n    /// <param name=\"options\"><see cref=\"FilterMemoryOptions\"/></param>\n    /// <param name=\"filterMemorySerializer\"></param>\n    public FilterMemory(FilterMemoryOptions options, IFilterMemorySerializer filterMemorySerializer)\n        : base(options.Name, options.ExpectedElements, options.ErrorRate, HashFunction.Functions[options.Method])\n    {\n        _filterMemorySerializer = filterMemorySerializer;\n\n        if (options.Buckets is not null)\n        {\n            Import(options.Buckets);\n        }\n        else if (options.BucketBytes is not null)\n        {\n            Import(options.BucketBytes);\n        }\n        else\n        {\n            Init();\n        }\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterMemory\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"filterMemorySerializer\"></param>\n    public FilterMemory(string name, long expectedElements, double errorRate, HashFunction hashFunction, IFilterMemorySerializer filterMemorySerializer)\n        : base(name, expectedElements, errorRate, hashFunction)\n    {\n        _filterMemorySerializer = filterMemorySerializer;\n\n        Init();\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterMemory\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"size\">The size.</param>\n    /// <param name=\"hashes\">The hashes.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"filterMemorySerializer\"></param>\n    public FilterMemory(string name, long size, int hashes, HashFunction hashFunction, IFilterMemorySerializer filterMemorySerializer)\n        : base(name, size, hashes, hashFunction)\n    {\n        _filterMemorySerializer = filterMemorySerializer;\n        Init();\n    }\n\n    [MemberNotNull(nameof(_buckets))]\n    private void Init()\n    {\n        var bits = new List<BitArray>();\n        var m = Capacity;\n        while (m > 0)\n        {\n            if (m > MaxInt)\n            {\n                bits.Add(new BitArray(MaxInt));\n                m -= MaxInt;\n            }\n            else\n            {\n                bits.Add(new BitArray((int)m));\n                break;\n            }\n        }\n        _buckets = bits.ToArray();\n    }\n\n    /// <summary>\n    /// Serialize to a stream\n    /// </summary>\n    /// <param name=\"stream\"></param>\n    /// <returns></returns>\n    /// <remarks>\n    /// This method holds the lock during the entire serialization process (including I/O).\n    /// This ensures data consistency but will block other operations (Add/Contains) during serialization.\n    /// The BitArray is cloned to ensure immutability during serialization.\n    /// </remarks>\n    public async ValueTask SerializeAsync(Stream stream)\n    {\n        using var _ = await _asyncLock.AcquireAsync();\n\n        await _filterMemorySerializer.SerializeAsync(new FilterMemorySerializerParam\n        {\n            Name = Name,\n            Method = Hash.Method,\n            ExpectedElements = ExpectedElements,\n            ErrorRate = ErrorRate,\n            Buckets = _buckets.Select(s => new BitArray(s)).ToArray()  // Clone to ensure immutability\n        }, stream);\n    }\n\n    /// <summary>\n    /// Deserialize from the stream\n    /// </summary>\n    /// <param name=\"stream\"></param>\n    /// <returns></returns>\n    public async ValueTask DeserializeAsync(Stream stream)\n    {\n        var param = await _filterMemorySerializer.DeserializeAsync(stream);\n\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(param.Buckets);\n#else\n        if (param.Buckets is null)\n            throw new ArgumentNullException(nameof(FilterMemorySerializerParam.Buckets));\n#endif\n\n        if (param.Buckets.Length == 0)\n            throw new ArgumentOutOfRangeException($\"The length must greater than 0\", nameof(FilterMemorySerializerParam.Buckets));\n\n        SetFilterParam(param.ExpectedElements, param.ErrorRate, param.Method);\n\n        if (Capacity > param.Buckets.Sum(s => (long)s.Length))\n        {\n            throw new ArgumentOutOfRangeException($\"The length must less than or equal to {Capacity}\", nameof(FilterMemorySerializerParam.Buckets));\n        }\n\n        using var _ = await _asyncLock.AcquireAsync();\n\n        _buckets = new BitArray[param.Buckets.Length];\n\n        for (int i = 0; i < param.Buckets.Length; i++)\n        {\n            _buckets[i] = new BitArray(param.Buckets[i]);\n        }\n    }\n\n    /// <summary>\n    /// Importing bitmap\n    /// </summary>\n    /// <param name=\"buckets\">Sets the multiple bitmap</param>\n    [MemberNotNull(nameof(_buckets))]\n    public void Import(BitArray[] buckets)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(buckets);\n#else\n        if (buckets is null)\n            throw new ArgumentNullException(nameof(buckets));\n#endif\n\n        if (buckets.Length == 0)\n            throw new ArgumentOutOfRangeException($\"The length must greater than 0\", nameof(buckets));\n\n        if (Capacity > buckets.Sum(s => (long)s.Length))\n        {\n            throw new ArgumentOutOfRangeException($\"The length must less than or equal to {Capacity}\", nameof(buckets));\n        }\n\n        using var _ = _asyncLock.Acquire();\n\n        _buckets = new BitArray[buckets.Length];\n\n        for (int i = 0; i < buckets.Length; i++)\n        {\n            _buckets[i] = new BitArray(buckets[i]);\n        }\n    }\n\n    /// <summary>\n    /// Importing bitmap\n    /// </summary>\n    /// <param name=\"bucketBytes\">Sets the multiple bitmaps</param>\n    [MemberNotNull(nameof(_buckets))]\n    public void Import(IList<byte[]> bucketBytes)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(bucketBytes);\n#else\n        if (bucketBytes is null)\n            throw new ArgumentNullException(nameof(bucketBytes));\n#endif\n\n        if (bucketBytes.Count == 0)\n            throw new ArgumentOutOfRangeException($\"The length must greater than 0\", nameof(bucketBytes));\n\n        Import(bucketBytes.Select(s => new BitArray(s)).ToArray());\n    }\n\n    /// <summary>\n    /// Exporting bitmap\n    /// </summary>\n    public BitArray[] Export()\n    {\n        using var _ = _asyncLock.Acquire();\n        return _buckets.Select(s => new BitArray(s)).ToArray();\n    }\n\n    /// <summary>\n    /// Exporting bitmap\n    /// </summary>\n    public IList<byte[]> ExportToBytes()\n    {\n        int Mod(int len) => len % 8 > 0 ? 1 : 0;\n\n        var result = new List<byte[]>();\n\n        using var _ = _asyncLock.Acquire();\n\n        foreach (var bucket in _buckets)\n        {\n            var bits = new byte[bucket.Length / 8 + Mod(bucket.Length)];\n            bucket.CopyTo(bits, 0);\n            result.Add(bits);\n        }\n\n        return result;\n    }\n\n    /// <summary>\n    /// Adds the passed value to the filter.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    public override bool Add(ReadOnlySpan<byte> data)\n    {\n        bool added = false;\n        var positions = ComputeHash(data);\n\n        using var _ = _asyncLock.Acquire();\n\n        foreach (var position in positions)\n        {\n            if (!Get(position))\n            {\n                added = true;\n                Set(position);\n            }\n        }\n\n        return added;\n    }\n\n    /// <summary>\n    /// Adds the passed value to the filter.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    public override ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data)\n    {\n        return new ValueTask<bool>(Add(data.Span));\n    }\n\n    public override IList<bool> Add(IEnumerable<byte[]> elements)\n    {\n        // Pre-allocate capacity if possible\n        var elementsList = elements as IList<byte[]> ?? elements.ToList();\n        var hashes = new List<long>(elementsList.Count * Hashes);\n\n        foreach (var element in elementsList)\n        {\n            hashes.AddRange(ComputeHash(element));\n        }\n\n        var processResults = new bool[hashes.Count];\n\n        using (var _ = _asyncLock.Acquire())\n        {\n            for (var i = 0; i < hashes.Count; i++)\n            {\n                if (!Get(hashes[i]))\n                {\n                    Set(hashes[i]);\n                    processResults[i] = false;\n                }\n                else\n                {\n                    processResults[i] = true;\n                }\n            }\n        }\n\n        IList<bool> results = new List<bool>(elementsList.Count);\n        bool wasAdded = false;\n        int processed = 0;\n\n        //For each value check, if all bits in ranges of hashes bits are set\n        foreach (var item in processResults)\n        {\n            if (!item) wasAdded = true;\n            if ((processed + 1) % Hashes == 0)\n            {\n                results.Add(wasAdded);\n                wasAdded = false;\n            }\n            processed++;\n        }\n\n        return results;\n    }\n\n    public override ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elements)\n    {\n        return new ValueTask<IList<bool>>(Add(elements));\n    }\n\n    /// <summary>\n    /// Tests whether an element is present in the filter\n    /// </summary>\n    /// <param name=\"element\"></param>\n    /// <returns></returns>\n    public override bool Contains(ReadOnlySpan<byte> element)\n    {\n        var positions = ComputeHash(element);\n\n        using var _ = _asyncLock.Acquire();\n\n        foreach (var position in positions)\n        {\n            if (!Get(position))\n                return false;\n        }\n        return true;\n    }\n\n    public override ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)\n    {\n        return new ValueTask<bool>(Contains(element.Span));\n    }\n\n    public override IList<bool> Contains(IEnumerable<byte[]> elements)\n    {\n        // Pre-allocate capacity if possible\n        var elementsList = elements as IList<byte[]> ?? elements.ToList();\n        var hashes = new List<long>(elementsList.Count * Hashes);\n\n        foreach (var element in elementsList)\n        {\n            hashes.AddRange(ComputeHash(element));\n        }\n\n        var processResults = new bool[hashes.Count];\n\n        using (var _ = _asyncLock.Acquire())\n        {\n            for (var i = 0; i < hashes.Count; i++)\n            {\n                processResults[i] = Get(hashes[i]);\n            }\n\n        }\n\n        IList<bool> results = new List<bool>(elementsList.Count);\n        bool isPresent = true;\n        int processed = 0;\n\n        //For each value check, if all bits in ranges of hashes bits are set\n        foreach (var item in processResults)\n        {\n            if (!item) isPresent = false;\n            if ((processed + 1) % Hashes == 0)\n            {\n                results.Add(isPresent);\n                isPresent = true;\n            }\n            processed++;\n        }\n\n        return results;\n    }\n\n    public override ValueTask<IList<bool>> ContainsAsync(IEnumerable<byte[]> elements)\n    {\n        return new ValueTask<IList<bool>>(Contains(elements));\n    }\n\n    public override bool All(IEnumerable<byte[]> elements)\n    {\n        return Contains(elements).All(e => e);\n    }\n\n    public override ValueTask<bool> AllAsync(IEnumerable<byte[]> elements)\n    {\n        return new ValueTask<bool>(All(elements));\n    }\n\n    /// <summary>\n    /// Removes all elements from the filter\n    /// </summary>\n    public override void Clear()\n    {\n        using var _ = _asyncLock.Acquire();\n\n        foreach (var item in _buckets)\n        {\n            item.SetAll(false);\n        }\n    }\n\n    public override ValueTask ClearAsync()\n    {\n        Clear();\n        return Empty;\n    }\n\n    private void Set(long index)\n    {\n        int idx = LogMaxInt(index, out int mod);\n\n        _buckets[idx].Set(mod, true);\n    }\n\n    public bool Get(long index)\n    {\n        int idx = LogMaxInt(index, out int mod);\n        return _buckets[idx].Get(mod);\n    }\n\n    public override void Dispose()\n    {\n        _asyncLock.Dispose();\n    }\n}"
  },
  {
    "path": "src/BloomFilter/FilterMemorySerializerParam.cs",
    "content": "﻿using System.Collections;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// FilterMemorySerializerParam\n/// </summary>\npublic class FilterMemorySerializerParam\n{\n    /// <summary>\n    /// Gets the name specified by BloomFilter.\n    /// </summary>\n#if NET5_0_OR_GREATER\n    public string Name { get; init; } = default!;\n#else\n    public string Name { get; set; } = default!;\n#endif\n\n    /// <summary>\n    /// <see cref=\"HashMethod\"/>\n    /// </summary>\n#if NET5_0_OR_GREATER\n    public HashMethod Method { get; init; }\n#else\n    public HashMethod Method { get; set; }\n#endif\n\n    /// <summary>\n    ///  the expected elements.\n    /// </summary>\n#if NET5_0_OR_GREATER\n    public long ExpectedElements { get; init; }\n#else\n    public long ExpectedElements { get; set; }\n#endif\n\n    /// <summary>\n    /// the number of expected elements\n    /// </summary>\n#if NET5_0_OR_GREATER\n    public double ErrorRate { get; init; }\n#else\n    public double ErrorRate { get; set; }\n#endif\n\n    /// <summary>\n    /// bitmap\n    /// </summary>\n#if NET5_0_OR_GREATER\n    public BitArray[] Buckets { get; init; } = default!;\n#else\n    public BitArray[] Buckets { get; set; } = default!;\n#endif\n}\n"
  },
  {
    "path": "src/BloomFilter/FilterRedisBase.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// Abstract base class for Redis-based Bloom Filter implementations.\n/// Encapsulates common batch operation logic shared across all Redis implementations.\n/// </summary>\npublic abstract class FilterRedisBase : Filter\n{\n    protected FilterRedisBase(string name, long expectedElements, double errorRate, HashFunction hashFunction)\n        : base(name, expectedElements, errorRate, hashFunction)\n    {\n    }\n\n    protected FilterRedisBase(string name, long capacity, int hashes, HashFunction hashFunction)\n        : base(name, capacity, hashes, hashFunction)\n    {\n    }\n\n    // Abstract methods - to be implemented by concrete Redis client implementations\n\n    /// <summary>\n    /// Sets a bit at the specified position in the Redis bitmap.\n    /// </summary>\n    /// <param name=\"position\">The bit position.</param>\n    /// <returns>The previous value of the bit (true if it was set, false otherwise).</returns>\n    protected abstract bool SetBit(long position);\n\n    /// <summary>\n    /// Gets the bit value at the specified position in the Redis bitmap.\n    /// </summary>\n    /// <param name=\"position\">The bit position.</param>\n    /// <returns>The value of the bit (true if set, false otherwise).</returns>\n    protected abstract bool GetBit(long position);\n\n    /// <summary>\n    /// Asynchronously sets a bit at the specified position in the Redis bitmap.\n    /// </summary>\n    /// <param name=\"position\">The bit position.</param>\n    /// <returns>The previous value of the bit.</returns>\n    protected abstract Task<bool> SetBitAsync(long position);\n\n    /// <summary>\n    /// Asynchronously gets the bit value at the specified position in the Redis bitmap.\n    /// </summary>\n    /// <param name=\"position\">The bit position.</param>\n    /// <returns>The value of the bit.</returns>\n    protected abstract Task<bool> GetBitAsync(long position);\n\n    /// <summary>\n    /// Sets multiple bits at the specified positions in the Redis bitmap.\n    /// </summary>\n    /// <param name=\"positions\">Array of bit positions.</param>\n    /// <returns>Array of previous bit values.</returns>\n    protected abstract bool[] SetBits(long[] positions);\n\n    /// <summary>\n    /// Gets multiple bits at the specified positions in the Redis bitmap.\n    /// </summary>\n    /// <param name=\"positions\">Array of bit positions.</param>\n    /// <returns>Array of bit values.</returns>\n    protected abstract bool[] GetBits(long[] positions);\n\n    /// <summary>\n    /// Asynchronously sets multiple bits at the specified positions in the Redis bitmap.\n    /// </summary>\n    /// <param name=\"positions\">Array of bit positions.</param>\n    /// <returns>Array of previous bit values.</returns>\n    protected abstract Task<bool[]> SetBitsAsync(long[] positions);\n\n    /// <summary>\n    /// Asynchronously gets multiple bits at the specified positions in the Redis bitmap.\n    /// </summary>\n    /// <param name=\"positions\">Array of bit positions.</param>\n    /// <returns>Array of bit values.</returns>\n    protected abstract Task<bool[]> GetBitsAsync(long[] positions);\n\n    /// <summary>\n    /// Clears all bits in the Redis bitmap.\n    /// </summary>\n    protected abstract void ClearBits();\n\n    /// <summary>\n    /// Asynchronously clears all bits in the Redis bitmap.\n    /// </summary>\n    protected abstract Task ClearBitsAsync();\n\n    // Common implementations - shared by all Redis implementations\n\n    public override IList<bool> Add(IEnumerable<byte[]> elements)\n    {\n        // Pre-allocate capacity if possible\n        var elementsList = elements as IList<byte[]> ?? elements.ToList();\n        var hashes = new List<long>(elementsList.Count * Hashes);\n\n        foreach (var element in elementsList)\n        {\n            hashes.AddRange(ComputeHash(element));\n        }\n\n        var processResults = SetBits(hashes.ToArray());\n        return ProcessBatchResults(processResults, Hashes, trackAdded: true);\n    }\n\n    public override async ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elements)\n    {\n        // Pre-allocate capacity if possible\n        var elementsList = elements as IList<byte[]> ?? elements.ToList();\n        var hashes = new List<long>(elementsList.Count * Hashes);\n\n        foreach (var element in elementsList)\n        {\n            hashes.AddRange(ComputeHash(element));\n        }\n\n        var processResults = await SetBitsAsync(hashes.ToArray());\n        return ProcessBatchResults(processResults, Hashes, trackAdded: true);\n    }\n\n    public override IList<bool> Contains(IEnumerable<byte[]> elements)\n    {\n        // Pre-allocate capacity if possible\n        var elementsList = elements as IList<byte[]> ?? elements.ToList();\n        var hashes = new List<long>(elementsList.Count * Hashes);\n\n        foreach (var element in elementsList)\n        {\n            hashes.AddRange(ComputeHash(element));\n        }\n\n        var processResults = GetBits(hashes.ToArray());\n        return ProcessBatchResults(processResults, Hashes, trackAdded: false);\n    }\n\n    public override async ValueTask<IList<bool>> ContainsAsync(IEnumerable<byte[]> elements)\n    {\n        // Pre-allocate capacity if possible\n        var elementsList = elements as IList<byte[]> ?? elements.ToList();\n        var hashes = new List<long>(elementsList.Count * Hashes);\n\n        foreach (var element in elementsList)\n        {\n            hashes.AddRange(ComputeHash(element));\n        }\n\n        var processResults = await GetBitsAsync(hashes.ToArray());\n        return ProcessBatchResults(processResults, Hashes, trackAdded: false);\n    }\n\n    public override bool All(IEnumerable<byte[]> elements)\n        => Contains(elements).All(e => e);\n\n    public override ValueTask<bool> AllAsync(IEnumerable<byte[]> elements)\n        => new(Contains(elements).All(e => e));\n\n    public override void Clear()\n        => ClearBits();\n\n    public override async ValueTask ClearAsync()\n        => await ClearBitsAsync();\n\n    /// <summary>\n    /// Processes batch operation results, converting bit-level results to element-level results.\n    /// </summary>\n    /// <param name=\"processResults\">Bit-level operation results (from Redis).</param>\n    /// <param name=\"hashes\">Number of hash functions (bits per element).</param>\n    /// <param name=\"trackAdded\">If true, tracks additions (wasAdded logic); if false, tracks presence (isPresent logic).</param>\n    /// <returns>Element-level results.</returns>\n    protected static IList<bool> ProcessBatchResults(bool[] processResults, int hashes, bool trackAdded)\n    {\n        var results = new List<bool>(processResults.Length / hashes);\n        bool flag = trackAdded ? false : true;\n        int processed = 0;\n\n        foreach (var item in processResults)\n        {\n            if (trackAdded && !item) flag = true;      // Add: any bit not previously set = new addition\n            if (!trackAdded && !item) flag = false;    // Contains: any bit not set = not present\n\n            if ((processed + 1) % hashes == 0)\n            {\n                results.Add(flag);\n                flag = trackAdded ? false : true;\n            }\n            processed++;\n        }\n\n        return results;\n    }\n}\n"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Adler32.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic class Adler32 : HashFunction\n{\n    public override HashMethod Method => HashMethod.Adler32;\n\n    private const int seed32 = 89_478_583;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n        int hashes = 0;\n        int salt = 0;\n\n        var adler32 = new Internal.Adler32();\n\n        while (hashes < k)\n        {\n            adler32.Append(data);\n            adler32.Append(BitConverter.GetBytes(hashes + salt++ + seed32));\n\n            var adlerValue = adler32.GetCurrentHashAsUInt32();\n            adler32.Reset();\n\n            long hash = BinaryHelper.Rejection(adlerValue, m);\n\n            if (hash != -1)\n            {\n                positions[hashes++] = hash;\n            }\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Crc32.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic partial class Crc32 : HashFunction\n{\n    public override HashMethod Method => HashMethod.CRC32;\n\n    private const int seed32 = 89_478_583;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n        int hashes = 0;\n        int salt = 0;\n\n        var crc32 = new Internal.Crc32();\n\n        while (hashes < k)\n        {\n            crc32.Append(data);\n            crc32.Append(BitConverter.GetBytes(hashes + salt++ + seed32));\n\n            var crc = crc32.GetCurrentHashAsUInt32();\n            crc32.Reset();\n\n            long hash = BinaryHelper.Rejection(crc, m);\n            if (hash != -1)\n            {\n                positions[hashes++] = hash;\n            }\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Crc64.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic partial class Crc64 : HashFunction\n{\n    public override HashMethod Method => HashMethod.CRC64;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n\n        var hash = Internal.Crc64.HashToUInt64(data);\n\n        uint hash1 = (uint)hash;\n        uint hash2 = (uint)(hash >> 32);\n\n        for (int i = 0; i < k; i++)\n        {\n            positions[i] = ((hash1 + (i * hash2)) % m);\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/HashCrypto.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Security.Cryptography;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic class HashCryptoSHA1 : HashCrypto\n{\n    public override HashMethod Method => HashMethod.SHA1;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        using var hashAlgorithm = SHA1.Create();\n        return ComputeHash(hashAlgorithm, data, m, k);\n    }\n}\n\npublic class HashCryptoSHA256 : HashCrypto\n{\n    public override HashMethod Method => HashMethod.SHA256;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        using var hashAlgorithm = SHA256.Create();\n        return ComputeHash(hashAlgorithm, data, m, k);\n    }\n}\n\npublic class HashCryptoSHA384 : HashCrypto\n{\n    public override HashMethod Method => HashMethod.SHA384;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        using var hashAlgorithm = SHA384.Create();\n        return ComputeHash(hashAlgorithm, data, m, k);\n    }\n}\n\npublic class HashCryptoSHA512 : HashCrypto\n{\n    public override HashMethod Method => HashMethod.SHA512;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        using var hashAlgorithm = SHA512.Create();\n        return ComputeHash(hashAlgorithm, data, m, k);\n    }\n}\n\npublic abstract class HashCrypto : HashFunction\n{\n    protected long[] ComputeHash(HashAlgorithm hashAlgorithm, ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n\n        int computedHashes = 0;\n\n        byte[] digest = new byte[hashAlgorithm.HashSize / 8];\n        byte[] output = new byte[hashAlgorithm.HashSize / 8];\n\n#if !NET6_0_OR_GREATER\n        var bytes = data.ToArray();\n#endif\n        while (computedHashes < k)\n        {\n            hashAlgorithm.TransformBlock(digest, 0, digest.Length, output, 0);\n\n#if NET6_0_OR_GREATER\n            hashAlgorithm.TryComputeHash(data, digest, out int bytesWritten);\n#else\n\n            digest = hashAlgorithm.ComputeHash(bytes, 0, bytes.Length);\n#endif\n            BitArray hashed = new(digest);\n\n            int filterSize = 32 - (int)BinaryHelper.NumberOfLeadingZeros((uint)m);\n\n            for (int split = 0; split < (hashAlgorithm.HashSize / filterSize) && computedHashes < k; split++)\n            {\n                int from = split * filterSize;\n                int to = ((split + 1) * filterSize);\n\n                int intHash = BinaryHelper.BitToIntOne(hashed, from, to);\n\n                if (intHash < m)\n                {\n                    positions[computedHashes] = (uint)intHash;\n                    computedHashes++;\n                }\n            }\n        }\n\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Adler32.cs",
    "content": "using System;\nusing System.Buffers.Binary;\nusing System.Runtime.InteropServices;\n\n#if NET6_0_OR_GREATER\nusing System.Runtime.Intrinsics;\nusing System.Runtime.Intrinsics.X86;\n#endif\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///   Adler32 algorithm\n/// </summary>\ninternal sealed partial class Adler32 : NonCryptoHashAlgorithm\n{\n    private const int Size = sizeof(uint);\n\n    private uint _adler;\n    private uint _alderInitial;\n\n    // largest prime smaller than 65536\n    private const int MOD32 = 65_521;\n\n    // NMAX32 is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1\n    private const int NMAX32 = 5_552;\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"Adler32\"/> class.\n    /// </summary>\n    public Adler32(uint adler = 1)\n        : base(Size)\n    {\n        _alderInitial = adler;\n        _adler = adler;\n    }\n\n    /// <summary>\n    ///   Appends the contents of <paramref name=\"source\"/> to the data already\n    ///   processed for the current hash computation.\n    /// </summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        _adler = Update(_adler, source);\n    }\n\n    /// <summary>\n    ///   Resets the hash computation to the initial state.\n    /// </summary>\n    public override void Reset()\n    {\n        _adler = _alderInitial;\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   without modifying accumulated state.\n    /// </summary>\n    /// <param name=\"destination\">The buffer that receives the computed hash value.</param>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, _adler);\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   then clears the accumulated state.\n    /// </summary>\n    protected override void GetHashAndResetCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, _adler);\n        _adler = _alderInitial;\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public uint GetCurrentHashAsUInt32() => _adler;\n\n    private static uint Update(uint adler, ReadOnlySpan<byte> source)\n    {\n#if NET6_0_OR_GREATER\n        if (Ssse3.IsSupported)\n        {\n            return GetSse(source, adler);\n        }\n#endif\n\n        return GetSimple(source, adler);\n    }\n\n    internal static uint GetSimple(ReadOnlySpan<byte> source, uint adler)\n    {\n        var count = source.Length;\n\n        uint s1 = adler & 0xFFFF;\n        uint s2 = adler >> 16;\n\n        int offset = 0;\n\n        while (count > 0)\n        {\n            int n = NMAX32;\n            if (n > count)\n            {\n                n = count;\n            }\n            count -= n;\n            while (--n >= 0)\n            {\n                s1 = s1 + (uint)(source[offset++] & 0xff);\n                s2 = s2 + s1;\n            }\n            s1 %= MOD32;\n            s2 %= MOD32;\n        }\n\n        adler = (s2 << 16) | s1;\n\n        return adler;\n    }\n\n#if NET6_0_OR_GREATER\n    internal static unsafe uint GetSse(ReadOnlySpan<byte> buffer, uint adler)\n    {\n        const int BLOCK_SIZE = 32;\n\n        uint s1 = adler & 0xFFFF;\n        uint s2 = adler >> 16;\n\n        uint len = (uint)buffer.Length;\n\n        uint blocks = len / BLOCK_SIZE;\n        len = len - blocks * BLOCK_SIZE;\n\n        Vector128<sbyte> tap1 = Vector128.Create(32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17);\n        Vector128<sbyte> tap2 = Vector128.Create(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);\n        Vector128<byte> zero = Vector128<byte>.Zero;\n        Vector128<short> ones = Vector128.Create(1, 1, 1, 1, 1, 1, 1, 1);\n\n        fixed (byte* bufPtr = &MemoryMarshal.GetReference(buffer))\n        {\n            var buf = bufPtr;\n\n            while (blocks != 0)\n            {\n                uint n = NMAX32 / BLOCK_SIZE;\n                if (n > blocks)\n                {\n                    n = blocks;\n                }\n\n                blocks -= n;\n\n                // Process n blocks of data. At most NMAX data bytes can be\n                // processed before s2 must be reduced modulo BASE.\n                Vector128<uint> v_ps = Vector128.Create(0, 0, 0, s1 * n);\n                Vector128<uint> v_s2 = Vector128.Create(0, 0, 0, s2);\n                Vector128<uint> v_s1 = Vector128.Create(0u, 0, 0, 0);\n\n                do\n                {\n                    // Load 32 input bytes.\n                    Vector128<byte> bytes1 = Sse2.LoadVector128(&buf[0]);\n                    Vector128<byte> bytes2 = Sse2.LoadVector128(&buf[16]);\n\n                    // Add previous block byte sum to v_ps.\n                    v_ps = Sse2.Add(v_ps, v_s1);\n\n                    // Horizontally add the bytes for s1, multiply-adds the\n                    // bytes by [ 32, 31, 30, ... ] for s2.\n                    Vector128<ushort> sad1 = Sse2.SumAbsoluteDifferences(bytes1, zero);\n                    v_s1 = Sse2.Add(v_s1, sad1.AsUInt32());\n                    Vector128<short> mad11 = Ssse3.MultiplyAddAdjacent(bytes1, tap1);\n                    Vector128<int> mad12 = Sse2.MultiplyAddAdjacent(mad11, ones);\n                    v_s2 = Sse2.Add(v_s2, mad12.AsUInt32());\n\n                    Vector128<ushort> sad2 = Sse2.SumAbsoluteDifferences(bytes2, zero);\n                    v_s1 = Sse2.Add(v_s1, sad2.AsUInt32());\n                    Vector128<short> mad21 = Ssse3.MultiplyAddAdjacent(bytes2, tap2);\n                    Vector128<int> mad22 = Sse2.MultiplyAddAdjacent(mad21, ones);\n                    v_s2 = Sse2.Add(v_s2, mad22.AsUInt32());\n\n                    buf += BLOCK_SIZE;\n\n                    n--;\n                } while (n != 0);\n\n                var shift = Sse2.ShiftLeftLogical(v_ps, 5);\n                v_s2 = Sse2.Add(v_s2, shift);\n\n                // Sum epi32 ints v_s1(s2) and accumulate in s1(s2).\n\n                // A B C D -> B A D C\n                const int S2301 = 2 << 6 | 3 << 4 | 0 << 2 | 1;\n                // A B C D -> C D A B\n                const int S1032 = 1 << 6 | 0 << 4 | 3 << 2 | 2;\n\n                v_s1 = Sse2.Add(v_s1, Sse2.Shuffle(v_s1, S2301));\n                v_s1 = Sse2.Add(v_s1, Sse2.Shuffle(v_s1, S1032));\n                s1 += Sse2.ConvertToUInt32(v_s1);\n                v_s2 = Sse2.Add(v_s2, Sse2.Shuffle(v_s2, S2301));\n                v_s2 = Sse2.Add(v_s2, Sse2.Shuffle(v_s2, S1032));\n                s2 = Sse2.ConvertToUInt32(v_s2);\n\n                s1 %= MOD32;\n                s2 %= MOD32;\n            }\n\n            if (len > 0)\n            {\n                if (len >= 16)\n                {\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    s2 += (s1 += *buf++);\n                    len -= 16;\n                }\n\n                while (len-- > 0)\n                {\n                    s2 += (s1 += *buf++);\n                }\n                if (s1 >= MOD32)\n                {\n                    s1 -= MOD32;\n                }\n\n                s2 %= MOD32;\n            }\n\n            return s1 | (s2 << 16);\n        }\n    }\n#endif\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Crc32.Arm.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\n#if NET6_0_OR_GREATER\n\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing ArmCrc = System.Runtime.Intrinsics.Arm.Crc32;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal partial class Crc32\n{\n    private static uint UpdateScalarArm64(uint crc, ReadOnlySpan<byte> source)\n    {\n        Debug.Assert(ArmCrc.Arm64.IsSupported, \"ARM CRC support is required.\");\n\n        // Compute in 8 byte chunks\n        if (source.Length >= sizeof(ulong))\n        {\n            ref byte ptr = ref MemoryMarshal.GetReference(source);\n            int longLength = source.Length & ~0x7; // Exclude trailing bytes not a multiple of 8\n\n            for (int i = 0; i < longLength; i += sizeof(ulong))\n            {\n                crc = ArmCrc.Arm64.ComputeCrc32(crc,\n                    Unsafe.ReadUnaligned<ulong>(ref Unsafe.Add(ref ptr, i)));\n            }\n\n            source = source.Slice(longLength);\n        }\n\n        // Compute remaining bytes\n        for (int i = 0; i < source.Length; i++)\n        {\n            crc = ArmCrc.ComputeCrc32(crc, source[i]);\n        }\n\n        return crc;\n    }\n\n    private static uint UpdateScalarArm32(uint crc, ReadOnlySpan<byte> source)\n    {\n        Debug.Assert(ArmCrc.IsSupported, \"ARM CRC support is required.\");\n\n        // Compute in 4 byte chunks\n        if (source.Length >= sizeof(uint))\n        {\n            ref byte ptr = ref MemoryMarshal.GetReference(source);\n            int intLength = source.Length & ~0x3; // Exclude trailing bytes not a multiple of 4\n\n            for (int i = 0; i < intLength; i += sizeof(uint))\n            {\n                crc = ArmCrc.ComputeCrc32(crc,\n                    Unsafe.ReadUnaligned<uint>(ref Unsafe.Add(ref ptr, i)));\n            }\n\n            source = source.Slice(intLength);\n        }\n\n        // Compute remaining bytes\n        for (int i = 0; i < source.Length; i++)\n        {\n            crc = ArmCrc.ComputeCrc32(crc, source[i]);\n        }\n\n        return crc;\n    }\n}\n#endif"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Crc32.Table.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal partial class Crc32 : NonCryptoHashAlgorithm\n{\n    /// <summary>CRC-32 transition table</summary>\n    /// <remarks>\n    /// While this implementation is based on the standard CRC-32 polynomial,\n    /// x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + x0,\n    /// this version uses reflected bit ordering, so 0x04C11DB7 becomes 0xEDB88320\n    /// </remarks>\n    private static ReadOnlySpan<uint> CrcLookup => new uint[]\n    {\n        // Generated by GenerateTable(0xEDB88320u):\n        //\n        //     static uint[] GenerateTable(uint reflectedPolynomial)\n        //     {\n        //         uint[] table = new uint[256];\n        //         for (int i = 0; i < table.Length; i++)\n        //         {\n        //             uint val = (uint)i;\n        //             for (int j = 0; j < 8; j++)\n        //             {\n        //                 if ((val & 0b0000_0001) == 0)\n        //                 {\n        //                     val >>= 1;\n        //                 }\n        //                 else\n        //                 {\n        //                     val = (val >> 1) ^ reflectedPolynomial;\n        //                 }\n        //             }\n        //             table[i] = val;\n        //         }\n        //         return table;\n        //     }\n\n        0x0, 0x77073096, 0xEE0E612C, 0x990951BA, 0x76DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n        0xEDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x9B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n        0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n        0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n        0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n        0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n        0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n        0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n        0x76DC4190, 0x1DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x6B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n        0x7807C9A2, 0xF00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x86D3D2D, 0x91646C97, 0xE6635C01,\n        0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n        0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n        0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n        0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n        0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n        0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n        0xEDB88320, 0x9ABFB3B6, 0x3B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x4DB2615, 0x73DC1683,\n        0xE3630B12, 0x94643B84, 0xD6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0xA00AE27, 0x7D079EB1,\n        0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n        0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n        0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n        0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n        0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n        0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n        0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x26D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x5005713,\n        0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0xCB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0xBDBDF21,\n        0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n        0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n        0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n        0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n        0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n        0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,\n    };\n}\n"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Crc32.Vectorized.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\n#if NET7_0_OR_GREATER\n\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.Intrinsics;\nusing System.Runtime.InteropServices;\nusing System;\nusing static BloomFilter.HashAlgorithms.Internal.VectorHelper;\n\nnamespace BloomFilter.HashAlgorithms.Internal\n{\n\n    internal partial class Crc32\n    {\n        // We check for little endian byte order here in case we're ever on ARM in big endian mode.\n        // All of these checks except the length check are elided by JIT, so the JITted implementation\n        // will be either a return false or a length check against a constant. This means this method\n        // should be inlined into the caller.\n        private static bool CanBeVectorized(ReadOnlySpan<byte> source) =>\n            BitConverter.IsLittleEndian\n            && VectorHelper.IsSupported\n            // Vectorization can process spans as short as a single vector (16 bytes), but if ARM intrinsics are supported they\n            // seem to be more performant for spans less than 8 vectors (128 bytes).\n            && source.Length >= Vector128<byte>.Count * (System.Runtime.Intrinsics.Arm.Crc32.IsSupported ? 8 : 1);\n\n        // Processes the bytes in source in 64 byte chunks using carryless/polynomial multiplication intrinsics,\n        // followed by processing 16 byte chunks, and then processing remaining bytes individually. Requires\n        // little endian byte order and support for PCLMULQDQ intrinsics on Intel architecture or AES and\n        // AdvSimd intrinsics on ARM architecture. Based on the algorithm put forth in the Intel paper \"Fast CRC\n        // Computation for Generic Polynomials Using PCLMULQDQ Instruction\" in December, 2009.\n        // https://github.com/intel/isa-l/blob/33a2d9484595c2d6516c920ce39a694c144ddf69/crc/crc32_ieee_by4.asm\n        // https://github.com/SixLabors/ImageSharp/blob/f4f689ce67ecbcc35cebddba5aacb603e6d1068a/src/ImageSharp/Formats/Png/Zlib/Crc32.cs#L80\n        private static uint UpdateVectorized(uint crc, ReadOnlySpan<byte> source)\n        {\n            Debug.Assert(CanBeVectorized(source), \"source cannot be vectorized.\");\n\n            // Work with a reference to where we're at in the ReadOnlySpan and a local length\n            // to avoid extraneous range checks.\n            ref byte srcRef = ref MemoryMarshal.GetReference(source);\n            int length = source.Length;\n\n            Vector128<ulong> kConstants;\n            Vector128<ulong> x1; // Accumulator for the new CRC\n            Vector128<ulong> x2;\n\n            if (length >= Vector128<byte>.Count * 8)\n            {\n                x1 = Vector128.LoadUnsafe(ref srcRef).AsUInt64();\n                x2 = Vector128.LoadUnsafe(ref srcRef, 16).AsUInt64();\n                Vector128<ulong> x3 = Vector128.LoadUnsafe(ref srcRef, 32).AsUInt64();\n                Vector128<ulong> x4 = Vector128.LoadUnsafe(ref srcRef, 48).AsUInt64();\n\n                srcRef = ref Unsafe.Add(ref srcRef, Vector128<byte>.Count * 4);\n                length -= Vector128<byte>.Count * 4;\n\n                // Load and XOR the initial CRC value\n                x1 ^= Vector128.CreateScalar(crc).AsUInt64();\n\n                kConstants = Vector128.Create(0x0154442bd4UL, 0x01c6e41596UL); // k1, k2\n\n                // Parallel fold blocks of 64, if any.\n                do\n                {\n                    Vector128<ulong> y5 = Vector128.LoadUnsafe(ref srcRef).AsUInt64();\n                    Vector128<ulong> y6 = Vector128.LoadUnsafe(ref srcRef, 16).AsUInt64();\n                    Vector128<ulong> y7 = Vector128.LoadUnsafe(ref srcRef, 32).AsUInt64();\n                    Vector128<ulong> y8 = Vector128.LoadUnsafe(ref srcRef, 48).AsUInt64();\n\n                    x1 = FoldPolynomialPair(y5, x1, kConstants);\n                    x2 = FoldPolynomialPair(y6, x2, kConstants);\n                    x3 = FoldPolynomialPair(y7, x3, kConstants);\n                    x4 = FoldPolynomialPair(y8, x4, kConstants);\n\n                    srcRef = ref Unsafe.Add(ref srcRef, Vector128<byte>.Count * 4);\n                    length -= Vector128<byte>.Count * 4;\n                } while (length >= Vector128<byte>.Count * 4);\n\n                // Fold into 128-bits.\n                kConstants = Vector128.Create(0x01751997d0UL, 0x00ccaa009eUL); // k3, k4\n                x1 = FoldPolynomialPair(x2, x1, kConstants);\n                x1 = FoldPolynomialPair(x3, x1, kConstants);\n                x1 = FoldPolynomialPair(x4, x1, kConstants);\n            }\n            else\n            {\n                // For shorter sources just load the first vector and XOR with the CRC\n                Debug.Assert(length >= 16);\n\n                x1 = Vector128.LoadUnsafe(ref srcRef).AsUInt64();\n                x1 ^= Vector128.CreateScalar(crc).AsUInt64();\n\n                srcRef = ref Unsafe.Add(ref srcRef, Vector128<byte>.Count);\n                length -= Vector128<byte>.Count;\n            }\n\n            // Single fold blocks of 16, if any.\n            while (length >= Vector128<byte>.Count)\n            {\n                x1 = FoldPolynomialPair(Vector128.LoadUnsafe(ref srcRef).AsUInt64(), x1,\n                    Vector128.Create(0x01751997d0UL, 0x00ccaa009eUL));\n\n                srcRef = ref Unsafe.Add(ref srcRef, Vector128<byte>.Count);\n                length -= Vector128<byte>.Count;\n            }\n\n            // Fold 128 bits to 64 bits.\n            Vector128<ulong> bitmask = Vector128.Create(~0, 0, ~0, 0).AsUInt64();\n            x1 = ShiftRightBytesInVector(x1, 8) ^\n                 CarrylessMultiplyLower(x1, Vector128.CreateScalar(0x00ccaa009eUL));\n            x1 = CarrylessMultiplyLower(x1 & bitmask, Vector128.CreateScalar(0x0163cd6124UL)) ^ // k5, k0\n                 ShiftRightBytesInVector(x1, 4);\n\n            // Reduce to 32 bits.\n            kConstants = Vector128.Create(0x01db710641UL, 0x01f7011641UL); // polynomial\n            x2 = CarrylessMultiplyLeftLowerRightUpper(x1 & bitmask, kConstants) & bitmask;\n            x2 = CarrylessMultiplyLower(x2, kConstants);\n            x1 ^= x2;\n\n            // Process the remaining bytes, if any\n            uint result = x1.AsUInt32().GetElement(1);\n            return length > 0\n                ? UpdateScalar(result, MemoryMarshal.CreateReadOnlySpan(ref srcRef, length))\n                : result;\n        }\n    }\n}\n#endif"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Crc32.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///   Provides an implementation of the CRC-32 algorithm, as used in\n///   ITU-T V.42 and IEEE 802.3.\n/// </summary>\n/// <remarks>\n///   <para>\n///     For methods that return byte arrays or that write into spans of bytes, this implementation\n///     emits the answer in the Little Endian byte order so that the CRC residue relationship\n///     (CRC(message concat CRC(message))) is a fixed value) holds.\n///     For CRC-32 this stable output is the byte sequence <c>{ 0x1C, 0xDF, 0x44, 0x21 }</c>,\n///     the Little Endian representation of <c>0x2144DF1C</c>.\n///   </para>\n///   <para>\n///     There are multiple, incompatible, definitions of a 32-bit cyclic redundancy\n///     check (CRC) algorithm. When interoperating with another system, ensure that you\n///     are using the same definition. The definition used by this implementation is not\n///     compatible with the cyclic redundancy check described in ITU-T I.363.5.\n///   </para>\n/// </remarks>\ninternal partial class Crc32 : NonCryptoHashAlgorithm\n{\n    private const uint InitialState = 0xFFFF_FFFFu;\n\n    private const int Size = sizeof(uint);\n\n    private uint _crc = InitialState;\n\n    public Crc32() : base(Size)\n    {\n    }\n\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        _crc = Update(_crc, source);\n    }\n\n    public override void Reset()\n    {\n        _crc = InitialState;\n    }\n\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, ~_crc);\n    }\n\n    protected override void GetHashAndResetCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, ~_crc);\n        _crc = InitialState;\n    }\n\n    public uint GetCurrentHashAsUInt32() => ~_crc;\n\n    private static uint Update(uint crc, ReadOnlySpan<byte> source)\n    {\n#if NET7_0_OR_GREATER\n        if (CanBeVectorized(source))\n        {\n            return UpdateVectorized(crc, source);\n        }\n#endif\n\n        return UpdateScalar(crc, source);\n    }\n\n    private static uint UpdateScalar(uint crc, ReadOnlySpan<byte> source)\n    {\n#if NET6_0_OR_GREATER\n        // Use ARM intrinsics for CRC if available. This is used for the trailing bytes on the vectorized path\n        // and is the primary method if the vectorized path is unavailable.\n        if (System.Runtime.Intrinsics.Arm.Crc32.Arm64.IsSupported)\n        {\n            return UpdateScalarArm64(crc, source);\n        }\n\n        if (System.Runtime.Intrinsics.Arm.Crc32.IsSupported)\n        {\n            return UpdateScalarArm32(crc, source);\n        }\n#endif\n\n        ReadOnlySpan<uint> crcLookup = CrcLookup;\n        for (int i = 0; i < source.Length; i++)\n        {\n            crc = crcLookup[(byte)(crc ^ source[i])] ^ (crc >> 8);\n        }\n\n        return crc;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Crc64.Table.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal sealed partial class Crc64 : NonCryptoHashAlgorithm\n{\n    /// <summary>CRC-64 transition table.</summary>\n    private static ReadOnlySpan<ulong> CrcLookup => new ulong[256]\n    {\n        // Generated by GenerateTable(0x42F0E1EBA9EA3693):\n        //\n        //     static ulong[] GenerateTable(ulong polynomial)\n        //     {\n        //         var table = new ulong[256];\n        //         for (int i = 0; i < table.Length; i++)\n        //         {\n        //             ulong val = (ulong)i << 56;\n        //             for (int j = 0; j < 8; j++)\n        //             {\n        //                 if ((val & 0x8000_0000_0000_0000) == 0)\n        //                 {\n        //                     val <<= 1;\n        //                 }\n        //                 else\n        //                 {\n        //                     val = (val << 1) ^ polynomial;\n        //                 }\n        //             }\n        //             table[i] = val;\n        //         }\n        //         return table;\n        //     }\n\n        0x0, 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, 0xC711223CFA3E5BB5, 0x493366450E42ECDF, 0xBC387AEA7A8DA4C, 0xCCD2A5925D9681F9, 0x8E224479F47CB76A,\n        0x9266CC8A1C85D9BE, 0xD0962D61B56FEF2D, 0x17870F5D4F51B498, 0x5577EEB6E6BB820B, 0xDB55AACF12C73561, 0x99A54B24BB2D03F2, 0x5EB4691841135847, 0x1C4488F3E8F96ED4,\n        0x663D78FF90E185EF, 0x24CD9914390BB37C, 0xE3DCBB28C335E8C9, 0xA12C5AC36ADFDE5A, 0x2F0E1EBA9EA36930, 0x6DFEFF5137495FA3, 0xAAEFDD6DCD770416, 0xE81F3C86649D3285,\n        0xF45BB4758C645C51, 0xB6AB559E258E6AC2, 0x71BA77A2DFB03177, 0x334A9649765A07E4, 0xBD68D2308226B08E, 0xFF9833DB2BCC861D, 0x388911E7D1F2DDA8, 0x7A79F00C7818EB3B,\n        0xCC7AF1FF21C30BDE, 0x8E8A101488293D4D, 0x499B3228721766F8, 0xB6BD3C3DBFD506B, 0x854997BA2F81E701, 0xC7B97651866BD192, 0xA8546D7C558A27, 0x4258B586D5BFBCB4,\n        0x5E1C3D753D46D260, 0x1CECDC9E94ACE4F3, 0xDBFDFEA26E92BF46, 0x990D1F49C77889D5, 0x172F5B3033043EBF, 0x55DFBADB9AEE082C, 0x92CE98E760D05399, 0xD03E790CC93A650A,\n        0xAA478900B1228E31, 0xE8B768EB18C8B8A2, 0x2FA64AD7E2F6E317, 0x6D56AB3C4B1CD584, 0xE374EF45BF6062EE, 0xA1840EAE168A547D, 0x66952C92ECB40FC8, 0x2465CD79455E395B,\n        0x3821458AADA7578F, 0x7AD1A461044D611C, 0xBDC0865DFE733AA9, 0xFF3067B657990C3A, 0x711223CFA3E5BB50, 0x33E2C2240A0F8DC3, 0xF4F3E018F031D676, 0xB60301F359DBE0E5,\n        0xDA050215EA6C212F, 0x98F5E3FE438617BC, 0x5FE4C1C2B9B84C09, 0x1D14202910527A9A, 0x93366450E42ECDF0, 0xD1C685BB4DC4FB63, 0x16D7A787B7FAA0D6, 0x5427466C1E109645,\n        0x4863CE9FF6E9F891, 0xA932F745F03CE02, 0xCD820D48A53D95B7, 0x8F72ECA30CD7A324, 0x150A8DAF8AB144E, 0x43A04931514122DD, 0x84B16B0DAB7F7968, 0xC6418AE602954FFB,\n        0xBC387AEA7A8DA4C0, 0xFEC89B01D3679253, 0x39D9B93D2959C9E6, 0x7B2958D680B3FF75, 0xF50B1CAF74CF481F, 0xB7FBFD44DD257E8C, 0x70EADF78271B2539, 0x321A3E938EF113AA,\n        0x2E5EB66066087D7E, 0x6CAE578BCFE24BED, 0xABBF75B735DC1058, 0xE94F945C9C3626CB, 0x676DD025684A91A1, 0x259D31CEC1A0A732, 0xE28C13F23B9EFC87, 0xA07CF2199274CA14,\n        0x167FF3EACBAF2AF1, 0x548F120162451C62, 0x939E303D987B47D7, 0xD16ED1D631917144, 0x5F4C95AFC5EDC62E, 0x1DBC74446C07F0BD, 0xDAAD56789639AB08, 0x985DB7933FD39D9B,\n        0x84193F60D72AF34F, 0xC6E9DE8B7EC0C5DC, 0x1F8FCB784FE9E69, 0x43081D5C2D14A8FA, 0xCD2A5925D9681F90, 0x8FDAB8CE70822903, 0x48CB9AF28ABC72B6, 0xA3B7B1923564425,\n        0x70428B155B4EAF1E, 0x32B26AFEF2A4998D, 0xF5A348C2089AC238, 0xB753A929A170F4AB, 0x3971ED50550C43C1, 0x7B810CBBFCE67552, 0xBC902E8706D82EE7, 0xFE60CF6CAF321874,\n        0xE224479F47CB76A0, 0xA0D4A674EE214033, 0x67C58448141F1B86, 0x253565A3BDF52D15, 0xAB1721DA49899A7F, 0xE9E7C031E063ACEC, 0x2EF6E20D1A5DF759, 0x6C0603E6B3B7C1CA,\n        0xF6FAE5C07D3274CD, 0xB40A042BD4D8425E, 0x731B26172EE619EB, 0x31EBC7FC870C2F78, 0xBFC9838573709812, 0xFD39626EDA9AAE81, 0x3A28405220A4F534, 0x78D8A1B9894EC3A7,\n        0x649C294A61B7AD73, 0x266CC8A1C85D9BE0, 0xE17DEA9D3263C055, 0xA38D0B769B89F6C6, 0x2DAF4F0F6FF541AC, 0x6F5FAEE4C61F773F, 0xA84E8CD83C212C8A, 0xEABE6D3395CB1A19,\n        0x90C79D3FEDD3F122, 0xD2377CD44439C7B1, 0x15265EE8BE079C04, 0x57D6BF0317EDAA97, 0xD9F4FB7AE3911DFD, 0x9B041A914A7B2B6E, 0x5C1538ADB04570DB, 0x1EE5D94619AF4648,\n        0x2A151B5F156289C, 0x4051B05E58BC1E0F, 0x87409262A28245BA, 0xC5B073890B687329, 0x4B9237F0FF14C443, 0x962D61B56FEF2D0, 0xCE73F427ACC0A965, 0x8C8315CC052A9FF6,\n        0x3A80143F5CF17F13, 0x7870F5D4F51B4980, 0xBF61D7E80F251235, 0xFD913603A6CF24A6, 0x73B3727A52B393CC, 0x31439391FB59A55F, 0xF652B1AD0167FEEA, 0xB4A25046A88DC879,\n        0xA8E6D8B54074A6AD, 0xEA16395EE99E903E, 0x2D071B6213A0CB8B, 0x6FF7FA89BA4AFD18, 0xE1D5BEF04E364A72, 0xA3255F1BE7DC7CE1, 0x64347D271DE22754, 0x26C49CCCB40811C7,\n        0x5CBD6CC0CC10FAFC, 0x1E4D8D2B65FACC6F, 0xD95CAF179FC497DA, 0x9BAC4EFC362EA149, 0x158E0A85C2521623, 0x577EEB6E6BB820B0, 0x906FC95291867B05, 0xD29F28B9386C4D96,\n        0xCEDBA04AD0952342, 0x8C2B41A1797F15D1, 0x4B3A639D83414E64, 0x9CA82762AAB78F7, 0x87E8C60FDED7CF9D, 0xC51827E4773DF90E, 0x20905D88D03A2BB, 0x40F9E43324E99428,\n        0x2CFFE7D5975E55E2, 0x6E0F063E3EB46371, 0xA91E2402C48A38C4, 0xEBEEC5E96D600E57, 0x65CC8190991CB93D, 0x273C607B30F68FAE, 0xE02D4247CAC8D41B, 0xA2DDA3AC6322E288,\n        0xBE992B5F8BDB8C5C, 0xFC69CAB42231BACF, 0x3B78E888D80FE17A, 0x7988096371E5D7E9, 0xF7AA4D1A85996083, 0xB55AACF12C735610, 0x724B8ECDD64D0DA5, 0x30BB6F267FA73B36,\n        0x4AC29F2A07BFD00D, 0x8327EC1AE55E69E, 0xCF235CFD546BBD2B, 0x8DD3BD16FD818BB8, 0x3F1F96F09FD3CD2, 0x41011884A0170A41, 0x86103AB85A2951F4, 0xC4E0DB53F3C36767,\n        0xD8A453A01B3A09B3, 0x9A54B24BB2D03F20, 0x5D45907748EE6495, 0x1FB5719CE1045206, 0x919735E51578E56C, 0xD367D40EBC92D3FF, 0x1476F63246AC884A, 0x568617D9EF46BED9,\n        0xE085162AB69D5E3C, 0xA275F7C11F7768AF, 0x6564D5FDE549331A, 0x279434164CA30589, 0xA9B6706FB8DFB2E3, 0xEB46918411358470, 0x2C57B3B8EB0BDFC5, 0x6EA7525342E1E956,\n        0x72E3DAA0AA188782, 0x30133B4B03F2B111, 0xF7021977F9CCEAA4, 0xB5F2F89C5026DC37, 0x3BD0BCE5A45A6B5D, 0x79205D0E0DB05DCE, 0xBE317F32F78E067B, 0xFCC19ED95E6430E8,\n        0x86B86ED5267CDBD3, 0xC4488F3E8F96ED40, 0x359AD0275A8B6F5, 0x41A94CE9DC428066, 0xCF8B0890283E370C, 0x8D7BE97B81D4019F, 0x4A6ACB477BEA5A2A, 0x89A2AACD2006CB9,\n        0x14DEA25F3AF9026D, 0x562E43B4931334FE, 0x913F6188692D6F4B, 0xD3CF8063C0C759D8, 0x5DEDC41A34BBEEB2, 0x1F1D25F19D51D821, 0xD80C07CD676F8394, 0x9AFCE626CE85B507,\n    };\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Crc64.Vectorized.cs",
    "content": "#if NET7_0_OR_GREATER\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.Intrinsics;\nusing System.Runtime.InteropServices;\nusing static BloomFilter.HashAlgorithms.Internal.VectorHelper;\n\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal partial class Crc64\n{\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Vector128<ulong> LoadFromSource(ref byte source, nuint elementOffset)\n    {\n        Vector128<byte> vector = Vector128.LoadUnsafe(ref source, elementOffset);\n\n        if (BitConverter.IsLittleEndian)\n        {\n            // Reverse the byte order.\n\n            // SSSE3 is required to get PSHUFB acceleration for Vector128.Shuffle on x86/x64.\n            // However, the gains from vectorizing the rest of the operations seem to to be\n            // greater than the added cost of emulating the shuffle, so we don't require SSSE3 support.\n            vector = Vector128.Shuffle(vector,\n                Vector128.Create((byte)0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,\n                    0x02, 0x01, 0x00));\n        }\n\n        return vector.AsUInt64();\n    }\n\n    // All of these checks except the length check are elided by JIT, so the JITted implementation\n    // will be either a return false or a length check against a constant. This means this method\n    // should be inlined into the caller.\n    private static bool CanBeVectorized(ReadOnlySpan<byte> source) => VectorHelper.IsSupported && source.Length >= Vector128<byte>.Count;\n\n    // Processes the bytes in source in 128 byte chunks using intrinsics, followed by processing 16\n    // byte chunks, and then processing remaining bytes individually. Requires at least 16 bytes of data.\n    // Requires little endian byte order and support for PCLMULQDQ intrinsics on Intel architecture\n    // or AES and AdvSimd intrinsics on ARM architecture. Based on the algorithm put forth in the Intel paper\n    // \"Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction\" in December, 2009 and the\n    // Intel reference implementation.\n    // https://github.com/intel/isa-l/blob/33a2d9484595c2d6516c920ce39a694c144ddf69/crc/crc64_ecma_norm_by8.asm\n    private static ulong UpdateVectorized(ulong crc, ReadOnlySpan<byte> source)\n    {\n        Debug.Assert(CanBeVectorized(source), \"source cannot be vectorized.\");\n\n        // Work with a reference to where we're at in the ReadOnlySpan and a local length\n        // to avoid extraneous range checks.\n        ref byte srcRef = ref MemoryMarshal.GetReference(source);\n        int length = source.Length;\n\n        Vector128<ulong> x7; // Accumulator for the new CRC\n        Vector128<ulong> kConstants; // Used to store reused constants\n\n        if (length >= Vector128<byte>.Count * 16) // At least 256 bytes\n        {\n            // Load the first 128 bytes\n            Vector128<ulong> x0 = LoadFromSource(ref srcRef, 0);\n            Vector128<ulong> x1 = LoadFromSource(ref srcRef, 16);\n            Vector128<ulong> x2 = LoadFromSource(ref srcRef, 32);\n            Vector128<ulong> x3 = LoadFromSource(ref srcRef, 48);\n            Vector128<ulong> x4 = LoadFromSource(ref srcRef, 64);\n            Vector128<ulong> x5 = LoadFromSource(ref srcRef, 80);\n            Vector128<ulong> x6 = LoadFromSource(ref srcRef, 96);\n            x7 = LoadFromSource(ref srcRef, 112);\n\n            srcRef = ref Unsafe.Add(ref srcRef, Vector128<byte>.Count * 8);\n            length -= Vector128<byte>.Count * 8;\n\n            // Load and XOR the initial CRC value\n            // CRC value does not need to be byte-reflected, but it needs to be moved to the high part of the register.\n            // because data will be byte-reflected and will align with initial crc at correct place.\n            x0 ^= ShiftLowerToUpper(Vector128.CreateScalar(crc));\n\n            kConstants = Vector128.Create(0x5cf79dea9ac37d6UL, 0x001067e571d7d5c2UL); // k3, k4\n\n            // Parallel fold blocks of 128\n            do\n            {\n                Vector128<ulong> y1 = LoadFromSource(ref srcRef, 0);\n                Vector128<ulong> y2 = LoadFromSource(ref srcRef, 16);\n                x0 = FoldPolynomialPair(y1, x0, kConstants);\n                x1 = FoldPolynomialPair(y2, x1, kConstants);\n\n                y1 = LoadFromSource(ref srcRef, 32);\n                y2 = LoadFromSource(ref srcRef, 48);\n                x2 = FoldPolynomialPair(y1, x2, kConstants);\n                x3 = FoldPolynomialPair(y2, x3, kConstants);\n\n                y1 = LoadFromSource(ref srcRef, 64);\n                y2 = LoadFromSource(ref srcRef, 80);\n                x4 = FoldPolynomialPair(y1, x4, kConstants);\n                x5 = FoldPolynomialPair(y2, x5, kConstants);\n\n                y1 = LoadFromSource(ref srcRef, 96);\n                y2 = LoadFromSource(ref srcRef, 112);\n                x6 = FoldPolynomialPair(y1, x6, kConstants);\n                x7 = FoldPolynomialPair(y2, x7, kConstants);\n\n                srcRef = ref Unsafe.Add(ref srcRef, Vector128<byte>.Count * 8);\n                length -= Vector128<byte>.Count * 8;\n            } while (length >= Vector128<byte>.Count * 8);\n\n            // Fold into 128-bits in x7\n            x7 = FoldPolynomialPair(x7, x0, Vector128.Create(0xe464f4df5fb60ac1UL, 0xb649c5b35a759cf2UL)); // k9, k10\n            x7 = FoldPolynomialPair(x7, x1, Vector128.Create(0x9af04e1eff82d0ddUL, 0x6e82e609297f8fe8UL)); // k11, k12\n            x7 = FoldPolynomialPair(x7, x2, Vector128.Create(0x97c516e98bd2e73UL, 0xb76477b31e22e7bUL)); // k13, k14\n            x7 = FoldPolynomialPair(x7, x3, Vector128.Create(0x5f6843ca540df020UL, 0xddf4b6981205b83fUL)); // k15, k16\n            x7 = FoldPolynomialPair(x7, x4, Vector128.Create(0x54819d8713758b2cUL, 0x4a6b90073eb0af5aUL)); // k17, k18\n            x7 = FoldPolynomialPair(x7, x5, Vector128.Create(0x571bee0a227ef92bUL, 0x44bef2a201b5200cUL)); // k19, k20\n            x7 = FoldPolynomialPair(x7, x6, Vector128.Create(0x5f5c3c7eb52fab6UL, 0x4eb938a7d257740eUL)); // k1, k2\n        }\n        else\n        {\n            // For shorter sources just load the first vector and XOR with the CRC\n            Debug.Assert(length >= 16);\n\n            x7 = LoadFromSource(ref srcRef, 0);\n\n            // Load and XOR the initial CRC value\n            // CRC value does not need to be byte-reflected, but it needs to be moved to the high part of the register.\n            // because the data will be byte-reflected and will align with initial crc at correct place.\n            x7 ^= ShiftLowerToUpper(Vector128.CreateScalar(crc));\n\n            srcRef = ref Unsafe.Add(ref srcRef, Vector128<byte>.Count);\n            length -= Vector128<byte>.Count;\n        }\n\n        // Single fold blocks of 16, if any, into x7\n        while (length >= Vector128<byte>.Count)\n        {\n            x7 = FoldPolynomialPair(LoadFromSource(ref srcRef, 0), x7,\n                Vector128.Create(0x5f5c3c7eb52fab6UL, 0x4eb938a7d257740eUL)); // k1, k2\n\n            srcRef = ref Unsafe.Add(ref srcRef, Vector128<byte>.Count);\n            length -= Vector128<byte>.Count;\n        }\n\n        // Compute CRC of a 128-bit value and fold to the upper 64-bits\n        x7 = CarrylessMultiplyLeftUpperRightLower(x7, Vector128.CreateScalar(0x5f5c3c7eb52fab6UL)) ^ // k5\n             ShiftLowerToUpper(x7);\n\n        // Barrett reduction\n        kConstants = Vector128.Create(0x578d29d06cc4f872UL, 0x42f0e1eba9ea3693UL); // k7, k8\n        Vector128<ulong> temp = x7;\n        x7 = CarrylessMultiplyLeftUpperRightLower(x7, kConstants) ^ (x7 & Vector128.Create(0UL, ~0UL));\n        x7 = CarrylessMultiplyUpper(x7, kConstants);\n        x7 ^= temp;\n\n        // Process the remaining bytes, if any\n        ulong result = x7.GetElement(0);\n        return length > 0\n            ? UpdateScalar(result, MemoryMarshal.CreateReadOnlySpan(ref srcRef, length))\n            : result;\n    }\n}\n#endif"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Crc64.cs",
    "content": "﻿\n// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///   Provides an implementation of the CRC-64 algorithm as described in ECMA-182, Annex B.\n/// </summary>\n/// <remarks>\n///   <para>\n///     For methods that return byte arrays or that write into spans of bytes,\n///     this implementation emits the answer in the Big Endian byte order so that\n///     the CRC residue relationship (CRC(message concat CRC(message))) is a fixed value) holds.\n///     For CRC-64 this stable output is the byte sequence\n///     <c>{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }</c>.\n///   </para>\n///   <para>\n///     There are multiple, incompatible, definitions of a 64-bit cyclic redundancy\n///     check (CRC) algorithm. When interoperating with another system, ensure that you\n///     are using the same definition. The definition used by this implementation is not\n///     compatible with the cyclic redundancy check described in ISO 3309.\n///   </para>\n/// </remarks>\ninternal sealed partial class Crc64 : NonCryptoHashAlgorithm\n{\n    private const ulong InitialState = 0UL;\n    private const int Size = sizeof(ulong);\n\n    private ulong _crc = InitialState;\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"Crc64\"/> class.\n    /// </summary>\n    public Crc64()\n        : base(Size)\n    {\n    }\n\n    /// <summary>\n    ///   Appends the contents of <paramref name=\"source\"/> to the data already\n    ///   processed for the current hash computation.\n    /// </summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        _crc = Update(_crc, source);\n    }\n\n    /// <summary>\n    ///   Resets the hash computation to the initial state.\n    /// </summary>\n    public override void Reset()\n    {\n        _crc = InitialState;\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   without modifying accumulated state.\n    /// </summary>\n    /// <param name=\"destination\">The buffer that receives the computed hash value.</param>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt64BigEndian(destination, _crc);\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   then clears the accumulated state.\n    /// </summary>\n    protected override void GetHashAndResetCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt64BigEndian(destination, _crc);\n        _crc = InitialState;\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public ulong GetCurrentHashAsUInt64() => _crc;\n\n    public static ulong HashToUInt64(ReadOnlySpan<byte> source) =>\n        Update(InitialState, source);\n\n    private static ulong Update(ulong crc, ReadOnlySpan<byte> source)\n    {\n#if NET7_0_OR_GREATER\n        if (CanBeVectorized(source))\n        {\n            return UpdateVectorized(crc, source);\n        }\n#endif\n\n        return UpdateScalar(crc, source);\n    }\n\n    private static ulong UpdateScalar(ulong crc, ReadOnlySpan<byte> source)\n    {\n        ReadOnlySpan<ulong> crcLookup = CrcLookup;\n        for (int i = 0; i < source.Length; i++)\n        {\n            ulong idx = (crc >> 56);\n            idx ^= source[i];\n            crc = crcLookup[(int)idx] ^ (crc << 8);\n        }\n\n        return crc;\n    }\n}\n"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/FNV1.cs",
    "content": "using System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///   FNV1 algorithm\n/// </summary>\ninternal partial class FNV1 : NonCryptoHashAlgorithm\n{\n    private const int Size = sizeof(uint);\n\n    private uint _current;\n\n    private const uint Prime = 16_777_619;\n    private const uint InitialState = 2_166_136_261;\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"FNV1\"/> class.\n    /// </summary>\n    public FNV1()\n        : base(Size)\n    {\n        Reset();\n    }\n\n    /// <summary>\n    ///   Appends the contents of <paramref name=\"source\"/> to the data already\n    ///   processed for the current hash computation.\n    /// </summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        _current = Update(_current, source);\n    }\n\n    /// <summary>\n    ///   Resets the hash computation to the initial state.\n    /// </summary>\n    public override void Reset()\n    {\n        _current = InitialState;\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   without modifying accumulated state.\n    /// </summary>\n    /// <param name=\"destination\">The buffer that receives the computed hash value.</param>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, _current);\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   then clears the accumulated state.\n    /// </summary>\n    protected override void GetHashAndResetCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, _current);\n        _current = InitialState;\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public uint GetCurrentHashAsUInt32() => _current;\n\n    /// <summary>Computes the FNV1 hash of the provided data.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <returns>The computed FNV1 hash.</returns>\n    public static uint HashToUInt32(ReadOnlySpan<byte> source) =>\n        Update(InitialState, source);\n\n    private static uint Update(uint current, ReadOnlySpan<byte> source)\n    {\n        for (int i = 0; i < source.Length; i++)\n        {\n            current *= Prime;\n            current ^= source[i];\n        }\n\n        return current;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/FNV1a.cs",
    "content": "using System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n/// FNV1a algorithm\n/// </summary>\ninternal class FNV1a : NonCryptoHashAlgorithm\n{\n    private const int Size = sizeof(uint);\n\n    private uint _current;\n\n    private const uint Prime = 16_777_619;\n    private const uint InitialState = 2_166_136_261;\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"FNV1\"/> class.\n    /// </summary>\n    public FNV1a()\n        : base(Size)\n    {\n        Reset();\n    }\n\n    /// <summary>\n    ///   Appends the contents of <paramref name=\"source\"/> to the data already\n    ///   processed for the current hash computation.\n    /// </summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        _current = Update(_current, source);\n    }\n\n    /// <summary>\n    ///   Resets the hash computation to the initial state.\n    /// </summary>\n    public override void Reset()\n    {\n        _current = InitialState;\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   without modifying accumulated state.\n    /// </summary>\n    /// <param name=\"destination\">The buffer that receives the computed hash value.</param>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, _current);\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   then clears the accumulated state.\n    /// </summary>\n    protected override void GetHashAndResetCore(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, _current);\n        _current = InitialState;\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public uint GetCurrentHashAsUInt32() => _current;\n\n    /// <summary>Computes the FNV1 hash of the provided data.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <returns>The computed FNV1 hash.</returns>\n    public static uint HashToUInt32(ReadOnlySpan<byte> source) =>\n        Update(InitialState, source);\n\n    private static uint Update(uint current, ReadOnlySpan<byte> source)\n    {\n        for (int i = 0; i < source.Length; i++)\n        {\n            current ^= source[i];\n            current *= Prime;\n        }\n\n        return current;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/ModifiedFNV1.cs",
    "content": "using System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///   Implements a modified FNV hash. Provides better distribution than FNV1 but it's only 32 bit long.\n/// </summary>\ninternal class ModifiedFNV1 : NonCryptoHashAlgorithm\n{\n    private const int Size = sizeof(uint);\n\n    private uint _current;\n\n    private const uint Prime = 16_777_619;\n    private const uint InitialState = 2_166_136_261;\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"FNV1\"/> class.\n    /// </summary>\n    public ModifiedFNV1()\n        : base(Size)\n    {\n        Reset();\n    }\n\n    /// <summary>\n    ///   Appends the contents of <paramref name=\"source\"/> to the data already\n    ///   processed for the current hash computation.\n    /// </summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        _current = Update(_current, source);\n    }\n\n    /// <summary>\n    ///   Resets the hash computation to the initial state.\n    /// </summary>\n    public override void Reset()\n    {\n        _current = InitialState;\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   without modifying accumulated state.\n    /// </summary>\n    /// <param name=\"destination\">The buffer that receives the computed hash value.</param>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        _current = GetCurrentHashAsUInt32();\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, _current);\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   then clears the accumulated state.\n    /// </summary>\n    protected override void GetHashAndResetCore(Span<byte> destination)\n    {\n        _current = GetCurrentHashAsUInt32();\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, _current);\n        _current = InitialState;\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public uint GetCurrentHashAsUInt32()\n    {\n        return Finalization(_current);\n    }\n\n    /// <summary>Computes the FNV1 hash of the provided data.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <returns>The computed FNV1 hash.</returns>\n    public static uint HashToUInt32(ReadOnlySpan<byte> source) =>\n        Finalization(Update(InitialState, source));\n\n    private static uint Update(uint current, ReadOnlySpan<byte> source)\n    {\n        for (int i = 0; i < source.Length; i++)\n        {\n            current ^= source[i];\n            current *= Prime;\n        }\n\n        return current;\n    }\n\n    private static uint Finalization(uint current)\n    {\n        current += current << 13;\n        current ^= current >> 7;\n        current += current << 3;\n        current ^= current >> 17;\n        current += current << 5;\n\n        return current;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Murmur128BitsX64.State.cs",
    "content": "using System;\nusing System.Buffers.Binary;\nusing System.Runtime.CompilerServices;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal partial class Murmur128BitsX64\n{\n    private struct State\n    {\n        private const ulong C1 = 0x87c37b91114253d5UL;\n        private const ulong C2 = 0x4cf5ad432745937fUL;\n\n        private ulong _hash1;\n        private ulong _hash2;\n\n        internal State(uint seed)\n        {\n            _hash1 = _hash2 = seed;\n        }\n\n        internal unsafe void ProcessBlock(ReadOnlySpan<byte> source)\n        {\n            source = source.Slice(0, BlockSize);\n\n            ulong k1 = BinaryPrimitives.ReadUInt64LittleEndian(source);\n            ulong k2 = BinaryPrimitives.ReadUInt64LittleEndian(source.Slice(sizeof(ulong)));\n\n            // a variant of original algorithm optimized for processor instruction pipelining\n\n            k1 *= C1; k1 = BinaryHelper.RotateLeft(k1, 31); k1 *= C2; _hash1 ^= k1;\n\n            _hash1 = BinaryHelper.RotateLeft(_hash1, 27); _hash1 += _hash2; _hash1 = _hash1 * 5 + 0x52dce729;\n\n            k2 *= C2; k2 = BinaryHelper.RotateLeft(k2, 33); k2 *= C1; _hash2 ^= k2;\n\n            _hash2 = BinaryHelper.RotateLeft(_hash2, 31); _hash2 += _hash1; _hash2 = _hash2 * 5 + 0x38495ab5;\n        }\n\n        internal readonly ulong[] Tail(int length, ReadOnlySpan<byte> remaining)\n        {\n            ulong hash1 = _hash1;\n            ulong hash2 = _hash2;\n\n            ulong k1 = 0, k2 = 0;\n\n            // determine how many bytes we have left to work with based on length\n            switch (length & 15)\n            {\n                case 15: k2 ^= (ulong)remaining[14] << 48; goto case 14;\n                case 14: k2 ^= (ulong)remaining[13] << 40; goto case 13;\n                case 13: k2 ^= (ulong)remaining[12] << 32; goto case 12;\n                case 12: k2 ^= (ulong)remaining[11] << 24; goto case 11;\n                case 11: k2 ^= (ulong)remaining[10] << 16; goto case 10;\n                case 10: k2 ^= (ulong)remaining[9] << 8; goto case 9;\n                case 9: k2 ^= (ulong)remaining[8] << 0; goto case 8;\n                case 8: k1 ^= (ulong)remaining[7] << 56; goto case 7;\n                case 7: k1 ^= (ulong)remaining[6] << 48; goto case 6;\n                case 6: k1 ^= (ulong)remaining[5] << 40; goto case 5;\n                case 5: k1 ^= (ulong)remaining[4] << 32; goto case 4;\n                case 4: k1 ^= (ulong)remaining[3] << 24; goto case 3;\n                case 3: k1 ^= (ulong)remaining[2] << 16; goto case 2;\n                case 2: k1 ^= (ulong)remaining[1] << 8; goto case 1;\n                case 1: k1 ^= (ulong)remaining[0] << 0; break;\n            }\n\n            hash2 ^= BinaryHelper.RotateLeft(k2 * C2, 33) * C1;\n            hash1 ^= BinaryHelper.RotateLeft(k1 * C1, 31) * C2;\n\n            return Finalization(length, hash1, hash2);\n        }\n\n        private static ulong[] Finalization(int length, ulong hash1, ulong hash2)\n        {\n            var H1 = hash1;\n            var H2 = hash2;\n\n            ulong len = (ulong)length;\n            H1 ^= len;\n            H2 ^= len;\n\n            H1 += H2;\n            H2 += H1;\n\n            H1 = FMix(H1);\n            H2 = FMix(H2);\n\n            H1 += H2;\n            H2 += H1;\n\n            return new[] { H1, H2 };\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        internal static ulong FMix(ulong h)\n        {\n            h = (h ^ (h >> 33)) * 0xff51afd7ed558ccd;\n            h = (h ^ (h >> 33)) * 0xc4ceb9fe1a85ec53;\n            return (h ^ (h >> 33));\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Murmur128BitsX64.cs",
    "content": "using System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///  Provides an implementation of the MurmurHash 128 bits x64 algorithm.\n///  https://en.wikipedia.org/wiki/MurmurHash\n/// </summary>\ninternal partial class Murmur128BitsX64 : NonCryptoHashAlgorithm\n{\n    private const int HashSize = sizeof(ulong) * 2;\n    private const int BlockSize = sizeof(ulong) * 2;\n\n    private readonly uint _seed;\n    private State _state;\n    private byte[]? _holdback;\n    private int _length;\n\n    public Murmur128BitsX64() : base(HashSize)\n    {\n    }\n\n    public Murmur128BitsX64(uint seed)\n       : base(HashSize)\n    {\n        _seed = seed;\n        Reset();\n    }\n\n    public override void Reset()\n    {\n        _state = new State(_seed);\n        _length = 0;\n    }\n\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        int held = _length & 0x0F;\n\n        if (held != 0)\n        {\n            int remain = BlockSize - held;\n\n            if (source.Length >= remain)\n            {\n                source.Slice(0, remain).CopyTo(_holdback.AsSpan(held));\n                _state.ProcessBlock(_holdback);\n\n                source = source.Slice(remain);\n                _length += remain;\n            }\n            else\n            {\n                source.CopyTo(_holdback.AsSpan(held));\n                _length += source.Length;\n                return;\n            }\n        }\n\n        while (source.Length >= BlockSize)\n        {\n            _state.ProcessBlock(source);\n            source = source.Slice(BlockSize);\n            _length += BlockSize;\n        }\n\n        if (source.Length > 0)\n        {\n            _holdback ??= new byte[BlockSize];\n            source.CopyTo(_holdback);\n            _length += source.Length;\n        }\n    }\n\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        ulong[] hash = GetCurrentHashAsUInt128Array();\n        Fill(destination, ref hash);\n    }\n\n#if NET7_0_OR_GREATER\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public UInt128 GetCurrentHashAsUInt128()\n    {\n        ulong[] current = GetCurrentHashAsUInt128Array();\n        return new UInt128(current[1], current[2]);\n    }\n#endif\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public ulong[] GetCurrentHashAsUInt128Array()\n    {\n        int remainingLength = _length & 0x0F;\n        ReadOnlySpan<byte> remaining = ReadOnlySpan<byte>.Empty;\n\n        if (remainingLength > 0)\n        {\n            remaining = new ReadOnlySpan<byte>(_holdback, 0, remainingLength);\n        }\n\n        return _state.Tail(_length, remaining);\n    }\n\n    public static ulong[] HashToUInt128Array(ReadOnlySpan<byte> source, uint seed = 0)\n    {\n        int totalLength = source.Length;\n\n        State state = new(seed);\n\n        while (source.Length >= BlockSize)\n        {\n            state.ProcessBlock(source);\n            source = source.Slice(BlockSize);\n        }\n\n        return state.Tail(totalLength, source);\n    }\n\n    private static void Fill(Span<byte> destination, ref ulong[] hash)\n    {\n        BinaryPrimitives.WriteUInt64LittleEndian(destination, hash[0]);\n        BinaryPrimitives.WriteUInt64LittleEndian(destination.Slice(sizeof(ulong)), hash[1]);\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Murmur128BitsX86.State.cs",
    "content": "using System;\nusing System.Buffers.Binary;\nusing System.Runtime.CompilerServices;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal partial class Murmur128BitsX86\n{\n    private struct State\n    {\n        private const uint C1 = 0x239b961b;\n        private const uint C2 = 0xab0e9789;\n        private const uint C3 = 0x38b34ae5;\n        private const uint C4 = 0xa1e38b93;\n\n        private uint _hash1;\n        private uint _hash2;\n        private uint _hash3;\n        private uint _hash4;\n\n        internal State(uint seed)\n        {\n            _hash1 = _hash2 = _hash3 = _hash4 = seed;\n        }\n\n        internal unsafe void ProcessBlock(ReadOnlySpan<byte> source)\n        {\n            source = source.Slice(0, BlockSize);\n\n            uint k1 = BinaryPrimitives.ReadUInt32LittleEndian(source);\n            uint k2 = BinaryPrimitives.ReadUInt32LittleEndian(source.Slice(sizeof(uint)));\n            uint k3 = BinaryPrimitives.ReadUInt32LittleEndian(source.Slice(sizeof(uint) * 2));\n            uint k4 = BinaryPrimitives.ReadUInt32LittleEndian(source.Slice(sizeof(uint) * 3));\n\n            k1 *= C1; k1 = BinaryHelper.RotateLeft(k1, 15); k1 *= C2; _hash1 ^= k1;\n\n            _hash1 = BinaryHelper.RotateLeft(_hash1, 19); _hash1 += _hash2; _hash1 = _hash1 * 5 + 0x561ccd1b;\n\n            k2 *= C2; k2 = BinaryHelper.RotateLeft(k2, 16); k2 *= C3; _hash2 ^= k2;\n\n            _hash2 = BinaryHelper.RotateLeft(_hash2, 17); _hash2 += _hash3; _hash2 = _hash2 * 5 + 0x0bcaa747;\n\n            k3 *= C3; k3 = BinaryHelper.RotateLeft(k3, 17); k3 *= C4; _hash3 ^= k3;\n\n            _hash3 = BinaryHelper.RotateLeft(_hash3, 15); _hash3 += _hash4; _hash3 = _hash3 * 5 + 0x96cd1c35;\n\n            k4 *= C4; k4 = BinaryHelper.RotateLeft(k4, 18); k4 *= C1; _hash4 ^= k4;\n\n            _hash4 = BinaryHelper.RotateLeft(_hash4, 13); _hash4 += _hash1; _hash4 = _hash4 * 5 + 0x32ac3b17;\n        }\n\n        internal readonly uint[] Tail(int length, ReadOnlySpan<byte> remaining)\n        {\n            uint h1 = _hash1;\n            uint h2 = _hash2;\n            uint h3 = _hash3;\n            uint h4 = _hash4;\n\n            uint k1 = 0;\n            uint k2 = 0;\n            uint k3 = 0;\n            uint k4 = 0;\n\n            // determine how many bytes we have left to work with based on length\n            switch (length & 15)\n            {\n                case 15: k4 ^= (uint)remaining[14] << 16; goto case 14;\n                case 14: k4 ^= (uint)remaining[13] << 8; goto case 13;\n                case 13: k4 ^= (uint)remaining[12] << 0; goto case 12;\n                case 12: k3 ^= (uint)remaining[11] << 24; goto case 11;\n                case 11: k3 ^= (uint)remaining[10] << 16; goto case 10;\n                case 10: k3 ^= (uint)remaining[9] << 8; goto case 9;\n                case 9: k3 ^= (uint)remaining[8] << 0; goto case 8;\n                case 8: k2 ^= (uint)remaining[7] << 24; goto case 7;\n                case 7: k2 ^= (uint)remaining[6] << 16; goto case 6;\n                case 6: k2 ^= (uint)remaining[5] << 8; goto case 5;\n                case 5: k2 ^= (uint)remaining[4] << 0; goto case 4;\n                case 4: k1 ^= (uint)remaining[3] << 24; goto case 3;\n                case 3: k1 ^= (uint)remaining[2] << 16; goto case 2;\n                case 2: k1 ^= (uint)remaining[1] << 8; goto case 1;\n                case 1: k1 ^= (uint)remaining[0] << 0; break;\n            }\n\n            h4 ^= BinaryHelper.RotateLeft(k4 * C4, 18) * C1;\n            h3 ^= BinaryHelper.RotateLeft(k3 * C3, 17) * C4;\n            h2 ^= BinaryHelper.RotateLeft(k2 * C2, 16) * C3;\n            h1 ^= BinaryHelper.RotateLeft(k1 * C1, 15) * C2;\n\n            return Finalization(length, h1, h2, h3, h4);\n        }\n\n        private static uint[] Finalization(int length, uint h1, uint h2, uint h3, uint h4)\n        {\n            uint len = (uint)length;\n            // pipelining friendly algorithm\n            h1 ^= len; h2 ^= len; h3 ^= len; h4 ^= len;\n\n            h1 += (h2 + h3 + h4);\n            h2 += h1; h3 += h1; h4 += h1;\n\n            h1 = FMix(h1);\n            h2 = FMix(h2);\n            h3 = FMix(h3);\n            h4 = FMix(h4);\n\n            h1 += (h2 + h3 + h4);\n            h2 += h1; h3 += h1; h4 += h1;\n\n            return new[] { h1, h2, h3, h4 };\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        internal static uint FMix(uint h)\n        {\n            h = (h ^ (h >> 16)) * 0x85ebca6b;\n            h = (h ^ (h >> 13)) * 0xc2b2ae35;\n            return h ^ (h >> 16);\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Murmur128BitsX86.cs",
    "content": "using System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///  Provides an implementation of the MurmurHash 128 bits x86 algorithm.\n///  https://en.wikipedia.org/wiki/MurmurHash\n/// </summary>\ninternal partial class Murmur128BitsX86 : NonCryptoHashAlgorithm\n{\n    private const int HashSize = sizeof(uint) * 4;\n    private const int BlockSize = sizeof(uint) * 4;\n\n    private readonly uint _seed;\n    private State _state;\n    private byte[]? _holdback;\n    private int _length;\n\n    public Murmur128BitsX86() : base(HashSize)\n    {\n    }\n\n    public Murmur128BitsX86(uint seed)\n       : base(HashSize)\n    {\n        _seed = seed;\n        Reset();\n    }\n\n    public override void Reset()\n    {\n        _state = new State(_seed);\n        _length = 0;\n    }\n\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        int held = _length & 0x0F;\n\n        if (held != 0)\n        {\n            int remain = BlockSize - held;\n\n            if (source.Length >= remain)\n            {\n                source.Slice(0, remain).CopyTo(_holdback.AsSpan(held));\n                _state.ProcessBlock(_holdback);\n\n                source = source.Slice(remain);\n                _length += remain;\n            }\n            else\n            {\n                source.CopyTo(_holdback.AsSpan(held));\n                _length += source.Length;\n                return;\n            }\n        }\n\n        while (source.Length >= BlockSize)\n        {\n            _state.ProcessBlock(source);\n            source = source.Slice(BlockSize);\n            _length += BlockSize;\n        }\n\n        if (source.Length > 0)\n        {\n            _holdback ??= new byte[BlockSize];\n            source.CopyTo(_holdback);\n            _length += source.Length;\n        }\n    }\n\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        uint[] hash = GetCurrentHashAsUInt128Array();\n        Fill(destination, ref hash);\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public uint[] GetCurrentHashAsUInt128Array()\n    {\n        int remainingLength = _length & 0x0F;\n        ReadOnlySpan<byte> remaining = ReadOnlySpan<byte>.Empty;\n\n        if (remainingLength > 0)\n        {\n            remaining = new ReadOnlySpan<byte>(_holdback, 0, remainingLength);\n        }\n\n        return _state.Tail(_length, remaining);\n    }\n\n    public static uint[] HashToUInt128Array(ReadOnlySpan<byte> source, uint seed = 0)\n    {\n        int totalLength = source.Length;\n\n        State state = new(seed);\n\n        while (source.Length >= BlockSize)\n        {\n            state.ProcessBlock(source);\n            source = source.Slice(BlockSize);\n        }\n\n        return state.Tail(totalLength, source);\n    }\n\n    private static void Fill(Span<byte> destination, ref uint[] hash)\n    {\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, hash[0]);\n        BinaryPrimitives.WriteUInt32LittleEndian(destination.Slice(sizeof(uint)), hash[1]);\n        BinaryPrimitives.WriteUInt32LittleEndian(destination.Slice(sizeof(uint) * 2), hash[2]);\n        BinaryPrimitives.WriteUInt32LittleEndian(destination.Slice(sizeof(uint) * 3), hash[3]);\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Murmur32BitsX86.State.cs",
    "content": "using System;\nusing System.Buffers.Binary;\nusing System.Runtime.CompilerServices;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal partial class Murmur32BitsX86\n{\n    private struct State\n    {\n        /// <summary>\n        /// First hash multiplication constant.\n        /// </summary>\n        private const uint C1 = 0xCC9E2D51U;\n\n        /// <summary>\n        /// Second hash multiplication constant.\n        /// </summary>\n        private const uint C2 = 0x1B873593U;\n\n        /// <summary>\n        /// The hash value.\n        /// </summary>\n        private uint _hash;\n\n        internal State(uint seed)\n        {\n            _hash = seed;\n        }\n\n        internal unsafe void ProcessBlock(ReadOnlySpan<byte> source)\n        {\n            source = source.Slice(0, BlockSize);\n\n            _hash ^= C2 * BinaryHelper.RotateLeft(C1 * BinaryPrimitives.ReadUInt32LittleEndian(source), 15);\n            _hash = (5 * BinaryHelper.RotateLeft(_hash, 13)) + 0xE6546B64;\n        }\n\n        internal readonly uint Tail(int length, ReadOnlySpan<byte> remaining)\n        {\n            uint k1 = 0x00000000U;\n            var position = 0;\n\n            uint hash = _hash;\n\n            switch (length & 3)\n            {\n                case 3:\n                    k1 ^= (uint)remaining[position + 2] << 16;\n                    k1 ^= (uint)remaining[position + 1] << 8;\n                    k1 ^= remaining[position];\n                    hash ^= C2 * BinaryHelper.RotateLeft(C1 * k1, 15);\n                    break;\n\n                case 2:\n                    k1 ^= (uint)remaining[position + 1] << 8;\n                    k1 ^= remaining[position];\n                    hash ^= C2 * BinaryHelper.RotateLeft(C1 * k1, 15);\n                    break;\n\n                case 1:\n                    k1 ^= remaining[position];\n                    hash ^= C2 * BinaryHelper.RotateLeft(C1 * k1, 15);\n                    break;\n            }\n\n            return Finalization(hash ^ (uint)length);\n        }\n\n        /// <summary>\n        /// Finalization mix - force all bits of a hash block to avalanche.\n        /// </summary>\n        /// <param name=\"k\">The value to mix.</param>\n        /// <returns>The mixed value.</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        private static uint Finalization(in uint k)\n        {\n            uint k1 = 0x85EBCA6BU * (k ^ (k >> 16));\n            uint k2 = 0xC2B2AE35U * (k1 ^ (k1 >> 13));\n\n            return k2 ^ (k2 >> 16);\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/Murmur32BitsX86.cs",
    "content": "using System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///  Provides an implementation of the MurmurHash 32 bits x86 algorithm.\n///  https://en.wikipedia.org/wiki/MurmurHash\n/// </summary>\ninternal partial class Murmur32BitsX86 : NonCryptoHashAlgorithm\n{\n    private const int HashSize = sizeof(uint);\n    private const int BlockSize = sizeof(uint);\n\n    private readonly uint _seed;\n    private State _state;\n    private byte[]? _holdback;\n    private int _length;\n\n    public Murmur32BitsX86() : base(HashSize)\n    {\n    }\n\n    public Murmur32BitsX86(uint seed)\n       : base(HashSize)\n    {\n        _seed = seed;\n        Reset();\n    }\n\n    public override void Reset()\n    {\n        _state = new State(_seed);\n        _length = 0;\n    }\n\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        int held = _length & 0x03;\n\n        if (held != 0)\n        {\n            int remain = BlockSize - held;\n\n            if (source.Length >= remain)\n            {\n                source.Slice(0, remain).CopyTo(_holdback.AsSpan(held));\n                _state.ProcessBlock(_holdback);\n\n                source = source.Slice(remain);\n                _length += remain;\n            }\n            else\n            {\n                source.CopyTo(_holdback.AsSpan(held));\n                _length += source.Length;\n                return;\n            }\n        }\n\n        while (source.Length >= BlockSize)\n        {\n            _state.ProcessBlock(source);\n            source = source.Slice(BlockSize);\n            _length += BlockSize;\n        }\n\n        if (source.Length > 0)\n        {\n            _holdback ??= new byte[BlockSize];\n            source.CopyTo(_holdback);\n            _length += source.Length;\n        }\n    }\n\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        uint hash = GetCurrentHashAsUInt32();\n        BinaryPrimitives.WriteUInt32LittleEndian(destination, hash);\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public uint GetCurrentHashAsUInt32()\n    {\n        int remainingLength = _length & 0x03;\n        ReadOnlySpan<byte> remaining = ReadOnlySpan<byte>.Empty;\n\n        if (remainingLength > 0)\n        {\n            remaining = new ReadOnlySpan<byte>(_holdback, 0, remainingLength);\n        }\n\n        return _state.Tail(_length, remaining);\n    }\n\n    public static uint HashToUInt32(ReadOnlySpan<byte> source, uint seed = 0)\n    {\n        int totalLength = source.Length;\n        State state = new(seed);\n\n        while (source.Length >= BlockSize)\n        {\n            state.ProcessBlock(source);\n            source = source.Slice(BlockSize);\n        }\n\n        return state.Tail(totalLength, source);\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/NonCryptoHashAlgorithm.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n/// 表示非加密散列算法。\n/// </summary>\ninternal abstract class NonCryptoHashAlgorithm\n{\n    /// <summary>\n    ///   获取由此散列算法产生的字节数。\n    /// </summary>\n    /// <value>这个散列算法产生的字节数。</value>\n    public int HashLengthInBytes { get; }\n\n    protected NonCryptoHashAlgorithm(int hashLengthInBytes)\n    {\n        if (hashLengthInBytes < 1)\n            throw new ArgumentOutOfRangeException(nameof(hashLengthInBytes));\n\n        HashLengthInBytes = hashLengthInBytes;\n    }\n\n    public abstract void Append(ReadOnlySpan<byte> source);\n\n    public abstract void Reset();\n\n    protected abstract void GetCurrentHashCore(Span<byte> destination);\n\n    public void Append(byte[] source)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(source);\n#else\n        if (source is null)\n        {\n            throw new ArgumentNullException(nameof(source));\n        }\n#endif\n\n        Append(new ReadOnlySpan<byte>(source));\n    }\n\n    protected virtual void GetHashAndResetCore(Span<byte> destination)\n    {\n        Debug.Assert(destination.Length == HashLengthInBytes);\n\n        GetCurrentHashCore(destination);\n        Reset();\n    }\n\n#if NET6_0_OR_GREATER\n    [DoesNotReturn]\n#endif\n\n    protected static void ThrowDestinationTooShort() =>\n          throw new ArgumentException(\"Destination is too short.\", \"destination\");\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/ThrowHelper.cs",
    "content": "using System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal static partial class ThrowHelper\n{\n#if NET7_0_OR_GREATER\n    [DoesNotReturn]\n\n    internal static void ThrowUnreachableException() => throw new UnreachableException();\n#endif\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/VectorHelper.cs",
    "content": "﻿#if NET7_0_OR_GREATER\n\nusing System.Diagnostics.CodeAnalysis;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.Intrinsics.Arm;\nusing System.Runtime.Intrinsics.X86;\nusing System.Runtime.Intrinsics;\nusing Aes = System.Runtime.Intrinsics.Arm.Aes;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n// Helpers which provide equivalent intrinsics for Intel and ARM architectures. Should only be used\n// if the intrinsics are available.\ninternal static class VectorHelper\n{\n    // Pclmulqdq implies support for SSE2\n    public static bool IsSupported => Pclmulqdq.IsSupported || (Aes.IsSupported && AdvSimd.IsSupported);\n\n    // Performs carryless multiplication of the upper pairs of source and constants and the lower pairs of source and constants,\n    // then folds them into target using carryless addition.\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Vector128<ulong> FoldPolynomialPair(Vector128<ulong> target, Vector128<ulong> source, Vector128<ulong> constants)\n    {\n        target ^= CarrylessMultiplyUpper(source, constants);\n        target ^= CarrylessMultiplyLower(source, constants);\n\n        return target;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Vector128<ulong> CarrylessMultiplyLower(Vector128<ulong> left, Vector128<ulong> right)\n    {\n        if (Pclmulqdq.IsSupported)\n        {\n            return Pclmulqdq.CarrylessMultiply(left, right, 0x00);\n        }\n\n        if (Aes.IsSupported)\n        {\n            return Aes.PolynomialMultiplyWideningLower(left.GetLower(), right.GetLower());\n        }\n\n        ThrowHelper.ThrowUnreachableException();\n        return default;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Vector128<ulong> CarrylessMultiplyUpper(Vector128<ulong> left, Vector128<ulong> right)\n    {\n        if (Pclmulqdq.IsSupported)\n        {\n            return Pclmulqdq.CarrylessMultiply(left, right, 0x11);\n        }\n\n        if (Aes.IsSupported)\n        {\n            return Aes.PolynomialMultiplyWideningUpper(left, right);\n        }\n\n        ThrowHelper.ThrowUnreachableException();\n        return default;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Vector128<ulong> CarrylessMultiplyLeftUpperRightLower(Vector128<ulong> left, Vector128<ulong> right)\n    {\n        if (Pclmulqdq.IsSupported)\n        {\n            return Pclmulqdq.CarrylessMultiply(left, right, 0x01);\n        }\n\n        if (Aes.IsSupported)\n        {\n            return Aes.PolynomialMultiplyWideningLower(left.GetUpper(), right.GetLower());\n        }\n\n        ThrowHelper.ThrowUnreachableException();\n        return default;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Vector128<ulong> CarrylessMultiplyLeftLowerRightUpper(Vector128<ulong> left, Vector128<ulong> right)\n    {\n        if (Pclmulqdq.IsSupported)\n        {\n            return Pclmulqdq.CarrylessMultiply(left, right, 0x10);\n        }\n\n        if (Aes.IsSupported)\n        {\n            return Aes.PolynomialMultiplyWideningLower(left.GetLower(), right.GetUpper());\n        }\n\n        ThrowHelper.ThrowUnreachableException();\n        return default;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Vector128<ulong> ShiftRightBytesInVector(Vector128<ulong> operand,\n        [ConstantExpected(Max = (byte)15)] byte numBytesToShift)\n    {\n        if (Sse2.IsSupported)\n        {\n            return Sse2.ShiftRightLogical128BitLane(operand, numBytesToShift);\n        }\n\n        if (AdvSimd.IsSupported)\n        {\n            return AdvSimd.ExtractVector128(operand.AsByte(), Vector128<byte>.Zero, numBytesToShift).AsUInt64();\n        }\n\n        ThrowHelper.ThrowUnreachableException();\n        return default;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Vector128<ulong> ShiftLowerToUpper(Vector128<ulong> operand)\n    {\n        if (Sse2.IsSupported)\n        {\n            return Sse2.ShiftLeftLogical128BitLane(operand, 8);\n        }\n\n        if (AdvSimd.IsSupported)\n        {\n            return AdvSimd.ExtractVector128(Vector128<byte>.Zero, operand.AsByte(), 8).AsUInt64();\n        }\n\n        ThrowHelper.ThrowUnreachableException();\n        return default;\n    }\n}\n#endif"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/XxHash128.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\n// Based on the XXH128 implementation from https://github.com/Cyan4973/xxHash.\n\nusing System;\nusing System.Buffers.Binary;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing static BloomFilter.HashAlgorithms.Internal.XxHashShared;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>Provides an implementation of the XXH128 hash algorithm for generating a 128-bit hash.</summary>\n/// <remarks>\n/// For methods that persist the computed numerical hash value as bytes,\n/// the value is written in the Big Endian byte order.\n/// </remarks>\ninternal sealed unsafe class XxHash128 : NonCryptoHashAlgorithm\n{\n    /// <summary>XXH128 produces 16-byte hashes.</summary>\n    private new const int HashLengthInBytes = 16;\n\n    private State _state;\n\n    /// <summary>Initializes a new instance of the <see cref=\"XxHash128\"/> class using the default seed value 0.</summary>\n    public XxHash128() : this(0)\n    {\n    }\n\n    /// <summary>Initializes a new instance of the <see cref=\"XxHash128\"/> class using the specified seed.</summary>\n    public XxHash128(ulong seed) : base(HashLengthInBytes)\n    {\n        Initialize(ref _state, seed);\n    }\n\n    /// <summary>Computes the XXH128 hash of the provided <paramref name=\"source\"/> data using the optionally provided <paramref name=\"seed\"/>.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <param name=\"seed\">The seed value for this hash computation. The default is zero.</param>\n    /// <returns>The XXH128 128-bit hash code of the provided data.</returns>\n    public static byte[] Hash(ReadOnlySpan<byte> source, ulong seed = 0)\n    {\n        byte[] result = new byte[HashLengthInBytes];\n        Hash(source, result, seed);\n        return result;\n    }\n\n    /// <summary>Computes the XXH128 hash of the provided <paramref name=\"source\"/> data into the provided <paramref name=\"destination\"/> using the optionally provided <paramref name=\"seed\"/>.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <param name=\"destination\">The buffer that receives the computed 128-bit hash code.</param>\n    /// <param name=\"seed\">The seed value for this hash computation. The default is zero.</param>\n    /// <returns>The number of bytes written to <paramref name=\"destination\"/>.</returns>\n    /// <exception cref=\"ArgumentException\"><paramref name=\"destination\"/> is shorter than <see cref=\"HashLengthInBytes\"/> (8 bytes).</exception>\n    public static int Hash(ReadOnlySpan<byte> source, Span<byte> destination, ulong seed = 0)\n    {\n        if (!TryHash(source, destination, out int bytesWritten, seed))\n        {\n            ThrowDestinationTooShort();\n        }\n\n        return bytesWritten;\n    }\n\n    /// <summary>Attempts to compute the XXH128 hash of the provided <paramref name=\"source\"/> data into the provided <paramref name=\"destination\"/> using the optionally provided <paramref name=\"seed\"/>.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <param name=\"destination\">The buffer that receives the computed 128-bit hash code.</param>\n    /// <param name=\"bytesWritten\">When this method returns, contains the number of bytes written to <paramref name=\"destination\"/>.</param>\n    /// <param name=\"seed\">The seed value for this hash computation. The default is zero.</param>\n    /// <returns><see langword=\"true\"/> if <paramref name=\"destination\"/> is long enough to receive the computed hash value (8 bytes); otherwise, <see langword=\"false\"/>.</returns>\n    public static bool TryHash(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten, ulong seed = 0)\n    {\n        if (destination.Length >= sizeof(ulong) * 2)\n        {\n            Hash128 hash = HashToHash128(source, seed);\n            WriteBigEndian128(hash, destination);\n            bytesWritten = HashLengthInBytes;\n            return true;\n        }\n\n        bytesWritten = 0;\n        return false;\n    }\n\n    internal static Hash128 HashToHash128(ReadOnlySpan<byte> source, ulong seed = 0)\n    {\n        uint length = (uint)source.Length;\n        fixed (byte* sourcePtr = &MemoryMarshal.GetReference(source))\n        {\n            if (length <= 16)\n            {\n                return HashLength0To16(sourcePtr, length, seed);\n            }\n\n            if (length <= 128)\n            {\n                return HashLength17To128(sourcePtr, length, seed);\n            }\n\n            if (length <= MidSizeMaxBytes)\n            {\n                return HashLength129To240(sourcePtr, length, seed);\n            }\n\n            return HashLengthOver240(sourcePtr, length, seed);\n        }\n    }\n\n    /// <summary>Resets the hash computation to the initial state.</summary>\n    public override void Reset()\n    {\n        XxHashShared.Reset(ref _state);\n    }\n\n    /// <summary>Appends the contents of <paramref name=\"source\"/> to the data already processed for the current hash computation.</summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        XxHashShared.Append(ref _state, source);\n    }\n\n    /// <summary>Writes the computed 128-bit hash value to <paramref name=\"destination\"/> without modifying accumulated state.</summary>\n    /// <param name=\"destination\">The buffer that receives the computed hash value.</param>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        Hash128 current = GetCurrentHashAsHash128();\n        WriteBigEndian128(current, destination);\n    }\n\n    internal Hash128 GetCurrentHashAsHash128()\n    {\n        Hash128 current;\n\n        if (_state.TotalLength > MidSizeMaxBytes)\n        {\n            // Digest on a local copy to ensure the accumulators remain unaltered.\n            ulong* accumulators = stackalloc ulong[AccumulatorCount];\n            CopyAccumulators(ref _state, accumulators);\n\n            fixed (byte* secret = _state.Secret)\n            {\n                DigestLong(ref _state, accumulators, secret);\n                current = new Hash128(\n                    low64: MergeAccumulators(accumulators, secret + SecretMergeAccsStartBytes, _state.TotalLength * Prime64_1),\n                    high64: MergeAccumulators(accumulators, secret + SecretLengthBytes - AccumulatorCount * sizeof(ulong) - SecretMergeAccsStartBytes, ~(_state.TotalLength * Prime64_2)));\n            }\n        }\n        else\n        {\n            fixed (byte* buffer = _state.Buffer)\n            {\n                current = HashToHash128(new ReadOnlySpan<byte>(buffer, (int)_state.TotalLength), _state.Seed);\n            }\n        }\n\n        return current;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static void WriteBigEndian128(in Hash128 hash, Span<byte> destination)\n    {\n        ulong low = hash.Low64;\n        ulong high = hash.High64;\n        if (BitConverter.IsLittleEndian)\n        {\n            low = BinaryPrimitives.ReverseEndianness(low);\n            high = BinaryPrimitives.ReverseEndianness(high);\n        }\n\n        ref byte dest0 = ref MemoryMarshal.GetReference(destination);\n        Unsafe.WriteUnaligned(ref dest0, high);\n        Unsafe.WriteUnaligned(ref Unsafe.AddByteOffset(ref dest0, new IntPtr(sizeof(ulong))), low);\n    }\n\n    private static Hash128 HashLength0To16(byte* source, uint length, ulong seed)\n    {\n        if (length > 8)\n        {\n            return HashLength9To16(source, length, seed);\n        }\n\n        if (length >= 4)\n        {\n            return HashLength4To8(source, length, seed);\n        }\n\n        if (length != 0)\n        {\n            return HashLength1To3(source, length, seed);\n        }\n\n        const ulong BitFlipL = DefaultSecretUInt64_8 ^ DefaultSecretUInt64_9;\n        const ulong BitFlipH = DefaultSecretUInt64_10 ^ DefaultSecretUInt64_11;\n        return new Hash128(XxHash64.Avalanche(seed ^ BitFlipL), XxHash64.Avalanche(seed ^ BitFlipH));\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Hash128 HashLength1To3(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 1 && length <= 3);\n\n        // When source.Length == 1, c1 == source[0], c2 == source[0], c3 == source[0]\n        // When source.Length == 2, c1 == source[0], c2 == source[1], c3 == source[1]\n        // When source.Length == 3, c1 == source[0], c2 == source[1], c3 == source[2]\n        byte c1 = *source;\n        byte c2 = source[length >> 1];\n        byte c3 = source[length - 1];\n\n        uint combinedl = ((uint)c1 << 16) | ((uint)c2 << 24) | c3 | (length << 8);\n\n        uint combinedh = BinaryHelper.RotateLeft(BinaryPrimitives.ReverseEndianness(combinedl), 13);\n        const uint SecretXorL = (unchecked((uint)DefaultSecretUInt64_0) ^ (uint)(DefaultSecretUInt64_0 >> 32));\n        const uint SecretXorH = (unchecked((uint)DefaultSecretUInt64_1) ^ (uint)(DefaultSecretUInt64_1 >> 32));\n        ulong bitflipl = SecretXorL + seed;\n        ulong bitfliph = SecretXorH - seed;\n        ulong keyedLo = combinedl ^ bitflipl;\n        ulong keyedHi = combinedh ^ bitfliph;\n\n        return new Hash128(XxHash64.Avalanche(keyedLo), XxHash64.Avalanche(keyedHi));\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Hash128 HashLength4To8(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 4 && length <= 8);\n\n        seed ^= (ulong)BinaryPrimitives.ReverseEndianness((uint)seed) << 32;\n\n        uint inputLo = ReadUInt32LE(source);\n        uint inputHi = ReadUInt32LE(source + length - 4);\n        ulong input64 = inputLo + ((ulong)inputHi << 32);\n        ulong bitflip = (DefaultSecretUInt64_2 ^ DefaultSecretUInt64_3) + seed;\n        ulong keyed = input64 ^ bitflip;\n\n        ulong m128High = Multiply64To128(keyed, Prime64_1 + (length << 2), out ulong m128Low);\n\n        m128High += (m128Low << 1);\n        m128Low ^= (m128High >> 3);\n\n        m128Low = XorShift(m128Low, 35);\n        m128Low *= 0x9FB21C651E98DF25UL;\n        m128Low = XorShift(m128Low, 28);\n        m128High = Avalanche(m128High);\n\n        return new Hash128(m128Low, m128High);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Hash128 HashLength9To16(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 9 && length <= 16);\n        ulong bitflipl = (DefaultSecretUInt64_4 ^ DefaultSecretUInt64_5) - seed;\n        ulong bitfliph = (DefaultSecretUInt64_6 ^ DefaultSecretUInt64_7) + seed;\n        ulong inputLo = ReadUInt64LE(source);\n        ulong inputHi = ReadUInt64LE(source + length - 8);\n        ulong m128High = Multiply64To128(inputLo ^ inputHi ^ bitflipl, Prime64_1, out ulong m128Low);\n\n        m128Low += (ulong)(length - 1) << 54;\n        inputHi ^= bitfliph;\n\n        m128High += sizeof(void*) < sizeof(ulong) ?\n            (inputHi & 0xFFFFFFFF00000000UL) + Multiply32To64((uint)inputHi, Prime32_2) :\n            inputHi + Multiply32To64((uint)inputHi, Prime32_2 - 1);\n\n        m128Low ^= BinaryPrimitives.ReverseEndianness(m128High);\n\n        ulong h128High = Multiply64To128(m128Low, Prime64_2, out ulong h128Low);\n        h128High += m128High * (ulong)Prime64_2;\n\n        h128Low = Avalanche(h128Low);\n        h128High = Avalanche(h128High);\n        return new Hash128(h128Low, h128High);\n    }\n\n    private static Hash128 HashLength17To128(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 17 && length <= 128);\n\n        ulong accLow = length * Prime64_1;\n        ulong accHigh = 0;\n\n        switch ((length - 1) / 32)\n        {\n            default: // case 3\n                Mix32Bytes(ref accLow, ref accHigh, source + 48, source + length - 64, DefaultSecretUInt64_12, DefaultSecretUInt64_13, DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed);\n                goto case 2;\n            case 2:\n                Mix32Bytes(ref accLow, ref accHigh, source + 32, source + length - 48, DefaultSecretUInt64_8, DefaultSecretUInt64_9, DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed);\n                goto case 1;\n            case 1:\n                Mix32Bytes(ref accLow, ref accHigh, source + 16, source + length - 32, DefaultSecretUInt64_4, DefaultSecretUInt64_5, DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed);\n                goto case 0;\n            case 0:\n                Mix32Bytes(ref accLow, ref accHigh, source, source + length - 16, DefaultSecretUInt64_0, DefaultSecretUInt64_1, DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed);\n                break;\n        }\n\n        return AvalancheHash(accLow, accHigh, length, seed);\n    }\n\n    private static Hash128 HashLength129To240(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 129 && length <= 240);\n\n        ulong accLow = length * Prime64_1;\n        ulong accHigh = 0;\n\n        Mix32Bytes(ref accLow, ref accHigh, source + (32 * 0), source + (32 * 0) + 16, DefaultSecretUInt64_0, DefaultSecretUInt64_1, DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed);\n        Mix32Bytes(ref accLow, ref accHigh, source + (32 * 1), source + (32 * 1) + 16, DefaultSecretUInt64_4, DefaultSecretUInt64_5, DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed);\n        Mix32Bytes(ref accLow, ref accHigh, source + (32 * 2), source + (32 * 2) + 16, DefaultSecretUInt64_8, DefaultSecretUInt64_9, DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed);\n        Mix32Bytes(ref accLow, ref accHigh, source + (32 * 3), source + (32 * 3) + 16, DefaultSecretUInt64_12, DefaultSecretUInt64_13, DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed);\n\n        accLow = Avalanche(accLow);\n        accHigh = Avalanche(accHigh);\n\n        uint bound = ((length - (32 * 4)) / 32);\n        if (bound != 0)\n        {\n            Mix32Bytes(ref accLow, ref accHigh, source + (32 * 4), source + (32 * 4) + 16, DefaultSecret3UInt64_0, DefaultSecret3UInt64_1, DefaultSecret3UInt64_2, DefaultSecret3UInt64_3, seed);\n            if (bound >= 2)\n            {\n                Mix32Bytes(ref accLow, ref accHigh, source + (32 * 5), source + (32 * 5) + 16, DefaultSecret3UInt64_4, DefaultSecret3UInt64_5, DefaultSecret3UInt64_6, DefaultSecret3UInt64_7, seed);\n                if (bound == 3)\n                {\n                    Mix32Bytes(ref accLow, ref accHigh, source + (32 * 6), source + (32 * 6) + 16, DefaultSecret3UInt64_8, DefaultSecret3UInt64_9, DefaultSecret3UInt64_10, DefaultSecret3UInt64_11, seed);\n                }\n            }\n        }\n        Mix32Bytes(ref accLow, ref accHigh, source + length - 16, source + length - 32, 0x4F0BC7C7BBDCF93F, 0x59B4CD4BE0518A1D, 0x7378D9C97E9FC831, 0xEBD33483ACC5EA64, 0 - seed);\n\n        return AvalancheHash(accLow, accHigh, length, seed);\n    }\n\n    private static Hash128 HashLengthOver240(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length > 240);\n\n        fixed (byte* defaultSecret = &MemoryMarshal.GetReference(DefaultSecret))\n        {\n            byte* secret = defaultSecret;\n            if (seed != 0)\n            {\n                byte* customSecret = stackalloc byte[SecretLengthBytes];\n                DeriveSecretFromSeed(customSecret, seed);\n                secret = customSecret;\n            }\n\n            ulong* accumulators = stackalloc ulong[AccumulatorCount];\n            InitializeAccumulators(accumulators);\n\n            HashInternalLoop(accumulators, source, length, secret);\n\n            return new Hash128(\n                low64: MergeAccumulators(accumulators, secret + SecretMergeAccsStartBytes, length * Prime64_1),\n                high64: MergeAccumulators(accumulators, secret + SecretLengthBytes - AccumulatorCount * sizeof(ulong) - SecretMergeAccsStartBytes, ~(length * Prime64_2)));\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Hash128 AvalancheHash(ulong accLow, ulong accHigh, uint length, ulong seed)\n    {\n        ulong h128Low = accLow + accHigh;\n        ulong h128High = (accLow * Prime64_1)\n                      + (accHigh * Prime64_4)\n                      + ((length - seed) * Prime64_2);\n        h128Low = Avalanche(h128Low);\n        h128High = 0ul - Avalanche(h128High);\n        return new Hash128(h128Low, h128High);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static void Mix32Bytes(ref ulong accLow, ref ulong accHigh, byte* input1, byte* input2, ulong secret1, ulong secret2, ulong secret3, ulong secret4, ulong seed)\n    {\n        accLow += Mix16Bytes(input1, secret1, secret2, seed);\n        accLow ^= ReadUInt64LE(input2) + ReadUInt64LE(input2 + 8);\n        accHigh += Mix16Bytes(input2, secret3, secret4, seed);\n        accHigh ^= ReadUInt64LE(input1) + ReadUInt64LE(input1 + 8);\n    }\n\n    [DebuggerDisplay(\"Low64: {\" + nameof(Low64) + \"}, High64: {\" + nameof(High64) + \"}\")]\n    internal readonly struct Hash128\n    {\n        public readonly ulong Low64;\n        public readonly ulong High64;\n\n        public Hash128(ulong low64, ulong high64)\n        {\n            Low64 = low64;\n            High64 = high64;\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/XxHash3.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\n// Based on the XXH3 implementation from https://github.com/Cyan4973/xxHash.\n\nusing System;\nusing System.Buffers.Binary;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing static BloomFilter.HashAlgorithms.Internal.XxHashShared;\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>Provides an implementation of the XXH3 hash algorithm for generating a 64-bit hash.</summary>\n/// <remarks>\n/// For methods that persist the computed numerical hash value as bytes,\n/// the value is written in the Big Endian byte order.\n/// </remarks>\ninternal sealed unsafe class XxHash3 : NonCryptoHashAlgorithm\n{\n    /// <summary>XXH3 produces 8-byte hashes.</summary>\n    private new const int HashLengthInBytes = 8;\n\n    private State _state;\n\n    /// <summary>Initializes a new instance of the <see cref=\"XxHash3\"/> class using the default seed value 0.</summary>\n    public XxHash3() : this(0)\n    {\n    }\n\n    /// <summary>Initializes a new instance of the <see cref=\"XxHash3\"/> class using the specified seed.</summary>\n    public XxHash3(ulong seed) : base(HashLengthInBytes)\n    {\n        Initialize(ref _state, seed);\n    }\n\n    /// <summary>Computes the XXH3 hash of the provided data.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <param name=\"seed\">The seed value for this hash computation.</param>\n    /// <returns>The computed XXH3 hash.</returns>\n    public static ulong HashToUInt64(ReadOnlySpan<byte> source, ulong seed = 0)\n    {\n        uint length = (uint)source.Length;\n        fixed (byte* sourcePtr = &MemoryMarshal.GetReference(source))\n        {\n            if (length <= 16)\n            {\n                return HashLength0To16(sourcePtr, length, seed);\n            }\n\n            if (length <= 128)\n            {\n                return HashLength17To128(sourcePtr, length, seed);\n            }\n\n            if (length <= MidSizeMaxBytes)\n            {\n                return HashLength129To240(sourcePtr, length, seed);\n            }\n\n            return HashLengthOver240(sourcePtr, length, seed);\n        }\n    }\n\n    /// <summary>Resets the hash computation to the initial state.</summary>\n    public override void Reset()\n    {\n        XxHashShared.Reset(ref _state);\n    }\n\n    /// <summary>Appends the contents of <paramref name=\"source\"/> to the data already processed for the current hash computation.</summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        XxHashShared.Append(ref _state, source);\n    }\n\n    /// <summary>Writes the computed 64-bit hash value to <paramref name=\"destination\"/> without modifying accumulated state.</summary>\n    /// <param name=\"destination\">The buffer that receives the computed hash value.</param>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        ulong hash = GetCurrentHashAsUInt64();\n        BinaryPrimitives.WriteUInt64BigEndian(destination, hash);\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public ulong GetCurrentHashAsUInt64()\n    {\n        ulong current;\n\n        if (_state.TotalLength > MidSizeMaxBytes)\n        {\n            // Digest on a local copy to ensure the accumulators remain unaltered.\n            ulong* accumulators = stackalloc ulong[AccumulatorCount];\n            CopyAccumulators(ref _state, accumulators);\n\n            fixed (byte* secret = _state.Secret)\n            {\n                DigestLong(ref _state, accumulators, secret);\n                current = MergeAccumulators(accumulators, secret + SecretMergeAccsStartBytes, _state.TotalLength * Prime64_1);\n            }\n        }\n        else\n        {\n            fixed (byte* buffer = _state.Buffer)\n            {\n                current = HashToUInt64(new ReadOnlySpan<byte>(buffer, (int)_state.TotalLength), _state.Seed);\n            }\n        }\n\n        return current;\n    }\n\n    private static ulong HashLength0To16(byte* source, uint length, ulong seed)\n    {\n        if (length > 8)\n        {\n            return HashLength9To16(source, length, seed);\n        }\n\n        if (length >= 4)\n        {\n            return HashLength4To8(source, length, seed);\n        }\n\n        if (length != 0)\n        {\n            return HashLength1To3(source, length, seed);\n        }\n\n        const ulong SecretXor = DefaultSecretUInt64_7 ^ DefaultSecretUInt64_8;\n        return XxHash64.Avalanche(seed ^ SecretXor);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static ulong HashLength1To3(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 1 && length <= 3);\n\n        // When source.Length == 1, c1 == source[0], c2 == source[0], c3 == source[0]\n        // When source.Length == 2, c1 == source[0], c2 == source[1], c3 == source[1]\n        // When source.Length == 3, c1 == source[0], c2 == source[1], c3 == source[2]\n        byte c1 = *source;\n        byte c2 = source[length >> 1];\n        byte c3 = source[length - 1];\n\n        uint combined = ((uint)c1 << 16) | ((uint)c2 << 24) | c3 | (length << 8);\n\n        const uint SecretXor = unchecked((uint)DefaultSecretUInt64_0) ^ (uint)(DefaultSecretUInt64_0 >> 32);\n        return XxHash64.Avalanche(combined ^ (SecretXor + seed));\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static ulong HashLength4To8(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 4 && length <= 8);\n\n        seed ^= (ulong)BinaryPrimitives.ReverseEndianness((uint)seed) << 32;\n\n        uint inputLow = ReadUInt32LE(source);\n        uint inputHigh = ReadUInt32LE(source + length - sizeof(uint));\n\n        const ulong SecretXor = DefaultSecretUInt64_1 ^ DefaultSecretUInt64_2;\n        ulong bitflip = SecretXor - seed;\n        ulong input64 = inputHigh + (((ulong)inputLow) << 32);\n\n        return Rrmxmx(input64 ^ bitflip, length);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static ulong HashLength9To16(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 9 && length <= 16);\n\n        const ulong SecretXorL = DefaultSecretUInt64_3 ^ DefaultSecretUInt64_4;\n        const ulong SecretXorR = DefaultSecretUInt64_5 ^ DefaultSecretUInt64_6;\n        ulong bitflipLow = SecretXorL + seed;\n        ulong bitflipHigh = SecretXorR - seed;\n\n        ulong inputLow = ReadUInt64LE(source) ^ bitflipLow;\n        ulong inputHigh = ReadUInt64LE(source + length - sizeof(ulong)) ^ bitflipHigh;\n\n        return Avalanche(\n            length +\n            BinaryPrimitives.ReverseEndianness(inputLow) +\n            inputHigh +\n            Multiply64To128ThenFold(inputLow, inputHigh));\n    }\n\n    private static ulong HashLength17To128(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 17 && length <= 128);\n\n        ulong hash = length * Prime64_1;\n\n        switch ((length - 1) / 32)\n        {\n            default: // case 3\n                hash += Mix16Bytes(source + 48, DefaultSecretUInt64_12, DefaultSecretUInt64_13, seed);\n                hash += Mix16Bytes(source + length - 64, DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed);\n                goto case 2;\n            case 2:\n                hash += Mix16Bytes(source + 32, DefaultSecretUInt64_8, DefaultSecretUInt64_9, seed);\n                hash += Mix16Bytes(source + length - 48, DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed);\n                goto case 1;\n            case 1:\n                hash += Mix16Bytes(source + 16, DefaultSecretUInt64_4, DefaultSecretUInt64_5, seed);\n                hash += Mix16Bytes(source + length - 32, DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed);\n                goto case 0;\n            case 0:\n                hash += Mix16Bytes(source, DefaultSecretUInt64_0, DefaultSecretUInt64_1, seed);\n                hash += Mix16Bytes(source + length - 16, DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed);\n                break;\n        }\n\n        return Avalanche(hash);\n    }\n\n    private static ulong HashLength129To240(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length >= 129 && length <= 240);\n\n        ulong hash = length * Prime64_1;\n\n        hash += Mix16Bytes(source + (16 * 0), DefaultSecretUInt64_0, DefaultSecretUInt64_1, seed);\n        hash += Mix16Bytes(source + (16 * 1), DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed);\n        hash += Mix16Bytes(source + (16 * 2), DefaultSecretUInt64_4, DefaultSecretUInt64_5, seed);\n        hash += Mix16Bytes(source + (16 * 3), DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed);\n        hash += Mix16Bytes(source + (16 * 4), DefaultSecretUInt64_8, DefaultSecretUInt64_9, seed);\n        hash += Mix16Bytes(source + (16 * 5), DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed);\n        hash += Mix16Bytes(source + (16 * 6), DefaultSecretUInt64_12, DefaultSecretUInt64_13, seed);\n        hash += Mix16Bytes(source + (16 * 7), DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed);\n\n        hash = Avalanche(hash);\n\n        switch ((length - (16 * 8)) / 16)\n        {\n            default: // case 7\n                Debug.Assert((length - 16 * 8) / 16 == 7);\n                hash += Mix16Bytes(source + (16 * 14), DefaultSecret3UInt64_12, DefaultSecret3UInt64_13, seed);\n                goto case 6;\n            case 6:\n                hash += Mix16Bytes(source + (16 * 13), DefaultSecret3UInt64_10, DefaultSecret3UInt64_11, seed);\n                goto case 5;\n            case 5:\n                hash += Mix16Bytes(source + (16 * 12), DefaultSecret3UInt64_8, DefaultSecret3UInt64_9, seed);\n                goto case 4;\n            case 4:\n                hash += Mix16Bytes(source + (16 * 11), DefaultSecret3UInt64_6, DefaultSecret3UInt64_7, seed);\n                goto case 3;\n            case 3:\n                hash += Mix16Bytes(source + (16 * 10), DefaultSecret3UInt64_4, DefaultSecret3UInt64_5, seed);\n                goto case 2;\n            case 2:\n                hash += Mix16Bytes(source + (16 * 9), DefaultSecret3UInt64_2, DefaultSecret3UInt64_3, seed);\n                goto case 1;\n            case 1:\n                hash += Mix16Bytes(source + (16 * 8), DefaultSecret3UInt64_0, DefaultSecret3UInt64_1, seed);\n                goto case 0;\n            case 0:\n                hash += Mix16Bytes(source + length - 16, 0x7378D9C97E9FC831, 0xEBD33483ACC5EA64, seed); // DefaultSecret[119], DefaultSecret[127]\n                break;\n        }\n\n        return Avalanche(hash);\n    }\n\n    private static ulong HashLengthOver240(byte* source, uint length, ulong seed)\n    {\n        Debug.Assert(length > 240);\n\n        fixed (byte* defaultSecret = &MemoryMarshal.GetReference(DefaultSecret))\n        {\n            byte* secret = defaultSecret;\n            if (seed != 0)\n            {\n                byte* customSecret = stackalloc byte[SecretLengthBytes];\n                DeriveSecretFromSeed(customSecret, seed);\n                secret = customSecret;\n            }\n\n            ulong* accumulators = stackalloc ulong[AccumulatorCount];\n            InitializeAccumulators(accumulators);\n\n            HashInternalLoop(accumulators, source, length, secret);\n\n            return MergeAccumulators(accumulators, secret + 11, length * Prime64_1);\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/XxHash32.State.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Buffers.Binary;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing static BloomFilter.HashAlgorithms.Internal.XxHashShared;\n\n// Implemented from the specification at\n// https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal sealed partial class XxHash32\n{\n    private struct State\n    {\n        private uint _acc1;\n        private uint _acc2;\n        private uint _acc3;\n        private uint _acc4;\n        private readonly uint _smallAcc;\n        private bool _hadFullStripe;\n\n        internal State(uint seed)\n        {\n            _acc1 = seed + unchecked(Prime32_1 + Prime32_2);\n            _acc2 = seed + Prime32_2;\n            _acc3 = seed;\n            _acc4 = seed - Prime32_1;\n\n            _smallAcc = seed + Prime32_5;\n            _hadFullStripe = false;\n        }\n\n        internal unsafe void ProcessStripe(ReadOnlySpan<byte> source)\n        {\n            Debug.Assert(source.Length >= StripeSize);\n\n            source = source.Slice(0, StripeSize);\n\n            _acc1 = ApplyRound(_acc1, source);\n            _acc2 = ApplyRound(_acc2, source.Slice(sizeof(uint)));\n            _acc3 = ApplyRound(_acc3, source.Slice(2 * sizeof(uint)));\n            _acc4 = ApplyRound(_acc4, source.Slice(3 * sizeof(uint)));\n\n            _hadFullStripe = true;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        private readonly uint Converge()\n        {\n            return\n                BinaryHelper.RotateLeft(_acc1, 1) +\n                BinaryHelper.RotateLeft(_acc2, 7) +\n                BinaryHelper.RotateLeft(_acc3, 12) +\n                BinaryHelper.RotateLeft(_acc4, 18);\n        }\n\n        private static uint ApplyRound(uint acc, ReadOnlySpan<byte> lane)\n        {\n            acc += BinaryPrimitives.ReadUInt32LittleEndian(lane) * Prime32_2;\n            acc = BinaryHelper.RotateLeft(acc, 13);\n            acc *= Prime32_1;\n\n            return acc;\n        }\n\n        internal readonly uint Complete(int length, ReadOnlySpan<byte> remaining)\n        {\n            uint acc = _hadFullStripe ? Converge() : _smallAcc;\n\n            acc += (uint)length;\n\n            while (remaining.Length >= sizeof(uint))\n            {\n                uint lane = BinaryPrimitives.ReadUInt32LittleEndian(remaining);\n                acc += lane * Prime32_3;\n                acc = BinaryHelper.RotateLeft(acc, 17);\n                acc *= Prime32_4;\n\n                remaining = remaining.Slice(sizeof(uint));\n            }\n\n            for (int i = 0; i < remaining.Length; i++)\n            {\n                uint lane = remaining[i];\n                acc += lane * Prime32_5;\n                acc = BinaryHelper.RotateLeft(acc, 11);\n                acc *= Prime32_1;\n            }\n\n            acc ^= (acc >> 15);\n            acc *= Prime32_2;\n            acc ^= (acc >> 13);\n            acc *= Prime32_3;\n            acc ^= (acc >> 16);\n\n            return acc;\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/XxHash32.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Buffers.Binary;\n\n// Implemented from the specification at\n// https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///   Provides an implementation of the XxHash32 algorithm.\n/// </summary>\n/// <remarks>\n/// For methods that persist the computed numerical hash value as bytes,\n/// the value is written in the Big Endian byte order.\n/// </remarks>\ninternal sealed partial class XxHash32 : NonCryptoHashAlgorithm\n{\n    private const int HashSize = sizeof(uint);\n    private const int StripeSize = 4 * sizeof(uint);\n\n    private readonly uint _seed;\n    private State _state;\n    private byte[]? _holdback;\n    private int _length;\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"XxHash32\"/> class.\n    /// </summary>\n    /// <remarks>\n    ///   The XxHash32 algorithm supports an optional seed value.\n    ///   Instances created with this constructor use the default seed, zero.\n    /// </remarks>\n    public XxHash32()\n        : this(0)\n    {\n    }\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"XxHash32\"/> class with\n    ///   a specified seed.\n    /// </summary>\n    /// <param name=\"seed\">\n    ///   The hash seed value for computations from this instance.\n    /// </param>\n    public XxHash32(uint seed)\n        : base(HashSize)\n    {\n        _seed = seed;\n        Reset();\n    }\n\n    /// <summary>\n    ///   Resets the hash computation to the initial state.\n    /// </summary>\n    public override void Reset()\n    {\n        _state = new State(_seed);\n        _length = 0;\n    }\n\n    /// <summary>\n    ///   Appends the contents of <paramref name=\"source\"/> to the data already\n    ///   processed for the current hash computation.\n    /// </summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        // Every time we've read 16 bytes, process the stripe.\n        // Data that isn't perfectly mod-16 gets stored in a holdback\n        // buffer.\n\n        int held = _length & 0x0F;\n\n        if (held != 0)\n        {\n            int remain = StripeSize - held;\n\n            if (source.Length >= remain)\n            {\n                source.Slice(0, remain).CopyTo(_holdback.AsSpan(held));\n                _state.ProcessStripe(_holdback);\n\n                source = source.Slice(remain);\n                _length += remain;\n            }\n            else\n            {\n                source.CopyTo(_holdback.AsSpan(held));\n                _length += source.Length;\n                return;\n            }\n        }\n\n        while (source.Length >= StripeSize)\n        {\n            _state.ProcessStripe(source);\n            source = source.Slice(StripeSize);\n            _length += StripeSize;\n        }\n\n        if (source.Length > 0)\n        {\n            _holdback ??= new byte[StripeSize];\n            source.CopyTo(_holdback);\n            _length += source.Length;\n        }\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   without modifying accumulated state.\n    /// </summary>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        uint hash = GetCurrentHashAsUInt32();\n        BinaryPrimitives.WriteUInt32BigEndian(destination, hash);\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public uint GetCurrentHashAsUInt32()\n    {\n        int remainingLength = _length & 0x0F;\n        ReadOnlySpan<byte> remaining = ReadOnlySpan<byte>.Empty;\n\n        if (remainingLength > 0)\n        {\n            remaining = new ReadOnlySpan<byte>(_holdback, 0, remainingLength);\n        }\n\n        return _state.Complete(_length, remaining);\n    }\n\n    /// <summary>Computes the XxHash32 hash of the provided data.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <param name=\"seed\">The seed value for this hash computation. The default is zero.</param>\n    /// <returns>The computed XxHash32 hash.</returns>\n    public static uint HashToUInt32(ReadOnlySpan<byte> source, uint seed = 0)\n    {\n        int totalLength = source.Length;\n        State state = new State(seed);\n\n        while (source.Length >= StripeSize)\n        {\n            state.ProcessStripe(source);\n            source = source.Slice(StripeSize);\n        }\n\n        return state.Complete(totalLength, source);\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/XxHash64.State.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Buffers.Binary;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing static BloomFilter.HashAlgorithms.Internal.XxHashShared;\n\n// Implemented from the specification at\n// https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\ninternal sealed partial class XxHash64\n{\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    internal static ulong Avalanche(ulong hash)\n    {\n        hash ^= hash >> 33;\n        hash *= Prime64_2;\n        hash ^= hash >> 29;\n        hash *= Prime64_3;\n        hash ^= hash >> 32;\n        return hash;\n    }\n\n    private struct State\n    {\n        private ulong _acc1;\n        private ulong _acc2;\n        private ulong _acc3;\n        private ulong _acc4;\n        private readonly ulong _smallAcc;\n        private bool _hadFullStripe;\n\n        internal State(ulong seed)\n        {\n            _acc1 = seed + unchecked(Prime64_1 + Prime64_2);\n            _acc2 = seed + Prime64_2;\n            _acc3 = seed;\n            _acc4 = seed - Prime64_1;\n\n            _smallAcc = seed + Prime64_5;\n            _hadFullStripe = false;\n        }\n\n        internal void ProcessStripe(ReadOnlySpan<byte> source)\n        {\n            Debug.Assert(source.Length >= StripeSize);\n            source = source.Slice(0, StripeSize);\n\n            _acc1 = ApplyRound(_acc1, source);\n            _acc2 = ApplyRound(_acc2, source.Slice(sizeof(ulong)));\n            _acc3 = ApplyRound(_acc3, source.Slice(2 * sizeof(ulong)));\n            _acc4 = ApplyRound(_acc4, source.Slice(3 * sizeof(ulong)));\n\n            _hadFullStripe = true;\n        }\n\n        private static ulong MergeAccumulator(ulong acc, ulong accN)\n        {\n            acc ^= ApplyRound(0, accN);\n            acc *= Prime64_1;\n            acc += Prime64_4;\n\n            return acc;\n        }\n\n        private readonly ulong Converge()\n        {\n            ulong acc =\n                BinaryHelper.RotateLeft(_acc1, 1) +\n                BinaryHelper.RotateLeft(_acc2, 7) +\n                BinaryHelper.RotateLeft(_acc3, 12) +\n                BinaryHelper.RotateLeft(_acc4, 18);\n\n            acc = MergeAccumulator(acc, _acc1);\n            acc = MergeAccumulator(acc, _acc2);\n            acc = MergeAccumulator(acc, _acc3);\n            acc = MergeAccumulator(acc, _acc4);\n\n            return acc;\n        }\n\n        private static ulong ApplyRound(ulong acc, ReadOnlySpan<byte> lane)\n        {\n            return ApplyRound(acc, BinaryPrimitives.ReadUInt64LittleEndian(lane));\n        }\n\n        private static ulong ApplyRound(ulong acc, ulong lane)\n        {\n            acc += lane * Prime64_2;\n            acc = BinaryHelper.RotateLeft(acc, 31);\n            acc *= Prime64_1;\n\n            return acc;\n        }\n\n        internal readonly ulong Complete(long length, ReadOnlySpan<byte> remaining)\n        {\n            ulong acc = _hadFullStripe ? Converge() : _smallAcc;\n\n            acc += (ulong)length;\n\n            while (remaining.Length >= sizeof(ulong))\n            {\n                ulong lane = BinaryPrimitives.ReadUInt64LittleEndian(remaining);\n                acc ^= ApplyRound(0, lane);\n                acc = BinaryHelper.RotateLeft(acc, 27);\n                acc *= Prime64_1;\n                acc += Prime64_4;\n\n                remaining = remaining.Slice(sizeof(ulong));\n            }\n\n            // Doesn't need to be a while since it can occur at most once.\n            if (remaining.Length >= sizeof(uint))\n            {\n                ulong lane = BinaryPrimitives.ReadUInt32LittleEndian(remaining);\n                acc ^= lane * Prime64_1;\n                acc = BinaryHelper.RotateLeft(acc, 23);\n                acc *= Prime64_2;\n                acc += Prime64_3;\n\n                remaining = remaining.Slice(sizeof(uint));\n            }\n\n            for (int i = 0; i < remaining.Length; i++)\n            {\n                ulong lane = remaining[i];\n                acc ^= lane * Prime64_5;\n                acc = BinaryHelper.RotateLeft(acc, 11);\n                acc *= Prime64_1;\n            }\n\n            return Avalanche(acc);\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/XxHash64.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Buffers.Binary;\n\n// Implemented from the specification at\n// https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>\n///   Provides an implementation of the XxHash64 algorithm.\n/// </summary>\n/// <remarks>\n/// For methods that persist the computed numerical hash value as bytes,\n/// the value is written in the Big Endian byte order.\n/// </remarks>\ninternal sealed partial class XxHash64 : NonCryptoHashAlgorithm\n{\n    private const int HashSize = sizeof(ulong);\n    private const int StripeSize = 4 * sizeof(ulong);\n\n    private readonly ulong _seed;\n    private State _state;\n    private byte[]? _holdback;\n    private long _length;\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"XxHash64\"/> class.\n    /// </summary>\n    /// <remarks>\n    ///   The XxHash64 algorithm supports an optional seed value.\n    ///   Instances created with this constructor use the default seed, zero.\n    /// </remarks>\n    public XxHash64()\n        : this(0)\n    {\n    }\n\n    /// <summary>\n    ///   Initializes a new instance of the <see cref=\"XxHash64\"/> class with\n    ///   a specified seed.\n    /// </summary>\n    /// <param name=\"seed\">\n    ///   The hash seed value for computations from this instance.\n    /// </param>\n    public XxHash64(ulong seed)\n        : base(HashSize)\n    {\n        _seed = seed;\n        Reset();\n    }\n\n    /// <summary>\n    ///   Resets the hash computation to the initial state.\n    /// </summary>\n    public override void Reset()\n    {\n        _state = new State(_seed);\n        _length = 0;\n    }\n\n    /// <summary>\n    ///   Appends the contents of <paramref name=\"source\"/> to the data already\n    ///   processed for the current hash computation.\n    /// </summary>\n    /// <param name=\"source\">The data to process.</param>\n    public override void Append(ReadOnlySpan<byte> source)\n    {\n        // Every time we've read 32 bytes, process the stripe.\n        // Data that isn't perfectly mod-32 gets stored in a holdback\n        // buffer.\n\n        int held = (int)_length & 0x1F;\n\n        if (held != 0)\n        {\n            int remain = StripeSize - held;\n\n            if (source.Length >= remain)\n            {\n                source.Slice(0, remain).CopyTo(_holdback.AsSpan(held));\n                _state.ProcessStripe(_holdback);\n\n                source = source.Slice(remain);\n                _length += remain;\n            }\n            else\n            {\n                source.CopyTo(_holdback.AsSpan(held));\n                _length += source.Length;\n                return;\n            }\n        }\n\n        while (source.Length >= StripeSize)\n        {\n            _state.ProcessStripe(source);\n            source = source.Slice(StripeSize);\n            _length += StripeSize;\n        }\n\n        if (source.Length > 0)\n        {\n            _holdback ??= new byte[StripeSize];\n            source.CopyTo(_holdback);\n            _length += source.Length;\n        }\n    }\n\n    /// <summary>\n    ///   Writes the computed hash value to <paramref name=\"destination\"/>\n    ///   without modifying accumulated state.\n    /// </summary>\n    protected override void GetCurrentHashCore(Span<byte> destination)\n    {\n        ulong hash = GetCurrentHashAsUInt64();\n        BinaryPrimitives.WriteUInt64BigEndian(destination, hash);\n    }\n\n    /// <summary>Gets the current computed hash value without modifying accumulated state.</summary>\n    /// <returns>The hash value for the data already provided.</returns>\n    public ulong GetCurrentHashAsUInt64()\n    {\n        int remainingLength = (int)_length & 0x1F;\n        ReadOnlySpan<byte> remaining = ReadOnlySpan<byte>.Empty;\n\n        if (remainingLength > 0)\n        {\n            remaining = new ReadOnlySpan<byte>(_holdback, 0, remainingLength);\n        }\n\n        return _state.Complete(_length, remaining);\n    }\n\n    /// <summary>Computes the XxHash64 hash of the provided data.</summary>\n    /// <param name=\"source\">The data to hash.</param>\n    /// <param name=\"seed\">The seed value for this hash computation.</param>\n    /// <returns>The computed XxHash64 hash.</returns>\n    public static ulong HashToUInt64(ReadOnlySpan<byte> source, ulong seed = 0)\n    {\n        int totalLength = source.Length;\n        State state = new State(seed);\n\n        while (source.Length >= StripeSize)\n        {\n            state.ProcessStripe(source);\n            source = source.Slice(StripeSize);\n        }\n\n        return state.Complete((uint)totalLength, source);\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Internal/XxHashShared.cs",
    "content": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n\nusing System;\nusing System.Buffers.Binary;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n#if NET7_0_OR_GREATER\nusing System.Runtime.Intrinsics;\nusing System.Runtime.Intrinsics.Arm;\nusing System.Runtime.Intrinsics.X86;\n#endif\n\nnamespace BloomFilter.HashAlgorithms.Internal;\n\n/// <summary>Shared implementation of the XXH3 hash algorithm for 64-bit in <see cref=\"XxHash3\"/> and <see cref=\"XxHash128\"/> version.</summary>\ninternal static unsafe class XxHashShared\n{\n    public const int StripeLengthBytes = 64;\n    public const int SecretLengthBytes = 192;\n    public const int SecretSizeMin = 136;\n    public const int SecretLastAccStartBytes = 7;\n    public const int SecretConsumeRateBytes = 8;\n    public const int SecretMergeAccsStartBytes = 11;\n    public const int NumStripesPerBlock = (SecretLengthBytes - StripeLengthBytes) / SecretConsumeRateBytes;\n    public const int AccumulatorCount = StripeLengthBytes / sizeof(ulong);\n    public const int MidSizeMaxBytes = 240;\n    public const int InternalBufferStripes = InternalBufferLengthBytes / StripeLengthBytes;\n    public const int InternalBufferLengthBytes = 256;\n\n    /// <summary>The default secret for when no seed is provided.</summary>\n    /// <remarks>This is the same as a custom secret derived from a seed of 0.</remarks>\n    public static ReadOnlySpan<byte> DefaultSecret => new byte[]\n    {\n        0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, // DefaultSecretUInt64_0\n        0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, // DefaultSecretUInt64_1\n        0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, // DefaultSecretUInt64_2\n        0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, // DefaultSecretUInt64_3\n        0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, // DefaultSecretUInt64_4\n        0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, // DefaultSecretUInt64_5\n        0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, // DefaultSecretUInt64_6\n        0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, // DefaultSecretUInt64_7\n        0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, // DefaultSecretUInt64_8\n        0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, // DefaultSecretUInt64_9\n        0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, // DefaultSecretUInt64_10\n        0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, // DefaultSecretUInt64_11\n        0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, // DefaultSecretUInt64_12\n        0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, // DefaultSecretUInt64_13\n        0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, // DefaultSecretUInt64_14\n        0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, // DefaultSecretUInt64_15\n        0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, // DefaultSecretUInt64_16\n        0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, // DefaultSecretUInt64_17\n        0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, // DefaultSecretUInt64_18\n        0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, // DefaultSecretUInt64_19\n        0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, // DefaultSecretUInt64_20\n        0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, // DefaultSecretUInt64_21\n        0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, // DefaultSecretUInt64_22\n        0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, // DefaultSecretUInt64_23\n    };\n\n    // Cast of DefaultSecret byte[] => ulong[] (See above for the correspondence)\n    public const ulong DefaultSecretUInt64_0 = 0xBE4BA423396CFEB8;\n    public const ulong DefaultSecretUInt64_1 = 0x1CAD21F72C81017C;\n    public const ulong DefaultSecretUInt64_2 = 0xDB979083E96DD4DE;\n    public const ulong DefaultSecretUInt64_3 = 0x1F67B3B7A4A44072;\n    public const ulong DefaultSecretUInt64_4 = 0x78E5C0CC4EE679CB;\n    public const ulong DefaultSecretUInt64_5 = 0x2172FFCC7DD05A82;\n    public const ulong DefaultSecretUInt64_6 = 0x8E2443F7744608B8;\n    public const ulong DefaultSecretUInt64_7 = 0x4C263A81E69035E0;\n    public const ulong DefaultSecretUInt64_8 = 0xCB00C391BB52283C;\n    public const ulong DefaultSecretUInt64_9 = 0xA32E531B8B65D088;\n    public const ulong DefaultSecretUInt64_10 = 0x4EF90DA297486471;\n    public const ulong DefaultSecretUInt64_11 = 0xD8ACDEA946EF1938;\n    public const ulong DefaultSecretUInt64_12 = 0x3F349CE33F76FAA8;\n    public const ulong DefaultSecretUInt64_13 = 0x1D4F0BC7C7BBDCF9;\n    public const ulong DefaultSecretUInt64_14 = 0x3159B4CD4BE0518A;\n    public const ulong DefaultSecretUInt64_15 = 0x647378D9C97E9FC8;\n\n    // Cast of DefaultSecret offset by 3 bytes, byte[] => ulong[]\n    public const ulong DefaultSecret3UInt64_0 = 0x81017CBE4BA42339;\n    public const ulong DefaultSecret3UInt64_1 = 0x6DD4DE1CAD21F72C;\n    public const ulong DefaultSecret3UInt64_2 = 0xA44072DB979083E9;\n    public const ulong DefaultSecret3UInt64_3 = 0xE679CB1F67B3B7A4;\n    public const ulong DefaultSecret3UInt64_4 = 0xD05A8278E5C0CC4E;\n    public const ulong DefaultSecret3UInt64_5 = 0x4608B82172FFCC7D;\n    public const ulong DefaultSecret3UInt64_6 = 0x9035E08E2443F774;\n    public const ulong DefaultSecret3UInt64_7 = 0x52283C4C263A81E6;\n    public const ulong DefaultSecret3UInt64_8 = 0x65D088CB00C391BB;\n    public const ulong DefaultSecret3UInt64_9 = 0x486471A32E531B8B;\n    public const ulong DefaultSecret3UInt64_10 = 0xEF19384EF90DA297;\n    public const ulong DefaultSecret3UInt64_11 = 0x76FAA8D8ACDEA946;\n    public const ulong DefaultSecret3UInt64_12 = 0xBBDCF93F349CE33F;\n    public const ulong DefaultSecret3UInt64_13 = 0xE0518A1D4F0BC7C7;\n\n    public const ulong Prime64_1 = 0x9E3779B185EBCA87UL;\n    public const ulong Prime64_2 = 0xC2B2AE3D27D4EB4FUL;\n    public const ulong Prime64_3 = 0x165667B19E3779F9UL;\n    public const ulong Prime64_4 = 0x85EBCA77C2B2AE63UL;\n    public const ulong Prime64_5 = 0x27D4EB2F165667C5UL;\n\n    public const uint Prime32_1 = 0x9E3779B1U;\n    public const uint Prime32_2 = 0x85EBCA77U;\n    public const uint Prime32_3 = 0xC2B2AE3DU;\n    public const uint Prime32_4 = 0x27D4EB2FU;\n    public const uint Prime32_5 = 0x165667B1U;\n\n#if DEBUG\n    static XxHashShared()\n    {\n        // Make sure DefaultSecret is the custom secret derived from a seed of 0.\n        byte* secret = stackalloc byte[SecretLengthBytes];\n        DeriveSecretFromSeed(secret, 0);\n        Debug.Assert(new Span<byte>(secret, SecretLengthBytes).SequenceEqual(DefaultSecret));\n\n        // Validate some relationships.\n        Debug.Assert(InternalBufferLengthBytes % StripeLengthBytes == 0);\n\n        ReadOnlySpan<ulong> defaultSecretUInt64 = MemoryMarshal.Cast<byte, ulong>(DefaultSecret);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[0]) == DefaultSecretUInt64_0);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[1]) == DefaultSecretUInt64_1);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[2]) == DefaultSecretUInt64_2);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[3]) == DefaultSecretUInt64_3);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[4]) == DefaultSecretUInt64_4);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[5]) == DefaultSecretUInt64_5);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[6]) == DefaultSecretUInt64_6);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[7]) == DefaultSecretUInt64_7);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[8]) == DefaultSecretUInt64_8);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[9]) == DefaultSecretUInt64_9);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[10]) == DefaultSecretUInt64_10);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[11]) == DefaultSecretUInt64_11);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[12]) == DefaultSecretUInt64_12);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[13]) == DefaultSecretUInt64_13);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[14]) == DefaultSecretUInt64_14);\n        Debug.Assert(ReadLE64(defaultSecretUInt64[15]) == DefaultSecretUInt64_15);\n\n        ReadOnlySpan<ulong> defaultSecret3UInt64 = MemoryMarshal.Cast<byte, ulong>(DefaultSecret.Slice(3));\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[0]) == DefaultSecret3UInt64_0);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[1]) == DefaultSecret3UInt64_1);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[2]) == DefaultSecret3UInt64_2);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[3]) == DefaultSecret3UInt64_3);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[4]) == DefaultSecret3UInt64_4);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[5]) == DefaultSecret3UInt64_5);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[6]) == DefaultSecret3UInt64_6);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[7]) == DefaultSecret3UInt64_7);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[8]) == DefaultSecret3UInt64_8);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[9]) == DefaultSecret3UInt64_9);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[10]) == DefaultSecret3UInt64_10);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[11]) == DefaultSecret3UInt64_11);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[12]) == DefaultSecret3UInt64_12);\n        Debug.Assert(ReadLE64(defaultSecret3UInt64[13]) == DefaultSecret3UInt64_13);\n\n        static ulong ReadLE64(ulong data) => BitConverter.IsLittleEndian ? data : BinaryPrimitives.ReverseEndianness(data);\n    }\n#endif\n\n    public static void Initialize(ref State state, ulong seed)\n    {\n        state.Seed = (ulong)seed;\n\n        fixed (byte* secret = state.Secret)\n        {\n            if (seed == 0)\n            {\n                DefaultSecret.CopyTo(new Span<byte>(secret, SecretLengthBytes));\n            }\n            else\n            {\n                DeriveSecretFromSeed(secret, (ulong)seed);\n            }\n        }\n\n        Reset(ref state);\n    }\n\n    public static void Reset(ref State state)\n    {\n        state.BufferedCount = 0;\n        state.StripesProcessedInCurrentBlock = 0;\n        state.TotalLength = 0;\n\n        fixed (ulong* accumulators = state.Accumulators)\n        {\n            InitializeAccumulators(accumulators);\n        }\n    }\n\n    /// <summary>\"This is a stronger avalanche, preferable when input has not been previously mixed.\"</summary>\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong Rrmxmx(ulong hash, uint length)\n    {\n        hash ^= BinaryHelper.RotateLeft(hash, 49) ^ BinaryHelper.RotateLeft(hash, 24);\n        hash *= 0x9FB21C651E98DF25;\n        hash ^= (hash >> 35) + length;\n        hash *= 0x9FB21C651E98DF25;\n        return XorShift(hash, 28);\n    }\n\n    public static void HashInternalLoop(ulong* accumulators, byte* source, uint length, byte* secret)\n    {\n        Debug.Assert(length > 240);\n\n        const int StripesPerBlock = (SecretLengthBytes - StripeLengthBytes) / SecretConsumeRateBytes;\n        const int BlockLen = StripeLengthBytes * StripesPerBlock;\n        int blocksNum = (int)((length - 1) / BlockLen);\n\n        Accumulate(accumulators, source, secret, StripesPerBlock, true, blocksNum);\n        int offset = BlockLen * blocksNum;\n\n        int stripesNumber = (int)((length - 1 - offset) / StripeLengthBytes);\n        Accumulate(accumulators, source + offset, secret, stripesNumber);\n        Accumulate512(accumulators, source + length - StripeLengthBytes, secret + (SecretLengthBytes - StripeLengthBytes - SecretLastAccStartBytes));\n    }\n\n    public static void ConsumeStripes(ulong* accumulators, ref ulong stripesSoFar, ulong stripesPerBlock, byte* source, ulong stripes, byte* secret)\n    {\n        Debug.Assert(stripes <= stripesPerBlock); // can handle max 1 scramble per invocation\n        Debug.Assert(stripesSoFar < stripesPerBlock);\n\n        ulong stripesToEndOfBlock = stripesPerBlock - stripesSoFar;\n        if (stripesToEndOfBlock <= stripes)\n        {\n            // need a scrambling operation\n            ulong stripesAfterBlock = stripes - stripesToEndOfBlock;\n            Accumulate(accumulators, source, secret + ((int)stripesSoFar * SecretConsumeRateBytes), (int)stripesToEndOfBlock);\n            ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes));\n            Accumulate(accumulators, source + ((int)stripesToEndOfBlock * StripeLengthBytes), secret, (int)stripesAfterBlock);\n            stripesSoFar = stripesAfterBlock;\n        }\n        else\n        {\n            Accumulate(accumulators, source, secret + ((int)stripesSoFar * SecretConsumeRateBytes), (int)stripes);\n            stripesSoFar += stripes;\n        }\n    }\n\n    public static void Append(ref State state, ReadOnlySpan<byte> source)\n    {\n        Debug.Assert(state.BufferedCount <= InternalBufferLengthBytes);\n\n        state.TotalLength += (uint)source.Length;\n\n        fixed (byte* buffer = state.Buffer)\n        {\n            // Small input: just copy the data to the buffer.\n            if (source.Length <= InternalBufferLengthBytes - state.BufferedCount)\n            {\n                source.CopyTo(new Span<byte>(buffer + state.BufferedCount, source.Length));\n                state.BufferedCount += (uint)source.Length;\n                return;\n            }\n\n            fixed (byte* secret = state.Secret)\n            fixed (ulong* accumulators = state.Accumulators)\n            fixed (byte* sourcePtr = &MemoryMarshal.GetReference(source))\n            {\n                // Internal buffer is partially filled (always, except at beginning). Complete it, then consume it.\n                int sourceIndex = 0;\n                if (state.BufferedCount != 0)\n                {\n                    int loadSize = InternalBufferLengthBytes - (int)state.BufferedCount;\n\n                    source.Slice(0, loadSize).CopyTo(new Span<byte>(buffer + state.BufferedCount, loadSize));\n                    sourceIndex = loadSize;\n\n                    ConsumeStripes(accumulators, ref state.StripesProcessedInCurrentBlock, NumStripesPerBlock, buffer, InternalBufferStripes, secret);\n                    state.BufferedCount = 0;\n                }\n                Debug.Assert(sourceIndex < source.Length);\n\n                // Large input to consume: ingest per full block.\n                if (source.Length - sourceIndex > NumStripesPerBlock * StripeLengthBytes)\n                {\n                    ulong stripes = (ulong)(source.Length - sourceIndex - 1) / StripeLengthBytes;\n                    Debug.Assert(NumStripesPerBlock >= state.StripesProcessedInCurrentBlock);\n\n                    // Join to current block's end.\n                    ulong stripesToEnd = NumStripesPerBlock - state.StripesProcessedInCurrentBlock;\n                    Debug.Assert(stripesToEnd <= stripes);\n                    Accumulate(accumulators, sourcePtr + sourceIndex, secret + ((int)state.StripesProcessedInCurrentBlock * SecretConsumeRateBytes), (int)stripesToEnd);\n                    ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes));\n                    state.StripesProcessedInCurrentBlock = 0;\n                    sourceIndex += (int)stripesToEnd * StripeLengthBytes;\n                    stripes -= stripesToEnd;\n\n                    // Consume entire blocks.\n                    while (stripes >= NumStripesPerBlock)\n                    {\n                        Accumulate(accumulators, sourcePtr + sourceIndex, secret, NumStripesPerBlock);\n                        ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes));\n                        sourceIndex += NumStripesPerBlock * StripeLengthBytes;\n                        stripes -= NumStripesPerBlock;\n                    }\n\n                    // Consume complete stripes in the last partial block.\n                    Accumulate(accumulators, sourcePtr + sourceIndex, secret, (int)stripes);\n                    sourceIndex += (int)stripes * StripeLengthBytes;\n                    Debug.Assert(sourceIndex < source.Length);  // at least some bytes left\n                    state.StripesProcessedInCurrentBlock = stripes;\n\n                    // Copy the last stripe into the end of the buffer so it is available to GetCurrentHashCore when processing the \"stripe from the end\".\n                    source.Slice(sourceIndex - StripeLengthBytes, StripeLengthBytes).CopyTo(new Span<byte>(buffer + InternalBufferLengthBytes - StripeLengthBytes, StripeLengthBytes));\n                }\n                else if (source.Length - sourceIndex > InternalBufferLengthBytes)\n                {\n                    // Content to consume <= block size. Consume source by a multiple of internal buffer size.\n                    do\n                    {\n                        ConsumeStripes(accumulators, ref state.StripesProcessedInCurrentBlock, NumStripesPerBlock, sourcePtr + sourceIndex, InternalBufferStripes, secret);\n                        sourceIndex += InternalBufferLengthBytes;\n                    }\n                    while (source.Length - sourceIndex > InternalBufferLengthBytes);\n\n                    // Copy the last stripe into the end of the buffer so it is available to GetCurrentHashCore when processing the \"stripe from the end\".\n                    source.Slice(sourceIndex - StripeLengthBytes, StripeLengthBytes).CopyTo(new Span<byte>(buffer + InternalBufferLengthBytes - StripeLengthBytes, StripeLengthBytes));\n                }\n\n                // Buffer the remaining input.\n                Span<byte> remaining = new Span<byte>(buffer, source.Length - sourceIndex);\n                Debug.Assert(sourceIndex < source.Length);\n                Debug.Assert(remaining.Length <= InternalBufferLengthBytes);\n                Debug.Assert(state.BufferedCount == 0);\n                source.Slice(sourceIndex).CopyTo(remaining);\n                state.BufferedCount = (uint)remaining.Length;\n            }\n        }\n    }\n\n    public static void CopyAccumulators(ref State state, ulong* accumulators)\n    {\n        fixed (ulong* stateAccumulators = state.Accumulators)\n        {\n#if NET7_0_OR_GREATER\n            if (Vector256.IsHardwareAccelerated)\n            {\n                Vector256.Store(Vector256.Load(stateAccumulators), accumulators);\n                Vector256.Store(Vector256.Load(stateAccumulators + 4), accumulators + 4);\n            }\n            else if (Vector128.IsHardwareAccelerated)\n            {\n                Vector128.Store(Vector128.Load(stateAccumulators), accumulators);\n                Vector128.Store(Vector128.Load(stateAccumulators + 2), accumulators + 2);\n                Vector128.Store(Vector128.Load(stateAccumulators + 4), accumulators + 4);\n                Vector128.Store(Vector128.Load(stateAccumulators + 6), accumulators + 6);\n            }\n            else\n#endif\n            {\n                for (int i = 0; i < 8; i++)\n                {\n                    accumulators[i] = stateAccumulators[i];\n                }\n            }\n        }\n    }\n\n    public static void DigestLong(ref State state, ulong* accumulators, byte* secret)\n    {\n        Debug.Assert(state.BufferedCount > 0);\n\n        fixed (byte* buffer = state.Buffer)\n        {\n            byte* accumulateData;\n            if (state.BufferedCount >= StripeLengthBytes)\n            {\n                uint stripes = (state.BufferedCount - 1) / StripeLengthBytes;\n                ulong stripesSoFar = state.StripesProcessedInCurrentBlock;\n\n                ConsumeStripes(accumulators, ref stripesSoFar, NumStripesPerBlock, buffer, stripes, secret);\n\n                accumulateData = buffer + state.BufferedCount - StripeLengthBytes;\n            }\n            else\n            {\n                byte* lastStripe = stackalloc byte[StripeLengthBytes];\n                int catchupSize = StripeLengthBytes - (int)state.BufferedCount;\n\n                new ReadOnlySpan<byte>(buffer + InternalBufferLengthBytes - catchupSize, catchupSize).CopyTo(new Span<byte>(lastStripe, StripeLengthBytes));\n                new ReadOnlySpan<byte>(buffer, (int)state.BufferedCount).CopyTo(new Span<byte>(lastStripe + catchupSize, (int)state.BufferedCount));\n                accumulateData = lastStripe;\n            }\n\n            Accumulate512(accumulators, accumulateData, secret + (SecretLengthBytes - StripeLengthBytes - SecretLastAccStartBytes));\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static void InitializeAccumulators(ulong* accumulators)\n    {\n#if NET7_0_OR_GREATER\n        if (Vector256.IsHardwareAccelerated)\n        {\n            Vector256.Store(Vector256.Create(Prime32_3, Prime64_1, Prime64_2, Prime64_3), accumulators);\n            Vector256.Store(Vector256.Create(Prime64_4, Prime32_2, Prime64_5, Prime32_1), accumulators + 4);\n        }\n        else if (Vector128.IsHardwareAccelerated)\n        {\n            Vector128.Store(Vector128.Create(Prime32_3, Prime64_1), accumulators);\n            Vector128.Store(Vector128.Create(Prime64_2, Prime64_3), accumulators + 2);\n            Vector128.Store(Vector128.Create(Prime64_4, Prime32_2), accumulators + 4);\n            Vector128.Store(Vector128.Create(Prime64_5, Prime32_1), accumulators + 6);\n        }\n        else\n#endif\n        {\n            accumulators[0] = Prime32_3;\n            accumulators[1] = Prime64_1;\n            accumulators[2] = Prime64_2;\n            accumulators[3] = Prime64_3;\n            accumulators[4] = Prime64_4;\n            accumulators[5] = Prime32_2;\n            accumulators[6] = Prime64_5;\n            accumulators[7] = Prime32_1;\n        }\n    }\n\n    public static ulong MergeAccumulators(ulong* accumulators, byte* secret, ulong start)\n    {\n        ulong result64 = start;\n\n        result64 += Multiply64To128ThenFold(accumulators[0] ^ ReadUInt64LE(secret), accumulators[1] ^ ReadUInt64LE(secret + 8));\n        result64 += Multiply64To128ThenFold(accumulators[2] ^ ReadUInt64LE(secret + 16), accumulators[3] ^ ReadUInt64LE(secret + 24));\n        result64 += Multiply64To128ThenFold(accumulators[4] ^ ReadUInt64LE(secret + 32), accumulators[5] ^ ReadUInt64LE(secret + 40));\n        result64 += Multiply64To128ThenFold(accumulators[6] ^ ReadUInt64LE(secret + 48), accumulators[7] ^ ReadUInt64LE(secret + 56));\n\n        return Avalanche(result64);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong Mix16Bytes(byte* source, ulong secretLow, ulong secretHigh, ulong seed) =>\n        Multiply64To128ThenFold(\n            ReadUInt64LE(source) ^ (secretLow + seed),\n            ReadUInt64LE(source + sizeof(ulong)) ^ (secretHigh - seed));\n\n    /// <summary>Calculates a 32-bit to 64-bit long multiply.</summary>\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong Multiply32To64(uint v1, uint v2) => (ulong)v1 * v2;\n\n    /// <summary>\"This is a fast avalanche stage, suitable when input bits are already partially mixed.\"</summary>\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong Avalanche(ulong hash)\n    {\n        hash = XorShift(hash, 37);\n        hash *= 0x165667919E3779F9;\n        hash = XorShift(hash, 32);\n        return hash;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong Multiply64To128(ulong left, ulong right, out ulong lower)\n    {\n#if NET5_0_OR_GREATER\n        return Math.BigMul(left, right, out lower);\n#else\n        ulong lowerLow = Multiply32To64((uint)left, (uint)right);\n        ulong higherLow = Multiply32To64((uint)(left >> 32), (uint)right);\n        ulong lowerHigh = Multiply32To64((uint)left, (uint)(right >> 32));\n        ulong higherHigh = Multiply32To64((uint)(left >> 32), (uint)(right >> 32));\n\n        ulong cross = (lowerLow >> 32) + (higherLow & 0xFFFFFFFF) + lowerHigh;\n        ulong upper = (higherLow >> 32) + (cross >> 32) + higherHigh;\n        lower = (cross << 32) | (lowerLow & 0xFFFFFFFF);\n        return upper;\n#endif\n    }\n\n    /// <summary>Calculates a 64-bit to 128-bit multiply, then XOR folds it.</summary>\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong Multiply64To128ThenFold(ulong left, ulong right)\n    {\n        ulong upper = Multiply64To128(left, right, out ulong lower);\n        return lower ^ upper;\n    }\n\n    public static void DeriveSecretFromSeed(byte* destinationSecret, ulong seed)\n    {\n        fixed (byte* defaultSecret = &MemoryMarshal.GetReference(DefaultSecret))\n        {\n#if NET7_0_OR_GREATER\n            if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian)\n            {\n                Vector256<ulong> seedVec = Vector256.Create(seed, 0u - seed, seed, 0u - seed);\n                for (int i = 0; i < SecretLengthBytes; i += Vector256<byte>.Count)\n                {\n                    Vector256.Store(Vector256.Load((ulong*)(defaultSecret + i)) + seedVec, (ulong*)(destinationSecret + i));\n                }\n            }\n            else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian)\n            {\n                Vector128<ulong> seedVec = Vector128.Create(seed, 0u - seed);\n                for (int i = 0; i < SecretLengthBytes; i += Vector128<byte>.Count)\n                {\n                    Vector128.Store(Vector128.Load((ulong*)(defaultSecret + i)) + seedVec, (ulong*)(destinationSecret + i));\n                }\n            }\n            else\n#endif\n            {\n                for (int i = 0; i < SecretLengthBytes; i += sizeof(ulong) * 2)\n                {\n                    WriteUInt64LE(destinationSecret + i, ReadUInt64LE(defaultSecret + i) + seed);\n                    WriteUInt64LE(destinationSecret + i + 8, ReadUInt64LE(defaultSecret + i + 8) - seed);\n                }\n            }\n        }\n    }\n\n    /// <summary>Optimized version of looping over <see cref=\"Accumulate512\"/>.</summary>\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private static void Accumulate(ulong* accumulators, byte* source, byte* secret, int stripesToProcess, bool scramble = false, int blockCount = 1)\n    {\n        byte* secretForAccumulate = secret;\n        byte* secretForScramble = secret + (SecretLengthBytes - StripeLengthBytes);\n\n#if NET7_0_OR_GREATER\n        if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian)\n        {\n            Vector256<ulong> acc1 = Vector256.Load(accumulators);\n            Vector256<ulong> acc2 = Vector256.Load(accumulators + Vector256<ulong>.Count);\n\n            for (int j = 0; j < blockCount; j++)\n            {\n                secret = secretForAccumulate;\n                for (int i = 0; i < stripesToProcess; i++)\n                {\n                    Vector256<uint> secretVal = Vector256.Load((uint*)secret);\n                    acc1 = Accumulate256(acc1, source, secretVal);\n                    source += Vector256<byte>.Count;\n\n                    secretVal = Vector256.Load((uint*)secret + Vector256<uint>.Count);\n                    acc2 = Accumulate256(acc2, source, secretVal);\n                    source += Vector256<byte>.Count;\n\n                    secret += SecretConsumeRateBytes;\n                }\n\n                if (scramble)\n                {\n                    acc1 = ScrambleAccumulator256(acc1, Vector256.Load((ulong*)secretForScramble));\n                    acc2 = ScrambleAccumulator256(acc2, Vector256.Load((ulong*)secretForScramble + Vector256<ulong>.Count));\n                }\n            }\n\n            Vector256.Store(acc1, accumulators);\n            Vector256.Store(acc2, accumulators + Vector256<ulong>.Count);\n        }\n        else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian)\n        {\n            Vector128<ulong> acc1 = Vector128.Load(accumulators);\n            Vector128<ulong> acc2 = Vector128.Load(accumulators + Vector128<ulong>.Count);\n            Vector128<ulong> acc3 = Vector128.Load(accumulators + Vector128<ulong>.Count * 2);\n            Vector128<ulong> acc4 = Vector128.Load(accumulators + Vector128<ulong>.Count * 3);\n\n            for (int j = 0; j < blockCount; j++)\n            {\n                secret = secretForAccumulate;\n                for (int i = 0; i < stripesToProcess; i++)\n                {\n                    Vector128<uint> secretVal = Vector128.Load((uint*)secret);\n                    acc1 = Accumulate128(acc1, source, secretVal);\n                    source += Vector128<byte>.Count;\n\n                    secretVal = Vector128.Load((uint*)secret + Vector128<uint>.Count);\n                    acc2 = Accumulate128(acc2, source, secretVal);\n                    source += Vector128<byte>.Count;\n\n                    secretVal = Vector128.Load((uint*)secret + Vector128<uint>.Count * 2);\n                    acc3 = Accumulate128(acc3, source, secretVal);\n                    source += Vector128<byte>.Count;\n\n                    secretVal = Vector128.Load((uint*)secret + Vector128<uint>.Count * 3);\n                    acc4 = Accumulate128(acc4, source, secretVal);\n                    source += Vector128<byte>.Count;\n\n                    secret += SecretConsumeRateBytes;\n                }\n\n                if (scramble)\n                {\n                    acc1 = ScrambleAccumulator128(acc1, Vector128.Load((ulong*)secretForScramble));\n                    acc2 = ScrambleAccumulator128(acc2, Vector128.Load((ulong*)secretForScramble + Vector128<ulong>.Count));\n                    acc3 = ScrambleAccumulator128(acc3, Vector128.Load((ulong*)secretForScramble + Vector128<ulong>.Count * 2));\n                    acc4 = ScrambleAccumulator128(acc4, Vector128.Load((ulong*)secretForScramble + Vector128<ulong>.Count * 3));\n                }\n            }\n\n            Vector128.Store(acc1, accumulators);\n            Vector128.Store(acc2, accumulators + Vector128<ulong>.Count);\n            Vector128.Store(acc3, accumulators + Vector128<ulong>.Count * 2);\n            Vector128.Store(acc4, accumulators + Vector128<ulong>.Count * 3);\n        }\n        else\n#endif\n        {\n            for (int j = 0; j < blockCount; j++)\n            {\n                for (int i = 0; i < stripesToProcess; i++)\n                {\n                    Accumulate512Inlined(accumulators, source, secret + (i * SecretConsumeRateBytes));\n                    source += StripeLengthBytes;\n                }\n\n                if (scramble)\n                {\n                    ScrambleAccumulators(accumulators, secretForScramble);\n                }\n            }\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    public static void Accumulate512(ulong* accumulators, byte* source, byte* secret)\n    {\n        Accumulate512Inlined(accumulators, source, secret);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static void Accumulate512Inlined(ulong* accumulators, byte* source, byte* secret)\n    {\n#if NET7_0_OR_GREATER\n        if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian)\n        {\n            for (int i = 0; i < AccumulatorCount / Vector256<ulong>.Count; i++)\n            {\n                Vector256<ulong> accVec = Accumulate256(Vector256.Load(accumulators), source, Vector256.Load((uint*)secret));\n                Vector256.Store(accVec, accumulators);\n\n                accumulators += Vector256<ulong>.Count;\n                secret += Vector256<byte>.Count;\n                source += Vector256<byte>.Count;\n            }\n        }\n        else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian)\n        {\n            for (int i = 0; i < AccumulatorCount / Vector128<ulong>.Count; i++)\n            {\n                Vector128<ulong> accVec = Accumulate128(Vector128.Load(accumulators), source, Vector128.Load((uint*)secret));\n                Vector128.Store(accVec, accumulators);\n\n                accumulators += Vector128<ulong>.Count;\n                secret += Vector128<byte>.Count;\n                source += Vector128<byte>.Count;\n            }\n        }\n        else\n#endif\n        {\n            for (int i = 0; i < AccumulatorCount; i++)\n            {\n                ulong sourceVal = ReadUInt64LE(source + (8 * i));\n                ulong sourceKey = sourceVal ^ ReadUInt64LE(secret + (i * 8));\n\n                accumulators[i ^ 1] += sourceVal; // swap adjacent lanes\n                accumulators[i] += Multiply32To64((uint)sourceKey, (uint)(sourceKey >> 32));\n            }\n        }\n    }\n\n#if NET7_0_OR_GREATER\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Vector256<ulong> Accumulate256(Vector256<ulong> accVec, byte* source, Vector256<uint> secret)\n    {\n        Vector256<uint> sourceVec = Vector256.Load((uint*)source);\n        Vector256<uint> sourceKey = sourceVec ^ secret;\n\n        // TODO: Figure out how to unwind this shuffle and just use Vector256.Multiply\n        Vector256<uint> sourceKeyLow = Vector256.Shuffle(sourceKey, Vector256.Create(1u, 0, 3, 0, 5, 0, 7, 0));\n        Vector256<uint> sourceSwap = Vector256.Shuffle(sourceVec, Vector256.Create(2u, 3, 0, 1, 6, 7, 4, 5));\n        Vector256<ulong> sum = accVec + sourceSwap.AsUInt64();\n        Vector256<ulong> product = Avx2.IsSupported ?\n            Avx2.Multiply(sourceKey, sourceKeyLow) :\n            (sourceKey & Vector256.Create(~0u, 0u, ~0u, 0u, ~0u, 0u, ~0u, 0u)).AsUInt64() * (sourceKeyLow & Vector256.Create(~0u, 0u, ~0u, 0u, ~0u, 0u, ~0u, 0u)).AsUInt64();\n\n        accVec = product + sum;\n        return accVec;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Vector128<ulong> Accumulate128(Vector128<ulong> accVec, byte* source, Vector128<uint> secret)\n    {\n        Vector128<uint> sourceVec = Vector128.Load((uint*)source);\n        Vector128<uint> sourceKey = sourceVec ^ secret;\n\n        // TODO: Figure out how to unwind this shuffle and just use Vector128.Multiply\n        Vector128<uint> sourceSwap = Vector128.Shuffle(sourceVec, Vector128.Create(2u, 3, 0, 1));\n        Vector128<ulong> sum = accVec + sourceSwap.AsUInt64();\n\n        Vector128<ulong> product = MultiplyWideningLower(sourceKey);\n        accVec = product + sum;\n        return accVec;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Vector128<ulong> MultiplyWideningLower(Vector128<uint> source)\n    {\n        if (AdvSimd.IsSupported)\n        {\n            Vector64<uint> sourceLow = Vector128.Shuffle(source, Vector128.Create(0u, 2, 0, 0)).GetLower();\n            Vector64<uint> sourceHigh = Vector128.Shuffle(source, Vector128.Create(1u, 3, 0, 0)).GetLower();\n            return AdvSimd.MultiplyWideningLower(sourceLow, sourceHigh);\n        }\n        else\n        {\n            Vector128<uint> sourceLow = Vector128.Shuffle(source, Vector128.Create(1u, 0, 3, 0));\n            return Sse2.IsSupported ?\n                Sse2.Multiply(source, sourceLow) :\n                (source & Vector128.Create(~0u, 0u, ~0u, 0u)).AsUInt64() * (sourceLow & Vector128.Create(~0u, 0u, ~0u, 0u)).AsUInt64();\n        }\n    }\n#endif\n\n    private static void ScrambleAccumulators(ulong* accumulators, byte* secret)\n    {\n#if NET7_0_OR_GREATER\n        if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian)\n        {\n            for (int i = 0; i < AccumulatorCount / Vector256<ulong>.Count; i++)\n            {\n                Vector256<ulong> accVec = ScrambleAccumulator256(Vector256.Load(accumulators), Vector256.Load((ulong*)secret));\n                Vector256.Store(accVec, accumulators);\n\n                accumulators += Vector256<ulong>.Count;\n                secret += Vector256<byte>.Count;\n            }\n        }\n        else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian)\n        {\n            for (int i = 0; i < AccumulatorCount / Vector128<ulong>.Count; i++)\n            {\n                Vector128<ulong> accVec = ScrambleAccumulator128(Vector128.Load(accumulators), Vector128.Load((ulong*)secret));\n                Vector128.Store(accVec, accumulators);\n\n                accumulators += Vector128<ulong>.Count;\n                secret += Vector128<byte>.Count;\n            }\n        }\n        else\n#endif\n        {\n            for (int i = 0; i < AccumulatorCount; i++)\n            {\n                ulong xorShift = XorShift(*accumulators, 47);\n                ulong xorWithKey = xorShift ^ ReadUInt64LE(secret);\n                *accumulators = xorWithKey * Prime32_1;\n\n                accumulators++;\n                secret += sizeof(ulong);\n            }\n        }\n    }\n\n#if NET7_0_OR_GREATER\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Vector256<ulong> ScrambleAccumulator256(Vector256<ulong> accVec, Vector256<ulong> secret)\n    {\n        Vector256<ulong> xorShift = accVec ^ Vector256.ShiftRightLogical(accVec, 47);\n        Vector256<ulong> xorWithKey = xorShift ^ secret;\n        accVec = xorWithKey * Vector256.Create((ulong)Prime32_1);\n        return accVec;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static Vector128<ulong> ScrambleAccumulator128(Vector128<ulong> accVec, Vector128<ulong> secret)\n    {\n        Vector128<ulong> xorShift = accVec ^ Vector128.ShiftRightLogical(accVec, 47);\n        Vector128<ulong> xorWithKey = xorShift ^ secret;\n        accVec = xorWithKey * Vector128.Create((ulong)Prime32_1);\n        return accVec;\n    }\n#endif\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong XorShift(ulong value, int shift)\n    {\n        Debug.Assert(shift >= 0 && shift < 64);\n        return value ^ (value >> shift);\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static uint ReadUInt32LE(byte* data) =>\n        BitConverter.IsLittleEndian ?\n            Unsafe.ReadUnaligned<uint>(data) :\n            BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned<uint>(data));\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static ulong ReadUInt64LE(byte* data) =>\n        BitConverter.IsLittleEndian ?\n            Unsafe.ReadUnaligned<ulong>(data) :\n            BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned<ulong>(data));\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static void WriteUInt64LE(byte* data, ulong value)\n    {\n        if (!BitConverter.IsLittleEndian)\n        {\n            value = BinaryPrimitives.ReverseEndianness(value);\n        }\n        Unsafe.WriteUnaligned(data, value);\n    }\n\n    [StructLayout(LayoutKind.Auto)]\n    public struct State\n    {\n        /// <summary>The accumulators. Length is <see cref=\"AccumulatorCount\"/>.</summary>\n        internal fixed ulong Accumulators[AccumulatorCount];\n\n        /// <summary>Used to store a custom secret generated from a seed. Length is <see cref=\"SecretLengthBytes\"/>.</summary>\n        internal fixed byte Secret[SecretLengthBytes];\n\n        /// <summary>The internal buffer. Length is <see cref=\"InternalBufferLengthBytes\"/>.</summary>\n        internal fixed byte Buffer[InternalBufferLengthBytes];\n\n        /// <summary>The amount of memory in <see cref=\"Buffer\"/>.</summary>\n        internal uint BufferedCount;\n\n        /// <summary>Number of stripes processed in the current block.</summary>\n        internal ulong StripesProcessedInCurrentBlock;\n\n        /// <summary>Total length hashed.</summary>\n        internal ulong TotalLength;\n\n        /// <summary>The seed employed (possibly 0).</summary>\n        internal ulong Seed;\n    };\n}\n"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/LCGWithFNV.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\n/// <summary>\n/// Implements an Linear Congruential Generator With  FNV1a hash algorithm.\n/// </summary>\npublic class LCGWithFNV1a : LCGWithFNV\n{\n    public override HashMethod Method => HashMethod.LCGWithFNV1a;\n\n    public override long Hash(ReadOnlySpan<byte> data)\n    {\n        return Internal.FNV1a.HashToUInt32(data);\n    }\n}\n\n/// <summary>\n/// Implements an Linear Congruential Generator With  modified FNV hash. Provides better distribution than FNV1 but it's only 32 bit long.\n/// </summary>\npublic class LCGModifiedFNV1 : LCGWithFNV1a\n{\n    public override HashMethod Method => HashMethod.LCGModifiedFNV1;\n\n    public override long Hash(ReadOnlySpan<byte> data)\n    {\n        return Internal.ModifiedFNV1.HashToUInt32(data);\n    }\n}\n\n/// <summary>\n/// Implements an Linear Congruential Generator With FNV1 hash algorithm.\n/// </summary>\npublic class LCGWithFNV : HashFunction\n{\n    public override HashMethod Method => HashMethod.LCGWithFNV1;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long multiplier = 0x5DEECE66DL;\n        long addend = 0xBL;\n        long mask = (1L << 48) - 1;\n\n        // Generate int from byte Array using the FNV hash\n        long reduced = Math.Abs(Hash(data));\n        // Make number positive\n        // Handle the special case: smallest negative number is itself as the\n        // absolute value\n        if (reduced == int.MaxValue)\n            reduced = 42;\n\n        // Calculate hashes numbers iteratively\n        long[] positions = new long[k];\n        long seed = reduced;\n        for (int i = 0; i < k; i++)\n        {\n            //http://en.wikipedia.org/wiki/Linear_congruential_generator\n            // LCG formula: x_i+1 = (multiplier * x_i + addend) mod mask\n            seed = (seed * multiplier + addend) & mask;\n            positions[i] = BinaryHelper.RightMove(seed, (48 - 30)) % m;\n        }\n        return positions;\n    }\n\n    public virtual long Hash(ReadOnlySpan<byte> data)\n    {\n        return Internal.FNV1.HashToUInt32(data);\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Murmur128BitsX64.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic class Murmur128BitsX64 : HashFunction\n{\n    public override HashMethod Method => HashMethod.Murmur128BitsX64;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n\n        var uint128 = Internal.Murmur128BitsX64.HashToUInt128Array(data);\n\n        var hash1 = (uint)uint128[0];\n        var hash2 = (uint)(uint128[1] >> 32);\n\n        for (int i = 0; i < k; i++)\n        {\n            positions[i] = (hash1 + i * hash2) % m;\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Murmur128BitsX86.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic class Murmur128BitsX86 : HashFunction\n{\n    public override HashMethod Method => HashMethod.Murmur128BitsX86;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n\n        var uint128 = Internal.Murmur128BitsX86.HashToUInt128Array(data);\n\n        var hash1 = uint128[0];\n        var hash2 = uint128[1];\n\n        for (int i = 0; i < k; i++)\n        {\n            positions[i] = (hash1 + i * hash2) % m;\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/Murmur32BitsX86.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\n/// <summary>\n/// Building a Better Bloom Filter\" by Adam Kirsch and Michael Mitzenmacher,\n/// https://www.eecs.harvard.edu/~michaelm/postscripts/tr-02-05.pdf\n/// </summary>\npublic class Murmur32BitsX86 : HashFunction\n{\n    public override HashMethod Method => HashMethod.Murmur32BitsX86;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n        var hash1 = Internal.Murmur32BitsX86.HashToUInt32(data);\n        var hash2 = Internal.Murmur32BitsX86.HashToUInt32(data, hash1);\n        for (int i = 0; i < k; i++)\n        {\n            positions[i] = (hash1 + i * hash2) % m;\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/RNGWithFNV.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\n/// <summary>\n/// Implements an Random With FNV1a hash algorithm.\n/// </summary>\npublic class RNGWithFNV1a : RNGWithFNV1\n{\n    public override HashMethod Method => HashMethod.RNGWithFNV1a;\n\n    public override long Hash(ReadOnlySpan<byte> data)\n    {\n        return Internal.FNV1a.HashToUInt32(data);\n    }\n}\n\n/// <summary>\n/// Implements an Random With modified FNV hash. Provides better distribution than FNV1 but it's only 32 bit long.\n/// </summary>\npublic class RNGModifiedFNV1 : RNGWithFNV1a\n{\n    public override HashMethod Method => HashMethod.RNGModifiedFNV1;\n\n    public override long Hash(ReadOnlySpan<byte> data)\n    {\n        return Internal.ModifiedFNV1.HashToUInt32(data);\n    }\n}\n\n/// <summary>\n/// Implements an Random With FNV1 hash algorithm.\n/// </summary>\npublic class RNGWithFNV1 : HashFunction\n{\n    public override HashMethod Method => HashMethod.RNGWithFNV1;\n\n    protected const long Prime = 16_777_619;\n    protected const long Init = 2_166_136_261;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n\n        Random r = new((int)Hash(data));\n\n        for (int i = 0; i < k; i++)\n        {\n#if NET6_0_OR_GREATER\n            positions[i] = r.NextInt64(m);\n#else\n            positions[i] = r.Next((int)m);\n#endif\n        }\n        return positions;\n    }\n\n    public virtual long Hash(ReadOnlySpan<byte> data)\n    {\n        return Internal.FNV1.HashToUInt32(data);\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/XXHash128.cs",
    "content": "﻿using System;\nusing System.Buffers.Binary;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic class XXHash128 : HashFunction\n{\n    public override HashMethod Method => HashMethod.XXHash128;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n\n#if NET7_0_OR_GREATER\n        var hash = Internal.XxHash128.HashToHash128(data);\n        var hash1 = (uint)hash.High64;\n        var hash2 = (uint)(hash.High64 >> 32);\n#else\n        ReadOnlySpan<byte> hash = Internal.XxHash128.Hash(data);\n        var hash1 = BinaryPrimitives.ReadUInt32BigEndian(hash);\n        var hash2 = BinaryPrimitives.ReadUInt32BigEndian(hash.Slice(4));\n#endif\n        for (int i = 0; i < k; i++)\n        {\n            positions[i] = ((hash1 + i * hash2) % m);\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/XXHash3.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic class XXHash3 : HashFunction\n{\n    public override HashMethod Method => HashMethod.XXHash3;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n\n        var hash = Internal.XxHash3.HashToUInt64(data, 0);\n\n        uint hash1 = (uint)hash;\n        uint hash2 = (uint)(hash >> 32);\n\n        for (int i = 0; i < k; i++)\n        {\n            positions[i] = ((hash1 + i * hash2) % m);\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/XXHash32.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic class XXHash32 : HashFunction\n{\n    public override HashMethod Method => HashMethod.XXHash32;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n        uint hash1 = Internal.XxHash32.HashToUInt32(data, 0);\n        uint hash2 = Internal.XxHash32.HashToUInt32(data, hash1);\n        for (int i = 0; i < k; i++)\n        {\n            positions[i] = ((hash1 + (i * hash2)) % m);\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashAlgorithms/XXHash64.cs",
    "content": "﻿using System;\n\nnamespace BloomFilter.HashAlgorithms;\n\npublic class XXHash64 : HashFunction\n{\n    public override HashMethod Method => HashMethod.XXHash64;\n\n    public override long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k)\n    {\n        long[] positions = new long[k];\n\n        var hash = Internal.XxHash64.HashToUInt64(data, 0);\n\n        uint hash1 = (uint)hash;\n        uint hash2 = (uint)(hash >> 32);\n\n        for (int i = 0; i < k; i++)\n        {\n            positions[i] = ((hash1 + (i * hash2)) % m);\n        }\n        return positions;\n    }\n}"
  },
  {
    "path": "src/BloomFilter/HashFunction.cs",
    "content": "﻿using BloomFilter.HashAlgorithms;\nusing System;\nusing System.Collections.Generic;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// An implemented to provide custom hash functions.\n/// </summary>\npublic abstract class HashFunction\n{\n    /// <summary>\n    /// The hash functions\n    /// </summary>\n    public static readonly IReadOnlyDictionary<HashMethod, HashFunction> Functions = new Dictionary<HashMethod, HashFunction>\n    {\n        { HashMethod.LCGWithFNV1,new LCGWithFNV() },\n        { HashMethod.LCGWithFNV1a,new LCGWithFNV1a() },\n        { HashMethod.LCGModifiedFNV1,new LCGModifiedFNV1() },\n\n        { HashMethod.RNGWithFNV1,new RNGWithFNV1() },\n        { HashMethod.RNGWithFNV1a,new RNGWithFNV1a() },\n        { HashMethod.RNGModifiedFNV1,new RNGModifiedFNV1() },\n\n        { HashMethod.CRC32,new Crc32() },\n        { HashMethod.CRC64,new Crc64() },\n        { HashMethod.Adler32,new Adler32() },\n\n        { HashMethod.Murmur3,new Murmur32BitsX86() },\n        { HashMethod.Murmur32BitsX86,new Murmur32BitsX86() },\n        { HashMethod.Murmur128BitsX64,new Murmur128BitsX64() },\n        { HashMethod.Murmur128BitsX86,new Murmur128BitsX86() },\n\n        { HashMethod.SHA1,new HashCryptoSHA1() },\n        { HashMethod.SHA256,new HashCryptoSHA256() },\n        { HashMethod.SHA384,new HashCryptoSHA384() },\n        { HashMethod.SHA512,new HashCryptoSHA512() },\n\n        { HashMethod.XXHash32,new XXHash32() },\n        { HashMethod.XXHash64,new XXHash64() },\n        { HashMethod.XXHash3,new XXHash3() },\n        { HashMethod.XXHash128,new XXHash128() },\n    };\n\n    /// <summary>\n    /// Hash Method\n    /// </summary>\n    public abstract HashMethod Method { get; }\n\n    /// <summary>\n    /// Hashes the specified value.\n    /// </summary>\n    /// <param name=\"data\">The data.</param>\n    /// <param name=\"m\">integer output range.</param>\n    /// <param name=\"k\">number of hashes to be computed.</param>\n    /// <returns>\n    /// int array of hashes hash values\n    /// </returns>\n    public abstract long[] ComputeHash(ReadOnlySpan<byte> data, long m, int k);\n}"
  },
  {
    "path": "src/BloomFilter/HashMethod.cs",
    "content": "﻿namespace BloomFilter;\n\n/// <summary>\n/// Hash Methods\n/// </summary>\npublic enum HashMethod : int\n{\n    LCGWithFNV1 = 0,\n    LCGWithFNV1a = 1,\n    LCGModifiedFNV1 = 2,\n\n    RNGWithFNV1 = 100,\n    RNGWithFNV1a = 101,\n    RNGModifiedFNV1 = 102,\n\n    CRC32 = 200,\n    CRC64 = 201,\n    Adler32 = 202,\n\n    Murmur3 = 300,\n    Murmur32BitsX86 = 301,\n    Murmur128BitsX64 = 302,\n    Murmur128BitsX86 = 303,\n\n    SHA1 = 400,\n    SHA256 = 401,\n    SHA384 = 402,\n    SHA512 = 403,\n\n    XXHash32 = 500,\n    XXHash64 = 501,\n    XXHash3 = 502,\n    XXHash128 = 503,\n}"
  },
  {
    "path": "src/BloomFilter/IBloomFilter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// Represents a Bloom filter.\n/// </summary>\npublic interface IBloomFilter : IDisposable\n{\n    /// <summary>\n    /// Gets the name specified by BloomFilter.\n    /// </summary>\n    string Name { get; }\n\n    /// <summary>\n    /// Adds the passed value to the filter.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    bool Add(ReadOnlySpan<byte> data);\n\n    /// <summary>\n    /// Async Adds the passed value to the filter.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data);\n\n    /// <summary>\n    /// Adds the specified elements.\n    /// </summary>\n    /// <param name=\"elements\">The elements.</param>\n    /// <returns></returns>\n    IList<bool> Add(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Async Adds the specified elements.\n    /// </summary>\n    /// <param name=\"elements\">The elements.</param>\n    /// <returns></returns>\n    ValueTask<IList<bool>> AddAsync(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Tests whether an element is present in the filter\n    /// </summary>\n    /// <param name=\"element\"></param>\n    /// <returns></returns>\n    bool Contains(ReadOnlySpan<byte> element);\n\n    /// <summary>\n    /// Async Tests whether an element is present in the filter\n    /// </summary>\n    /// <param name=\"element\"></param>\n    /// <returns></returns>\n    ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element);\n\n    /// <summary>\n    /// Tests whether an elements is present in the filter\n    /// </summary>\n    /// <param name=\"elements\"></param>\n    /// <returns></returns>\n    IList<bool> Contains(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Async Tests whether an elements is present in the filter\n    /// </summary>\n    /// <param name=\"elements\"></param>\n    /// <returns></returns>\n    ValueTask<IList<bool>> ContainsAsync(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Alls the specified elements.\n    /// </summary>\n    /// <param name=\"elements\">The elements.</param>\n    /// <returns></returns>\n    bool All(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Async Alls the specified elements.\n    /// </summary>\n    /// <param name=\"elements\">The elements.</param>\n    /// <returns></returns>\n    ValueTask<bool> AllAsync(IEnumerable<byte[]> elements);\n\n    /// <summary>\n    /// Removes all elements from the filter\n    /// </summary>\n    void Clear();\n\n    /// <summary>\n    /// Async Removes all elements from the filter\n    /// </summary>\n    ValueTask ClearAsync();\n\n    /// <summary>\n    ///  Hashes the specified value.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    long[] ComputeHash(ReadOnlySpan<byte> data);\n}"
  },
  {
    "path": "src/BloomFilter/IBloomFilterFactory.cs",
    "content": "﻿using System.Diagnostics.CodeAnalysis;\n\nnamespace BloomFilter;\n\n/// <summary>\n/// BloomFilter Factory\n/// </summary>\npublic interface IBloomFilterFactory\n{\n    /// <summary>\n    /// Gets the <see cref=\"IBloomFilter\"/>\n    /// </summary>\n    /// <returns>The bloomFilter.</returns>\n    /// <param name=\"name\">Name.</param>\n    IBloomFilter Get(string name);\n\n    /// <summary>\n    /// Try Gets the<see cref=\"IBloomFilter\"/>\n    /// </summary>\n    /// <param name=\"name\">Name.</param>\n    /// <param name=\"bloomFilter\">The bloomFilter</param>\n    /// <returns></returns>\n    bool TryGet(string name,\n#if NET5_0_OR_GREATER\n        [MaybeNullWhen(false)]\n#endif\n    out IBloomFilter bloomFilter);\n}"
  },
  {
    "path": "src/BloomFilter/IFilterMemorySerializer.cs",
    "content": "﻿using System.IO;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter;\n\n/// <summary>\n///  Represents a <see cref=\"FilterMemory\"/> serialization interface\n/// </summary>\npublic interface IFilterMemorySerializer\n{\n    /// <summary>\n    /// Serialize to a stream\n    /// </summary>\n    /// <param name=\"param\"></param>\n    /// <param name=\"stream\"></param>\n    /// <returns></returns>\n    ValueTask SerializeAsync(FilterMemorySerializerParam param, Stream stream);\n\n    /// <summary>\n    /// Deserialize from the stream\n    /// </summary>\n    /// <param name=\"stream\"></param>\n    /// <returns></returns>\n    ValueTask<FilterMemorySerializerParam> DeserializeAsync(Stream stream);\n}"
  },
  {
    "path": "src/BloomFilter/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Security;\n\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"931DFF3C-9F5A-4551-B36C-2300844DDDC2\")]\n\n\n#if NETSTANDARD2_1 || NET6_0_OR_GREATER || NETSTANDARD2_0 || NET40\n[assembly: AllowPartiallyTrustedCallers]\n#endif\n#if NETSTANDARD2_1 || NET6_0_OR_GREATER || NETSTANDARD2_0 || NET40 || NET45\n[assembly: SecurityRules(SecurityRuleSet.Level1)]\n#endif\n\n\n[assembly: InternalsVisibleTo(\"BloomFilterTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001004dd575590e774ea5ea5b02c96ec45feb8720721159f7d7a463680d1dcca3ddc5c5f52dd0e3f7086a6504df00571f9816545ac9ad6d402370bd6f9a395e08a9fe7ff26ce99318bab6a7fdc8233e9ce22c81d7fd75508d79bb7a93f6440656282bd7c95a3f891258075626eea022d03d0859954641424cbb15e031b6fec15541d3\")]\n[assembly: InternalsVisibleTo(\"PerformanceTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001004dd575590e774ea5ea5b02c96ec45feb8720721159f7d7a463680d1dcca3ddc5c5f52dd0e3f7086a6504df00571f9816545ac9ad6d402370bd6f9a395e08a9fe7ff26ce99318bab6a7fdc8233e9ce22c81d7fd75508d79bb7a93f6440656282bd7c95a3f891258075626eea022d03d0859954641424cbb15e031b6fec15541d3\")]\n[assembly: InternalsVisibleTo(\"BenchmarkTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001004dd575590e774ea5ea5b02c96ec45feb8720721159f7d7a463680d1dcca3ddc5c5f52dd0e3f7086a6504df00571f9816545ac9ad6d402370bd6f9a395e08a9fe7ff26ce99318bab6a7fdc8233e9ce22c81d7fd75508d79bb7a93f6440656282bd7c95a3f891258075626eea022d03d0859954641424cbb15e031b6fec15541d3\")]"
  },
  {
    "path": "src/BloomFilter/ServiceCollectionExtensions.cs",
    "content": "﻿using System;\nusing BloomFilter;\nusing BloomFilter.Configurations;\n\nnamespace Microsoft.Extensions.DependencyInjection\n{\n    public static class ServiceCollectionExtensions\n    {\n        /// <summary>\n        /// Adds the BloomFilter.\n        /// </summary>\n        /// <param name=\"services\">Services.</param>\n        /// <param name=\"setupAction\">Setup action.</param>\n        public static IServiceCollection AddBloomFilter(this IServiceCollection services, Action<BloomFilterOptions> setupAction)\n        {\n#if NET6_0_OR_GREATER\n            ArgumentNullException.ThrowIfNull(setupAction);\n#else\n            if (setupAction == null) throw new ArgumentNullException(nameof(setupAction));\n#endif\n\n            //Options and extension service\n            var options = new BloomFilterOptions();\n            setupAction(options);\n            foreach (var serviceExtension in options.Extensions)\n            {\n                serviceExtension.AddServices(services);\n            }\n            services.AddSingleton(options);\n\n            return services;\n        }\n\n        /// <summary>\n        /// Uses the in-memory.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"setupActions\"></param>\n        public static BloomFilterOptions UseInMemory(this BloomFilterOptions options,\n            string name = BloomFilterConstValue.DefaultInMemoryName, Action<FilterMemoryOptions>? setupActions = null)\n        {\n            var filterMemoryOptions = new FilterMemoryOptions\n            {\n                Name = name\n            };\n            setupActions?.Invoke(filterMemoryOptions);\n            options.RegisterExtension(new FilterMemoryOptionsExtension(filterMemoryOptions));\n            return options;\n        }\n\n        /// <summary>\n        /// Uses the in-memory.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"filterMemoryOptions\"></param>\n        public static BloomFilterOptions UseInMemory(this BloomFilterOptions options, FilterMemoryOptions filterMemoryOptions)\n        {\n#if NET6_0_OR_GREATER\n            ArgumentNullException.ThrowIfNull(filterMemoryOptions);\n#else\n            if (filterMemoryOptions == null) throw new ArgumentNullException(nameof(filterMemoryOptions));\n#endif\n            options.RegisterExtension(new FilterMemoryOptionsExtension(filterMemoryOptions));\n            return options;\n        }\n\n        /// <summary>\n        /// Uses the in-memory.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"setupActions\"></param>\n        public static BloomFilterOptions UseInMemoryWithSerializer<TSerializer>(this BloomFilterOptions options,\n            string name = BloomFilterConstValue.DefaultInMemoryName, Action<FilterMemoryOptions>? setupActions = null)\n            where TSerializer : IFilterMemorySerializer\n        {\n            var filterMemoryOptions = new FilterMemoryOptions\n            {\n                Name = name\n            };\n            setupActions?.Invoke(filterMemoryOptions);\n            options.RegisterExtension(new FilterMemoryOptionsExtension(filterMemoryOptions, typeof(TSerializer)));\n            return options;\n        }\n\n        /// <summary>\n        /// Uses the in-memory.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"filterMemoryOptions\"></param>\n        public static BloomFilterOptions UseInMemoryWithSerializer<TSerializer>(this BloomFilterOptions options, FilterMemoryOptions filterMemoryOptions)\n              where TSerializer : IFilterMemorySerializer\n        {\n#if NET6_0_OR_GREATER\n            ArgumentNullException.ThrowIfNull(filterMemoryOptions);\n#else\n            if (filterMemoryOptions == null) throw new ArgumentNullException(nameof(filterMemoryOptions));\n#endif\n            options.RegisterExtension(new FilterMemoryOptionsExtension(filterMemoryOptions, typeof(TSerializer)));\n            return options;\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter/StringSpanExtensions.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace BloomFilter;\n\ninternal static class StringSpanExtensions\n{\n    public static ReadOnlyMemory<byte> ToUtf8(this ReadOnlySpan<char> value)\n    {\n#if NET6_0_OR_GREATER\n        Memory<byte> bytes = new byte[Encoding.UTF8.GetByteCount(value)];\n        var bytesWritten = Encoding.UTF8.GetBytes(value, bytes.Span);\n        return bytes.Slice(0, bytesWritten);\n\n#else\n        var chars = value.ToArray();\n        var bytes = new byte[Encoding.UTF8.GetByteCount(chars)];\n        var bytesWritten = Encoding.UTF8.GetBytes(chars, 0, value.Length, bytes, 0);\n        return new ReadOnlyMemory<byte>(bytes, 0, bytesWritten);\n#endif\n    }\n\n    public static ReadOnlyMemory<char> FromUtf8(this ReadOnlySpan<byte> source)\n    {\n#if NET6_0_OR_GREATER\n        source = source.WithoutBom();\n        Memory<char> chars = new char[Encoding.UTF8.GetCharCount(source)];\n        var charsWritten = Encoding.UTF8.GetChars(source, chars.Span);\n        return chars.Slice(0, charsWritten);\n#else\n        var bytes = source.WithoutBom().ToArray();\n        var chars = new char[Encoding.UTF8.GetCharCount(bytes)];\n        var charsWritten = Encoding.UTF8.GetChars(bytes, 0, bytes.Length, chars, 0);\n        return new ReadOnlyMemory<char>(chars, 0, charsWritten);\n\n#endif\n    }\n\n    public static byte[] ToUtf8Bytes(this ReadOnlySpan<char> value)\n    {\n        return ToUtf8(value).ToArray();\n    }\n\n    public static ReadOnlySpan<char> WithoutBom(this ReadOnlySpan<char> value)\n    {\n        return value.Length > 0 && value[0] == 65279\n            ? value.Slice(1)\n            : value;\n    }\n\n    public static ReadOnlySpan<byte> WithoutBom(this ReadOnlySpan<byte> value)\n    {\n        return value.Length > 3 && value[0] == 0xEF && value[1] == 0xBB && value[2] == 0xBF\n            ? value.Slice(3)\n            : value;\n    }\n}"
  },
  {
    "path": "src/BloomFilter.CSRedis/BloomFilter.CSRedis.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\t<PropertyGroup>\n\t\t<AssemblyName>BloomFilter.CSRedis</AssemblyName>\n\t\t<AssemblyTitle>BloomFilter.CSRedis</AssemblyTitle>\n\t\t<PackageId>BloomFilter.CSRedis.NetCore</PackageId>\n\t\t<TargetFrameworks>net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>\n\t\t<AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n\t\t<GenerateDocumentationFile>true</GenerateDocumentationFile>\n\t\t<Nullable>enable</Nullable>\n\t\t<NullableReferenceTypes>true</NullableReferenceTypes>\n\t\t<NoWarn>$(NoWarn);CS1591</NoWarn>\n\t</PropertyGroup>\n\t<ItemGroup>\n\t\t<PackageReference Include=\"CSRedisCore\" />\n\t</ItemGroup>\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\BloomFilter\\BloomFilter.csproj\" />\n\t</ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/BloomFilter.CSRedis/Configurations/FilterCSRedisOptions.cs",
    "content": "﻿using BloomFilter.Configurations;\nusing CSRedis;\nusing System;\nusing System.Collections.Generic;\n\nnamespace BloomFilter.CSRedis.Configurations\n{\n    public class FilterCSRedisOptions : FilterMemoryOptions\n    {\n        /// <summary>\n        /// The Name\n        /// </summary>\n        public new string Name { get; set; } = BloomFilterConstValue.DefaultRedisName;\n\n        /// <summary>\n        /// The Redis Key\n        /// </summary>\n        public string RedisKey { get; set; } = \"BloomFilter.Core\";\n\n        /// <summary>\n        /// Gets or sets the node rule.\n        /// </summary>\n        public Func<string, string>? NodeRule { get; set; }\n\n        /// <summary>\n        /// Gets or sets the connection strings.\n        /// </summary>\n        public List<string>? ConnectionStrings { get; set; }\n\n        /// <summary>\n        /// Gets or sets the sentinels settings.\n        /// </summary>\n        public List<string>? Sentinels { get; set; }\n\n        /// <summary>\n        /// Gets or sets the read write setting for sentinel mode.\n        /// </summary>\n        public bool ReadOnly { get; set; }\n\n        /// <summary>\n        /// Shared CSRedisClient\n        /// </summary>\n        public CSRedisClient? Client { get; set; }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.CSRedis/Configurations/FilterCSRedisOptionsExtension.cs",
    "content": "﻿using BloomFilter.Configurations;\nusing CSRedis;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.DependencyInjection.Extensions;\nusing System.Linq;\nusing System;\n\nnamespace BloomFilter.CSRedis.Configurations\n{\n    public class FilterCSRedisOptionsExtension : IBloomFilterOptionsExtension\n    {\n        private readonly FilterCSRedisOptions _options;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"FilterCSRedisOptionsExtension\"/> class.\n        /// </summary>\n        /// <param name=\"options\">Configure.</param>\n        public FilterCSRedisOptionsExtension(FilterCSRedisOptions options)\n        {\n            _options = options;\n        }\n\n        public void AddServices(IServiceCollection services)\n        {\n            services.TryAddSingleton<IBloomFilterFactory, DefaultBloomFilterFactory>();\n\n            services.AddSingleton<IBloomFilter, FilterCSRedis>(x =>\n            {\n                FilterCSRedis createFilter(CSRedisClient client)\n                {\n                    return new FilterCSRedis(\n                        _options.Name,\n                        client,\n                        _options.RedisKey,\n                        _options.ExpectedElements,\n                        _options.ErrorRate,\n                        HashFunction.Functions[_options.Method]);\n                }\n\n                if (_options.Client != null)\n                {\n                    return createFilter(_options.Client);\n                }\n\n                if (_options.ConnectionStrings == null || _options.ConnectionStrings.Count == 0)\n                {\n                    throw new ArgumentException($\"{nameof(FilterCSRedisOptions.ConnectionStrings)} is Empty!\");\n                }\n\n                if (_options.Sentinels != null && _options.Sentinels.Any())\n                {\n                    var redisClient = new CSRedisClient(_options.ConnectionStrings[0], _options.Sentinels.ToArray(), _options.ReadOnly);\n                    return createFilter(redisClient);\n                }\n\n                if (_options.ConnectionStrings.Count == 1)\n                {\n                    var redisClient = new CSRedisClient(_options.ConnectionStrings[0]);\n                    return createFilter(redisClient);\n                }\n                else\n                {\n                    if (_options.NodeRule == null)\n                    {\n                        throw new ArgumentNullException(nameof(FilterCSRedisOptions.NodeRule));\n                    }\n\n                    var redisClient = new CSRedisClient(_options.NodeRule, _options.ConnectionStrings.ToArray());\n                    return createFilter(redisClient);\n                }\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.CSRedis/Configurations/ServiceCollectionExtensions.cs",
    "content": "﻿using BloomFilter;\nusing BloomFilter.Configurations;\nusing BloomFilter.CSRedis.Configurations;\nusing System;\n\nnamespace Microsoft.Extensions.DependencyInjection\n{\n    public static class ServiceCollectionExtensions\n    {\n        /// <summary>\n        /// Uses the redis.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"setupActions\"></param>\n        public static BloomFilterOptions UseCSRedis(this BloomFilterOptions options,\n            string name = BloomFilterConstValue.DefaultRedisName, Action<FilterCSRedisOptions>? setupActions = null)\n        {\n            var filterRedisOptions = new FilterCSRedisOptions\n            {\n                Name = name\n            };\n            setupActions?.Invoke(filterRedisOptions);\n            options.RegisterExtension(new FilterCSRedisOptionsExtension(filterRedisOptions));\n            return options;\n        }\n\n        /// <summary>\n        /// Uses the redis.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"filterRedisOptions\"></param>\n        public static BloomFilterOptions UseCSRedis(this BloomFilterOptions options, FilterCSRedisOptions filterRedisOptions)\n        {\n            if (filterRedisOptions == null) throw new ArgumentNullException(nameof(filterRedisOptions));\n            options.RegisterExtension(new FilterCSRedisOptionsExtension(filterRedisOptions));\n            return options;\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.CSRedis/FilterCSRedis.cs",
    "content": "using CSRedis;\nusing System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter.CSRedis;\n\n/// <summary>\n/// Bloom Filter Redis Implementation using CSRedisCore\n/// </summary>\npublic class FilterCSRedis : FilterRedisBase\n{\n    private readonly CSRedisClient _client;\n    private readonly string _redisKey;\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterCSRedis\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"client\">The <see cref=\"CSRedisClient\"/>.</param>\n    /// <param name=\"redisKey\">The redisKey.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    public FilterCSRedis(string name, CSRedisClient client, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction)\n        : base(name, expectedElements, errorRate, hashFunction)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey));\n        _client = client ?? throw new ArgumentNullException(nameof(client));\n        _redisKey = redisKey;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterCSRedis\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"client\">The <see cref=\"CSRedisClient\"/>.</param>\n    /// <param name=\"redisKey\">The redisKey.</param>\n    /// <param name=\"capacity\">The capacity.</param>\n    /// <param name=\"hashes\">The hashes.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    public FilterCSRedis(string name, CSRedisClient client, string redisKey, long capacity, int hashes, HashFunction hashFunction)\n        : base(name, capacity, hashes, hashFunction)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey));\n        _client = client ?? throw new ArgumentNullException(nameof(client));\n        _redisKey = redisKey;\n    }\n\n    // Implement abstract methods - CSRedis specific operations\n\n    protected override bool SetBit(long position)\n        => _client.SetBit(_redisKey, (uint)position, true);\n\n    protected override bool GetBit(long position)\n        => _client.GetBit(_redisKey, (uint)position);\n\n    protected override async Task<bool> SetBitAsync(long position)\n        => await _client.SetBitAsync(_redisKey, (uint)position, true);\n\n    protected override async Task<bool> GetBitAsync(long position)\n        => await _client.GetBitAsync(_redisKey, (uint)position);\n\n    protected override bool[] SetBits(long[] positions)\n    {\n        // Use pipeline for batch execution\n        using var pipe = _client.StartPipe();\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            pipe.SetBit(_redisKey, (uint)positions[i], true);\n        }\n\n        var pipeResults = pipe.EndPipe();\n        var results = new bool[positions.Length];\n\n        for (int i = 0; i < pipeResults.Length; i++)\n        {\n            results[i] = Convert.ToBoolean(pipeResults[i]);\n        }\n\n        return results;\n    }\n\n    protected override bool[] GetBits(long[] positions)\n    {\n        // Use pipeline for batch execution\n        using var pipe = _client.StartPipe();\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            pipe.GetBit(_redisKey, (uint)positions[i]);\n        }\n\n        var pipeResults = pipe.EndPipe();\n        var results = new bool[positions.Length];\n\n        for (int i = 0; i < pipeResults.Length; i++)\n        {\n            results[i] = Convert.ToBoolean(pipeResults[i]);\n        }\n\n        return results;\n    }\n\n    protected override async Task<bool[]> SetBitsAsync(long[] positions)\n    {\n        // Execute all operations in parallel\n        var tasks = new Task<bool>[positions.Length];\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            tasks[i] = _client.SetBitAsync(_redisKey, (uint)positions[i], true);\n        }\n\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n\n        var results = new bool[tasks.Length];\n        for (int i = 0; i < tasks.Length; i++)\n        {\n            results[i] = tasks[i].Result;\n        }\n\n        return results;\n    }\n\n    protected override async Task<bool[]> GetBitsAsync(long[] positions)\n    {\n        // Execute all operations in parallel\n        var tasks = new Task<bool>[positions.Length];\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            tasks[i] = _client.GetBitAsync(_redisKey, (uint)positions[i]);\n        }\n\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n\n        var results = new bool[tasks.Length];\n        for (int i = 0; i < tasks.Length; i++)\n        {\n            results[i] = tasks[i].Result;\n        }\n\n        return results;\n    }\n\n    protected override void ClearBits()\n        => _client.Del(_redisKey);\n\n    protected override async Task ClearBitsAsync()\n        => await _client.DelAsync(_redisKey);\n\n    // Single element operations\n\n    public override bool Add(ReadOnlySpan<byte> data)\n    {\n        var positions = ComputeHash(data);\n        return SetBits(positions).Any(a => !a);\n    }\n\n    public override async ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data)\n    {\n        var positions = ComputeHash(data.Span);\n        var results = await SetBitsAsync(positions);\n        return results.Any(a => !a);\n    }\n\n    public override bool Contains(ReadOnlySpan<byte> element)\n    {\n        var positions = ComputeHash(element);\n        return GetBits(positions).All(a => a);\n    }\n\n    public override async ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)\n    {\n        var positions = ComputeHash(element.Span);\n        var results = await GetBitsAsync(positions);\n        return results.All(a => a);\n    }\n\n    public override void Dispose()\n    {\n        _client.Dispose();\n    }\n}\n"
  },
  {
    "path": "src/BloomFilter.CSRedis/FilterCSRedisBuilder.cs",
    "content": "using CSRedis;\nusing System;\n\nnamespace BloomFilter.CSRedis;\n\n/// <summary>\n/// BloomFilter CSRedis Builder - Supports both static factory methods and fluent API\n/// </summary>\n/// <example>\n/// Fluent API:\n/// <code>\n/// var filter = FilterCSRedisBuilder.Create()\n///     .WithRedisClient(csredisClient)\n///     .WithRedisKey(\"bloom:users\")\n///     .WithName(\"UserFilter\")\n///     .ExpectingElements(10_000_000)\n///     .WithErrorRate(0.001)\n///     .UsingHashMethod(HashMethod.XXHash3)\n///     .BuildCSRedis();\n/// </code>\n/// </example>\npublic class FilterCSRedisBuilder : FilterBuilder\n{\n    #region Fluent API - Instance Members\n\n    private string? _redisKey;\n    private CSRedisClient? _client;\n\n    /// <summary>\n    /// Sets the Redis key for the Bloom Filter\n    /// </summary>\n    /// <param name=\"redisKey\">The Redis key</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentException\">Thrown when redisKey is null or whitespace</exception>\n    public FilterCSRedisBuilder WithRedisKey(string redisKey)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey))\n            throw new ArgumentException(\"Redis key cannot be null or whitespace\", nameof(redisKey));\n        _redisKey = redisKey;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the CSRedis client\n    /// </summary>\n    /// <param name=\"client\">The CSRedisClient instance</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when client is null</exception>\n    public FilterCSRedisBuilder WithRedisClient(CSRedisClient client)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(client);\n#else\n        if (client == null)\n            throw new ArgumentNullException(nameof(client));\n#endif\n        _client = client;\n        return this;\n    }\n\n    /// <summary>\n    /// Builds a CSRedis-backed Bloom Filter with the configured settings\n    /// </summary>\n    /// <returns>A new IBloomFilter instance backed by CSRedis</returns>\n    /// <exception cref=\"InvalidOperationException\">Thrown when required configuration is missing</exception>\n    public IBloomFilter BuildCSRedis()\n    {\n        if (string.IsNullOrWhiteSpace(_redisKey))\n            throw new InvalidOperationException(\"Redis key must be specified using WithRedisKey()\");\n\n        if (_client == null)\n            throw new InvalidOperationException(\"CSRedis client must be specified using WithRedisClient()\");\n\n        // Get hash function from base class configuration\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n\n        return new FilterCSRedis(_name, _client, _redisKey!, _expectedElements, _errorRate, hashFunction);\n    }\n\n    /// <summary>\n    /// Builds a CSRedis-backed Bloom Filter with explicit capacity and hash count (advanced usage)\n    /// </summary>\n    /// <param name=\"capacity\">The bit array capacity</param>\n    /// <param name=\"hashes\">The number of hash functions</param>\n    /// <returns>A new IBloomFilter instance backed by CSRedis</returns>\n    /// <exception cref=\"InvalidOperationException\">Thrown when required configuration is missing</exception>\n    public IBloomFilter BuildCSRedisWithCapacity(long capacity, int hashes)\n    {\n        if (string.IsNullOrWhiteSpace(_redisKey))\n            throw new InvalidOperationException(\"Redis key must be specified using WithRedisKey()\");\n\n        if (_client == null)\n            throw new InvalidOperationException(\"CSRedis client must be specified using WithRedisClient()\");\n\n        // Get hash function from base class configuration\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n\n        return new FilterCSRedis(_name, _client, _redisKey!, capacity, hashes, hashFunction);\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "src/BloomFilter.EasyCaching/BloomFilter.EasyCaching.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\t<PropertyGroup>\n\t\t<AssemblyName>BloomFilter.EasyCaching</AssemblyName>\n\t\t<AssemblyTitle>BloomFilter.EasyCaching</AssemblyTitle>\n\t\t<PackageId>BloomFilter.EasyCaching.NetCore</PackageId>\n\t\t<TargetFrameworks>net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>\n\t\t<AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n\t\t<GenerateDocumentationFile>true</GenerateDocumentationFile>\n\t\t<Nullable>enable</Nullable>\n\t\t<NullableReferenceTypes>true</NullableReferenceTypes>\n\t\t<NoWarn>$(NoWarn);CS1591</NoWarn>\n\t</PropertyGroup>\n\t<ItemGroup>\n\t\t<PackageReference Include=\"EasyCaching.Core\" />\n\t</ItemGroup>\n\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\BloomFilter\\BloomFilter.csproj\" />\n\t</ItemGroup>\n\n\t<PropertyGroup>\n\t\t<SignAssembly>False</SignAssembly>\n\t</PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "src/BloomFilter.EasyCaching/Configurations/FilterEasyCachingRedisExtension.cs",
    "content": "﻿using BloomFilter.Configurations;\nusing BloomFilter.EasyCaching;\nusing EasyCaching.Core;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.DependencyInjection.Extensions;\n\nnamespace BloomFilter.CSRedis.Configurations\n{\n    public class FilterEasyCachingRedisExtension : IBloomFilterOptionsExtension\n    {\n        private readonly FilterEasyCachingRedisOptions _options;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"FilterEasyCachingRedisExtension\"/> class.\n        /// </summary>\n        /// <param name=\"options\">Configure.</param>\n        public FilterEasyCachingRedisExtension(FilterEasyCachingRedisOptions options)\n        {\n            _options = options;\n        }\n\n        public void AddServices(IServiceCollection services)\n        {\n            services.TryAddSingleton<IBloomFilterFactory, DefaultBloomFilterFactory>();\n\n            services.AddSingleton<IBloomFilter, FilterEasyCachingRedis>(x =>\n            {\n                var provider = x.GetRequiredService<IRedisCachingProvider>();\n\n                if (!string.IsNullOrWhiteSpace(_options.ProviderName))\n                {\n                    var factory = x.GetRequiredService<IEasyCachingProviderFactory>();\n                    provider = factory.GetRedisProvider(_options.ProviderName);\n                }\n\n                return new FilterEasyCachingRedis(\n                        _options.Name,\n                        provider,\n                        _options.RedisKey,\n                        _options.ExpectedElements,\n                        _options.ErrorRate,\n                        HashFunction.Functions[_options.Method]);\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.EasyCaching/Configurations/FilterEasyCachingRedisOptions.cs",
    "content": "﻿using BloomFilter.Configurations;\nusing EasyCaching.Core;\n\nnamespace BloomFilter.CSRedis.Configurations\n{\n    public class FilterEasyCachingRedisOptions : FilterMemoryOptions\n    {\n        /// <summary>\n        /// The Name\n        /// </summary>\n        public new string Name { get; set; } = BloomFilterConstValue.DefaultRedisName;\n\n        /// <summary>\n        /// The Redis Key\n        /// </summary>\n        public string RedisKey { get; set; } = \"BloomFilter.Core\";\n\n        /// <summary>\n        /// The <see cref=\"IRedisCachingProvider\"/> Name\n        /// </summary>\n        public string? ProviderName { get; set; }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.EasyCaching/Configurations/ServiceCollectionExtensions.cs",
    "content": "﻿using BloomFilter;\nusing BloomFilter.Configurations;\nusing BloomFilter.CSRedis.Configurations;\nusing System;\n\nnamespace Microsoft.Extensions.DependencyInjection\n{\n    public static class ServiceCollectionExtensions\n    {\n        /// <summary>\n        /// Uses the EasyCaching redis.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"setupActions\"></param>\n        public static BloomFilterOptions UseEasyCachingRedis(this BloomFilterOptions options,\n            string name = BloomFilterConstValue.DefaultRedisName, Action<FilterEasyCachingRedisOptions>? setupActions = null)\n        {\n            var filterRedisOptions = new FilterEasyCachingRedisOptions\n            {\n                Name = name\n            };\n            setupActions?.Invoke(filterRedisOptions);\n            options.RegisterExtension(new FilterEasyCachingRedisExtension(filterRedisOptions));\n            return options;\n        }\n\n        /// <summary>\n        /// Uses the EasyCaching redis.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"filterRedisOptions\"></param>\n        public static BloomFilterOptions UseEasyCachingRedis(this BloomFilterOptions options, FilterEasyCachingRedisOptions filterRedisOptions)\n        {\n            if (filterRedisOptions == null) throw new ArgumentNullException(nameof(filterRedisOptions));\n            options.RegisterExtension(new FilterEasyCachingRedisExtension(filterRedisOptions));\n            return options;\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.EasyCaching/FilterEasyCachingBuilder.cs",
    "content": "using EasyCaching.Core;\nusing System;\n\nnamespace BloomFilter.EasyCaching;\n\n/// <summary>\n/// BloomFilter EasyCaching Builder - Supports both static factory methods and fluent API\n/// </summary>\n/// <example>\n/// Fluent API:\n/// <code>\n/// var filter = FilterEasyCachingBuilder.Create()\n///     .WithRedisCachingProvider(provider)\n///     .WithRedisKey(\"bloom:users\")\n///     .WithName(\"UserFilter\")\n///     .ExpectingElements(10_000_000)\n///     .WithErrorRate(0.001)\n///     .UsingHashMethod(HashMethod.XXHash3)\n///     .BuildEasyCaching();\n/// </code>\n/// </example>\npublic class FilterEasyCachingBuilder : FilterBuilder\n{\n    #region Fluent API - Instance Members\n\n    private string? _redisKey;\n    private IRedisCachingProvider? _provider;\n\n    /// <summary>\n    /// Sets the Redis key for the Bloom Filter\n    /// </summary>\n    /// <param name=\"redisKey\">The Redis key</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentException\">Thrown when redisKey is null or whitespace</exception>\n    public FilterEasyCachingBuilder WithRedisKey(string redisKey)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey))\n            throw new ArgumentException(\"Redis key cannot be null or whitespace\", nameof(redisKey));\n        _redisKey = redisKey;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the EasyCaching Redis caching provider\n    /// </summary>\n    /// <param name=\"provider\">The IRedisCachingProvider instance</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when provider is null</exception>\n    public FilterEasyCachingBuilder WithRedisCachingProvider(IRedisCachingProvider provider)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(provider);\n#else\n        if (provider == null)\n            throw new ArgumentNullException(nameof(provider));\n#endif\n        _provider = provider;\n        return this;\n    }\n\n    /// <summary>\n    /// Builds an EasyCaching-backed Bloom Filter with the configured settings\n    /// </summary>\n    /// <returns>A new IBloomFilter instance backed by EasyCaching</returns>\n    /// <exception cref=\"InvalidOperationException\">Thrown when required configuration is missing</exception>\n    public IBloomFilter BuildEasyCaching()\n    {\n        if (string.IsNullOrWhiteSpace(_redisKey))\n            throw new InvalidOperationException(\"Redis key must be specified using WithRedisKey()\");\n\n        if (_provider == null)\n            throw new InvalidOperationException(\"Redis caching provider must be specified using WithRedisCachingProvider()\");\n\n        // Get hash function from base class configuration\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n\n        return new FilterEasyCachingRedis(_name, _provider, _redisKey!, _expectedElements, _errorRate, hashFunction);\n    }\n\n    /// <summary>\n    /// Builds an EasyCaching-backed Bloom Filter with explicit capacity and hash count (advanced usage)\n    /// </summary>\n    /// <param name=\"capacity\">The bit array capacity</param>\n    /// <param name=\"hashes\">The number of hash functions</param>\n    /// <returns>A new IBloomFilter instance backed by EasyCaching</returns>\n    /// <exception cref=\"InvalidOperationException\">Thrown when required configuration is missing</exception>\n    public IBloomFilter BuildEasyCachingWithCapacity(long capacity, int hashes)\n    {\n        if (string.IsNullOrWhiteSpace(_redisKey))\n            throw new InvalidOperationException(\"Redis key must be specified using WithRedisKey()\");\n\n        if (_provider == null)\n            throw new InvalidOperationException(\"Redis caching provider must be specified using WithRedisCachingProvider()\");\n\n        // Get hash function from base class configuration\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n\n        return new FilterEasyCachingRedis(_name, _provider, _redisKey!, capacity, hashes, hashFunction);\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "src/BloomFilter.EasyCaching/FilterEasyCachingRedis.cs",
    "content": "﻿using EasyCaching.Core;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter.EasyCaching;\n\n/// <summary>\n/// Bloom Filter Redis Implementation using EasyCaching\n/// </summary>\npublic class FilterEasyCachingRedis : FilterRedisBase\n{\n    private readonly string _redisKey;\n    private readonly IRedisCachingProvider _provider;\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterEasyCachingRedis\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"provider\">The <see cref=\"IRedisCachingProvider\"/>.</param>\n    /// <param name=\"redisKey\">The redisKey.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    public FilterEasyCachingRedis(string name, IRedisCachingProvider provider, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction)\n        : base(name, expectedElements, errorRate, hashFunction)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey));\n        _provider = provider ?? throw new ArgumentNullException(nameof(provider));\n        _redisKey = redisKey;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterEasyCachingRedis\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"provider\">The <see cref=\"IRedisCachingProvider\"/>.</param>\n    /// <param name=\"redisKey\">The redisKey.</param>\n    /// <param name=\"capacity\">The capacity.</param>\n    /// <param name=\"hashes\">The hashes.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    public FilterEasyCachingRedis(string name, IRedisCachingProvider provider, string redisKey, long capacity, int hashes, HashFunction hashFunction)\n        : base(name, capacity, hashes, hashFunction)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey));\n        _provider = provider ?? throw new ArgumentNullException(nameof(provider));\n        _redisKey = redisKey;\n    }\n\n    // Implement abstract methods - EasyCaching specific operations\n\n    protected override bool SetBit(long position)\n    {\n        var result = _provider.Eval(\"return redis.call('SETBIT', KEYS[1], ARGV[1], 1)\",\n            _redisKey, new object[] { position }.ToList());\n        return result.ToString() == \"1\";\n    }\n\n    protected override bool GetBit(long position)\n    {\n        var result = _provider.Eval(\"return redis.call('GETBIT', KEYS[1], ARGV[1])\",\n            _redisKey, new object[] { position }.ToList());\n        return result.ToString() == \"1\";\n    }\n\n    protected override async Task<bool> SetBitAsync(long position)\n    {\n        var result = await _provider.EvalAsync(\"return redis.call('SETBIT', KEYS[1], ARGV[1], 1)\",\n            _redisKey, new object[] { position }.ToList()).ConfigureAwait(false);\n        return result.ToString() == \"1\";\n    }\n\n    protected override async Task<bool> GetBitAsync(long position)\n    {\n        var result = await _provider.EvalAsync(\"return redis.call('GETBIT', KEYS[1], ARGV[1])\",\n            _redisKey, new object[] { position }.ToList()).ConfigureAwait(false);\n        return result.ToString() == \"1\";\n    }\n\n    protected override bool[] SetBits(long[] positions)\n    {\n        // Use Lua script for batch execution\n        const string luaScript = @\"\nlocal results = {}\nfor i, pos in ipairs(ARGV) do\n    results[i] = redis.call('SETBIT', KEYS[1], pos, 1)\nend\nreturn results\";\n\n        var result = _provider.Eval(luaScript, _redisKey, positions.Cast<object>().ToList());\n\n        if (result is object[] resultArray)\n        {\n            var results = new bool[resultArray.Length];\n            for (int i = 0; i < resultArray.Length; i++)\n            {\n                results[i] = resultArray[i].ToString() == \"1\";\n            }\n            return results;\n        }\n\n        // Fallback: if Lua script fails, use sequential execution\n        var fallbackResults = new bool[positions.Length];\n        for (int i = 0; i < positions.Length; i++)\n        {\n            var singleResult = _provider.Eval(\"return redis.call('SETBIT', KEYS[1], ARGV[1], 1)\",\n                _redisKey, new object[] { positions[i] }.ToList());\n            fallbackResults[i] = singleResult.ToString() == \"1\";\n        }\n        return fallbackResults;\n    }\n\n    protected override bool[] GetBits(long[] positions)\n    {\n        // Use Lua script for batch execution\n        const string luaScript = @\"\nlocal results = {}\nfor i, pos in ipairs(ARGV) do\n    results[i] = redis.call('GETBIT', KEYS[1], pos)\nend\nreturn results\";\n\n        var result = _provider.Eval(luaScript, _redisKey, positions.Cast<object>().ToList());\n\n        if (result is object[] resultArray)\n        {\n            var results = new bool[resultArray.Length];\n            for (int i = 0; i < resultArray.Length; i++)\n            {\n                results[i] = resultArray[i].ToString() == \"1\";\n            }\n            return results;\n        }\n\n        // Fallback: if Lua script fails, use sequential execution\n        var fallbackResults = new bool[positions.Length];\n        for (int i = 0; i < positions.Length; i++)\n        {\n            var singleResult = _provider.Eval(\"return redis.call('GETBIT', KEYS[1], ARGV[1])\",\n                _redisKey, new object[] { positions[i] }.ToList());\n            fallbackResults[i] = singleResult.ToString() == \"1\";\n        }\n        return fallbackResults;\n    }\n\n    protected override async Task<bool[]> SetBitsAsync(long[] positions)\n    {\n        // Use Lua script for batch execution\n        const string luaScript = @\"\nlocal results = {}\nfor i, pos in ipairs(ARGV) do\n    results[i] = redis.call('SETBIT', KEYS[1], pos, 1)\nend\nreturn results\";\n\n        var result = await _provider.EvalAsync(luaScript, _redisKey, positions.Cast<object>().ToList()).ConfigureAwait(false);\n\n        if (result is object[] resultArray)\n        {\n            var results = new bool[resultArray.Length];\n            for (int i = 0; i < resultArray.Length; i++)\n            {\n                results[i] = resultArray[i].ToString() == \"1\";\n            }\n            return results;\n        }\n\n        // Fallback: if Lua script fails, use parallel execution\n        var tasks = new Task<object>[positions.Length];\n        for (int i = 0; i < positions.Length; i++)\n        {\n            tasks[i] = _provider.EvalAsync(\"return redis.call('SETBIT', KEYS[1], ARGV[1], 1)\",\n                _redisKey, new object[] { positions[i] }.ToList());\n        }\n\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n\n        var fallbackResults = new bool[tasks.Length];\n        for (int i = 0; i < tasks.Length; i++)\n        {\n            fallbackResults[i] = tasks[i].Result.ToString() == \"1\";\n        }\n        return fallbackResults;\n    }\n\n    protected override async Task<bool[]> GetBitsAsync(long[] positions)\n    {\n        // Use Lua script for batch execution\n        const string luaScript = @\"\nlocal results = {}\nfor i, pos in ipairs(ARGV) do\n    results[i] = redis.call('GETBIT', KEYS[1], pos)\nend\nreturn results\";\n\n        var result = await _provider.EvalAsync(luaScript, _redisKey, positions.Cast<object>().ToList()).ConfigureAwait(false);\n\n        if (result is object[] resultArray)\n        {\n            var results = new bool[resultArray.Length];\n            for (int i = 0; i < resultArray.Length; i++)\n            {\n                results[i] = resultArray[i].ToString() == \"1\";\n            }\n            return results;\n        }\n\n        // Fallback: if Lua script fails, use parallel execution\n        var tasks = new Task<object>[positions.Length];\n        for (int i = 0; i < positions.Length; i++)\n        {\n            tasks[i] = _provider.EvalAsync(\"return redis.call('GETBIT', KEYS[1], ARGV[1])\",\n                _redisKey, new object[] { positions[i] }.ToList());\n        }\n\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n\n        var fallbackResults = new bool[tasks.Length];\n        for (int i = 0; i < tasks.Length; i++)\n        {\n            fallbackResults[i] = tasks[i].Result.ToString() == \"1\";\n        }\n        return fallbackResults;\n    }\n\n    protected override void ClearBits()\n        => _provider.KeyDel(_redisKey);\n\n    protected override async Task ClearBitsAsync()\n        => await _provider.KeyDelAsync(_redisKey);\n\n    // Single element operations\n\n    public override bool Add(ReadOnlySpan<byte> element)\n    {\n        var positions = ComputeHash(element);\n        return SetBits(positions).Any(a => !a);\n    }\n\n    public override async ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data)\n    {\n        var positions = ComputeHash(data.Span);\n        var results = await SetBitsAsync(positions);\n        return results.Any(a => !a);\n    }\n\n    public override bool Contains(ReadOnlySpan<byte> element)\n    {\n        var positions = ComputeHash(element);\n        return GetBits(positions).All(a => a);\n    }\n\n    public override async ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)\n    {\n        var positions = ComputeHash(element.Span);\n        var results = await GetBitsAsync(positions);\n        return results.All(a => a);\n    }\n\n    public override void Dispose()\n    {\n    }\n}"
  },
  {
    "path": "src/BloomFilter.FreeRedis/BloomFilter.FreeRedis.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\t<PropertyGroup>\n\t\t<AssemblyName>BloomFilter.FreeRedis</AssemblyName>\n\t\t<AssemblyTitle>BloomFilter.FreeRedis</AssemblyTitle>\n\t\t<PackageId>BloomFilter.FreeRedis.NetCore</PackageId>\n\t\t<TargetFrameworks>net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>\n\t\t<AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n\t\t<GenerateDocumentationFile>true</GenerateDocumentationFile>\n\t\t<Nullable>enable</Nullable>\n\t\t<NullableReferenceTypes>true</NullableReferenceTypes>\n\t\t<NoWarn>$(NoWarn);CS1591</NoWarn>\n\t</PropertyGroup>\n\t<ItemGroup>\n\t\t<PackageReference Include=\"FreeRedis\" />\n\t</ItemGroup>\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\BloomFilter\\BloomFilter.csproj\" />\n\t</ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/BloomFilter.FreeRedis/Configurations/FilterFreeRedisOptions.cs",
    "content": "﻿using BloomFilter.Configurations;\nusing FreeRedis;\nusing System;\nusing System.Collections.Generic;\n\nnamespace BloomFilter.FreeRedis.Configurations\n{\n    public class FilterFreeRedisOptions : FilterMemoryOptions\n    {\n        /// <summary>\n        /// The Name\n        /// </summary>\n        public new string Name { get; set; } = BloomFilterConstValue.DefaultRedisName;\n\n        /// <summary>\n        /// The Redis Key\n        /// </summary>\n        public string RedisKey { get; set; } = \"BloomFilter.Core\";\n\n        /// <summary>\n        /// Gets or sets the connection strings.\n        /// </summary>\n        public List<string>? ConnectionStrings { get; set; }\n\n        /// <summary>\n        /// Gets or sets the sentinels settings.\n        /// </summary>\n        public List<string>? Sentinels { get; set; }\n\n        /// <summary>\n        /// Gets or sets the read write setting for sentinel mode.\n        /// </summary>\n        public bool ReadOnly { get; set; }\n\n        /// <summary>\n        /// Shared CSRedisClient\n        /// </summary>\n        public RedisClient? Client { get; set; }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.FreeRedis/Configurations/FilterFreeRedisOptionsExtension.cs",
    "content": "﻿using BloomFilter.Configurations;\nusing FreeRedis;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.DependencyInjection.Extensions;\nusing System;\nusing System.Linq;\n\nnamespace BloomFilter.FreeRedis.Configurations\n{\n    public class FilterFreeRedisOptionsExtension : IBloomFilterOptionsExtension\n    {\n        private readonly FilterFreeRedisOptions _options;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"FilterFreeRedisOptionsExtension\"/> class.\n        /// </summary>\n        /// <param name=\"options\">Configure.</param>\n        public FilterFreeRedisOptionsExtension(FilterFreeRedisOptions options)\n        {\n            _options = options;\n        }\n\n        public void AddServices(IServiceCollection services)\n        {\n            services.TryAddSingleton<IBloomFilterFactory, DefaultBloomFilterFactory>();\n\n            services.AddSingleton<IBloomFilter, FilterFreeRedis>(x =>\n            {\n                FilterFreeRedis createFilter(RedisClient client)\n                {\n                    return new FilterFreeRedis(\n                        _options.Name,\n                        client,\n                        _options.RedisKey,\n                        _options.ExpectedElements,\n                        _options.ErrorRate,\n                        HashFunction.Functions[_options.Method]);\n                }\n\n                if (_options.Client != null)\n                {\n                    return createFilter(_options.Client);\n                }\n\n                if (_options.ConnectionStrings == null || _options.ConnectionStrings.Count == 0)\n                {\n                    throw new ArgumentException($\"{nameof(FilterFreeRedisOptions.ConnectionStrings)} is Empty!\");\n                }\n\n                if (_options.Sentinels != null && _options.Sentinels.Any())\n                {\n                    var redisClient = new RedisClient(_options.ConnectionStrings[0], _options.Sentinels.ToArray(), _options.ReadOnly);\n                    return createFilter(redisClient);\n                }\n\n                if (_options.ConnectionStrings.Count == 1)\n                {\n                    var redisClient = new RedisClient(_options.ConnectionStrings[0]);\n                    return createFilter(redisClient);\n                }\n                else\n                {\n                    var redisClient = new RedisClient(_options.ConnectionStrings.Select(a => (ConnectionStringBuilder)a).ToArray());\n                    return createFilter(redisClient);\n                }\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.FreeRedis/Configurations/ServiceCollectionExtensions.cs",
    "content": "﻿using BloomFilter;\nusing BloomFilter.Configurations;\nusing BloomFilter.FreeRedis.Configurations;\nusing System;\n\nnamespace Microsoft.Extensions.DependencyInjection\n{\n    public static class ServiceCollectionExtensions\n    {\n        /// <summary>\n        /// Uses the redis.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"setupActions\"></param>\n        public static BloomFilterOptions UseFreeRedis(this BloomFilterOptions options,\n            string name = BloomFilterConstValue.DefaultRedisName, Action<FilterFreeRedisOptions>? setupActions = null)\n        {\n            var filterRedisOptions = new FilterFreeRedisOptions\n            {\n                Name = name\n            };\n            setupActions?.Invoke(filterRedisOptions);\n            options.RegisterExtension(new FilterFreeRedisOptionsExtension(filterRedisOptions));\n            return options;\n        }\n\n        /// <summary>\n        /// Uses the redis.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"filterRedisOptions\"></param>\n        public static BloomFilterOptions UseFreeRedis(this BloomFilterOptions options, FilterFreeRedisOptions filterRedisOptions)\n        {\n            if (filterRedisOptions == null) throw new ArgumentNullException(nameof(filterRedisOptions));\n            options.RegisterExtension(new FilterFreeRedisOptionsExtension(filterRedisOptions));\n            return options;\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.FreeRedis/FilterFreeRedis.cs",
    "content": "﻿using FreeRedis;\nusing System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter.FreeRedis;\n\n/// <summary>\n/// Bloom Filter Redis Implementation using FreeRedis\n/// </summary>\npublic class FilterFreeRedis : FilterRedisBase\n{\n    private readonly RedisClient _client;\n    private readonly string _redisKey;\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterFreeRedis\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"client\">The <see cref=\"RedisClient\"/>.</param>\n    /// <param name=\"redisKey\">The redisKey.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    public FilterFreeRedis(string name, RedisClient client, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction)\n        : base(name, expectedElements, errorRate, hashFunction)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey));\n        _client = client ?? throw new ArgumentNullException(nameof(client));\n        _redisKey = redisKey;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterFreeRedis\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"client\">The <see cref=\"RedisClient\"/>.</param>\n    /// <param name=\"redisKey\">The redisKey.</param>\n    /// <param name=\"capacity\">The capacity.</param>\n    /// <param name=\"hashes\">The hashes.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    public FilterFreeRedis(string name, RedisClient client, string redisKey, long capacity, int hashes, HashFunction hashFunction)\n        : base(name, capacity, hashes, hashFunction)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey));\n        _client = client ?? throw new ArgumentNullException(nameof(client));\n        _redisKey = redisKey;\n    }\n\n    // Implement abstract methods - FreeRedis specific operations\n\n    protected override bool SetBit(long position)\n        => _client.SetBit(_redisKey, position, true) == 1;\n\n    protected override bool GetBit(long position)\n        => _client.GetBit(_redisKey, position);\n\n    protected override async Task<bool> SetBitAsync(long position)\n        => await _client.SetBitAsync(_redisKey, position, true) == 1;\n\n    protected override async Task<bool> GetBitAsync(long position)\n        => await _client.GetBitAsync(_redisKey, position);\n\n    protected override bool[] SetBits(long[] positions)\n    {\n        // Use pipeline for batch execution\n        using var pipe = _client.StartPipe();\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            pipe.SetBit(_redisKey, positions[i], true);\n        }\n\n        var pipeResults = pipe.EndPipe();\n        var results = new bool[positions.Length];\n\n        for (int i = 0; i < pipeResults.Length; i++)\n        {\n            results[i] = Convert.ToInt64(pipeResults[i]) == 1;\n        }\n\n        return results;\n    }\n\n    protected override bool[] GetBits(long[] positions)\n    {\n        // Use pipeline for batch execution\n        using var pipe = _client.StartPipe();\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            pipe.GetBit(_redisKey, positions[i]);\n        }\n\n        var pipeResults = pipe.EndPipe();\n        var results = new bool[positions.Length];\n\n        for (int i = 0; i < pipeResults.Length; i++)\n        {\n            results[i] = Convert.ToBoolean(pipeResults[i]);\n        }\n\n        return results;\n    }\n\n    protected override async Task<bool[]> SetBitsAsync(long[] positions)\n    {\n        // Execute all operations in parallel\n        var tasks = new Task<long>[positions.Length];\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            tasks[i] = _client.SetBitAsync(_redisKey, positions[i], true);\n        }\n\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n\n        var results = new bool[tasks.Length];\n        for (int i = 0; i < tasks.Length; i++)\n        {\n            results[i] = tasks[i].Result == 1;\n        }\n\n        return results;\n    }\n\n    protected override async Task<bool[]> GetBitsAsync(long[] positions)\n    {\n        // Execute all operations in parallel\n        var tasks = new Task<bool>[positions.Length];\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            tasks[i] = _client.GetBitAsync(_redisKey, positions[i]);\n        }\n\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n\n        var results = new bool[tasks.Length];\n        for (int i = 0; i < tasks.Length; i++)\n        {\n            results[i] = tasks[i].Result;\n        }\n\n        return results;\n    }\n\n    protected override void ClearBits()\n        => _client.Del(_redisKey);\n\n    protected override async Task ClearBitsAsync()\n        => await _client.DelAsync(_redisKey);\n\n    // Single element operations\n\n    public override bool Add(ReadOnlySpan<byte> data)\n    {\n        var positions = ComputeHash(data);\n        return SetBits(positions).Any(a => !a);\n    }\n\n    public override async ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data)\n    {\n        var positions = ComputeHash(data.Span);\n        var results = await SetBitsAsync(positions);\n        return results.Any(a => !a);\n    }\n\n    public override bool Contains(ReadOnlySpan<byte> element)\n    {\n        var positions = ComputeHash(element);\n        return GetBits(positions).All(a => a);\n    }\n\n    public override async ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)\n    {\n        var positions = ComputeHash(element.Span);\n        var results = await GetBitsAsync(positions);\n        return results.All(a => a);\n    }\n\n    public override void Dispose()\n    {\n        _client.Dispose();\n    }\n}"
  },
  {
    "path": "src/BloomFilter.FreeRedis/FilterFreeRedisBuilder.cs",
    "content": "using FreeRedis;\nusing System;\n\nnamespace BloomFilter.FreeRedis;\n\n/// <summary>\n/// BloomFilter FreeRedis Builder - Supports both static factory methods and fluent API\n/// </summary>\n/// <example>\n/// Fluent API:\n/// <code>\n/// var filter = FilterFreeRedisBuilder.Create()\n///     .WithRedisClient(redisClient)\n///     .WithRedisKey(\"bloom:users\")\n///     .WithName(\"UserFilter\")\n///     .ExpectingElements(10_000_000)\n///     .WithErrorRate(0.001)\n///     .UsingHashMethod(HashMethod.XXHash3)\n///     .BuildFreeRedis();\n/// </code>\n/// </example>\npublic class FilterFreeRedisBuilder : FilterBuilder\n{\n    #region Fluent API - Instance Members\n\n    private string? _redisKey;\n    private RedisClient? _client;\n\n    /// <summary>\n    /// Sets the Redis key for the Bloom Filter\n    /// </summary>\n    /// <param name=\"redisKey\">The Redis key</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentException\">Thrown when redisKey is null or whitespace</exception>\n    public FilterFreeRedisBuilder WithRedisKey(string redisKey)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey))\n            throw new ArgumentException(\"Redis key cannot be null or whitespace\", nameof(redisKey));\n        _redisKey = redisKey;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the FreeRedis client\n    /// </summary>\n    /// <param name=\"client\">The RedisClient instance</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when client is null</exception>\n    public FilterFreeRedisBuilder WithRedisClient(RedisClient client)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(client);\n#else\n        if (client == null)\n            throw new ArgumentNullException(nameof(client));\n#endif\n        _client = client;\n        return this;\n    }\n\n    /// <summary>\n    /// Builds a FreeRedis-backed Bloom Filter with the configured settings\n    /// </summary>\n    /// <returns>A new IBloomFilter instance backed by FreeRedis</returns>\n    /// <exception cref=\"InvalidOperationException\">Thrown when required configuration is missing</exception>\n    public IBloomFilter BuildFreeRedis()\n    {\n        if (string.IsNullOrWhiteSpace(_redisKey))\n            throw new InvalidOperationException(\"Redis key must be specified using WithRedisKey()\");\n\n        if (_client == null)\n            throw new InvalidOperationException(\"FreeRedis client must be specified using WithRedisClient()\");\n\n        // Get hash function from base class configuration\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n\n        return new FilterFreeRedis(_name, _client, _redisKey!, _expectedElements, _errorRate, hashFunction);\n    }\n\n    /// <summary>\n    /// Builds a FreeRedis-backed Bloom Filter with explicit capacity and hash count (advanced usage)\n    /// </summary>\n    /// <param name=\"capacity\">The bit array capacity</param>\n    /// <param name=\"hashes\">The number of hash functions</param>\n    /// <returns>A new IBloomFilter instance backed by FreeRedis</returns>\n    /// <exception cref=\"InvalidOperationException\">Thrown when required configuration is missing</exception>\n    public IBloomFilter BuildFreeRedisWithCapacity(long capacity, int hashes)\n    {\n        if (string.IsNullOrWhiteSpace(_redisKey))\n            throw new InvalidOperationException(\"Redis key must be specified using WithRedisKey()\");\n\n        if (_client == null)\n            throw new InvalidOperationException(\"FreeRedis client must be specified using WithRedisClient()\");\n\n        // Get hash function from base class configuration\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n\n        return new FilterFreeRedis(_name, _client, _redisKey!, capacity, hashes, hashFunction);\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "src/BloomFilter.Redis/BloomFilter.Redis.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\t<PropertyGroup>\n\t\t<AssemblyName>BloomFilter.Redis</AssemblyName>\n\t\t<AssemblyTitle>BloomFilter.Redis</AssemblyTitle>\n\t\t<PackageId>BloomFilter.Redis.NetCore</PackageId>\n\t\t<TargetFrameworks>net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>\n\t\t<AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n\t\t<GenerateDocumentationFile>true</GenerateDocumentationFile>\n\t\t<Nullable>enable</Nullable>\n\t\t<NullableReferenceTypes>true</NullableReferenceTypes>\n\t\t<NoWarn>$(NoWarn);CS1591</NoWarn>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<PackageReference Include=\"StackExchange.Redis\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\BloomFilter\\BloomFilter.csproj\" />\n\t</ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/BloomFilter.Redis/Configurations/FilterRedisOptions.cs",
    "content": "﻿using BloomFilter.Configurations;\nusing StackExchange.Redis;\nusing System.Collections.Generic;\n\nnamespace BloomFilter.Redis.Configurations\n{\n    public class FilterRedisOptions : FilterMemoryOptions\n    {\n        /// <summary>\n        /// The Name\n        /// </summary>\n        public new string Name { get; set; } = BloomFilterConstValue.DefaultRedisName;\n\n        /// <summary>\n        /// The Redis Key\n        /// </summary>\n        public string RedisKey { get; set; } = \"BloomFilter.Core\";\n\n        /// <summary>\n        /// Gets or sets the Redis database index the cache will use.\n        /// </summary>\n        public int Database { get; set; } = 0;\n\n        /// <summary>\n        /// Gets or sets the username to be used to connect to the Redis server.\n        /// </summary>\n        public string? Username { get; set; }\n\n        /// <summary>\n        /// Gets or sets the password to be used to connect to the Redis server.\n        /// </summary>\n        public string? Password { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to use SSL encryption.\n        /// </summary>\n        public bool IsSsl { get; set; } = false;\n\n        /// <summary>\n        /// Gets or sets the SSL Host.\n        /// If set, it will enforce this particular host on the server's certificate.\n        /// </summary>\n        public string? SslHost { get; set; }\n\n        /// <summary>\n        /// Gets or sets the timeout for any connect operations.\n        /// </summary>\n        public int ConnectionTimeout { get; set; } = 5_000;\n\n        /// <summary>\n        /// Gets the list of endpoints to be used to connect to the Redis server.\n        /// see: IP:Port\n        /// </summary>\n        public IList<string> Endpoints { get; set; } = new List<string>();\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this FilterRedisOptions\n        /// allow admin.\n        /// </summary>\n        public bool AllowAdmin { get; set; } = false;\n\n        /// <summary>\n        /// Gets or sets the string configuration.\n        /// </summary>\n        public string? Configuration { get; set; }\n\n        /// <summary>\n        /// Shared IConnectionMultiplexer\n        /// </summary>\n        public IConnectionMultiplexer? Connection { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this FilterRedisOptions\n        /// abort on connect fail.\n        /// </summary>\n        public bool AbortOnConnectFail { get; set; } = false;\n    }\n}"
  },
  {
    "path": "src/BloomFilter.Redis/Configurations/FilterRedisOptionsExtension.cs",
    "content": "﻿using BloomFilter.Configurations;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.DependencyInjection.Extensions;\nusing StackExchange.Redis;\n\nnamespace BloomFilter.Redis.Configurations\n{\n    public class FilterRedisOptionsExtension : IBloomFilterOptionsExtension\n    {\n        private readonly FilterRedisOptions _options;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"FilterRedisOptionsExtension\"/> class.\n        /// </summary>\n        /// <param name=\"options\">Configure.</param>\n        public FilterRedisOptionsExtension(FilterRedisOptions options)\n        {\n            _options = options;\n        }\n\n        public void AddServices(IServiceCollection services)\n        {\n            services.TryAddSingleton<IBloomFilterFactory, DefaultBloomFilterFactory>();\n\n            services.AddSingleton<IBloomFilter, FilterRedis>(x =>\n            {\n                IRedisBitOperate redisBitOperate;\n\n                if (_options.Connection != null)\n                {\n                    redisBitOperate = new RedisBitOperate(_options.Connection);\n                }\n                else if (!string.IsNullOrWhiteSpace(_options.Configuration))\n                {\n                    redisBitOperate = new RedisBitOperate(_options.Configuration!);\n                }\n                else\n                {\n                    var configurationOptions = new ConfigurationOptions\n                    {\n                        ConnectTimeout = _options.ConnectionTimeout,\n                        User = _options.Username,\n                        Password = _options.Password,\n                        Ssl = _options.IsSsl,\n                        SslHost = _options.SslHost,\n                        AllowAdmin = _options.AllowAdmin,\n                        DefaultDatabase = _options.Database,\n                        AbortOnConnectFail = _options.AbortOnConnectFail,\n                    };\n\n                    foreach (var endpoint in _options.Endpoints)\n                    {\n                        configurationOptions.EndPoints.Add(endpoint);\n                    }\n\n                    redisBitOperate = new RedisBitOperate(configurationOptions);\n                }\n\n                return new FilterRedis(\n                      _options.Name,\n                      redisBitOperate,\n                      _options.RedisKey,\n                      _options.ExpectedElements,\n                      _options.ErrorRate,\n                      HashFunction.Functions[_options.Method]);\n            });\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.Redis/Configurations/ServiceCollectionExtensions.cs",
    "content": "﻿using BloomFilter;\nusing BloomFilter.Configurations;\nusing BloomFilter.Redis.Configurations;\nusing System;\n\nnamespace Microsoft.Extensions.DependencyInjection\n{\n    public static class ServiceCollectionExtensions\n    {\n        /// <summary>\n        /// Uses the redis.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"setupActions\"></param>\n        public static BloomFilterOptions UseRedis(this BloomFilterOptions options,\n            string name = BloomFilterConstValue.DefaultRedisName, Action<FilterRedisOptions>? setupActions = null)\n        {\n            var filterRedisOptions = new FilterRedisOptions\n            {\n                Name = name\n            };\n            setupActions?.Invoke(filterRedisOptions);\n            options.RegisterExtension(new FilterRedisOptionsExtension(filterRedisOptions));\n            return options;\n        }\n\n        /// <summary>\n        /// Uses the redis.\n        /// </summary>\n        /// <param name=\"options\">Options.</param>\n        /// <param name=\"filterRedisOptions\"></param>\n        public static BloomFilterOptions UseRedis(this BloomFilterOptions options, FilterRedisOptions filterRedisOptions)\n        {\n            if (filterRedisOptions == null) throw new ArgumentNullException(nameof(filterRedisOptions));\n            options.RegisterExtension(new FilterRedisOptionsExtension(filterRedisOptions));\n            return options;\n        }\n    }\n}"
  },
  {
    "path": "src/BloomFilter.Redis/FilterRedis.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter.Redis;\n\n/// <summary>\n/// Bloom Filter Redis Implementation using StackExchange.Redis\n/// </summary>\npublic class FilterRedis : FilterRedisBase\n{\n    private readonly IRedisBitOperate _redisBitOperate;\n    private readonly string _redisKey;\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterRedis\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"redisBitOperate\">The redis bit operate.</param>\n    /// <param name=\"redisKey\">The redisKey.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    public FilterRedis(string name, IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction)\n        : base(name, expectedElements, errorRate, hashFunction)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey));\n        _redisBitOperate = redisBitOperate ?? throw new ArgumentNullException(nameof(redisBitOperate));\n        _redisKey = redisKey;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"FilterRedis\"/> class.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"redisBitOperate\">The redis bit operate.</param>\n    /// <param name=\"redisKey\">The redisKey.</param>\n    /// <param name=\"capacity\">The capacity.</param>\n    /// <param name=\"hashes\">The hashes.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    public FilterRedis(string name, IRedisBitOperate redisBitOperate, string redisKey, long capacity, int hashes, HashFunction hashFunction)\n        : base(name, capacity, hashes, hashFunction)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey));\n        _redisBitOperate = redisBitOperate ?? throw new ArgumentNullException(nameof(redisBitOperate));\n        _redisKey = redisKey;\n    }\n\n    // Implement abstract methods - StackExchange.Redis specific operations\n\n    protected override bool SetBit(long position)\n        => _redisBitOperate.Set(_redisKey, position, true);\n\n    protected override bool GetBit(long position)\n        => _redisBitOperate.Get(_redisKey, position);\n\n    protected override async Task<bool> SetBitAsync(long position)\n        => await _redisBitOperate.SetAsync(_redisKey, position, true);\n\n    protected override async Task<bool> GetBitAsync(long position)\n        => await _redisBitOperate.GetAsync(_redisKey, position);\n\n    protected override bool[] SetBits(long[] positions)\n        => _redisBitOperate.Set(_redisKey, positions, true);\n\n    protected override bool[] GetBits(long[] positions)\n        => _redisBitOperate.Get(_redisKey, positions);\n\n    protected override async Task<bool[]> SetBitsAsync(long[] positions)\n        => await _redisBitOperate.SetAsync(_redisKey, positions, true);\n\n    protected override async Task<bool[]> GetBitsAsync(long[] positions)\n        => await _redisBitOperate.GetAsync(_redisKey, positions);\n\n    protected override void ClearBits()\n        => _redisBitOperate.Clear(_redisKey);\n\n    protected override async Task ClearBitsAsync()\n        => await _redisBitOperate.ClearAsync(_redisKey);\n\n    // Single element operations (not part of base class - keep existing implementation)\n\n    /// <summary>\n    /// Adds the passed value to the filter.\n    /// </summary>\n    /// <param name=\"data\"></param>\n    /// <returns></returns>\n    public override bool Add(ReadOnlySpan<byte> data)\n    {\n        var positions = ComputeHash(data);\n        var results = _redisBitOperate.Set(_redisKey, positions, true);\n        return results.Any(a => !a);\n    }\n\n    public override async ValueTask<bool> AddAsync(ReadOnlyMemory<byte> data)\n    {\n        var positions = ComputeHash(data.Span);\n        var results = await _redisBitOperate.SetAsync(_redisKey, positions, true);\n        return results.Any(a => !a);\n    }\n\n    /// <summary>\n    /// Tests whether an element is present in the filter\n    /// </summary>\n    /// <param name=\"element\"></param>\n    /// <returns></returns>\n    public override bool Contains(ReadOnlySpan<byte> element)\n    {\n        var positions = ComputeHash(element);\n        var results = _redisBitOperate.Get(_redisKey, positions);\n        return results.All(a => a);\n    }\n\n    public override async ValueTask<bool> ContainsAsync(ReadOnlyMemory<byte> element)\n    {\n        var positions = ComputeHash(element.Span);\n        var results = await _redisBitOperate.GetAsync(_redisKey, positions);\n        return results.All(a => a);\n    }\n\n    public override void Dispose()\n    {\n        _redisBitOperate.Dispose();\n    }\n}\n"
  },
  {
    "path": "src/BloomFilter.Redis/FilterRedisBuilder.cs",
    "content": "﻿using StackExchange.Redis;\nusing System;\n\nnamespace BloomFilter.Redis;\n\n/// <summary>\n/// BloomFilter Redis Builder - Supports both static factory methods and fluent API\n/// </summary>\n/// <example>\n/// Static API:\n/// <code>\n/// var filter = FilterRedisBuilder.Build(connectionString, \"bloom:users\", 10_000_000, 0.001);\n/// </code>\n///\n/// Fluent API:\n/// <code>\n/// var filter = FilterRedisBuilder.Create()\n///     .WithRedisConnection(connectionString)\n///     .WithRedisKey(\"bloom:users\")\n///     .WithName(\"UserFilter\")\n///     .ExpectingElements(10_000_000)\n///     .WithErrorRate(0.001)\n///     .UsingHashMethod(HashMethod.XXHash3)\n///     .BuildRedis();\n/// </code>\n/// </example>\npublic class FilterRedisBuilder : FilterBuilder\n{\n    #region Fluent API - Instance Members\n\n    private string? _redisKey;\n    private IRedisBitOperate? _redisBitOperate;\n    private string? _connectionString;\n    private ConfigurationOptions? _configurationOptions;\n    private IConnectionMultiplexer? _connectionMultiplexer;\n\n    /// <summary>\n    /// Sets the Redis key for the Bloom Filter\n    /// </summary>\n    /// <param name=\"redisKey\">The Redis key</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentException\">Thrown when redisKey is null or whitespace</exception>\n    public FilterRedisBuilder WithRedisKey(string redisKey)\n    {\n        if (string.IsNullOrWhiteSpace(redisKey))\n            throw new ArgumentException(\"Redis key cannot be null or whitespace\", nameof(redisKey));\n        _redisKey = redisKey;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the Redis connection using a connection string\n    /// </summary>\n    /// <param name=\"connectionString\">The Redis connection string</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentException\">Thrown when connectionString is null or whitespace</exception>\n    public FilterRedisBuilder WithRedisConnection(string connectionString)\n    {\n        if (string.IsNullOrWhiteSpace(connectionString))\n            throw new ArgumentException(\"Connection string cannot be null or whitespace\", nameof(connectionString));\n        _connectionString = connectionString;\n        _configurationOptions = null;\n        _connectionMultiplexer = null;\n        _redisBitOperate = null;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the Redis connection using ConfigurationOptions\n    /// </summary>\n    /// <param name=\"options\">The Redis configuration options</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when options is null</exception>\n    public FilterRedisBuilder WithRedisConnection(ConfigurationOptions options)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(options);\n#else\n        if (options == null)\n            throw new ArgumentNullException(nameof(options));\n#endif\n        _configurationOptions = options;\n        _connectionString = null;\n        _connectionMultiplexer = null;\n        _redisBitOperate = null;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets the Redis connection using an existing IConnectionMultiplexer\n    /// </summary>\n    /// <param name=\"connection\">The Redis connection multiplexer</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when connection is null</exception>\n    public FilterRedisBuilder WithRedisConnection(IConnectionMultiplexer connection)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(connection);\n#else\n        if (connection == null)\n            throw new ArgumentNullException(nameof(connection));\n#endif\n        _connectionMultiplexer = connection;\n        _connectionString = null;\n        _configurationOptions = null;\n        _redisBitOperate = null;\n        return this;\n    }\n\n    /// <summary>\n    /// Sets a custom IRedisBitOperate implementation\n    /// </summary>\n    /// <param name=\"redisBitOperate\">The Redis bit operate implementation</param>\n    /// <returns>The builder for method chaining</returns>\n    /// <exception cref=\"ArgumentNullException\">Thrown when redisBitOperate is null</exception>\n    public FilterRedisBuilder WithRedisBitOperate(IRedisBitOperate redisBitOperate)\n    {\n#if NET6_0_OR_GREATER\n        ArgumentNullException.ThrowIfNull(redisBitOperate);\n#else\n        if (redisBitOperate == null)\n            throw new ArgumentNullException(nameof(redisBitOperate));\n#endif\n        _redisBitOperate = redisBitOperate;\n        _connectionString = null;\n        _configurationOptions = null;\n        _connectionMultiplexer = null;\n        return this;\n    }\n\n    /// <summary>\n    /// Builds a Redis-backed Bloom Filter with the configured settings\n    /// </summary>\n    /// <returns>A new IBloomFilter instance backed by Redis</returns>\n    /// <exception cref=\"InvalidOperationException\">Thrown when required configuration is missing</exception>\n    public IBloomFilter BuildRedis()\n    {\n        if (string.IsNullOrWhiteSpace(_redisKey))\n            throw new InvalidOperationException(\"Redis key must be specified using WithRedisKey()\");\n\n        // Get hash function from base class configuration\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n\n        // Determine Redis bit operate instance\n        IRedisBitOperate bitOperate;\n        if (_redisBitOperate != null)\n        {\n            bitOperate = _redisBitOperate;\n        }\n        else if (_connectionMultiplexer != null)\n        {\n            bitOperate = new RedisBitOperate(_connectionMultiplexer);\n        }\n        else if (_configurationOptions != null)\n        {\n            bitOperate = new RedisBitOperate(_configurationOptions);\n        }\n        else if (!string.IsNullOrWhiteSpace(_connectionString))\n        {\n            bitOperate = new RedisBitOperate(_connectionString!);\n        }\n        else\n        {\n            throw new InvalidOperationException(\"Redis connection must be specified using WithRedisConnection() or WithRedisBitOperate()\");\n        }\n\n        return new FilterRedis(_name, bitOperate, _redisKey!, _expectedElements, _errorRate, hashFunction);\n    }\n\n    /// <summary>\n    /// Builds a Redis-backed Bloom Filter with explicit capacity and hash count (advanced usage)\n    /// </summary>\n    /// <param name=\"capacity\">The bit array capacity</param>\n    /// <param name=\"hashes\">The number of hash functions</param>\n    /// <returns>A new IBloomFilter instance backed by Redis</returns>\n    /// <exception cref=\"InvalidOperationException\">Thrown when required configuration is missing</exception>\n    public IBloomFilter BuildRedisWithCapacity(long capacity, int hashes)\n    {\n        if (string.IsNullOrWhiteSpace(_redisKey))\n            throw new InvalidOperationException(\"Redis key must be specified using WithRedisKey()\");\n\n        // Get hash function from base class configuration\n        var hashFunction = _customHashFunction ?? HashFunction.Functions[_method];\n\n        // Determine Redis bit operate instance\n        IRedisBitOperate bitOperate;\n        if (_redisBitOperate != null)\n        {\n            bitOperate = _redisBitOperate;\n        }\n        else if (_connectionMultiplexer != null)\n        {\n            bitOperate = new RedisBitOperate(_connectionMultiplexer);\n        }\n        else if (_configurationOptions != null)\n        {\n            bitOperate = new RedisBitOperate(_configurationOptions);\n        }\n        else if (!string.IsNullOrWhiteSpace(_connectionString))\n        {\n            bitOperate = new RedisBitOperate(_connectionString!);\n        }\n        else\n        {\n            throw new InvalidOperationException(\"Redis connection must be specified using WithRedisConnection() or WithRedisBitOperate()\");\n        }\n\n        return new FilterRedis(_name, bitOperate, _redisKey!, capacity, hashes, hashFunction);\n    }\n\n    #endregion\n\n    #region Static Factory Methods (Legacy API - Backward Compatible)\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(configuration, redisKey, expectedElements, 0.01, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(configuration, redisKey, expectedElements, 0.01, hashMethod, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(configuration, redisKey, expectedElements, 0.01, hashFunction, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(configuration, redisKey, expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return new FilterRedis(name, new RedisBitOperate(configuration), redisKey, expectedElements, errorRate, HashFunction.Functions[hashMethod]);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return new FilterRedis(name, new RedisBitOperate(configuration), redisKey, expectedElements, errorRate, hashFunction);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(configuration, redisKey, expectedElements, 0.01, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(configuration, redisKey, expectedElements, 0.01, hashMethod, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(configuration, redisKey, expectedElements, 0.01, hashFunction, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(configuration, redisKey, expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return new FilterRedis(name, new RedisBitOperate(configuration), redisKey, expectedElements, errorRate, HashFunction.Functions[hashMethod]);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return new FilterRedis(name, new RedisBitOperate(configuration), redisKey, expectedElements, errorRate, hashFunction);\n    }\n\n    /// <summary>\n    /// Builds the specified connection.\n    /// </summary>\n    /// <param name=\"connection\">The connection.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(connection, redisKey, expectedElements, 0.01, hashMethod, name);\n    }\n\n    /// <summary>\n    /// Builds the specified connectionn.\n    /// </summary>\n    /// <param name=\"connectionn\">The connectionn.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IConnectionMultiplexer connectionn, string redisKey, long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(connectionn, redisKey, expectedElements, 0.01, hashFunction, name);\n    }\n\n    /// <summary>\n    /// Builds the specified connection.\n    /// </summary>\n    /// <param name=\"connection\">The connection.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(connection, redisKey, expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name);\n    }\n\n    /// <summary>\n    /// Builds the specified connection.\n    /// </summary>\n    /// <param name=\"connection\">The connection.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(connection, redisKey, expectedElements, 0.01, HashFunction.Functions[HashMethod.Murmur3], name);\n    }\n\n    /// <summary>\n    /// Builds the specified connection.\n    /// </summary>\n    /// <param name=\"connection\">The connection.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return new FilterRedis(name, new RedisBitOperate(connection), redisKey, expectedElements, errorRate, HashFunction.Functions[hashMethod]);\n    }\n\n    /// <summary>\n    /// Builds the specified connection.\n    /// </summary>\n    /// <param name=\"connection\">The connection.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return new FilterRedis(name, new RedisBitOperate(connection), redisKey, expectedElements, errorRate, hashFunction);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"redisBitOperate\">The redis bit operate.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(redisBitOperate, redisKey, expectedElements, 0.01, hashMethod, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"redisBitOperate\">The redis bit operate.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(redisBitOperate, redisKey, expectedElements, 0.01, hashFunction, name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"redisBitOperate\">The redis bit operate.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(redisBitOperate, redisKey, expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"redisBitOperate\">The redis bit operate.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return Build(redisBitOperate, redisKey, expectedElements, 0.01, HashFunction.Functions[HashMethod.Murmur3], name);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"redisBitOperate\">The redis bit operate.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashMethod\">The hash method.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return new FilterRedis(name, redisBitOperate, redisKey, expectedElements, errorRate, HashFunction.Functions[hashMethod]);\n    }\n\n    /// <summary>\n    /// Creates a BloomFilter Redis for the specified expected element\n    /// </summary>\n    /// <param name=\"redisBitOperate\">The redis bit operate.</param>\n    /// <param name=\"redisKey\">The redis key.</param>\n    /// <param name=\"expectedElements\">The expected elements.</param>\n    /// <param name=\"errorRate\">The error rate.</param>\n    /// <param name=\"hashFunction\">The hash function.</param>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName)\n    {\n        return new FilterRedis(name, redisBitOperate, redisKey, expectedElements, errorRate, hashFunction);\n    }\n\n    #endregion\n}"
  },
  {
    "path": "src/BloomFilter.Redis/IRedisBitOperate.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter.Redis;\n\n/// <summary>\n/// Redis BitMap operate Interface\n/// </summary>\npublic interface IRedisBitOperate : IDisposable\n{\n    bool[] Set(string redisKey, long[] positions, bool value);\n\n    Task<bool[]> SetAsync(string redisKey, long[] positions, bool value);\n\n    bool Set(string redisKey, long position, bool value);\n\n    Task<bool> SetAsync(string redisKey, long position, bool value);\n\n    bool Get(string redisKey, long position);\n\n    Task<bool> GetAsync(string redisKey, long position);\n\n    bool[] Get(string redisKey, long[] positions);\n\n    Task<bool[]> GetAsync(string redisKey, long[] positions);\n\n    void Clear(string redisKey);\n\n    Task ClearAsync(string redisKey);\n}"
  },
  {
    "path": "src/BloomFilter.Redis/RedisBitOperate.cs",
    "content": "﻿using StackExchange.Redis;\nusing System;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace BloomFilter.Redis;\n\n/// <summary>\n/// Redis Bit Operate\n/// </summary>\n/// <seealso cref=\"IRedisBitOperate\" />\npublic class RedisBitOperate : IRedisBitOperate\n{\n    private volatile IConnectionMultiplexer? _connection;\n    private readonly ConfigurationOptions? _configurationOptions;\n    private readonly SemaphoreSlim _connectionLock = new(initialCount: 1, maxCount: 1);\n\n    //allow the release of connection\n    private bool allowRelease;\n    private const int TimeoutMilliseconds = 5 * 1000;\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"RedisBitOperate\"/> class.\n    /// </summary>\n    /// <param name=\"configuration\">The configuration.</param>\n    public RedisBitOperate(string configuration)\n        : this(ConfigurationOptions.Parse(configuration))\n    {\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"RedisBitOperate\"/> class.\n    /// </summary>\n    /// <param name=\"configurationOptions\">The <see cref=\"ConfigurationOptions\"/> options.</param>\n    public RedisBitOperate(ConfigurationOptions configurationOptions)\n    {\n        _configurationOptions = configurationOptions ?? throw new ArgumentNullException(nameof(configurationOptions));\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"RedisBitOperate\"/> class.\n    /// </summary>\n    /// <param name=\"connection\">The <see cref=\"IConnectionMultiplexer\"/>.</param>\n    public RedisBitOperate(IConnectionMultiplexer connection)\n    {\n        _connection = connection;\n    }\n\n    public void Clear(string redisKey)\n    {\n        Database().KeyDelete(redisKey);\n    }\n\n    public async Task ClearAsync(string redisKey)\n    {\n        var db = await DatabaseAsync();\n        await db.KeyDeleteAsync(redisKey).ConfigureAwait(false);\n    }\n\n    public bool Get(string redisKey, long position)\n    {\n        return Database().StringGetBit(redisKey, position);\n    }\n\n    public bool[] Get(string redisKey, long[] positions)\n    {\n        var results = new Task<bool>[positions.Length];\n\n        var batch = Database().CreateBatch();\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            results[i] = batch.StringGetBitAsync(redisKey, positions[i]);\n        }\n\n        batch.Execute();\n\n        if (!Task.WaitAll(results, TimeoutMilliseconds)) throw new TimeoutException();\n\n        return results.Select(r => r.Result).ToArray();\n    }\n\n    public async Task<bool> GetAsync(string redisKey, long position)\n    {\n        var db = await DatabaseAsync();\n        return await db.StringGetBitAsync(redisKey, position).ConfigureAwait(false);\n    }\n\n    public async Task<bool[]> GetAsync(string redisKey, long[] positions)\n    {\n        var db = await DatabaseAsync().ConfigureAwait(false);\n\n        // Use batch for pipeline execution\n        var batch = db.CreateBatch();\n        var tasks = new Task<bool>[positions.Length];\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            tasks[i] = batch.StringGetBitAsync(redisKey, positions[i]);\n        }\n\n        batch.Execute();\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n\n        var results = new bool[tasks.Length];\n        for (int i = 0; i < tasks.Length; i++)\n        {\n            results[i] = tasks[i].Result;\n        }\n\n        return results;\n    }\n\n    public bool[] Set(string redisKey, long[] positions, bool value)\n    {\n        var results = new Task<bool>[positions.Length];\n\n        var batch = Database().CreateBatch();\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            results[i] = batch.StringSetBitAsync(redisKey, positions[i], value);\n        }\n\n        batch.Execute();\n        if (!Task.WaitAll(results, TimeoutMilliseconds)) throw new TimeoutException();\n\n        return results.Select(r => r.Result).ToArray();\n    }\n\n    public async Task<bool[]> SetAsync(string redisKey, long[] positions, bool value)\n    {\n        var db = await DatabaseAsync().ConfigureAwait(false);\n\n        // Use batch for pipeline execution\n        var batch = db.CreateBatch();\n        var tasks = new Task<bool>[positions.Length];\n\n        for (int i = 0; i < positions.Length; i++)\n        {\n            tasks[i] = batch.StringSetBitAsync(redisKey, positions[i], value);\n        }\n\n        batch.Execute();\n        await Task.WhenAll(tasks).ConfigureAwait(false);\n\n        var results = new bool[tasks.Length];\n        for (int i = 0; i < tasks.Length; i++)\n        {\n            results[i] = tasks[i].Result;\n        }\n\n        return results;\n    }\n\n    public bool Set(string redisKey, long position, bool value)\n    {\n        return Database().StringSetBit(redisKey, position, value);\n    }\n\n    public async Task<bool> SetAsync(string redisKey, long position, bool value)\n    {\n        var db = await DatabaseAsync();\n        return await db.StringSetBitAsync(redisKey, position, value).ConfigureAwait(false);\n    }\n\n    public void Dispose()\n    {\n        if (allowRelease)\n        {\n            _connection?.Dispose();\n        }\n    }\n\n    private IDatabase Database(int? db = null)\n    {\n        return GetConnection().GetDatabase(db ?? -1);\n    }\n\n    private async Task<IDatabase> DatabaseAsync(int? db = null)\n    {\n        var conn = await GetConnectionAsync();\n        return conn.GetDatabase(db ?? -1);\n    }\n\n    private IConnectionMultiplexer GetConnection()\n    {\n        if (_connection != null && _connection.IsConnected)\n            return _connection;\n\n        try\n        {\n            _connectionLock.Wait();\n\n            if (_connection != null && _connection.IsConnected)\n                return _connection;\n\n            //Create a new connection instance\n            if (_connection == null)\n            {\n                _connection = ConnectionMultiplexer.Connect(_configurationOptions!);\n                allowRelease = true;\n            }\n            else\n            {\n                if (allowRelease)\n                {\n                    _connection.Dispose();\n                }\n\n                //If the constructor parameter USES ConnectionMultiplexer,\n                //the configuration of ConnectionMultiplexer is reused\n                _connection = ConnectionMultiplexer.Connect(_connection.Configuration);\n                allowRelease = true;\n            }\n        }\n        finally\n        {\n            _connectionLock.Release();\n        }\n\n        return _connection;\n    }\n\n    private async Task<IConnectionMultiplexer> GetConnectionAsync()\n    {\n\n        if (_connection != null && _connection.IsConnected)\n            return _connection;\n\n        await _connectionLock.WaitAsync();\n\n        try\n        {\n            if (_connection != null && _connection.IsConnected)\n                return _connection;\n\n            if (_connection == null)\n            {\n                _connection = await ConnectionMultiplexer.ConnectAsync(_configurationOptions!);\n                allowRelease = true;\n            }\n            else\n            {\n                if (allowRelease)\n                {\n                    _connection.Dispose();\n                }\n\n                _connection = await ConnectionMultiplexer.ConnectAsync(_connection.Configuration);\n                allowRelease = true;\n            }\n        }\n        finally\n        {\n            _connectionLock.Release();\n        }\n\n        return _connection;\n    }\n}"
  },
  {
    "path": "test/BenchmarkTest/BenchmarkTest.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n\t<PropertyGroup>\n\t\t<OutputType>Exe</OutputType>\n\t\t<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n\t\t<LangVersion>latest</LangVersion>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<PackageReference Include=\"BenchmarkDotNet\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\BloomFilter.CSRedis\\BloomFilter.CSRedis.csproj\" />\n\t\t<ProjectReference Include=\"..\\..\\src\\BloomFilter.FreeRedis\\BloomFilter.FreeRedis.csproj\" />\n\t\t<ProjectReference Include=\"..\\..\\src\\BloomFilter.Redis\\BloomFilter.Redis.csproj\" />\n\t\t<ProjectReference Include=\"..\\..\\src\\BloomFilter\\BloomFilter.csproj\" />\n\t</ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "test/BenchmarkTest/FreeRedisBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BloomFilter;\nusing BloomFilter.FreeRedis;\nusing FreeRedis;\nusing System.Threading.Tasks;\n\nnamespace BenchmarkTest\n{\n    [RPlotExporter, RankColumn]\n    [MinColumn, MaxColumn]\n    [MemoryDiagnoser]\n    public class FreeRedisBenchmark\n    {\n        private const int B = 64;\n        private const int KB = 1024;\n        private const int MB = 1024 * KB;\n\n        private IBloomFilter filter;\n        private byte[] data;\n\n        [Params(B, KB, MB)]\n        public int DataSize;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            uint n = 1000000;\n            var errRate = 0.01;\n\n            data = Helper.GenerateBytes(DataSize);\n            var client = new RedisClient(\"localhost\");\n            filter = new FilterFreeRedis(\n                        BloomFilterConstValue.DefaultRedisName,\n                        client,\n                        \"BloomFilter.Core\",\n                        n,\n                        errRate,\n                        HashFunction.Functions[HashMethod.Murmur3]);\n            filter.Clear();\n        }\n\n        [Benchmark]\n        public void Add()\n        {\n            filter.Add(data);\n        }\n\n        [Benchmark]\n        public async ValueTask AddAsync()\n        {\n            await filter.AddAsync(data);\n        }\n    }\n}"
  },
  {
    "path": "test/BenchmarkTest/Helper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Security.Cryptography;\nusing System.Text;\n\nnamespace BenchmarkTest\n{\n    class Helper\n    {\n        private static readonly RandomNumberGenerator Rng = RandomNumberGenerator.Create();\n        private const string Base62 = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n        public static string GenerateString(int length)\n        {\n            if (length < 0) throw new ArgumentOutOfRangeException($\"{nameof(length)} is {length}.\");\n\n            var random = new Random(Guid.NewGuid().GetHashCode());\n            return new string(\n                Enumerable.Repeat(Base62, length)\n                          .Select(s => s[random.Next(s.Length)])\n                          .ToArray());\n        }\n\n        public static byte[] GenerateBytes(int size = 4)\n        {\n            if (size < 0) throw new ArgumentOutOfRangeException($\"{nameof(size)} is {size}.\");\n\n            var buff = new byte[size];\n            Rng.GetBytes(buff);\n            return buff;\n        }\n\n        public static IList<byte[]> GenerateData(int n)\n        {\n            var random = new Random(Guid.NewGuid().GetHashCode());\n            var set = new HashSet<byte[]>();\n            var list = new List<byte[]>(n);\n            for (int i = 0; i < n; i++)\n            {\n                var data = GenerateBytes(random.Next(32, 512));\n                if (!set.Contains(data))\n                {\n                    list.Add(data);\n                }\n                set.Add(data);\n            }\n            return list;\n        }\n    }\n}\n"
  },
  {
    "path": "test/BenchmarkTest/MemoryBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BloomFilter;\n\nnamespace BenchmarkTest\n{\n    [RPlotExporter, RankColumn]\n    [MinColumn, MaxColumn]\n    [MemoryDiagnoser]\n    public class MemoryBenchmark\n    {\n        private const int B = 64;\n        private const int KB = 1024;\n        private const int MB = 1024 * KB;\n\n        private IBloomFilter filter;\n        private byte[] data;\n\n        [ParamsAllValues]\n        public HashMethod Method;\n\n        [Params(B, KB, MB)]\n        public int DataSize;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            data = Helper.GenerateBytes(DataSize);\n\n            uint n = 1000000;\n            var errRate = 0.01;\n\n            filter = FilterBuilder.Build(n, errRate, Method);\n        }\n\n        [Benchmark]\n        public void Add()\n        {\n            filter.Add(data);\n        }\n    }\n}"
  },
  {
    "path": "test/BenchmarkTest/Program.cs",
    "content": "﻿using System;\nusing System.Reflection;\nusing BenchmarkDotNet.Configs;\nusing BenchmarkDotNet.Running;\n\nnamespace BenchmarkTest\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var summary = new BenchmarkSwitcher(typeof(Program).Assembly).Run(args,\n                 ManualConfig\n                    .Create(DefaultConfig.Instance)\n                    .WithOptions(ConfigOptions.JoinSummary | ConfigOptions.DisableLogFile | ConfigOptions.DisableOptimizationsValidator));\n            //var summary = BenchmarkRunner.Run<MemoryBenchmark>();\n            Console.Read();\n        }\n    }\n}\n"
  },
  {
    "path": "test/BenchmarkTest/RedisBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BloomFilter;\nusing BloomFilter.Redis;\nusing System.Threading.Tasks;\n\nnamespace BenchmarkTest\n{\n    [RPlotExporter, RankColumn]\n    [MinColumn, MaxColumn]\n    [MemoryDiagnoser]\n    public class RedisBenchmark\n    {\n        private const int B = 64;\n        private const int KB = 1024;\n        private const int MB = 1024 * KB;\n\n        private IBloomFilter filter;\n        private byte[] data;\n\n        [Params(B, KB, MB)]\n        public int DataSize;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            uint n = 1000000;\n            var errRate = 0.01;\n\n            data = Helper.GenerateBytes(DataSize);\n            filter = FilterRedisBuilder.Build(\"localhost\", \"RedisBloomFilterTest\", n, errRate, HashMethod.Murmur3);\n            filter.Clear();\n        }\n\n        [Benchmark]\n        public void Add()\n        {\n            filter.Add(data);\n        }\n\n        [Benchmark]\n        public async ValueTask AddAsync()\n        {\n            await filter.AddAsync(data);\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilter.Redis.Test/BloomFilter.Redis.Test.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"EasyCaching.CSRedis\" />\n    <PackageReference Include=\"EasyCaching.Serialization.Json\" />\n    <PackageReference Include=\"Microsoft.Extensions.DependencyInjection\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n    <PackageReference Include=\"xunit\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter.CSRedis\\BloomFilter.CSRedis.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter.EasyCaching\\BloomFilter.EasyCaching.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter.FreeRedis\\BloomFilter.FreeRedis.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter.Redis\\BloomFilter.Redis.csproj\" />\n  </ItemGroup>\n\n\t<PropertyGroup>\n\t\t<SignAssembly>False</SignAssembly>\n\t\t<DelaySign>False</DelaySign>\n\t</PropertyGroup>\n</Project>\n"
  },
  {
    "path": "test/BloomFilter.Redis.Test/BloomFilterCSRedisTest.cs",
    "content": "using BloomFilter.CSRedis.Configurations;\nusing CSRedis;\nusing Microsoft.Extensions.DependencyInjection;\nusing System.Linq;\nusing Xunit;\n\nnamespace BloomFilter.Redis.Test\n{\n    public class BloomFilterCSRedisTest\n    {\n        [Fact]\n        public void RedisOptionsTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseCSRedis(new FilterCSRedisOptions\n                {\n                    Name = \"Redis1\",\n                    RedisKey = \"CSRedis1\",\n                    ConnectionStrings = new[] { \"localhost\" }.ToList()\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n\n            Test(provider.GetService<IBloomFilter>());\n        }\n\n        [Fact]\n        public void RedisOptionsConfigurationTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseCSRedis(new FilterCSRedisOptions\n                {\n                    Name = \"Redis2\",\n                    RedisKey = \"CSRedis2\",\n                    ConnectionStrings = new[] { \"localhost\" }.ToList()\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n\n            Test(provider.GetService<IBloomFilter>());\n        }\n\n        [Fact]\n        public void RedisOptionsSharedTest()\n        {\n            var services = new ServiceCollection();\n\n            var clint = new CSRedisClient(\"localhost\");\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseCSRedis(new FilterCSRedisOptions\n                {\n                    Name = \"Redis3\",\n                    RedisKey = \"CSRedis3\",\n                    Client = clint\n                });\n\n                setupAction.UseCSRedis(new FilterCSRedisOptions\n                {\n                    Name = \"Redis4\",\n                    RedisKey = \"CSRedis4\",\n                    Client = clint\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n            var factory = provider.GetService<IBloomFilterFactory>();\n\n            Test(provider.GetService<IBloomFilter>());\n            Test(factory.Get(\"Redis3\"));\n            Test(factory.Get(\"Redis4\"));\n        }\n\n        private void Test(IBloomFilter bf)\n        {\n            var len = 10;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n            Assert.True(bf.All(array));\n            bf.Clear();\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilter.Redis.Test/BloomFilterEasyCachingRedisTest.cs",
    "content": "using BloomFilter.CSRedis.Configurations;\nusing BloomFilter.EasyCaching;\nusing CSRedis;\nusing EasyCaching.Core.Serialization;\nusing EasyCaching.CSRedis;\nusing EasyCaching.Serialization.Json;\nusing Microsoft.Extensions.DependencyInjection;\nusing Newtonsoft.Json;\nusing System.Linq;\nusing System.Xml.Linq;\nusing Xunit;\n\nnamespace BloomFilter.Redis.Test\n{\n    public class BloomFilterEasyCachingRedis\n    {\n        [Fact]\n        public void RedisOptionsTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddEasyCaching(setupAction =>\n            {\n                setupAction.WithJson();\n\n                setupAction.UseCSRedis(configure =>\n                {\n                    configure.SerializerName = \"json\";\n                    configure.DBConfig = new CSRedisDBOptions\n                    {\n                        ConnectionStrings = new System.Collections.Generic.List<string>\n                        {\n                            \"127.0.0.1,defaultDatabase=0,poolsize=10\"\n                        }\n                    };\n                }, \"BloomFilter1\");\n\n                setupAction.UseCSRedis(configure =>\n                {\n                    configure.SerializerName = \"json\";\n                    configure.DBConfig = new CSRedisDBOptions\n                    {\n                        ConnectionStrings = new System.Collections.Generic.List<string>\n                        {\n                            \"127.0.0.1,defaultDatabase=1,poolsize=10\"\n                        }\n                    };\n                }, \"BloomFilter2\");\n            });\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions\n                {\n                    Name = \"BF1\",\n                    RedisKey = \"EasyCaching1\",\n                    ProviderName = \"BloomFilter1\"\n                });\n\n                //BloomFilter2\n                setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions\n                {\n                    Name = \"BF2\",\n                    RedisKey = \"EasyCaching1\",\n\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n            var factory = provider.GetService<IBloomFilterFactory>();\n\n            Test(provider.GetService<IBloomFilter>());\n            Test(factory.Get(\"BF1\"));\n            Test(factory.Get(\"BF2\"));\n        }\n\n\n        private void Test(IBloomFilter bf)\n        {\n            var len = 10;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n            Assert.True(bf.All(array));\n            bf.Clear();\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilter.Redis.Test/BloomFilterFreeRedisTest.cs",
    "content": "using BloomFilter.FreeRedis.Configurations;\nusing FreeRedis;\nusing Microsoft.Extensions.DependencyInjection;\nusing System.Linq;\nusing Xunit;\n\nnamespace BloomFilter.Redis.Test\n{\n    public class BloomFilterFreeRedisTest\n    {\n        [Fact]\n        public void RedisOptionsTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseFreeRedis(new FilterFreeRedisOptions\n                {\n                    Name = \"Redis1\",\n                    RedisKey = \"FreeRedis1\",\n                    ConnectionStrings = new[] { \"localhost\" }.ToList()\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n\n            Test(provider.GetService<IBloomFilter>());\n        }\n\n        [Fact]\n        public void RedisOptionsConfigurationTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseFreeRedis(new FilterFreeRedisOptions\n                {\n                    Name = \"Redis2\",\n                    RedisKey = \"FreeRedis2\",\n                    ConnectionStrings = new[] { \"localhost\" }.ToList()\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n\n            Test(provider.GetService<IBloomFilter>());\n        }\n\n        [Fact]\n        public void RedisOptionsSharedTest()\n        {\n            var services = new ServiceCollection();\n\n            var clint = new RedisClient(\"localhost\");\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseFreeRedis(new FilterFreeRedisOptions\n                {\n                    Name = \"Redis3\",\n                    RedisKey = \"FreeRedis3\",\n                    Client = clint\n                });\n\n                setupAction.UseFreeRedis(new FilterFreeRedisOptions\n                {\n                    Name = \"Redis4\",\n                    RedisKey = \"FreeRedis4\",\n                    Client = clint\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n            var factory = provider.GetService<IBloomFilterFactory>();\n\n            Test(provider.GetService<IBloomFilter>());\n            Test(factory.Get(\"Redis3\"));\n            Test(factory.Get(\"Redis4\"));\n        }\n\n        private void Test(IBloomFilter bf)\n        {\n            var len = 10;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n            Assert.True(bf.All(array));\n            bf.Clear();\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilter.Redis.Test/BloomFilterRedisTest.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Security.Cryptography;\nusing System.Threading.Tasks;\nusing BloomFilter;\nusing BloomFilter.Redis;\nusing StackExchange.Redis;\nusing Xunit;\n\nnamespace BloomFilter.Redis.Test\n{\n    public class BloomFilterRedisTest\n    {\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void NormalTest(HashMethod hashMethod)\n        {\n            var bf = FilterRedisBuilder.Build(\"localhost\", \"NormalTest\", 10000, 0.01, hashMethod);\n\n            var len = 10;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n\n            Assert.True(bf.All(array));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public async Task NormalTestAsync(HashMethod hashMethod)\n        {\n            var bf = FilterRedisBuilder.Build(\"localhost\", \"NormalTestAsync\", 10000, 0.01, hashMethod);\n\n            var len = 10;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(await bf.AddAsync(array), r => Assert.True(r));\n            Assert.All(await bf.ContainsAsync(array), r => Assert.True(r));\n\n            Assert.True(await bf.AllAsync(array));\n\n            await bf.ClearAsync();\n\n            Assert.All(await bf.ContainsAsync(array), r => Assert.False(r));\n            Assert.False(await bf.AllAsync(array));\n        }\n\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void BytesArrayTest(HashMethod hashMethod)\n        {\n            var bf = FilterRedisBuilder.Build(\"localhost\", \"BytesArrayTest\", 10000, 0.01, hashMethod);\n\n            var rng = RandomNumberGenerator.Create();\n\n            var len = 10;\n            var list = new List<byte[]>(len);\n            for (int i = 0; i < len; i++)\n            {\n                var data = new byte[1024];\n                rng.GetBytes(data);\n                list.Add(data);\n            }\n\n            Assert.All(bf.Add(list), r => Assert.True(r));\n            Assert.All(bf.Contains(list), r => Assert.True(r));\n\n            Assert.True(bf.All(list));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(list), r => Assert.False(r));\n            Assert.False(bf.All(list));\n\n\n        }\n\n\n        [Fact]\n        public void IntTest()\n        {\n            var config = ConfigurationOptions.Parse(\"localhost\");\n\n            var bf = FilterRedisBuilder.Build(config, \"IntTest\", 10000, 0.01);\n\n            var len = 10;\n            var array = new int[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = i;\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n\n            Assert.True(bf.All(array));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n\n\n        [Fact]\n        public async Task IntTestAsync()\n        {\n            var config = ConfigurationOptions.Parse(\"localhost\");\n\n            var bf = FilterRedisBuilder.Build(config, \"IntTestAsync\", 10000, 0.01);\n\n            var len = 10;\n            var array = new int[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = i;\n            }\n\n            Assert.All(await bf.AddAsync(array), r => Assert.True(r));\n            Assert.All(await bf.ContainsAsync(array), r => Assert.True(r));\n\n            Assert.True(await bf.AllAsync(array));\n\n            await bf.ClearAsync();\n\n            Assert.All(await bf.ContainsAsync(array), r => Assert.False(r));\n            Assert.False(await bf.AllAsync(array));\n        }\n\n\n        [Fact]\n        public void BuildTest()\n        {\n            var hashFun = new HashAlgorithms.HashCryptoSHA256();\n            var config = ConfigurationOptions.Parse(\"localhost\");\n            var conn = ConnectionMultiplexer.Connect(config);\n            var operate = new RedisBitOperate(conn);\n\n            buildTest(FilterRedisBuilder.Build(config, \"BuildTest\", 10000));\n            buildTest(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, hashFun));\n            buildTest(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, HashMethod.Adler32));\n            buildTest(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, 0.01));\n            buildTest(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, 0.01, hashFun));\n            buildTest(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, 0.01, HashMethod.Adler32));\n\n            buildTest(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000));\n            buildTest(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, hashFun));\n            buildTest(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, HashMethod.Adler32));\n            buildTest(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, 0.01));\n            buildTest(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, 0.01, hashFun));\n            buildTest(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, 0.01, HashMethod.Adler32));\n\n            buildTest(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000));\n            buildTest(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, hashFun));\n            buildTest(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, HashMethod.Adler32));\n            buildTest(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, 0.01));\n            buildTest(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, 0.01, hashFun));\n            buildTest(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, 0.01, HashMethod.Adler32));\n\n            buildTest(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000));\n            buildTest(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, hashFun));\n            buildTest(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, HashMethod.Adler32));\n            buildTest(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, 0.01));\n            buildTest(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, 0.01, hashFun));\n            buildTest(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, 0.01, HashMethod.Adler32));\n\n\n            conn.Dispose();\n        }\n\n        void buildTest(IBloomFilter bf)\n        {\n            var len = 20;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n\n            Assert.True(bf.All(array));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n\n        [Fact]\n        public async Task BuildTestAsync()\n        {\n            var hashFun = new HashAlgorithms.HashCryptoSHA256();\n            var config = ConfigurationOptions.Parse(\"localhost\");\n            var conn = ConnectionMultiplexer.Connect(config);\n            var operate = new RedisBitOperate(conn);\n\n            await buildTestAsync(FilterRedisBuilder.Build(config, \"BuildTest\", 10000));\n            await buildTestAsync(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, hashFun));\n            await buildTestAsync(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, HashMethod.Adler32));\n            await buildTestAsync(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, 0.01));\n            await buildTestAsync(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, 0.01, hashFun));\n            await buildTestAsync(FilterRedisBuilder.Build(config, \"BuildTest\", 10000, 0.01, HashMethod.Adler32));\n\n            await buildTestAsync(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000));\n            await buildTestAsync(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, hashFun));\n            await buildTestAsync(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, HashMethod.Adler32));\n            await buildTestAsync(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, 0.01));\n            await buildTestAsync(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, 0.01, hashFun));\n            await buildTestAsync(FilterRedisBuilder.Build(\"localhost\", \"BuildTest\", 10000, 0.01, HashMethod.Adler32));\n\n            await buildTestAsync(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000));\n            await buildTestAsync(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, hashFun));\n            await buildTestAsync(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, HashMethod.Adler32));\n            await buildTestAsync(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, 0.01));\n            await buildTestAsync(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, 0.01, hashFun));\n            await buildTestAsync(FilterRedisBuilder.Build(conn, \"BuildTest\", 10000, 0.01, HashMethod.Adler32));\n\n            await buildTestAsync(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000));\n            await buildTestAsync(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, hashFun));\n            await buildTestAsync(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, HashMethod.Adler32));\n            await buildTestAsync(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, 0.01));\n            await buildTestAsync(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, 0.01, hashFun));\n            await buildTestAsync(FilterRedisBuilder.Build(operate, \"BuildTest\", 10000, 0.01, HashMethod.Adler32));\n\n\n            conn.Dispose();\n        }\n\n        async Task buildTestAsync(IBloomFilter bf)\n        {\n            var len = 20;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(await bf.AddAsync(array), r => Assert.True(r));\n            Assert.All(await bf.ContainsAsync(array), r => Assert.True(r));\n\n            Assert.True(await bf.AllAsync(array));\n\n            await bf.ClearAsync();\n\n            Assert.All(await bf.ContainsAsync(array), r => Assert.False(r));\n            Assert.False(await bf.AllAsync(array));\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "test/BloomFilter.Redis.Test/ConfigurationsTest.cs",
    "content": "﻿using BloomFilter.Redis.Configurations;\nusing Microsoft.Extensions.DependencyInjection;\nusing StackExchange.Redis;\nusing System.Linq;\nusing Xunit;\n\nnamespace BloomFilter.Redis.Test\n{\n    public class ConfigurationsTest\n    {\n        [Fact]\n        public void RedisOptionsTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseRedis(new FilterRedisOptions\n                {\n                    Name = \"Redis1\",\n                    RedisKey = \"BloomFilter1\",\n                    Endpoints = new[] { \"localhost\" }.ToList()\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n\n            Test(provider.GetService<IBloomFilter>());\n        }\n\n        [Fact]\n        public void RedisOptionsConfigurationTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseRedis(new FilterRedisOptions\n                {\n                    Name = \"Redis2\",\n                    RedisKey = \"BloomFilter2\",\n                    Configuration = \"localhost\"\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n\n            Test(provider.GetService<IBloomFilter>());\n        }\n\n        [Fact]\n        public void RedisOptionsSharedTest()\n        {\n            var services = new ServiceCollection();\n\n            var connection = ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(\"localhost\"));\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseRedis(new FilterRedisOptions\n                {\n                    Name = \"Redis3\",\n                    RedisKey = \"BloomFilter3\",\n                    Connection = connection\n                });\n\n                setupAction.UseRedis(new FilterRedisOptions\n                {\n                    Name = \"Redis4\",\n                    RedisKey = \"BloomFilter4\",\n                    Connection = connection\n                });\n            });\n\n            var provider = services.BuildServiceProvider();\n            var factory = provider.GetService<IBloomFilterFactory>();\n\n            Test(provider.GetService<IBloomFilter>());\n            Test(factory.Get(\"Redis3\"));\n            Test(factory.Get(\"Redis4\"));\n        }\n\n        private void Test(IBloomFilter bf)\n        {\n            var len = 10;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n            Assert.True(bf.All(array));\n            bf.Clear();\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilter.Redis.Test/RedisBitOperateTest.cs",
    "content": "﻿using StackExchange.Redis;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Xunit;\n\nnamespace BloomFilter.Redis.Test\n{\n    public class RedisBitOperateTest\n    {\n\n        [Fact]\n        public void NormalTest()\n        {\n\n            var operate = new RedisBitOperate(\"localhost\");\n            operate.Set(\"RB-NormalTest\", 0, true);\n            Assert.True(operate.Get(\"RB-NormalTest\", 0));\n            operate.Dispose();\n\n        }\n\n        [Fact]\n        public async Task NormalTestAsync()\n        {\n\n            var operate = new RedisBitOperate(\"localhost\");\n            await operate.SetAsync(\"RB-NormalTestAsync\", 0, true);\n            Assert.True(await operate.GetAsync(\"RB-NormalTestAsync\", 0));\n            operate.Dispose();\n\n        }\n\n        [Fact]\n        public void Can_Connection_Has_Not_Close()\n        {\n\n            var conn = ConnectionMultiplexer.Connect(\"localhost\");\n            Assert.True(conn.IsConnected);\n\n            var operate = new RedisBitOperate(conn);\n            operate.Set(\"Can_Connection_Has_Not_Close\", 1, true);\n            Assert.True(operate.Get(\"Can_Connection_Has_Not_Close\", 1));\n            operate.Dispose();\n\n            Assert.True(conn.IsConnected);\n\n        }\n\n        [Fact]\n        public async Task Can_Connection_Has_Not_CloseAsync()\n        {\n\n            var conn = ConnectionMultiplexer.Connect(\"localhost\");\n            Assert.True(conn.IsConnected);\n\n            var operate = new RedisBitOperate(conn);\n            await operate.SetAsync(\"Can_Connection_Has_Not_CloseAsync\", 1, true);\n            Assert.True(await operate.GetAsync(\"Can_Connection_Has_Not_CloseAsync\", 1));\n            operate.Dispose();\n\n            Assert.True(conn.IsConnected);\n\n        }\n\n        [Fact]\n        public void Can_Close_With_New_Connection()\n        {\n\n            var conn = ConnectionMultiplexer.Connect(\"localhost\");\n            Assert.True(conn.IsConnected);\n            conn.Dispose();\n            Assert.False(conn.IsConnected);\n\n            var operate = new RedisBitOperate(conn);\n            operate.Set(\"Can_Close_With_New_Connection\", 2, true);\n            Assert.True(operate.Get(\"Can_Close_With_New_Connection\", 2));\n            operate.Dispose();\n\n        }\n\n        [Fact]\n        public async Task Can_Close_With_New_ConnectionAsync()\n        {\n\n            var conn = ConnectionMultiplexer.Connect(\"localhost\");\n            Assert.True(conn.IsConnected);\n            conn.Dispose();\n            Assert.False(conn.IsConnected);\n\n            var operate = new RedisBitOperate(conn);\n            await operate.SetAsync(\"Can_Close_With_New_ConnectionAsync\", 2, true);\n            Assert.True(await operate.GetAsync(\"Can_Close_With_New_ConnectionAsync\", 2));\n            operate.Dispose();\n\n        }\n\n        [Fact]\n        public void Can_The_Batch_Result()\n        {\n            var operate = new RedisBitOperate(ConfigurationOptions.Parse(\"localhost\"));\n            string key = \"RB:Batch\";\n            operate.Clear(key);\n\n            var positions = new long[] { 5, 6, 7, 8, 9, 10, 11, 12 };\n\n            var results = operate.Set(key, positions, true);\n            Assert.False(results.All(r => r));\n\n            results = operate.Set(key, positions, true);\n            Assert.True(results.All(r => r));\n\n            results = operate.Get(key, positions);\n            Assert.True(results.All(r => r));\n\n            operate.Clear(key);\n            results = operate.Get(key, positions);\n            Assert.False(results.All(r => r));\n\n            operate.Dispose();\n        }\n\n        [Fact]\n        public async Task Can_The_Batch_ResultAsync()\n        {\n            var operate = new RedisBitOperate(ConfigurationOptions.Parse(\"localhost\"));\n            string key = \"RB:BatchAsync\";\n            await operate.ClearAsync(key);\n\n            var positions = new long[] { 5, 6, 7, 8, 9, 10, 11, 12 };\n\n            var results = await operate.SetAsync(key, positions, true);\n            Assert.False(results.All(r => r));\n\n            results = await operate.SetAsync(key, positions, true);\n            Assert.True(results.All(r => r));\n\n            results = await operate.GetAsync(key, positions);\n            Assert.True(results.All(r => r));\n\n            await operate.ClearAsync(key);\n            results = await operate.GetAsync(key, positions);\n            Assert.False(results.All(r => r));\n\n            operate.Dispose();\n        }\n\n    }\n}\n"
  },
  {
    "path": "test/BloomFilter.Redis.Test/Utilitiy.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace BloomFilter.Redis.Test\n{\n    class Utilitiy\n    {\n        private const string Base62 = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n        public static string GenerateString(int length)\n        {\n            if (length < 0) throw new ArgumentOutOfRangeException($\"{nameof(length)} is {length}.\");\n\n            var random = new Random(Guid.NewGuid().GetHashCode());\n            return new string(\n                Enumerable.Repeat(Base62, length)\n                          .Select(s => s[random.Next(s.Length)])\n                          .ToArray());\n        }\n\n       \n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/AsyncLockTests.cs",
    "content": "﻿using BloomFilter;\nusing Xunit;\n\nnamespace BloomFilterTest\n{\n    [Collection(\"AsyncLock Tests\")]\n    [CollectionDefinition(\"AsyncLock Tests\", DisableParallelization = false)]\n    public class AsyncLockTests\n    {\n        [Fact]\n        public void TestMaxCount()\n        {\n            using var mutex = new AsyncLock(2);\n            Assert.Equal(0, mutex.GetRemainingCount());\n            Assert.Equal(mutex.MaxCount, mutex.GetCurrentCount());\n            using (var myLock = mutex.Acquire())\n            {\n                Assert.Equal(1, mutex.GetRemainingCount());\n                Assert.Equal(1, mutex.GetCurrentCount());\n                using var myLock2 = mutex.Acquire();\n                Assert.Equal(mutex.MaxCount, mutex.GetRemainingCount());\n                Assert.Equal(0, mutex.GetCurrentCount());\n            }\n            Assert.Equal(0, mutex.GetRemainingCount());\n            Assert.Equal(mutex.MaxCount, mutex.GetCurrentCount());\n        }\n\n        [Fact]\n        public void TestLock()\n        {\n            var mutex = new AsyncLock();\n            Assert.Equal(0, mutex.GetRemainingCount());\n            Assert.Equal(1, mutex.GetCurrentCount());\n            using (var myLock = mutex.Acquire())\n            {\n                Assert.Equal(1, mutex.GetRemainingCount());\n                Assert.Equal(0, mutex.GetCurrentCount());\n            }\n            Assert.Equal(0, mutex.GetRemainingCount());\n            Assert.Equal(1, mutex.GetCurrentCount());\n        }\n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/BloomFilterTest.cs",
    "content": "using BloomFilter;\nusing BloomFilter.HashAlgorithms;\nusing System;\nusing System.Collections.Generic;\nusing System.Security.Cryptography;\nusing Xunit;\n\nnamespace BloomFilterTest\n{\n    public class BloomFilterTest\n    {\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void NormalTest(HashMethod hashMethod)\n        {\n            var bf = FilterBuilder.Build(10000, 0.01, hashMethod);\n\n            var len = 10;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n\n            Assert.True(bf.All(array));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void BytesArrayTest(HashMethod hashMethod)\n        {\n            var bf = FilterBuilder.Build(10000, 0.01, hashMethod);\n\n            var rng = RandomNumberGenerator.Create();\n\n            var len = 10;\n            var list = new List<byte[]>(len);\n            for (int i = 0; i < len; i++)\n            {\n                var data = new byte[1024];\n                rng.GetBytes(data);\n                list.Add(data);\n            }\n\n            Assert.All(bf.Add(list), r => Assert.True(r));\n            Assert.All(bf.Contains(list), r => Assert.True(r));\n\n            Assert.True(bf.All(list));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(list), r => Assert.False(r));\n            Assert.False(bf.All(list));\n        }\n\n        [Fact]\n        public void BuildTest()\n        {\n            var hashFun = new Crc32();\n            buildTest(FilterBuilder.Build(10000));\n            buildTest(FilterBuilder.Build(10000, hashFun));\n            buildTest(FilterBuilder.Build(10000, HashMethod.Adler32));\n            buildTest(FilterBuilder.Build(10000, 0.01));\n            buildTest(FilterBuilder.Build(10000, 0.01, hashFun));\n            buildTest(FilterBuilder.Build(10000, 0.01, HashMethod.Adler32));\n        }\n\n        private void buildTest(IBloomFilter bf)\n        {\n            var len = 20;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n\n            Assert.True(bf.All(array));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n        }\n\n        [Fact]\n        public void FixMurmur3Test()\n        {\n            var bf = FilterBuilder.Build(10000, 0.01, HashMethod.Murmur3);\n\n            var rng = RandomNumberGenerator.Create();\n\n            var data = new byte[1024];\n            rng.GetBytes(data);\n\n            Assert.True(bf.Add(data));\n\n            Assert.True(bf.Contains(data));\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilterTest/BloomFilterTest.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"FluentAssertions\" />\n    <PackageReference Include=\"Microsoft.Extensions.DependencyInjection\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n\t<PackageReference Include=\"xunit\" />\n\t<PackageReference Include=\"xunit.runner.visualstudio\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter.Redis\\BloomFilter.Redis.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "test/BloomFilterTest/ConfigurationsTest.cs",
    "content": "﻿using BloomFilter;\nusing Microsoft.Extensions.DependencyInjection;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Xunit;\n\nnamespace BloomFilterTest\n{\n    public class ConfigurationsTest\n    {\n        [Fact]\n        public void NormalTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseInMemory();\n            });\n\n            var provider = services.BuildServiceProvider();\n\n            var bf = provider.GetService<IBloomFilter>();\n\n            var len = 10;\n            var array = new string[len];\n            for (int i = 0; i < len; i++)\n            {\n                array[i] = Utilitiy.GenerateString(10);\n            }\n\n            Assert.All(bf.Add(array), r => Assert.True(r));\n            Assert.All(bf.Contains(array), r => Assert.True(r));\n\n            Assert.True(bf.All(array));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(array), r => Assert.False(r));\n            Assert.False(bf.All(array));\n\n\n        }\n\n        [Fact]\n        public void BloomFilterFactoryTest()\n        {\n            var services = new ServiceCollection();\n\n            services.AddBloomFilter(setupAction =>\n            {\n                setupAction.UseInMemory();\n                setupAction.UseInMemory(\"CustomName\");\n            });\n\n            var provider = services.BuildServiceProvider();\n\n            var factory = provider.GetService<IBloomFilterFactory>();\n            var bf1 = factory.Get(BloomFilterConstValue.DefaultInMemoryName);\n            var bf2 = factory.Get(\"CustomName\");\n            var bf3 = provider.GetService<IBloomFilter>();\n\n\n            Assert.Equal(BloomFilterConstValue.DefaultInMemoryName, bf1.Name);\n            Assert.Equal(\"CustomName\", bf2.Name);\n            Assert.Equal(\"CustomName\", bf3.Name);\n        }\n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/FluentFilterBuilderTest.cs",
    "content": "using BloomFilter;\nusing System;\nusing Xunit;\n\nnamespace BloomFilterTest\n{\n    public class FluentFilterBuilderTest\n    {\n        [Fact]\n        public void Create_ReturnsNewBuilder()\n        {\n            var builder = FilterBuilder.Create();\n            Assert.NotNull(builder);\n        }\n\n        [Fact]\n        public void BuildInMemory_WithDefaults_CreatesFilter()\n        {\n            var filter = FilterBuilder.Create()\n                .BuildInMemory();\n\n            Assert.NotNull(filter);\n            Assert.IsAssignableFrom<IBloomFilter>(filter);\n        }\n\n        [Fact]\n        public void WithName_SetsFilterName()\n        {\n            var filter = FilterBuilder.Create()\n                .WithName(\"TestFilter\")\n                .BuildInMemory();\n\n            Assert.Equal(\"TestFilter\", filter.Name);\n        }\n\n        [Fact]\n        public void WithName_Null_ThrowsArgumentException()\n        {\n            var builder = FilterBuilder.Create();\n\n            // ArgumentException.ThrowIfNullOrWhiteSpace throws ArgumentNullException for null\n            Assert.ThrowsAny<ArgumentException>(() => builder.WithName(null!));\n        }\n\n        [Fact]\n        public void WithName_EmptyOrWhitespace_ThrowsArgumentException()\n        {\n            var builder = FilterBuilder.Create();\n\n            Assert.ThrowsAny<ArgumentException>(() => builder.WithName(\"\"));\n            Assert.ThrowsAny<ArgumentException>(() => builder.WithName(\"   \"));\n        }\n\n        [Fact]\n        public void ExpectingElements_SetsExpectedElements()\n        {\n            var filter = FilterBuilder.Create()\n                .ExpectingElements(5_000_000)\n                .BuildInMemory();\n\n            Assert.NotNull(filter);\n            // Filter is created successfully with specified expected elements\n        }\n\n        [Fact]\n        public void ExpectingElements_ZeroOrNegative_ThrowsArgumentOutOfRangeException()\n        {\n            var builder = FilterBuilder.Create();\n\n            Assert.Throws<ArgumentOutOfRangeException>(() => builder.ExpectingElements(0));\n            Assert.Throws<ArgumentOutOfRangeException>(() => builder.ExpectingElements(-1));\n        }\n\n        [Fact]\n        public void WithErrorRate_SetsErrorRate()\n        {\n            var filter = FilterBuilder.Create()\n                .WithErrorRate(0.001)\n                .BuildInMemory();\n\n            Assert.NotNull(filter);\n            // Filter is created successfully with specified error rate\n        }\n\n        [Fact]\n        public void WithErrorRate_InvalidRange_ThrowsArgumentOutOfRangeException()\n        {\n            var builder = FilterBuilder.Create();\n\n            Assert.Throws<ArgumentOutOfRangeException>(() => builder.WithErrorRate(0));\n            Assert.Throws<ArgumentOutOfRangeException>(() => builder.WithErrorRate(-0.1));\n            Assert.Throws<ArgumentOutOfRangeException>(() => builder.WithErrorRate(1));\n            Assert.Throws<ArgumentOutOfRangeException>(() => builder.WithErrorRate(1.5));\n        }\n\n        [Fact]\n        public void UsingHashMethod_SetsHashMethod()\n        {\n            var filter = FilterBuilder.Create()\n                .UsingHashMethod(HashMethod.XXHash3)\n                .BuildInMemory();\n\n            Assert.NotNull(filter);\n            // Filter is created successfully with specified hash method\n        }\n\n        [Fact]\n        public void UsingCustomHash_SetsCustomHashFunction()\n        {\n            var customHash = HashFunction.Functions[HashMethod.Murmur3];\n\n            var filter = FilterBuilder.Create()\n                .UsingCustomHash(customHash)\n                .BuildInMemory();\n\n            Assert.NotNull(filter);\n        }\n\n        [Fact]\n        public void UsingCustomHash_Null_ThrowsArgumentNullException()\n        {\n            var builder = FilterBuilder.Create();\n\n            Assert.Throws<ArgumentNullException>(() => builder.UsingCustomHash(null!));\n        }\n\n        [Fact]\n        public void ChainedCalls_BuildsCorrectFilter()\n        {\n            var filter = FilterBuilder.Create()\n                .WithName(\"ChainedFilter\")\n                .ExpectingElements(10_000_000)\n                .WithErrorRate(0.001)\n                .UsingHashMethod(HashMethod.XXHash3)\n                .BuildInMemory();\n\n            Assert.NotNull(filter);\n            Assert.Equal(\"ChainedFilter\", filter.Name);\n        }\n\n        [Fact]\n        public void BuildInMemory_FilterFunctionsCorrectly()\n        {\n            var filter = FilterBuilder.Create()\n                .ExpectingElements(1000)\n                .WithErrorRate(0.01)\n                .BuildInMemory();\n\n            // Test basic functionality\n            filter.Add(\"test1\");\n            filter.Add(\"test2\");\n\n            Assert.True(filter.Contains(\"test1\"));\n            Assert.True(filter.Contains(\"test2\"));\n            Assert.False(filter.Contains(\"test3\"));\n        }\n\n        [Fact]\n        public void BuildInMemoryWithCapacity_CreatesFilterWithSpecificCapacity()\n        {\n            var filter = FilterBuilder.Create()\n                .WithName(\"CapacityFilter\")\n                .BuildInMemoryWithCapacity(capacity: 1000, hashes: 5);\n\n            Assert.NotNull(filter);\n            Assert.Equal(\"CapacityFilter\", filter.Name);\n        }\n\n        [Fact]\n        public void MultipleBuilds_EachBuildIsIndependent()\n        {\n            var builder = FilterBuilder.Create()\n                .ExpectingElements(1000)\n                .WithErrorRate(0.01);\n\n            var filter1 = builder.BuildInMemory();\n            var filter2 = builder.BuildInMemory();\n\n            filter1.Add(\"test1\");\n\n            Assert.True(filter1.Contains(\"test1\"));\n            Assert.False(filter2.Contains(\"test1\")); // filter2 should be independent\n        }\n\n        [Fact]\n        public void WithSerializer_UsesCustomSerializer()\n        {\n            var customSerializer = new DefaultFilterMemorySerializer();\n\n            var filter = FilterBuilder.Create()\n                .WithSerializer(customSerializer)\n                .BuildInMemory();\n\n            Assert.NotNull(filter);\n        }\n\n        [Fact]\n        public void WithSerializer_Null_ThrowsArgumentNullException()\n        {\n            var builder = FilterBuilder.Create();\n\n            Assert.Throws<ArgumentNullException>(() => builder.WithSerializer(null!));\n        }\n\n        [Fact]\n        public void UsingHashMethod_OverridesCustomHash()\n        {\n            var customHash = HashFunction.Functions[HashMethod.Murmur3];\n\n            var filter = FilterBuilder.Create()\n                .UsingCustomHash(customHash)\n                .UsingHashMethod(HashMethod.XXHash3) // Should override custom hash\n                .BuildInMemory();\n\n            Assert.NotNull(filter);\n        }\n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/HashAlgorithms/Adler32Test.cs",
    "content": "using System;\nusing System.Linq;\nusing BloomFilter.HashAlgorithms.Internal;\nusing Xunit;\n\nnamespace BloomFilterTest.HashAlgorithms\n{\n    public class Adler32Test\n    {\n        ////Make sure your local memory is large enough\n        [Theory]\n        [InlineData(1024, 3838443024)]\n        [InlineData(1024 * 1024, 1185183625)]\n        [InlineData(32 * 1024 * 1024, 2524836307)]\n        [InlineData(128 * 1024 * 1024, 4178691958)]\n        [InlineData(363898432, 3303655557)]\n        [InlineData(1024 * 1024 * 1024, 3590863875)]\n        public void Adler_Append(int size, uint expected)\n        {\n            var bytes = Enumerable.Range(0, size).Select(i => (byte)i).ToArray();\n\n            Span<byte> data = bytes;\n\n            var a2 = new Adler32();\n\n            while (data.Length > 0)\n            {\n                var n = Random.Shared.Next(1, data.Length);\n                var d = data.Slice(0, n);\n                a2.Append(d);\n                data = data.Slice(n);\n            }\n\n            uint actual = a2.GetCurrentHashAsUInt32();\n\n            Assert.Equal(expected, actual);\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilterTest/HashAlgorithms/CrcTest.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing BloomFilter.HashAlgorithms.Internal;\nusing FluentAssertions;\nusing Xunit;\n\nnamespace BloomFilterTest.HashAlgorithms\n{\n    public class CrcTest\n    {\n        private static readonly byte[] buffer = new byte[] { 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6D, 0x69, 0x73, 0x74, 0x61, 0x6B, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x69, 0x6E, 0x6B, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x73, 0x6F, 0x6C, 0x76, 0x65, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x20, 0x70, 0x72, 0x6F, 0x62, 0x6C, 0x65, 0x6D, 0x73, 0x20, 0x6A, 0x75, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x6F, 0x74, 0x61, 0x74, 0x6F, 0x65, 0x73 };\n\n        [Theory]\n        [MemberData(nameof(Crc64TestData))]\n        public void Crc64_Append<ExpectedChecksum>(TestPayloadParameter<ExpectedChecksum> parameter)\n        {\n            var range = parameter.TestRange;\n\n            Crc64 crc = new();\n\n            Span<byte> data = parameter.TestPayload;\n\n            if (!range.Equals(Range.All))\n            {\n                data = parameter.TestPayload[range];\n            }\n\n            while (data.Length > 0)\n            {\n                var n = Random.Shared.Next(1, data.Length);\n                var d = data.Slice(0, n);\n                crc.Append(d);\n                data = data.Slice(n);\n            }\n\n            ulong actual = crc.GetCurrentHashAsUInt64();\n\n            var expected = (ulong)(object)parameter.ExpectedValue;\n\n            $\"0x{actual:X4}\".Should().Be($\"0x{expected:X4}\");\n        }\n\n\n        [Theory]\n        [MemberData(nameof(Crc32TestData))]\n        public void Crc32_Append<ExpectedChecksum>(TestPayloadParameter<ExpectedChecksum> parameter)\n        {\n            var range = parameter.TestRange;\n\n            Crc32 crc = new();\n\n            Span<byte> data = parameter.TestPayload;\n\n            if (!range.Equals(Range.All))\n            {\n                data = parameter.TestPayload[range];\n            }\n\n            while (data.Length > 0)\n            {\n                var n = Random.Shared.Next(1, data.Length);\n                var d = data.Slice(0, n);\n                crc.Append(d);\n                data = data.Slice(n);\n            }\n\n            uint actual = crc.GetCurrentHashAsUInt32();\n\n            var expected = (uint)(object)parameter.ExpectedValue;\n\n            $\"0x{actual:X4}\".Should().Be($\"0x{expected:X4}\");\n        }\n\n\n        public static IEnumerable<object[]> Crc64TestData()\n        {\n            yield return new object[] { new TestPayloadParameter<ulong>(buffer, .., 4970656839403593224) { TestScenario = \"CRC 64, Checksum of all bytes\" } };\n            yield return new object[] { new TestPayloadParameter<ulong>(buffer, 3..14, 7160332793041206217) { TestScenario = \"CRC 64, Checksum of bytes 3-14\" } };\n            yield return new object[] { new TestPayloadParameter<ulong>(buffer, 9..14, 11684299407097624602) { TestScenario = \"CRC 64, Checksum of bytes 9-14\" } };\n            yield return new object[] { new TestPayloadParameter<ulong>(buffer, 70..76, 7838111982916138213) { TestScenario = \"CRC 64, Checksum of bytes 70-76\" } };\n        }\n\n        public static IEnumerable<object[]> Crc32TestData()\n        {\n            yield return new object[] { new TestPayloadParameter<uint>(buffer, .., 0xCBE25E99) { TestScenario = \"CRC 32, Checksum of all bytes\" } };\n            yield return new object[] { new TestPayloadParameter<uint>(buffer, 3..14, 0xA0D118A0) { TestScenario = \"CRC 32, Checksum of bytes 3-14\" } };\n            yield return new object[] { new TestPayloadParameter<uint>(buffer, 9..14, 0xDEF4CFE9) { TestScenario = \"CRC 32, Checksum of bytes 9-14\" } };\n            yield return new object[] { new TestPayloadParameter<uint>(buffer, 70..76, 0xF373B43B) { TestScenario = \"CRC 32, Checksum of bytes 70-76\" } };\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilterTest/HashAlgorithms/FNVTest.cs",
    "content": "using BloomFilter.HashAlgorithms.Internal;\nusing System;\nusing System.Collections.Generic;\nusing Xunit;\nusing Xunit.Abstractions;\n\nnamespace BloomFilterTest.HashAlgorithms\n{\n    public class FNVTest\n    {\n        private readonly ITestOutputHelper _testOutputHelper;\n\n        public FNVTest(ITestOutputHelper testOutputHelper)\n        {\n            _testOutputHelper = testOutputHelper;\n        }\n\n        [Fact]\n        public void FNV1_Test()\n        {\n            var tests = FNV1TestData();\n\n            foreach (var test in tests)\n            {\n                var hash = FNV1.HashToUInt32(test.Hex.FromHex());\n\n                Assert.Equal(test.Hash, hash);\n            }\n        }\n\n        [Fact]\n        public void FNV1_Append()\n        {\n            var tests = FNV1TestData();\n\n            foreach (var test in tests)\n            {\n                var fnv = new FNV1();\n\n                Span<byte> span = test.Hex.FromHex();\n\n                while (span.Length > 0)\n                {\n                    var n = Random.Shared.Next(1, span.Length);\n                    var d = span.Slice(0, n);\n                    fnv.Append(d);\n                    span = span.Slice(n);\n                }\n\n                var hash2 = fnv.GetCurrentHashAsUInt32();\n\n                Assert.Equal(test.Hash, hash2);\n\n                var hash3 = fnv.GetCurrentHashAsUInt32();\n\n                Assert.Equal(test.Hash, hash3);\n            }\n        }\n\n        [Fact]\n        public void FNV1a_Test()\n        {\n            var tests = FNV1aTestData();\n\n            foreach (var test in tests)\n            {\n                var hash = FNV1a.HashToUInt32(test.Hex.FromHex());\n\n                Assert.Equal(test.Hash, hash);\n            }\n        }\n\n        [Fact]\n        public void FNV1a_Append()\n        {\n            var tests = FNV1aTestData();\n\n            foreach (var test in tests)\n            {\n                var fnv = new FNV1a();\n\n                Span<byte> span = test.Hex.FromHex();\n\n                while (span.Length > 0)\n                {\n                    var n = Random.Shared.Next(1, span.Length);\n                    var d = span.Slice(0, n);\n                    fnv.Append(d);\n                    span = span.Slice(n);\n                }\n\n                var hash2 = fnv.GetCurrentHashAsUInt32();\n\n                Assert.Equal(test.Hash, hash2);\n\n                var hash3 = fnv.GetCurrentHashAsUInt32();\n\n                Assert.Equal(test.Hash, hash3);\n            }\n        }\n\n        [Fact]\n        public void ModifiedFNV1_Test()\n        {\n            var tests = ModifiedFNV1TestData();\n\n            foreach (var test in tests)\n            {\n                var hash = ModifiedFNV1.HashToUInt32(test.Hex.FromHex());\n\n                Assert.Equal(test.Hash, hash);\n            }\n        }\n\n        [Fact]\n        public void ModifiedFNV1_Append()\n        {\n            var tests = ModifiedFNV1TestData();\n\n            foreach (var test in tests)\n            {\n                var fnv = new ModifiedFNV1();\n\n                Span<byte> span = test.Hex.FromHex();\n\n                while (span.Length > 0)\n                {\n                    var n = Random.Shared.Next(1, span.Length);\n                    var d = span.Slice(0, n);\n                    fnv.Append(d);\n                    span = span.Slice(n);\n                }\n\n                var hash2 = fnv.GetCurrentHashAsUInt32();\n\n                Assert.Equal(test.Hash, hash2);\n\n                var hash3 = fnv.GetCurrentHashAsUInt32();\n\n                Assert.Equal(test.Hash, hash3);\n            }\n        }\n\n        private static IEnumerable<(uint Hash, string Hex)> ModifiedFNV1TestData()\n        {\n            yield return (Hash: 771407592, Hex: \"FF70\");\n            yield return (Hash: 2685708795, Hex: \"6B8DD4ACD7359836075840BCC31A6BEE1EBE83CC14EDFA99209A5A03E7D0F5AC72E9389FB005C03EDC410CCB61EF5D9DBB3A697B538C6912126978C173C69F3D8E2981D63EC4B693EB3E17813980D3EADD138DFEC6E6874245BF3CCA324F313392EC839644126B154BF67F6087F0C0D2A41CF3270D98BB\");\n            yield return (Hash: 2131752732, Hex: \"0478A6193853A3C662B815238CD65CC6A645CC4C5740E5B17D2780AFEE2B71BE765F5D7CE15FAEE60AC8F953C0999608231C6FD69027C7D9D8BF298B701E1171AB1057D6258B4CE7C1034B257E90BCCD247100FCC32227BD64\");\n            yield return (Hash: 2862955741, Hex: \"D7FF61563E0C229520\");\n            yield return (Hash: 2601117268, Hex: \"E2137581C9B9B9D7B7DADF40ECF92BD24B5E9162ACC10E271270D999DF0AF54CDE96D0B0\");\n            yield return (Hash: 4262320966, Hex: \"F0BF792566598B5FAB8ABC654C43ECDE024B7259415DCBDB06C295\");\n            yield return (Hash: 397359451, Hex: \"5C8C4299DAC69F60B2B3C1C305325443F39DBA791D3278948101105F4CC314A823F76B0710CA6A6D75C773A706924B9D1214F58B12E49CC76C9C7532160C3A0F15C1AB2BDE5E87A7E5901702F034E9F6A1BEAF395B1B9EA0716A6B483BEF8F2C1E566614863565243BCC7F20DE638D745D4D0260825298\");\n            yield return (Hash: 314042805, Hex: \"2AA2F3144AB0BEB5A58DAA826D6B477BF26FF644E6A64C1D7468B3B03C23753468\");\n            yield return (Hash: 3436752930, Hex: \"ED74AD4C481FEA3FB32D3EC3C54C55C3444A82D3DDBF672185739087B0278A3EE3A7A7893A6C8A6D533C8DF68BD818184EC2592A05454DF11F4A2251E91E8501A13F7048A09860C0FDC109454292B996237363FB4A3C9DDD923C1E9EC9674095BB574A222E34277090821B2D2711913553\");\n            yield return (Hash: 2812754848, Hex: \"67CABDF47446C7D7FA716BAD1B325083AA6B3550A508D75E44CFDF6ED4BB8C6908ADD9F5774D376B6654ADD84683F186A3F1B48FC6C0E562F93B13F83E967B\");\n            yield return (Hash: 2379790101, Hex: \"AFDDA841F7698DE45EA5B74660F23F1C1E21C840839B69EE9764E5173A761BF72F9D83077D4154BE782D8C1865403424F05DDC1BF751014E5B0944CBBB9138E56489EE35CB128DA2860A02BD4F2E24C6FEF87578C40FE80802ECFF260B9CE7BB15D6FC6A0A488210E4A64374A2A214B756D9A2926670D9DFA8845FE083\");\n            yield return (Hash: 306391333, Hex: \"48D9B36285C3DAE6DF0D80B3AEDC1642DC5007F87B118D72FBE67937EC90464C1D4461EBAF2664086C9764668180C3DCD61522EB30CD6AF78747D5E8C550FF2C47513F04B0D3513A796757D5CA53D4460BEE3A7FB58561D554F371883A43B9D975FB4ABB3099D57BEB58A3DF4F47\");\n            yield return (Hash: 540193882, Hex: \"8266139A68B57376C457092AB1238748D4B914BD35C265F5EF23E6C838DBFB0508D9332A75515DCD7BADBDA16F98728FB6E44F1E0ED1464D5C0FC2F9E39B699961318DC7A5C12F64D142DDBD450B7EAB19C15A75FE28DF51B85416B9646A81591E58D44004572DFAFB1D16A9\");\n            yield return (Hash: 3122199454, Hex: \"E41DD8B5E85EB76D3265CA3347A7FB56C507122BB771\");\n            yield return (Hash: 3243637510, Hex: \"E3FA987220606350F7B95660C98C4381B9CB58DE2E6F9876ED48E67B9FF095AA74606C1FE89A9A5FF521A04BD449934637EFBEC96D4611C6F1A6AB0EED31294D6DF82C174208CB6EAF772A3AE0042AF5BB3888DC6F5C8F74\");\n            yield return (Hash: 2019755778, Hex: \"4A3ED2231F1F9526F9CA73B7DB57E0F3A49D6F92D3FB9EAB7FEE896A5BE1210982932E4D\");\n            yield return (Hash: 2742823170, Hex: \"7EE9D43616D1C8DB60B09373E2619CD6FFC565D4E7957A30588F8320449783538B63F13B11A2409B81DD73BA6BA2D52F5260AE76396FAAC132BE13E962DA1BA9FDF80309E6D99E35B9AF7664293A01BF5DBD01D1BF3A0536FB9D216AC86DD345D0E704B598879F5BA9E957\");\n            yield return (Hash: 3156521291, Hex: \"E11789E60DB126B319253973EA08A43FC41CFD86C64B143CA8\");\n            yield return (Hash: 455012644, Hex: \"7EABEAF54E3191CFB9FB1DE4C84273700175F72B9BFD67A02E586EF27140ED681A5ED74A7E113960D9\");\n            yield return (Hash: 795659620, Hex: \"3FF966BE098073C9E5E7363E5D8F0F40D70D8711587F083ECD25870FFF07A235D90E95696686\");\n            yield return (Hash: 2379202919, Hex: \"5FC6B58D1505D258385AA5D064E8A1E36334\");\n            yield return (Hash: 2933449609, Hex: \"2B87FAFCF6AB56E3351D94D41D629E18E50C1429AF8543B463A93DD8D4430D272FD47EF6E31D97FEE519FE3A97\");\n            yield return (Hash: 221896852, Hex: \"D6E4DEF7A38608A0B5A83854D0FB84E1958122474BB4E1884CB4A116A18C5B4A4A129EF313540A4991B6F3CF8217131D9DD9E654FDC29E1392CF409E8720F359A122A91EC62D4A1D\");\n            yield return (Hash: 3024224213, Hex: \"630C47ADF331AFDE288802F9\");\n            yield return (Hash: 3633626926, Hex: \"3C731362A38E3664BB3981E6146F2213345771457EF288792849A00B4652F16F362F90F0814A0E392837A94A5B8CF420F99280BF640349A4408A0A2596573FD0DB732CA55C9354D2B1AD6809522D76CEB607D5\");\n            yield return (Hash: 2381784309, Hex: \"45E3AF51A99E2ED718\");\n            yield return (Hash: 3435683190, Hex: \"44358221E0044589177CBE2D4096F094E6CF467DE133A452D6A8CFACD8BD94F0151F95318B5F878D5018609024B18F778A97\");\n            yield return (Hash: 2267301636, Hex: \"91DA46548511B88BCB7C7E2A226BC15E1C0E5697\");\n            yield return (Hash: 1111197284, Hex: \"69F2AC0472287C23E0833301BC5C73BD67B617264135A229BA5AFDC6E11B634F9987CED2D1318B1031D5ADF069EA8B348C3C1C09F359332BBF7AB9029E82209BED2CAC1B59C640DB6573A564C7FA8EA8F4ABF3974DA852D16C3BF3CDD6AE0326EB73792FA73E158BF81D35A0D2C0657041FE0E7726F500A7FB8FE8AEAA\");\n            yield return (Hash: 77317916, Hex: \"6C42F63439436B5502F2F3408DAD65F84867C1F57ECA8010C7DC\");\n            yield return (Hash: 2043351575, Hex: \"19716228568ACDE1B35572A5393CD1EA6751856339A1DFB978533CCB45CB8868C51CC0FEF7A8C00BC1DBC52371406ED9180C21D6B966E10B9CED40748E05F9\");\n            yield return (Hash: 2693191609, Hex: \"C6EE536C7FA875245230C0FFE437150141EFB7AACC608DFEE4026C1AE03867BEA6A8D8B51FC1C9\");\n            yield return (Hash: 1729792154, Hex: \"4C8045B453E42AF7B145FC90AB4BB097B309F9D3A7B3447EE836DC803E340C1EF70E92A96A02E2D8D34A4C4B75D9FDE53AFE045A2CF2DCCAFBC66A3E84F848400F09A63FC09F0C7FFAD1069DF445F1B0B1ECF3CC281BB536EA3883049CB358EBC2D5AA106416697A2EAAB3C789D1A7546E64161930B0267985B616\");\n            yield return (Hash: 3300453323, Hex: \"36002BBEC6\");\n            yield return (Hash: 1128662929, Hex: \"6209A45E5E09F876F354F935C86956A73525B301099D3C1380B0F7CDC4D8D735AA7B142DC8F1B44DB844ECDD8C2031A3F220\");\n            yield return (Hash: 1203037999, Hex: \"D752D74C20AAFBA11D6B1AC9BF326414E577BBE0B15C61F0D721A7DDE248DDB312998D70E3D499D15BDA273B6D33536D8E81776C005D8BB885D0F33ABB86A4E5650D778E8E6678232437382DEC9902E50269\");\n            yield return (Hash: 2253346941, Hex: \"825B3ACCF2A497ADD9A2735F48D4D4CBFFB7B1628CBF13869FC3D11082612F95750315FB056683864C2F6E12488F4A0C\");\n            yield return (Hash: 1690729144, Hex: \"041BB9FCF5284FAEAF1D47EF4CD909746F868CC4DE46DF8B7640F3424AF88D21CD29C4FA4D8E96254BAE9F7BC9BBB1D0203CC95DA31FF8263C3351451D0169BDBD09CEF4B12A450DA7E0828F\");\n            yield return (Hash: 1380856140, Hex: \"B225E0A12E7F7B487CBA0446D73310011271DD35749EB6FB8331D31EA011A86A992F0CC2C9\");\n            yield return (Hash: 2065327477, Hex: \"DBA7DE7157A22AB05421413E003F90DEA866908A1EA2C12D7B0ED06A26BD5C9B5AEDEE70736311B0ACCAC590B3AD7B5CD374CC2E52A629CE9D70EF41749E8D5247CC84EFAD6CC97C2D\");\n            yield return (Hash: 3496820726, Hex: \"95832593D0680446E1B5F14A5795BDF8498F07D9E08B9664D3888283B196A68673837EAC199B2F28081427C9791BBE8E\");\n            yield return (Hash: 1646959112, Hex: \"462B9637185ADAD86C702291CD2E22059AB9EAD4D8B8628936997F0463BB0373302C9E72AF4BB15328315EA5BE0BF741AFAE\");\n            yield return (Hash: 759505046, Hex: \"9288E5CB965A08F55E504154A041D6763D7193AAC20D82E20F41DEF641EA5E108B31F4DCF5DBF7119A05D3DCF40A96BFAFE6D7DC60\");\n            yield return (Hash: 1707217863, Hex: \"0A445327FA7DC62AD627CB07EE2DE9CCA25FE70591FAC9AF512B6AAB310FB95D2D761F12D2142E988F423EF3784CC7EDC7439FA49F39587BDB17295F7DD7F156015D8007645B8697C98B9599F6E19B738C8E96D1\");\n            yield return (Hash: 4204645367, Hex: \"AC267A6BB0B5087131A95D96150CAC506094B3FC97E8388EFCFAA9500BA84B3B887C3BD9342DB3940D01B91E0A4E9BD7FFE07565C9FB18FAB553783C96464E87649E2FE8986126CF636677EDFF74A332F150B9B90DBA990193885A736126DF22CFC2\");\n            yield return (Hash: 1936830277, Hex: \"7990CADBDC1D459D6976540EA717E904AEDB3A89B92FAFD6F93803CEC58ED18A7390178DC00C9D00B49506633D50D08E4E61AA238F3C47D2FE124E2DD1799C121F1598CF228C09FBD970\");\n            yield return (Hash: 3937308404, Hex: \"5FE9D01869616F759C181AF49885D9D937533EBA8B2BD6C79B694549D94AC2A0FDCCEC73ED5A053A747AF87C506838699E286F2AA9ED1768868A1C6DC63448402680E4094415D8F2D2BB1067F4F071D8037C5457F11F0468977D54AE7C9E61F8D1813853DE660520CDF0CCB223294684927D829FE69DD0CC4328A6\");\n            yield return (Hash: 222291166, Hex: \"D228C2A65AD223FC7F68DB77B52C3A6D537CF68F499DB9B3B0143264AC95B48E85D66C0DC7A9210FBFD048801F25B80611DBA6B1DD2ACCC03F40A00D4D6AA390\");\n            yield return (Hash: 2044130834, Hex: \"560BF39689CE9CC32FAAB7DAD31E2F1CB2D3B243DCA00F9CAEFFD8C9C47140\");\n            yield return (Hash: 1314214101, Hex: \"BE37E2F2576AAABDD181DD2B3F80F99DDD1C4222CA9246C2CFE497F7301C3FD2E1C2DED55F\");\n        }\n\n        private static IEnumerable<(uint Hash, string Hex)> FNV1aTestData()\n        {\n            yield return (Hash: 1361456389, Hex: \"C39F3471DD5B39EF0F1A1AE3F99E6B1AAD0B6DF07216C84AD21F4F8CE3B0F5B246E4D603BB7A6B479585B64F903504113F0F5650646A253E4946E0FF78B4A39843336C0C94507A121D81C02C45BF9AA57FFA9DE203E3\");\n            yield return (Hash: 2608785184, Hex: \"0EE9689771E018CBC14051613BE46D625A7E79C4785301DBF172CA972AAD44FB8F3E5BBC3E74009354C8E02BA480DBA04E77D0BC0E27D2DD14\");\n            yield return (Hash: 2253803506, Hex: \"786A2B79C92AA259D2F1DEC039C1B4C389FCC0C8B48C6B5126\");\n            yield return (Hash: 2929817712, Hex: \"250A3B188A377359666031FFE0EC9F67E344A1EF66A23E8A906996C55A0D9021AFE257C7BCD1079FB9AC3D4E227F6E6C5D47CF21B6A9C2B8DDF71FB6F0C710D2E24E6219A41CCD7ACB90\");\n            yield return (Hash: 479938296, Hex: \"8A59D34A7087B54B38C282A94801E094BA74EE8802DFB9A79E85449D59C7A57CD16FFC5113D20C9A9E9CD70B47983D2B1FD351ABE6B3F8BBD76E5295119157E5ABE16F20E6A578BEB9B3468E965F262DC48C841A0FFA399AF4E62EADDBEE5D5DE898C654584E39DD3BCC19C2BE722439C0E4424F3E62D47B\");\n            yield return (Hash: 1987518212, Hex: \"8D168C33A0A8C0649B8067D9826E5DE60EC048F39007DB564941B979888DEAE893FC55CD\");\n            yield return (Hash: 1572158773, Hex: \"35CCFADA7E6E76DCE4C3D9CCA720C9D98F62B585A78D9EB9A25D792A1C9C00B70246381E0333244D31980EE9D21138D517601F0ECA8006D2DFA49FC453776B5E8701BACBD439172BEFBD3102F6FA\");\n            yield return (Hash: 3765341012, Hex: \"DE614D883B9D73646A43C972159C68AAF4B3E5A1A128BA08C1E9EC5ADB8375DE4DE85109146D486C87FBA136EBB5402B24\");\n            yield return (Hash: 350969713, Hex: \"76C8A6661B6F0E6A61F2279747F2BB32FBAB2A360D25BAF5\");\n            yield return (Hash: 2306635765, Hex: \"AD6FF731FB82A92DD9CC7035EB0B2EEF5F8EBEB31FD36AED45EC7CB1EEA23021\");\n            yield return (Hash: 662653619, Hex: \"46A9F46BBC1D431C2DCDA104B560216202F90FE9F8429D8437847996B2524C80C12177469D99DA328E5617B2FD3EC46161D62BE38F9FC536405E2D43C0B82F84\");\n            yield return (Hash: 1241428040, Hex: \"073C1D12B397957411492E6663DE04CAD68AB7B4B0365B602F9A93C8D44E83D8628655E6C716B1842E22EF02E8A3470D56AB54D84D7BCA54A90ABFADD6CDA1F7BB0DBD2BA8A34E237D479E6CFCFFF3BEE5854470E6C0B6D4CB044E01B5E925B25E9DFE28568072EDA189FC641BAA54\");\n            yield return (Hash: 372260000, Hex: \"6F85C6ED599B457EB30D04A9304CA6349266AF829109E817E210E11324A362C09CDD85C56AD0BEA8945F97BD13068F448196142633A439DF405371A824F855FB372222C2\");\n            yield return (Hash: 4255596770, Hex: \"508F3C51EA379C751D\");\n            yield return (Hash: 2147463074, Hex: \"DDFCBB703A2AF2CFED9ED66C933A041AB8C5CA3B230A9D70BBCA37C9BF42\");\n            yield return (Hash: 3811242695, Hex: \"E8849FF1D2DB1BB9167A7EBBF09093C2480DBBF80EA511865D196FA65E9CDE36D1E8FFB67878D89A9C9E103AEB17F0D373AE968D5282F8EB21233CC291AA56974426C6BCFE59EC39BE89EF889409A284BD8ABED31C0D55A0102288A2909C3E8B26BBAF2DE641F7F2A04B18A9F001\");\n            yield return (Hash: 3183583768, Hex: \"894F3A002BD34221DC1C0E93C0ABD14215578EAF56DBF119FFE80A9A267D64A2FB37E9CA03AEA3\");\n            yield return (Hash: 3093827160, Hex: \"13E241CAEE3518A10E1086B1CA72E8C9CD4FDF24932F0B1D219976ECA13051E57D8CC82D7C131E3656B0DE4C9264CF7DEB831DFE31B96A64AD4B5168141E577C269925B0110B7651D0B8413EFD67AE118277B94B5870FC4937ED50D0FA9C259A6A74FD1A1848\");\n            yield return (Hash: 1935616554, Hex: \"10EC079A82855E84F8E1EA0B8132F0F00A0556E2858D93435CAD14F33990D04CEA9111DE8DF002488350320C5E9D0CC6C7CECC8FE212644E71947A7BDF53EAB03AB85FDE3CB1D605FE\");\n            yield return (Hash: 1686441197, Hex: \"5CF031F375B84008D26A2BC6B122051955F71E186F20CB3D3DCB4D5093C8740B1EF79D31C441AE3B5D11\");\n            yield return (Hash: 2088135941, Hex: \"A49B8A26B331C60EA389C77C793EC6F0BA85608FE532ED1E7FE978A740BC2E02ED22767490D40D\");\n            yield return (Hash: 3416715355, Hex: \"7DB3142D94B9BD9B8BC7DB720C34152742DA62648915C2A055C7375E37A1CD244C9FCD516D02C94B91C2D0FD71125276DA3825FAD882362F9FEC5E9E0C900B462F0F2C195C348E27C457842F333C698C9B4773CA3B4B3F49CF68284A7BDCBCEBCAF1FE2B42BEE9F20EF2E205\");\n            yield return (Hash: 3693179735, Hex: \"C682036D7F28F4BDFF41A86640727C8C0756678BB71BA1094B1E2FE5EE286D4B1490A1DA0E5C72EE28AB5292955A767F605F909D67395C8F54F5AFBF93CE499AF90B63F3132D4D43B0160C0AD527926F1FE32D50B9743443\");\n            yield return (Hash: 2979101757, Hex: \"CE895747E625352F7E8DB9242565\");\n            yield return (Hash: 2339769124, Hex: \"41B48C27B49FBB03247C3B9FD8D9FA798D98602B8ED5109FD15CC732CA5D5FA7751FE0E1248027E7AF7163DDE1AD6B1486D7729978510DA5D37DE4912CD4096C95CFB8AFD00F80FC94\");\n            yield return (Hash: 4166965744, Hex: \"7572B00418FA5F10991622E5F9F8F866BFDD19121C4C24B7BF91B6A8BF91F6B8\");\n            yield return (Hash: 2941135003, Hex: \"5E562D62D759AE2DAA62C5D1B0953C5007F1696A9BC512476F80C8D55C95F76EA118EF548410CDA00B034E801869BE43A66A1265E2CCD3A2358F660F8ABD147DCF61BF71F5AC01096C592D\");\n            yield return (Hash: 2017351576, Hex: \"98F91986961488039214A1B0DB538DDC5601983305D89C3E0E66D1605A964E51EC904F8B196081EF0C4CDE168E6438CECF4F38C76B260D99F0A7C2CD323D14E01E37BF179534BFF3E7C612E7AA3FFB90457DA21AB342236D8E6EDB2CEB1762339194FAB616E0B52EFE\");\n            yield return (Hash: 4058281559, Hex: \"BEFD3BB88FA6F97C88D7E60E950841DA3C7B784AACDB1820CF677E41AD9F7C40B95E7AA0C52080E7FF37538176A1E55A1561E3D513DC4DC058E2E4BE8939F81BA8357167F78A640B0E3B1269E2056BB96B91\");\n            yield return (Hash: 312960025, Hex: \"5C52C5F628CDC8EE19C93256CF3EBEC8A550B231AE070B9F0425D03BE9572D93E3F22A4BCDB2920211DE3F8CFBCF3AE81F3129A9A7A2CC6BB795C3AA7D372CEDBD2A25D8857370D8AFC7031CB55611C43645FC647431\");\n            yield return (Hash: 3790049648, Hex: \"FBFFE5F647144BC7161B9EAF76E0600187954DB8683C25B459B5637EFF3CB7E8CA66B3ECF6119CCA9C8A5E9B9BE5C521DB0B0C75754F40ECFE78ED9B2CDBE7EDC010EEA21605657A4B685620E48E97E5AD41124FEA651DF69AAB86CC00E8DCBE69F52F44570AD333F5\");\n            yield return (Hash: 257192492, Hex: \"B12CBD989818FD66284DB3FFE4DB2247F990BCD97B33935B9CFFD30C2B8C4CB7E373833C44103E31E60C536DD5B13201DCD9B91309E8A1B2770355380EE8CF3F6AEB8C8E9740E0FE5926A7B2C10D85B11089E73EAC8CA4F54DB9D20896CB1F2177418D66C497BA18C6BB1E21D9C37DBBDCD6C54E898E88F8CCEC\");\n            yield return (Hash: 3337729486, Hex: \"EAFE450B6D78E0F943299F7192D4E3E092931BBFBFE539F32298B4B1\");\n            yield return (Hash: 3041093559, Hex: \"413F52D0C30322D78770A6B5A10A233DFEE46C3E2E36C41B722270854E330511D61BB7F89822D598\");\n            yield return (Hash: 2896722076, Hex: \"F0D38D9F0FF2EBB3434144A66BAA14236BED2C3EC09324BE5BA3D9C48E11D9F800E98349DABE1EA895DC6CE22DD76B3269E44E8EC41EEA7AD4C009B0D12B72344AA69CD3F4E502EB86C6352DA5267C45FBC0058EE360\");\n            yield return (Hash: 4046458705, Hex: \"76E4EE676DFC87B5B7A04B828B647A01887B2F9947C5C794D4C1C3BE4C57D2734D2EC19F9FD557881CFEA751616138C46964827E2877A3804F60E19CEAEECDD07AE1673CCC234DDD2553F9E4CE3DAE7D82A398A861BF3FC6A5F54C9ABACF95BB794E610230A1D1B53CA6\");\n            yield return (Hash: 1953775614, Hex: \"0AF01B8BCA716549FC313110527578F9177782AE68767A3903B5C6C4B55A52FBCF599D7E00127EB7ADA0F488EBA7F734C37F911ADD6BE442D1291A2161F139D8AE\");\n            yield return (Hash: 1061007274, Hex: \"D51761B8905CFDB41F728987BA8F8C816BD9BFBF95BF57BE5A6DD648D26829B0D4241DD15D9AE5C54AA58DCA25105B05FA975357341E6AC5F8AEF3AD007D17D47F6B91A2104965B221E3\");\n            yield return (Hash: 2885560163, Hex: \"3C83A4CB8AC333E107D186B0353195F71B8409A21E2A2B94C4FAD2FE45445BA521BB7BE12920019D600A695A053638D79C5E890F05FA409AF651B691A657AC8079CFAA3741F9\");\n            yield return (Hash: 367681258, Hex: \"DA5D0394DFCAC82F5E5F3058E4F4788991000DCDC264A30B840F679CBBD690EB934A3803F2E7A7\");\n            yield return (Hash: 1312982385, Hex: \"74136CD375821064806D00FE71D7E665DD26A08C4E92FFBFF529417310CBADBC8FB0B65C314032B1D24947355B498615E4E2F2D2A39652400B4CB1024E00291E1A21B2D205273DE459D09BED90161561D9D7C92ABFF6CEDD52F0A0CF1D6B3970ECC83D18F2\");\n            yield return (Hash: 357664514, Hex: \"E6FAF7B32D\");\n            yield return (Hash: 3850666108, Hex: \"3541F4D9DBDCE2371A38941D3EB934B792AB489ECD9592A101510BC3628FFFA6907C8F829C6B263FD180C6DC3851087D55A12DCFC0F5D1546FD131343B118D95C3C08285\");\n            yield return (Hash: 1319863581, Hex: \"3766978FC68A2A9B59D4271ECB2E1B66BD56B5E393BB1F36C92310D59B573AD877B58F49C5AA9F7609E941E7C7539F07DA055E24EE5993A44347753A28E9238D76B930E0DD8A00E426AC657E833CC4B1BD9B61\");\n            yield return (Hash: 1909597356, Hex: \"C46F1FAF0CC34B1FAADFFE3FEE52BA9926A17BF35E975DC7828AC7BE5DACD58AB145DDA45E1E0CD642E38C1F2E5F33461D7BF7742C71C32664E97185F47A48ED655534B5EE627B69EC1AF7C1CCDD9273A898\");\n            yield return (Hash: 1230143715, Hex: \"87DAE7F7599C5B1F9F0151DBDA9EAE7697F503BD441D889EF048ABAB44D5BD3E248DC913D45D19006854EB3D7C1FE12481900D76F92C4D830AFD8451E8D876A3163F1CEDBA0986CF5FACC98BEFFF0DFC2A9D96A69D2341A4A4A67835025388205E952E38C39BB558A2938C6550D028E321E35B912B9BAEE54A0A\");\n            yield return (Hash: 1517782810, Hex: \"AF3383F543B6430F14F7D44651F2E732F73BE785A22F4FF250A84D2421853FAB312D11D2A601926C6FA19F976F154A3CC4047A13FDFED1E0353F9E5BF3A38AE7F215E8DCB698D7E033F69F94E2EEEC2CB5DEFFB0565413CDD9C3C22DAC4FBFF6CE57306FBD50AF4A33B68F70B44D2A4AC0315420F2781C6D657D84D2867B\");\n            yield return (Hash: 3913863138, Hex: \"36D15064DB2D07FF1D1C4F5F2FC7BD6B99199C65AFE7D77F53107BFCC91C87336E58572CF5525870E0EBE58E3FB359\");\n            yield return (Hash: 1031960380, Hex: \"E0EF15079E7631C869AE181CB3B729663EEE565449D5EF6DBA53D90C95056C83A21D7DDD682212B54C99EC3618A609A90D66424CAC7F4F1D12CA05E62D1699B0224ED3F19ECD98CC2C694ED5BB61E997C85FA7F2BFA248B09AB44451D163B7F743\");\n            yield return (Hash: 2870556520, Hex: \"6FBC04B1D3C4C2FBE69A58D96FD793FA5F9528429B3026EEB4C4AAAFC43E2F2535CA201DFB88CC0A964D1EEAB297972FE994F06CE4B2815039E8ABC182857E16103888A361302EE274E8FA6713743B3B3DF8CAC32FE8D79EC699069B36\");\n        }\n\n        private static IEnumerable<(uint Hash, string Hex)> FNV1TestData()\n        {\n            yield return (Hash: 2635463645, Hex: \"118E53AC4261C1B2E2F3AA94F89130EA1B4807BCF664A78A16DAA00F59DB10D02657DEF2B8C1D5A1CE2BE8FF63EAE3986A8C08BB4678C37EC8C5EBA229F95A97223C2DE2EB88D06B81798049EF6EAB4C777C1CC811B8253489F27CD2B2CDF45A482E2379E9136053794DE3CCA821B71C68F39211AECDF4CB8EA0\");\n            yield return (Hash: 3554551697, Hex: \"E319A5CDEA34972F3E2D7B81C24583CA5E763DDA8591E904B9F9C1716769155A7C9FA9D17BF09AF2711F1E8CC6D32FF7FB133454A4ADC643699BD1C7AB484E098CAA95ECAC15A49F25E81AE357A7B9520589CD\");\n            yield return (Hash: 3982721760, Hex: \"6AE05848413566607872541ECC76D4AF4A\");\n            yield return (Hash: 672705717, Hex: \"A02207BD7349633F37845DC8BD3D4E\");\n            yield return (Hash: 2990425823, Hex: \"B9F7A582AC8682B5F7D86A8A7DC9CE47EF386D00BE7FD7F2648CAD082A9CF7CED9127883458B640DDBAC0A3FA03B8E9FA7559EE249E253D2CA64262835044AC9B030D863B857290B34D45B88792BA3E64BCB513D164E02C76D0F1F17\");\n            yield return (Hash: 1617851715, Hex: \"FB1A3ABAD624FBDE518919F90B0CBDC3D164AADA18AF04674900071045129AF10C0FC15B699F0DB0F54AA51E7499C0C2D5B1D41EA8A0A30DE5AF1281F7C8DE5FD117315B223177D3211A2EC7F9D384930CDE0403A450733AFCB6BE0B6B6BF8D0EC4969662D2E218DB7C4BCCDC887BE97F10AC9EAEB2E6D\");\n            yield return (Hash: 1997689341, Hex: \"B4A95302A89926C834D03E244023A4F19733C120\");\n            yield return (Hash: 710844990, Hex: \"D38D62FB42AD3A9E16221E7C57E6EDE8F66321E4E757015E30DCB794B34B435376D443651A48FD90\");\n            yield return (Hash: 334089402, Hex: \"DF6CEBFADD1BD0AE528F2A87D1DEB53648C4FF1204F0012C306EFF26108E7966F9734862801E1306FECB32040E94B27767B63C462CC7013908303A5B81D6C3C8E53802CF39FAE89868D506C31F0BE838160FA9\");\n            yield return (Hash: 796899110, Hex: \"11EBBE80570A9F8FD49945FA9C67294BF80A30E57708D2D03E5674AE83D71C55302221C0E15C75CEC29D51F88E8CBE4F8F00208E5C3412386423BAF6B24E\");\n            yield return (Hash: 554746798, Hex: \"E716A769AEAED214344BA64AE4D972CFD13A4A930B76FC5088DDC018D08337B02F35EB687800E8CDD91ACE22AF50067E13ED9B\");\n            yield return (Hash: 2598448612, Hex: \"1A6206EC89\");\n            yield return (Hash: 3499195506, Hex: \"E5DD75F87DCC85C3DA448636C10BE0F49EC647AFEDBA5453D7ACB2FC3F22CF7E56EABCE4D958BC734C55D7CEC29D5846354206748E308A29235B26EE08A8AE1B52DDC11A4ADA347BBD7C90F62239BC7C76BE159C6286CF5E05C5CC8F8762352E051B908846311A832FE147546CC0C48EDF92AFA10488\");\n            yield return (Hash: 496228964, Hex: \"764395328F06D7C708188A15E05D4C0F10B8AB3C49923293EC1BFD414723AEFAE5CA681E2CCD5855F015A318E243D33BE54B48DEB2A8774DFA16F7B6F44784E597A3648905B5A92A2E0F49BE1D3B50A2D40DF5550E08C0C32D9103633BDFA6C4C9AA93935CFEBB175129BEB96F0CA43EEA11F0\");\n            yield return (Hash: 3708071514, Hex: \"231C6FCDE0CCB5326DB0CE296AA1\");\n            yield return (Hash: 1489016575, Hex: \"4C29A62B7F71DAC0B3DA82CF16F66E95D8B1C1B089C881BD5CA55E67CDDCF78527F6717136\");\n            yield return (Hash: 1285004468, Hex: \"1A0F37C1FFDD6496B9B91497B83424338F1A50BE2CE52077C454324859BD8212F3EB8296618EE7B89A829E9C5D\");\n            yield return (Hash: 2421629476, Hex: \"35961DF93E43F8C5DABF6B47E32AB0B1930E331D22C8EA2DEC71EABAE40C2160A1DBD6133C6F32767F22349D631B2EA3483DD08AC2E5D7B7C8D6F60F17085144C4C171694B3D9733B83BC84A0BE6\");\n            yield return (Hash: 718757354, Hex: \"4987EF65D5F15275D96030819476DD88D294D01D11DF3CFAC427CA5ABEB8C3464B446063B49E60E399CD6EB039788B6C894A031A4BF7B683F9E2E11827D2A68829D78A538EE35F5AAD6C0D2D0078A69DD913DB535654621790F6AA7DDCAA55D1A688E97D894D938510468C297C2C31979CD2E1\");\n            yield return (Hash: 2152987200, Hex: \"97E816ED628705D91F057E63FB8D23186E8294D1E834DC758E5EE5D6820A13D07F85D29AFB15D36B772D5BA0ABB92BF91841C40E6FE36ED48F8E31D83E1BF740DC7FB18DC7C87931CF5CB252A58CE0B92E5A3FF32A0F5F702115B94E\");\n            yield return (Hash: 1917736693, Hex: \"FF7E577A035D979747EFAF9CA6A035C25E05E4F54A8397083EDF56A6A4379CE6D50C0692104697B5D03B3619851F0534EFBEAD2989E70E2B65F0D5D73858CFFD74564DAC101A6D58981307A066B726C6DA3422BBA260BF61B8876394D563183FEB9B\");\n            yield return (Hash: 3944322793, Hex: \"8FEB17B2F6F95D9A0DCD05E89E9C21E22706E511119F1A6AA46BF8895DE2E445383890A5267F4795A538B00382B0E00ADDDD728BE2AB20C4A00FE47AC821C1A4894B71A3B7F248B763814938F1DCC72A3D1BD271113718CD8D1781C9A322E79E2F7392C8F22881CABA0FBFD54D8BDDFCA91E1A22D0C754F8ED20\");\n            yield return (Hash: 1786860816, Hex: \"983738658879714AE00690EC5B5AB4C25142D431C61021CFC8271A07\");\n            yield return (Hash: 3735522879, Hex: \"D98945D23F62E1A51729E61C7E7E0F30D770553638262232D7CBC56E2AF19F5C824363268416F2D5F7C07DA866AABA32B8287EE0E051D7B5D7C6BCB82353BB729217C70F0FCA13A7E24E1B07E10A81AD1CCF50276814ABCD44F8EB\");\n            yield return (Hash: 3276802671, Hex: \"35BC70A9E9F63B9C\");\n            yield return (Hash: 3581834553, Hex: \"DFDF1338B3D512778092575D45D9FAAB355C2CC5F2D87F52B222927249D6DB10916D100C7394E199644B5A6C98DBEF9370D7E69EE33592E43B5F78AB5D\");\n            yield return (Hash: 2682332667, Hex: \"EF291C6D9E6E9A11A2365B730F8F\");\n            yield return (Hash: 3167559903, Hex: \"8F8FBF3942A204C4376A22ED45D4BCF767E536BC8627E6A7CF5AC9D8D7544B\");\n            yield return (Hash: 1505748075, Hex: \"5E302BFF6D2AEF77FB6B723AC3767D0D47CF2CF44C7782BECFF5334511114B2A45B488E8065DF9EC7832F2A677DEC15C64684FFAF0CADE088AD61DA95B5D9AFBF4FCFCA1037346208C8404967FA233\");\n            yield return (Hash: 3445243446, Hex: \"F96A7E5D703CA6A81F29C2DDADAAB9D517A02553F180E88A046E493C61F8156A36AF0DCA9B66D216EC48005FF1EDA46954EAB429BFAFE7B8DD540D859A5DD02C400BAAAE52665712583748E7DF166CA8F6219611DA738C5AC3AB7433BEB09A\");\n            yield return (Hash: 1006732137, Hex: \"4B7C67F1A7A758F88D617BD1428F894374A0459312432216BC95BFAE6A85D19514B5411833A3238B2D06375C\");\n            yield return (Hash: 3113778847, Hex: \"75EFF30CABD2\");\n            yield return (Hash: 350882350, Hex: \"225797E64D5B97598872AEFBF39F1000FD88B54F4EAA199BC43B871481B3E9050206A838D1809252299162FB41CC2A666070542FFF6A5D02EEF7\");\n            yield return (Hash: 3347250713, Hex: \"1AADCA83D0DE540483A7BCFE3649B3763F2B4C1AF717A16865C5731A376522874BA7FF8E392E1D984E7DF89D69795C48A5B8848FBDC0E7C6FA7F4A4ABA5704499A74B1047D9081F7E745229F3D56BB6A85CA82D46EEB6F0247EB2303CC23A379C45A1412DAE7711541DEC0\");\n            yield return (Hash: 3820365861, Hex: \"31658A5FBF3AF595603C20F31286B3280320C633C021B66BB20DCDA35AA5A7C17BB92B5D\");\n            yield return (Hash: 4251210636, Hex: \"3D6D9A80C4798BE2CE204A53ECED97990E24FC4109CFD4DC8572F8FA9C2DB7B83BD98FB9185AA00E382EA83A4117E5B04B8842DE5180AE60F9A1B13DDAA28A164D80FCE5\");\n            yield return (Hash: 1004972091, Hex: \"CBB5E2C7C003C0EB7B7CC139DDC7A744EB4C5970EB190777A970D39921847C4F825BC614D62EECA1F27A4D1AA2B7D893F344D185F17A5726629A291BCFF427D54083\");\n            yield return (Hash: 1637392008, Hex: \"BDEF7F398AE1DB30874ED3C7FA04F018B1C3ACC11FB711ECFB663DA6A620436049BCFFAC6B4064951EF53BC4AE218817F35170A6238F14D0352FD4501E4FC806BD7BC1F8E7BCE3781595811B0AC8DCE7CD978776ECD399C24B8F3CF874E8077427AD64823B3D69A7AD9A934F38F1CFB294653F7C7C49F08E0D69030B\");\n            yield return (Hash: 4012815856, Hex: \"3E53E58324020DF1\");\n            yield return (Hash: 3766955629, Hex: \"32802317BF6CD45754C8991E81F4A3627FADC7AB2AD81EE7E550D41834F93C2C33FCC4939B03CE9B22873000BD25DC6C2F1679524BB793B21C6821B4982BCF82B1D2EF987544C9EFD7329A78006568CC64F70E15A5FCC79768357D044BCB4D4A1A173DF3F8F029F94A5C732E38F4082E41F009B1AE\");\n            yield return (Hash: 3827511978, Hex: \"D6669415EB0BB4F657EACDEB18E44C2791AF251BD303F73B069BDA98A59E987EEBDB8872C905BA2F20BF49FA15208E033A72E55D35F1A1ACB47294252BE69701F5CD0D20E97C\");\n            yield return (Hash: 1670646873, Hex: \"4C2D28E32F4817289B67392319E76F084D5AF1E5F9585321D30D1ACED7FE3D52F3E3218B6021024A99BC205EAEE1E4770BDCC02571F102D15A0DB2EF469D1FBB2F400E20\");\n            yield return (Hash: 3489845652, Hex: \"5506700AC494CE0810F97074923CA577611BADFA038D24E97CE8AC07C371747899250A5A84966728BADE56F1996630052934FBE29F6C16F872CAB711953FEE460EBBC93C8203B54621E63357A4A982ACAEC820ABF2D64B694C74936224AE951B6B41FDD40EDB28360FF718FC6D0CCB7622DB\");\n            yield return (Hash: 1048038136, Hex: \"8BE86685ED8EEEF020848D6C19F9422815695F558F73BECDE8C24790C6358C8E7F561808FC87EBFBFAC0BC1155628ABB34C0FB7AF384FDA9AD243B0A8388998D8B533F55FCFF90294644F6631CE0308781D2CE99307314EE1B06BFEEC8C1AED00E5BF0B555D6AE7B460592082AAAA41D7BE415252A05\");\n            yield return (Hash: 1877284463, Hex: \"130725DBD49174511E9369BC598462CBEDD5201DD1F79DC5FAE3DD7B88377F9EFDCE21CFD69A25362137E328B2C56901F77AC651EEB3875F3FE68A7EB6E10BA02D616E\");\n            yield return (Hash: 3012322111, Hex: \"1522699E28DF16B5D7886373131E3829A0FE0F78A7043A2C6AEB5141A9ECDF\");\n            yield return (Hash: 4014607478, Hex: \"332152DE740D3C0850E7EDF50C16A56A29C39842B8726CAEE9F4FBCBA08C241772138E65457F35FFF50BD4F89041742ED26133AC89EE13D9F7AF199A6E456BB99862D827656FB84B276F3C2E770AFC2AC7F985EB73\");\n            yield return (Hash: 157816068, Hex: \"4D2936D4EDC732730A37C56E\");\n            yield return (Hash: 281191578, Hex: \"7585DEAD72C56152F8FC4E5D71EF812E48DE425C79164EF056FDE93BBCDC662BABFC2BB3BA909BA771FF2324885E25B61181CAAC347407C3A23E1313F5F3B8B30753460606492FEDACB4073A36EE9A9C5A399AC5E4A754AC750F05A50FFF75F1689AE2102FA66F974838EE7D53A10480B3A6E26142BC\");\n            yield return (Hash: 441585460, Hex: \"C6FEC97C7D5841B18CAFB59898A9AC09CA480594D8E6D02BC39604FEE2E02719EDDB845F27F88136BC67F63EBBA2312C212AB8E7B7CC06F81B9DC1CE018E9421CC8310A9E1362829D441ABC29289E86CD5\");\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilterTest/HashAlgorithms/Murmur3Test.cs",
    "content": "using BloomFilter.HashAlgorithms.Internal;\nusing System;\nusing System.Buffers.Binary;\nusing System.Collections.Generic;\nusing Xunit;\n\nnamespace BloomFilterTest.HashAlgorithms\n{\n    public class Murmur3Test\n    {\n        [Fact]\n        public void Murmur32BitsX86_Hash()\n        {\n            var tests = Murmur32BitsX86TestData();\n\n            foreach (var test in tests)\n            {\n                var hash = Murmur32BitsX86.HashToUInt32(test.Hex.FromHex(), test.Seed);\n\n                Assert.Equal(BitConverter.ToUInt32(test.Hash.FromHex()), hash);\n            }\n        }\n\n        [Fact]\n        public void Murmur32BitsX86_Append()\n        {\n            var tests = Murmur32BitsX86TestData();\n\n            foreach (var test in tests)\n            {\n                var murmurHash32 = new Murmur32BitsX86(test.Seed);\n\n                Span<byte> span = test.Hex.FromHex();\n\n                while (span.Length > 0)\n                {\n                    var n = Random.Shared.Next(1, span.Length);\n                    var d = span.Slice(0, n);\n                    murmurHash32.Append(d);\n                    span = span.Slice(n);\n                }\n\n                var hash2 = murmurHash32.GetCurrentHashAsUInt32();\n\n                Assert.Equal(BitConverter.ToUInt32(test.Hash.FromHex()), hash2);\n\n\n            }\n        }\n\n\n        [Fact]\n        public void MurMurHash128X64()\n        {\n            var tests = Murmur128BitsX64TestData();\n\n            foreach (var test in tests)\n            {\n                var hash = Murmur128BitsX64.HashToUInt128Array(test.Hex.FromHex(), test.Seed);\n\n                var data = new byte[16];\n                var destination = data.AsSpan();\n\n                BinaryPrimitives.WriteUInt64LittleEndian(destination, hash[0]);\n                BinaryPrimitives.WriteUInt64LittleEndian(destination.Slice(sizeof(ulong)), hash[1]);\n\n                Assert.Equal(test.Hash, Convert.ToHexString(destination));\n            }\n        }\n\n        [Fact]\n        public void MurMurHash128X64_Append()\n        {\n            var tests = Murmur128BitsX64TestData();\n\n            foreach (var test in tests)\n            {\n                var murmurHash = new Murmur128BitsX64(test.Seed);\n\n                Span<byte> span = test.Hex.FromHex();\n\n                while (span.Length > 0)\n                {\n                    var n = Random.Shared.Next(1, span.Length);\n                    var d = span.Slice(0, n);\n                    murmurHash.Append(d);\n                    span = span.Slice(n);\n                }\n\n                var hash = murmurHash.GetCurrentHashAsUInt128Array();\n\n                var data = new byte[16];\n                var destination = data.AsSpan();\n\n                BinaryPrimitives.WriteUInt64LittleEndian(destination, hash[0]);\n                BinaryPrimitives.WriteUInt64LittleEndian(destination.Slice(sizeof(ulong)), hash[1]);\n\n                Assert.Equal(test.Hash, Convert.ToHexString(destination));\n            }\n        }\n\n        [Fact]\n        public void MurMurHash128X86()\n        {\n            var tests = Murmur128BitsX86TestData();\n\n            foreach (var test in tests)\n            {\n                var hash = Murmur128BitsX86.HashToUInt128Array(test.Hex.FromHex(), test.Seed);\n\n                Assert.Equal(test.Hash, hash);\n            }\n        }\n\n        [Fact]\n        public void MurMurHash128X86_Append()\n        {\n            var tests = Murmur128BitsX86TestData();\n\n            foreach (var test in tests)\n            {\n                var murmurHash = new Murmur128BitsX86(test.Seed);\n\n                Span<byte> span = test.Hex.FromHex();\n\n                while (span.Length > 0)\n                {\n                    var n = Random.Shared.Next(1, span.Length);\n                    var d = span.Slice(0, n);\n                    murmurHash.Append(d);\n                    span = span.Slice(n);\n                }\n\n                var hash2 = murmurHash.GetCurrentHashAsUInt128Array();\n\n                Assert.Equal(test.Hash, hash2);\n            }\n        }\n\n        private static IEnumerable<(uint[] Hash, uint Seed, string Hex)> Murmur128BitsX86TestData()\n        {\n            yield return (Hash: new uint[] { 2215698659, 3032003959, 3503290373, 4051986413 }, Seed: 624323927, Hex: \"5AC76D60C892111F5122A371871E17D5993E732E9A670899D5A9660B106502C5A85630A6311A3D46146121B193\");\n            yield return (Hash: new uint[] { 3154649860, 572048720, 4281386050, 1363778496 }, Seed: 1463608608, Hex: \"7259177D8D8E5838D716ED561E6861B6EABCA2BFC600CF6CC7C2ECD01101C0F61E59A634B175B610CF547EA66B75A5A4F0FD81E2DDDB455099BE303CBD33DCE9C09C6254D6C7E02BBDB14E3E81AEBDE30A4D14C5BCC03D10C25D194DE9B48B164E1ACC53ADFE8E82EE0738EE7EA9E6C60EAD408CC004070982DC8D1BA560A6C27B881D9AF4406C5B900F754FB6EA4F535EDA15DC95494D21864FFE5C86C76810EB8147AC31347270C922827FDD940729944E82BC414ED1FDB16DF7B824040634A45512D37CAD2A589A7C77905DE05AD5580E0D9631386C0969668C5D5DF3791F58AB17DB3D2554714BF0E27F70CB8337A62B5CD9A2C5CE25248F1407862A890697A034E8BD23FC6EB25EE041DAD4687C92D745F9F85E82D0E6FB1BC0B93B975A4DAF1D7F259E09CF87542230CD0EA113D002A572919E67924C7EF4E3C1A42C868785CFDAEB9081CAEE31C297B6861896DFAFB3E922A581231BA9BE48\");\n            yield return (Hash: new uint[] { 3396939834, 2586312543, 3441226297, 1709100437 }, Seed: 884763529, Hex: \"7600090892A3FA6EC758678EA3DB4D0AE15B9B22374934F3DC3421EF9ABEA9D86AFEF497391C9BF3EB4CB238CAADCC8BFCE983E50699F850CDA8A4131A26DEADE23E046FCA47A51E5D949917C74DF7A50C7C2A1957E43C726C1107627E677F5FC50DF2033A36EEE0BF529CD63D061A0891821C21CB1959108C90F79CA428934CE1D728D64806056C15CD41F3F1BCC0D339BC57990EB08F2905085A75B9B7CA6DC7DE8D4B20B52B44EBE667FC85E3FDD2FB7AA0788746421E3EA1D3D4F956C91BC0EDE7E163BCAD1940DFF524E8E09CABC4C166016843D2B71D25BD39C429E0516CBB4883295A7CFE72673F01092D8CA0586372AC6C59FE8DB78A84B85294B03FA8F035DE9F777059B8AED320A47104AEA6340D000650F5A46A96AF9BE6DBF025B4EF59EFA88C009538B0E8314FD1B387E57531FB42F1010CF94C6E8927BAC6412D85B9B445E4F999D2DA09AA9F525DA0ACDD8AB37C204F5B5E9F3EEF875AEB29E2AF2692EEDBE9F0DD6AD64E7794A33C27FCDDC6CEDB13C4B6D3348E08B8C8F9B2399D18B19F0703F741230249F828B95DFEC555EA324E914FD4A903FFE259\");\n            yield return (Hash: new uint[] { 1527664213, 633745573, 725028302, 3745625528 }, Seed: 1548519348, Hex: \"A3BCDE6A573D1F07A8A445D0E36537B3A91ED1D5B279C848C21FDA3A75A5834DD1F120DE639DDA6BCF5B3F5CC27B4BCB50601EFEF973E0EBEE737E16E292D8C2BFF9D162D487EE26E7F0F4983509C71243DB46D3EBF1B40F75CC0DF04A33257053041EF3658AE5D3A03EC2EA84E70E12C02D9D09AADDBF1F28476EEA21C9A22BC23A6193C06EDAD02099AB4B341B90FA65C76F8E8185390F79BC92D97EEDCA0AFB579923541C739CAD114A05BE134A4F145898B84EA8F629C7DB098CFD00BEBFEC443266E93F94CC9683E8BEED8B0E07B53496A7AC8FEC180CDE059BCCA28FA9995C904B354AFFCC7231F48065BA3ECA30E6C5AA8A0216EB36BFECCD6EE78C55561EE9A159D431A8529670\");\n            yield return (Hash: new uint[] { 2814272976, 2376951385, 871351497, 1880781378 }, Seed: 699095942, Hex: \"91D4A9013ADA4B7BAF5BAE8DCB6A42A1E2A0CBCC51C19BF7E93C2B8C1FC52066F0592DA28426C49B28D886A42EE9E03580BD0C641CAE91870AE87AAEB76200E75B84453252D4740294835AAFA91BEC737DC13B3040523323AFE3179E015D99414D754523502509F962C6A5E7DFFF8D2AD928E7935F95BFECB29BACB2B1DC235975FA22B0757D0F2F286A11A42EDA34F697D04516B20B790CF10B6D99C30D8DAB4E68A9ED4B202FA2ED3F0EB8F7A3761CC009E7366B51C74A8209923DFF50BC054641200AFD0A042DE92D0164FBCCDA4A1C4B1BA38ABBE48C8D07BCADAF64383EBC42583E4AA5221010BBF156B5C294B5C366CD9D47055F8EED55663035EB5A74F829C758F1635725D4126B82E8EB7FDF8012B2789ED3D8239587F4D179B1875EDAB30CEA8259413D56A6EB7EB1EBC56DC59A123E76FA2066FEF93A8A2F4D26C458BC6B8E1189545019C60F0D4594E8A329D29BEF854C843A8C591B5E8DDB5719525BA16FFA\");\n            yield return (Hash: new uint[] { 3157099896, 4253082395, 1731844123, 2146741131 }, Seed: 1077983759, Hex: \"7C4D86E4FEA6565297803BA1BE27821A08F53A5F72D0409CB65527C1AF1D1CB0656AA92E2378808C7A787DD443BB0658A170C19FFAC7B52548F6C137AB0143578B80EC6BCE4F5FA8DBBB58E6D090C82B185352EE242BC2590EE8C4E9A5D124E592651BE42ECA7CFF20B86A02A38D0936BC0B9C504BDD957EEE17BDA61616772D5CF43F777B40697A5720872D2F0C3404D5907D658945E2F5EFA934328309067114AFFACF78EF40B9297DAB86F637C60AD3AD40F8703F954D9AB74C4F740B1EA8A390C3026A2CB630D722D3CDCC794DA74BD62C7246F89AB4C737EF04F14CD80FB043FA03055057C09D4C5C7DC6F1B52FBC14755A7D053376685BF0FE242EB067C190269BF6006E6CB407FA64C479641C10796299F3223AC61CB58BD55D4F1998EA430102053EDB9EF8AC914BC09607EE242566AB3288A98382D5E3D789E1B49249916E8FDFC336CB60FBBBE7E07D4216C7341A9E08E8A92A68E4F4DE515D8F68538CC36E36A6821BBACE98C666A2F0765A27E284D1AF4556E8EC2CF1C59D15A349BA1ED6F0B6ED64856AB04E5EC23ACB837C80F75526CAAFF2E574027158660A\");\n            yield return (Hash: new uint[] { 3011620754, 1922841245, 757695589, 3009933068 }, Seed: 342502790, Hex: \"7C421F7F92B6A97F4696236262C81518CC26E301EC239F55D5D8E93BEC85FFBE456E17C3A84550E629A0E2A78615153A3FA05BA260609B291F7CF8A8C5F2243865A51AE3FF5EEF41224D3835F77455388F122F50E935FF47EFA2CEFEDD4764C70450D2A1537B1ED1C0751996411EB813158FF156F58AEE08ABF02EB2CD640882EDBBC626951CD7FEC7C5DECC599F287138C2DFBE5854C005A9BF2A65E12B4076BAC3827FB191C32C6326A7BF4A2D438362D404ECB82CA93C9D7CED88BC08B1E65365DD38A2C95CBD1BC92F6662C47520AD3DDC33F2BE7642E8D73FDA1342D92B3FBC1DD947611CE242C78D870CBF8A882A34E2ED93BF7DA37C58248DE98114B1323831E02746FF42063291A7F3B270DD16E3F8EC44C9BF5D7252D893965545BF2EEDDA6E67BF2B011C155B45F969DCA35B3535EC75C3D95F018AC3CC5FD2711EE50C74D9A090C11F7AC92C88CA1DCF8774A3653A468917CE74138CAE29409D07FFE4F6DB18268F6AC90214EC7093A1C16C9DAFC8D6EBC9847564D5C98AC1951905AF8D4C6AC414D438E007FE112791B814CC93C040F59B0DC8B1B856044F5DE812EA8936D624B508D1CA48476BF645DF3053156E78902953075B2C411F5DFE6D83CC8A89E3C8BF5854262D4AFAB63FE677D8678AB04DE3B5E6C70FD5029FFB4097A3E8835021CC3681843C27243BBE0326F5A6057BD2E74C0AAC3B\");\n            yield return (Hash: new uint[] { 1390625245, 1509992835, 3393821357, 905365800 }, Seed: 66510750, Hex: \"23190504CC8D0E873E4F308B72070DF1BE692359AE0D8864C75ED64DCC5E67D74AB0CFEFB92A4FCA3CF7BC07EEBC4A9DA8C3EF1DF1442220279DC44821BD5D6A62996DA44146D19643487AE5CA6082314A2F5F2ECD09E354B9BA5F1F4C7B32ECEAFCECA95A41C2667D76C51690F9E2FD1B1C6C\");\n            yield return (Hash: new uint[] { 2700877340, 2890106784, 2482240300, 3839655744 }, Seed: 1268474063, Hex: \"D7877D9842609C596A1AAC41C8ABC98810292EECAA6345F178A6D47825BEC4FD86E1D328CC96A8E0F9715E6BE4E0AFCAA818FE2840F0423ABF8748CB8A5C275928358F44436C68A2ECC52B8F2D4AD309EF1370616A6181E7E73BF0F3489D277D24370A03525CE6CF9F88AF2D17329CB749A7132D1890E82325337F6CDE053619ED2D1ED34792F104F3DFC1B3DA5BC81D6FE2017DE3277403F86B488000C6CD815A19247576DB0EFA27FEB4598A9852BD3F0D09ABF34137A7C069FEBD28CEB2E0EE9DC23CE21C26061513D3C888C84ED5A4E4CAE2918B37BA2B04F751AF7D9EEC27E44D71D8019176456157E5ACE56F7A80DDCB4702D900E06A902B3A2039CBE22736B04E28219BFBA4A9B10BB9A19908D4B59AF2250122C378735D629D1053657D14E425E17F1CB5B50E559617221271F52CE5968AB35ABB6ABA69C2F963954A1967456613DAD186A8D7D7F54422D60235CE5B10AE8D1814321DC8DB520F579F6B0D1DAD505B32DEA04B60DF9FD44C59E66F21AA491B798BA3037CE605AFCF12\");\n            yield return (Hash: new uint[] { 1371950926, 4217458030, 2481921480, 3800305645 }, Seed: 500631581, Hex: \"6C55C9C761583F2E311199AE66172E43FDA107E4421E4163FE112391883CA3B45675AF360D38CEF99D5740B83FD73D77C083384157572F2E880A4C2C79A737AD105A391271A364632E52BDBE11CBDC4B4053A167CD1E6CDCEFDAB07FD091D2A718370D3238D32C131583F1482054CFC4C8C9B07FF6BD4AC1D67FEC69C553CA2DDC92599BE916AE211BE901FE62500391D2050BD0293CDB8AD35F64339A44ED4FACD362730025213604099957B1CCCD1E4F0B052037FDC1E6D99C4A2009AB100352D19071D38E5DA684E02B8E187AC91858DF0BB89982633418B6A825B11D4BC66AF7E7973444481DC38F0D5F8C50AC9D083F4135A7CA14279F1C721FC1A37E45358A7EEB67D2B3A88E01404023BB0A16A9D7736358714FC6F07FD7E81788F8190276281AB0677FA852F0F78C501ACBA5A2F038D5FC96088EC64C5C2DB3DC35F601A886896D856FCE452007C8101CBAA4DDD15769F263E2638275B31DFF3F1A623722BFDF\");\n            yield return (Hash: new uint[] { 2502744574, 2541527050, 3786137451, 3730535590 }, Seed: 2017078500, Hex: \"DD03646C268E1FA489E701B62CB1D3544524C24DA7B0747AAD89A1F348D760B3DF0EFDA67BAAC5CDE6CAC1EB6AEA067C1864CE5966F5891EC9D5CABD4C0A39BCDE326C7B8CB9CE9B967510CF28A3CB1780789CC57E7D013CC67A6066E0AF14787B4BC78203652531B8B2FFF8D3F4606D7E26ADC3440AF0B09C456759F9A6BD72735DF546F5809C9BD120FFB4E23D2DAB1C004DE3AF96C4F09970473D324EEF062FF0C5760E3EA8A26DDD8FC5D4FA2E21FC0BACE6779FA23525B5DD2DBB9B5383D22DA07F05BE93902DDBB38F1C30E7F5FDA657B6772D63951959A970106E2C79F4B6A012E6729C0FD94731864D6EB3800DFA6F77027D8BE9F5BF8DD8A5C8AA37023B49D0CE9A85499F73F1E6C5BB28C01038F19E02312273994101E7F659CC44F32DD42A434305C5A35A972F318B6D2E6F78F60F30EE1CDCDD6E3DCD75BCCB3EE7B0286F1EC5DF08C3EC92A67EEA22F06D00D153E1F71047B4A165D3C8D5C5BA584C97F1D14D2A08AC921F1E2FF60EC9B55A97689055FD269289E96F17C5\");\n            yield return (Hash: new uint[] { 2084706682, 3003618727, 2202871765, 2456291953 }, Seed: 1359206343, Hex: \"ED2E34FEF1FD289FBE02C19E342C315BD7733A34170C77382ADA6D30CB42A39D83A36A48DA0ACBE9D49FB7AC242A6C3ECD22D8E7E217F0A02934373FF65199D218AE0028AF7E7E81B3FB5B607B6A6431EFB66D57A982FD9D34603E4F72810C942ADC51EF96F1DFC4B87D15FAD11986E1FC553644F6D145BFD4A683B9C4E17D926705AB9F6A9A262341BE597739442C123815E8CBCEA49C46C14453D1810084C9496EDE3879FEF14A66948EC117BBE1BF4EB1EAD4FFCE9B53DCDB60AD6E6782AE0A1CD10F587C26CEC01194B48307AC691BF216DCE395A1F465F5B7FAC6B833F553CF8436BF6FDB45D708CC9EB9FBC3\");\n            yield return (Hash: new uint[] { 3968703466, 3176451678, 1680514600, 3400969720 }, Seed: 1248119151, Hex: \"B16F79380EA9187E2677FFE47AE1CB6687CF5F06A077533FD701D2EE52373E3BEBD74AD42E4A85CC57FDD22DBC091B4C51FA360F6355E9919DE7A3008CAD97D27AF3\");\n            yield return (Hash: new uint[] { 218831155, 290265462, 4063675822, 1338631774 }, Seed: 1847767441, Hex: \"A173A38C0B47746795554195B3C42E9B51141F8149E31433043F1CEBBDE295B0E49DDC95F420C52FF730F96F781DA4F46DDCA22D9883BAD51BF238A8D45DFCCDA799BCF1A86C001486324F1E966C02718EF08000DF46F77AEAE28CB10721B02ED91CF0C2F599BBD5D1FC79519D59764354456E7861A6E30FC7\");\n            yield return (Hash: new uint[] { 3888190080, 3191944965, 2140792359, 1011439969 }, Seed: 170083408, Hex: \"49C7437C56A3E7869A4266CD54F7D4A5CD922A9610421F6F66C6F5DF55644B0B5D38FF79BA40144F17A786A4F170D5080E35AD11D3CA5CC659DE0A3A98D54F6E0EFE64261FF85DD638B868C9970E51E94883282C60C7F8B5ACDDBAD857754CB8F61E9FCBC804EEF963C72371B67859CE5FE18DFA068994668FEA584D18FA4EE35267B9C3E5EE1B61DBBD0AC4EFBCEAE0AE98675AF9447E5CA0EA545E54AD06E663D3B8EC9D9579960DCF39C271D38A1620BD06F1111A70E4F8B26A585FFB6B1FF1DD6E0F91B85C75C0C3B8CBC08870EC5E187FA4BB93A25C655610CEBCD992FE4D50F555AB3DE8914A7AD529193B78907013E260E2F3B43E46ECBBBA344476F09CA4BC659B3EF84AD429EA28B3E83F16DD3D76E267708A4E1C9E8764E09B5F07689594F1793F1F8CF6F0A1FB0A837BCBD64FC1E85175AB0C9718B04D01F5D153EFF429F6B5E9CB408AE50DF1C4C7BAC7079E1ECA764F6A602450FA3EFFEBFB0F6A8C926D87796F3225DBC99C87497123D584D561622027B9C5A67AB6099D804827736A3344F28525E88A7D20FC5C21ADC322D41A26975794AF4582C055BC2A2CF8F174DAC802555B69F5\");\n            yield return (Hash: new uint[] { 3076913453, 3819946539, 486773280, 2532186942 }, Seed: 366007005, Hex: \"2730372170F74CEB133137F348349423C4E2AD4F23B74D7BC6F34FB60D87182ADE8D0E587C8742FFB664E10D0C17A99153B791822455682E771E1FC3FC1E44A685BFCF71EA4F5A41FCD6DD4BB02B3BBA8853560A4D683BB1B530F77678F6832D424225EC203CF9E71D14AA212F431A5ABAC4A4E4A70DF7AA5E98A13E9EB086982B2DF8E4006530125E797741E6989BD92F319A4DE8932B0EDEFA7040CDBE08DF79FD9EE823AAB9B3231273E1193540D5124F1209F0F6C68F9C65068F22C1CB62926CB3C237EDF1E141831A7F5CC66D6D1BB6C5818B08C2395E3D4F028B8269909F5100901EC5ED0F5E1646D4723134C95EC94A2458048FCA34DF42732032395CF36FD85FD3B9BD9F83C5C3FC9CCFB62149279B3C4731217003E8E494F9C9490BDE3A300BD7D15D0B97E7B1247C9FE9BC3B9DBA1B78096B56175A7D6A0D6F3FA8F9740FEB44167F5461BD99749AA87E57311575C0EFD951D79F7937C6BC2961DDD824BA849A27EC21AE5E3534E3766B522A098D5487AE45B4D3A6E314E46515F3E887FD77963725DDAD42163C04258EB46A3C62F06473E7688044BC392AE1E0058F37BF5D409254574F9D5DEF328AE0901F1B2223364C5B5349F15CC14C6E673F48\");\n            yield return (Hash: new uint[] { 1547248121, 292558247, 728617438, 3236974133 }, Seed: 1976386952, Hex: \"3E5D4462AA8B15D766C16D707BF299B6CE6A7BA7B52B4D333E1FF369FFBE138D56D1816194670EC08EC3028D009703B3D7284045D0CF3557E32C242998762C8B33A44AFE3D07A597E2A0A897E83EC2D38FAED7984C32D68E41F3B1A0E0B76008677C8454084681C9DC7A1C359AD54E6CA50425A2EBF1AD52AAF2B695CC6956E8E0D8A5393C861DC0036E156C188AFC94BEBEAF956624515FDAD66A53C417C915529A5778B6D1EC9C3E7D1E7A5D034FC1071B518B52EB110AB8DFC34CF179C248D52C690BD3DE1334413E03E855282EFB2D7B714EC9C49E7FA3ADCD7305791C4163451161E851EF974F0B7CDC20E0581098E88196801BFD81BFA560\");\n            yield return (Hash: new uint[] { 2685149695, 3541348990, 2166120047, 3967730347 }, Seed: 1161970177, Hex: \"814CF77C1D589AA6472C63EED3BD7C972DED30CAE9DBD42D9E104F2F362A34CF34F13A753E4783E63E20B7E143B877793EBE3BBA9344C3345E72F86AA9F2276C14E8AE51F8AE206F7663B301DFD9517B87955865D47753B5C53D87811D7617DFB2581C4B0AD1AAF21AC9950E964ED2DC1C24CBB6C364A65C13829340F9D9C5C91BF0CE4C6C90F7CDF51C0B8DC41A38AC0E2E5F66B947B74DDA98350718ABEDD9933D5A3FAD0F1A70EFD3D05845597C14C2B7198F874F5034630DFA6F446E05FD9E7490521102EE16D8DD1A02F75137FAD8A97212358851CD30AB5F20772BA1217E2418B72BAC2F9B24AEB6B88DAF1FE806C88397DB08F894BAC5202B4CBD0AE7B17AE3F1FF2870307D595D7752A4D65799E886DB0301C02445644921FCF24A9F34C920089F4D7078A1D24AC9C95DE78F7457086F622044\");\n            yield return (Hash: new uint[] { 3588760812, 2400756979, 918717433, 2059809473 }, Seed: 344817061, Hex: \"1788BBD5EDBD6511FDC3EBE9ED652B852C80F070968AFF8C16\");\n            yield return (Hash: new uint[] { 4188097558, 1775794822, 1712369067, 130909042 }, Seed: 125827953, Hex: \"EC3672F9FCC21D4D04089E32D4AB375E63B9B17BF8FE1E437B3E907D3ECE2F62C58A5CCB89A06132A99369A7745352E76CEE443F53CF9A0E335A6EAE79793D275E93CC5C9BDC17CF4E8F5F69520BBA07094353D6E03354220DBFA9AFB245291B3EFE91853CC34F3327B3B889498C938ABCFE0327198CB8EF3B2617FA2F9686A3E8BF0181799CB4E7810B0FFEAE180966CFEB427394C447228C4A2162A192884525A8D8771278A23A9425B77B8D3672CEDE62AA82D574240BEAC742254BB8B6961E3B5A46F77C8F788EE1A4DE34ADA9F1890E6B7F6BF99D10EA09E580E7BE5E0C2A53300C45BB500B0C562B912B3C0CE26FFBAE8968A89EAAB39ADC899B495CB741F8D08277568576E321086C5531135FD2\");\n            yield return (Hash: new uint[] { 4252560320, 3746339192, 3419414874, 1383629698 }, Seed: 41509480, Hex: \"C5BD77A1E507AAB28A01\");\n            yield return (Hash: new uint[] { 1533037209, 2762704710, 2331645170, 4012620333 }, Seed: 219907122, Hex: \"C8A68223CE197F7F333D55F3BC95E83BB49C92DC5B358A4FA1D5CC70CE53EEAF453ED2A47D365EFEB99CF9C7D899C2B6A9D4D1C6CF9F3EAEAAC7C56995A4C2DF372CDA5C1374775741DAD2AC08D7D3F75482CF71\");\n            yield return (Hash: new uint[] { 2919651647, 1231075927, 2169873647, 2533174663 }, Seed: 1369583581, Hex: \"B30F8D0503CC99397E66B61C2C819DD084C4F3D5EBB5A4B5BA44CCF5CFEF3E03C2C23DB7B810A3F9D1AE144EAE01103E8BBE0DF0477A78D1F6E804CE21FC332E92BCE7FA1839D2A8F29BBF7A7BF0F96FCB549160CE6B8221DECDD7321423C98960D6B14E0CE20DE82DADFB7D00368F5685E13FBC0795EE5FCBE203BEDD876B18D9A1505B8B40E22639BD701ED8D0C0243170D38BD5DFF3D38FFA9ED1E8A2200246C537CEBF3D86D5F1B015BAF522BD3C1F80E26DB4E8E5F4484812BC9B7F13D8121A2E8AF8A2E535FF33AED4A33D11E15784670BDA90C8034DA6B6796531B00375E18C8D2026A672FA62591B7EA36559710683E0DA4E1741AC31D74120F57743B961B8E539A9E0F564DDD59B93363C8CD63C61EF723EB4BF09D4626A5812E333A179CC47E4AB0EF27FD2475480CC9B807E7109C47528EEBC1DAB1F07DA23DEAB72E5\");\n            yield return (Hash: new uint[] { 1943684651, 347605652, 3842601690, 1144224108 }, Seed: 1604295317, Hex: \"EEB2F4275BB69C90B4432D206CA79544C3FA7EF1998EE55925E49F3648BE6A77BD128BD9304735EDBE67C5D57E90412852463E3898D27165C7588B85621795A219944FC703E2C8E16D2C96818152E0CC7DE8B11FF4ED1A6B07E2DAFA3C064997A8FEBEFD718C6C7201412C380005586A8469D9B1018C426D6D92485FE9247D7A9D590289D7A637B8437CE1FF9257935AB21C06FA9FD7FE78359960A7EA3A336C7195FE8700024A38E3DB2C09DD832D952D7403\");\n            yield return (Hash: new uint[] { 2092665045, 3209674161, 2960122209, 163516595 }, Seed: 644067252, Hex: \"D1D9184476176BFEF09DB462B592ABB039BA91CE96B70532EB4307D729426C3174505D4016B9B0A613C34367B1EE83E3450755909828C8BE2421D3C85883A2E2B7EDF5CFD6AB623DA31BD18614860CDCEB1876137242\");\n            yield return (Hash: new uint[] { 4039824156, 4125754601, 160127724, 2948265886 }, Seed: 548718501, Hex: \"2226B0A8F4E43C4C92046789814C8A217644C3127F5F31CCFBB65B81336440B8A7FD308E05246390BA0789078736CAF5D423F2782D9C95542AB221E7C17072721BE45EC9521369A60EB36EF49EFD73AD12904AF16188D3BD171ABF15D9F0AC141A6DD190AE4061D6F7DDF25CBAE2BBB89D4933FBE5842402A3D3112BF6F529F8F84DF7EBA65F28503576C25E70EF87438F3216FA53F0640C46346CB57ADBFA1079C3A561C7E96B2461EA7BE8BB36317E6A1A081547771346529EED4B50BAFDC4ADC78C3155956EB440CAB0F33E3824366AB534A628AA56758AD3D07B45E1D737205973A892EED9AF095842922B3060BBA7736F01FE6107CEAB381FD658FDFF92A38D1BD0F8BE8EC4BAC4002367D5108795CBAD7824BA233C75F92A689B3333B9DD2705F19CBEC9BFB7C707004A7ADB7E927E4669CA209DC775AA387689EDFA1906D20A63D93C1EC8DF8362FC53B695DF4FDB5C79EE\");\n            yield return (Hash: new uint[] { 2731024591, 3195941253, 3195051858, 678394514 }, Seed: 280275997, Hex: \"902EAF4170A69264F40F4A13C233A596A7839CB019116AFFF7E3D564B67D4FAC2C81CD4CAC14FDAD20C9A55696B906A5AAA2CA40682A00CB9EF12D4289CC58633103C4E981B0D5AED8FA1762BF647D4F05C27B9C0E60886C0C89395709C9C36E3F32A9412653D60BF4349302D8139C4845B41C4AB2D02BBE1C134657A4774BDAF00E6FB8D7747EB1FD1C76C1E2FEF109AC50722C42C5B97F9F8B3A5AA9C27CD24F29FE8C6290C79296E4453C279646621C1F6602CB97BC22DA90A5B43E2BF5B3C71023180F6AA479F81811A5A2A7DF6A11F776EED0054C17B64919AE943D8321F0BDA7FDD28C5469AA176F9F4A72E563B21D12F02896FDFCD94A0623BED7B821BBEBE326D8835F58E37EB6719EB4A79565961E80C65A9BC848023E42FA541E0F1334E99587A202D36B09382CB83A32D2FC6B2223AA4D3B42C9C80659AB134DB16E2223C70AFB05ACED61E7A6A46AE0D4501075BCBBF7E94A215F6D6D971BB84FBECB5E4D41A6C3EAB68DDEDD15635FDE641BF6F971EF9FB7BF18E1552F2F632FE47A80369D4C7AB866B04694C807AE0FA4E676861BE46F90F5EDB8FE9E2065ACF674E48BD72C24C4C010257AF43593C01CCF67F94CBD78D8BD092B13B9A9CC0AC4692DED5AB882D2B03F255F63\");\n            yield return (Hash: new uint[] { 127008505, 4064281, 744888336, 2158463362 }, Seed: 2032427704, Hex: \"B0B0EC8E61DE26D3A7D72B7DD0F2D25C281D5BCD31DC299F6BB52CA329230420ED08EA663E2A2BC6E101475DC991CB7B0B1BAD84216D8A826973CC01C7EF88846B43A8E94197384B82E933722F97691C9D565A471AC2A07DBFEC1B3A1F60C5D3B3C22CB165CA78F931191B80D1CD5FEC59E8D5FF9F163DF9E98BE96D30B5CB23C22EAB5E71A5EB6F0CFE26B7A83FCA36163C49232BDA67F0D2031027D3728A14C5B0D45CD4E5A98E9DEF27D33186E9F5A9F32147BEA5B30A56D23113A5587C89BC08B69766F05815E2357071B876A097D08ACC239467CDEA8AE3536A4A545B7BEA9AE55D9A439DE05960272DD929A7155F6FC41D995CA21E850B8F5FFDCCD74A5E013E897C85557166AA520C75794092DEA477ADEA4DBFF101034CCF603B546D6FCC3D28AC2C74368E8C2754D4E6F1DFB6454DC047CB78A5A6A908B3046F5E53F388A52F8211DEDA4F62961A314F25E9A277805216BE2D440961B3B0C477E87E035D195136268FDEDE854E0BD737CADFE3788828CF4FC6904A104A1D56CC08AFF281CD65F7548E6134C2B740547D5B01110CFBD639990C4EBCA1842AD0C5CD762D06288288FF7979225807E98C33D3E4E60F54F88E3C30A2D97F848B5A6FE0F64A94112767679AE56AB2CB25FC5573652757101880C3CAE2957D23E51250CCB4F65FFBE33FDA8C203E1D\");\n            yield return (Hash: new uint[] { 291334284, 1097247301, 3992317059, 1932545580 }, Seed: 1364493586, Hex: \"B8814BD9818F94AD93B3BD561DC26F29638E5304B72E2D71C068A0BCB71947CA799502AEB93005EB132D544307CFE37A9E4D8D9F0EDA4D317BADD4962230275C9D3FC23102BE8B3ED42AD89A3B11618F10787C0C0FDF43EE239362A3A428B9196F3D2B14F2E2128B9629D1F21C60F8CF768FBFCD6E629772837F787B73E1DB7908E6762A1EF0743B0C0597F1574FB2BC06E6BC8C943E6E6383FF3C187E5552AFAF98DA57E06D86DE4F59774A8B46C6619549CA4FD71F6DE0CED19E7FC93CD9D15E7AE4CC2C2B22BDEADF54BCAE1E4A49A5DFE688199961027515BE7228BA5E9956EA239B6B6335ED22625961DFA239B931087E07C41B6B5D5A8D188A8AFC2DAB5CCB6F7EC7BF64AF5B78DE3A79585402D0A351321F8C9346FCDCC5C3938CBEC2D3FCFD8A6664F9CE225A7ECF1996A714B1CC6832CBA126C88D76BD73EBFE1DEC82B5CA00A4D1FDF182B95C99769215354103C8F4E11A8A146AE5A4F73B61600B3E9C5321C729EC736871A07B461E5F517B45DF2155CDB5CC00D726AFBE24C8686CC3F889DA93730D6E934FF8E342DCDC8BB97E5B950456CEDF311746E98D3B\");\n            yield return (Hash: new uint[] { 2125626829, 2892893507, 1021384483, 4119209963 }, Seed: 270958588, Hex: \"713BF37292F534A9EFEBE42DA5DBD248D47B6ADD8FA8FB977D37A1446EFEA74D28A2D4A1FF6CE3721D30E17D3C5B38CC745A7157EA2029CE6A62AEC3FE247A4CE588968BCA1875AD\");\n            yield return (Hash: new uint[] { 1892346040, 1896277397, 3255598943, 716267962 }, Seed: 124498910, Hex: \"3B0852890A953C2288D90E2078B8E4CFA5939394DF4892921A0523EA257E3E309863583AAD947497A29AE9DD44B15A7A1B610ADEC8A4B4CC8182C70A3B556D129A1D4A36BB9CA864D11AB5E2B3ED2A43BB0189CC127152E68C1AC2CCB182D1D2E12A435CA36830556D6FEDB823D847573FEBA7BD4793EF28FF31F54A77E4AF266443BF12FE4F2249DB2386CD7DD2EB8CD4B64FA44B6E65401EC580BAF482713E2BB4836680BEB28AD4FD94102F5400A016017C806CEED5A7187FBA5D04D861415B355C888361393E95798CEC864DAECD0743FF0EAFAFC40A617B51A5C9E00BB2EB8005C25184F28BA946C5E1E486F53632CEE6D13268944A0C99D1A574BB860EE696FEF7E7875A00D662C57A1825E3C04869F2C9C9A908C28CC69FFC03A0FAEF91308C04EC8765809E05F9E4F484781B\");\n            yield return (Hash: new uint[] { 2333932488, 2672844765, 1143670548, 1293057405 }, Seed: 262317786, Hex: \"B83085707E0B6ABDE646A1B71A5EA6FC36F3987BFFAABD34D751186ADEE7742F71D9EE6D5F7A8A214EC5CCEC4F34D736A34F69FBA8E0CECFBCC328BCD9603A2930D289F598D23847BD99E17A6FBA198317202A9F40BDE08B7BDBF90B4E4B8C69CD86C013758ED5F3CF46ED541683341C945667393DFD6F36C6A9AF163049319910EDB60665B9D1DB36D30D87890335C1B2F51FF153CE996BF6675A2E49901879BF0011B4D4FA12293FD74186DE065F73207B07781C66A323AB36A384789EEDEDB070AE447A0992D2001938EAFE3CB1340F77897D57937F4A956FCFA6AA459BDC0A1D11452E163FBC75CDDC38BD081C3BE4C34411F57F44BDAA2DEAAF551CCFB8843140B2ACA8C697A83146F166A343F31540168AF4A4BD8F85E1E5FBE02B223057EF733ABCCA75232104DC5702AEDB495D4A0D596162A3648F12A73D1CD94966E24D9EC6BCB516EC7F7B61E6A01679F9\");\n            yield return (Hash: new uint[] { 1775486688, 4042807914, 1359185069, 4157595113 }, Seed: 1560695038, Hex: \"0A0765680E0B5C0FB1E483DF57FC3A61C1D25033123539715FD3DE07424BB59B36063AECB66AC57C27F35E396534C9BA2E1426578FD0738025F95E3434741C1EA182C858BB30BADD37ECA4521EA8E34C1F8B62E32D3FC7DE929247D87550C9F5F95FD54DA99C3337F43539D68F707025C9FA2676A29C0E944A0737C8055854678E844F13E4FC903B111713636E5CFD6FF010D40C94C34032F4F84696090B1FBC45EEB3DC7E676B800B3195D14DE5664BF2136DF02EA3BE4CED7CE0EE203787A688D56B7D1D3AF0C652625BD8AC3522833CBD843044D6FC143AFE0A7EA7FED19189FB2597DA7BE9EDB6C97553EFE9CB1F3032126E374B3571FF1C6B664989D828838D22C611B7658F4E70AD1231449563D735489677FA90563B925B4F9D5E1E7F3E24CCC3F6AC81A5A5DF36C490B53FF9E80C7A9A0C9F58A11CFCB91153B49D445F0F609ABA0DA6FD3A4BC54E9BC07B397FA985A642E09F993FDA9732EF94FB5EC8F2B779DA2A044FE2A3250D1D5907D48A8A9F1474745050F469A48100F7DF3A061E48E850F3E5E0FC2242CA3DEF5E49222D22CF1765A188ABAC4C457AE305F0DB1B915934992E1E620A057D996FCEF612FB2EA0117B6400176AECB6DE94B812E6A6BCCB3F0975C0C83783269CE594E90EBB88ADDC9B75CEB0B98363\");\n            yield return (Hash: new uint[] { 3040311369, 1576115638, 934800120, 1139064769 }, Seed: 132359882, Hex: \"DDCBB147918FC43132D6199A1261FD98D60C8292A254CD9FD50D1BCA786151B11CF098C9B4A7D8A0641FBBDA3EBFE9ADF74E2BAE632B19A18E42E4D2BCB3F0C1028B2AA18E08401B2152435F6983BFA5517F3E994F1E11357AFFCE2D77B1F566E8929D399257513005A88C0D608DAE87280C15EE99D4F8B265ED76C266CE72A8C5BCA745AA09554D295F9621FC594F2849E1FD8B6D39A7798488F9B569E6DA2583427A6F0047B03C870658D4BCFB110403AF5240478DBD95B00401A3E1183AE07E4CF14BCEA0A6091593DBC2D6A70C213FDBB85E8E7C0037884B0814B97711A2F3C11B9405C333362D45B671A3266566D84E28AEB0BBA8D2D43C0F2C4DC507\");\n            yield return (Hash: new uint[] { 117510796, 495873045, 495873045, 495873045 }, Seed: 2094542525, Hex: \"68F8\");\n            yield return (Hash: new uint[] { 2216860844, 639474082, 234214536, 3739056031 }, Seed: 1296208561, Hex: \"0286D3D5D597259145EA1AEA2F60A2FD276928DF13CEF42FC12996C975B101C9ACD04011F3823117D7FD7276969BE0BF45346BAECB9D161B4C5F383288C883A137EC32CB8A3A168C8C6712F8F9DCAA2962700BCE45CD2C268C76802962F4FE4B5402329AC20478F720ACC84C49242564578C1D28E0CA6B11E2187879364118F1FCFFBB1785018E33CC402F1A41EA5A505CD1628AC1F9895F79D534BFEF53D9CB6AC3F659CF1CF5B4B01BD5AE9C69F14C248EE95753E6964DA284584D2B6F754CB529A64714BC5E25505865218508ABD861484AD93284D49B13F378\");\n            yield return (Hash: new uint[] { 369567647, 3770254201, 3450453930, 1494011398 }, Seed: 702699190, Hex: \"B1FF5383F0A6B9987468106612BAE3358C5E63F7E49D74AE7009205AE972\");\n            yield return (Hash: new uint[] { 4153751406, 3310923774, 560798096, 2692750275 }, Seed: 1229717985, Hex: \"0236B7DAAEA6427D2A22B537F299E18AB546F7D1CD43EFDC9C2C1B2CA9FC124EDDBB146740E96F1991C608F75D5402BFDAC507C2EB472F63B340CE5A45E8BA06B69636C81EA9EE5A722726DEC8673CA58D59C279BD2FAA7819310F1A7BC86BB38B4B31565E244CE55D01E2AD6ACA93C7EDEC13FC2FDCDC917BD4DF8E4D58987A798406DB0D1AD9D1A4B24D9BAEF64926456EA42B6F654AE279314034175E023CFE43ACB0835BD088BFB84286BBEA4A5DCFF89F6903A2E6D56CBD8E51BF97CD73082BDD40224D2C8A7EC8BB4636678551EFD01CF261AA71B1B63359C238A1B634D4B5F47B0A6923887706D3F1A257801643A6D0D326A750A201B6706AACEC9387D68D7FE28AD4219DB5E32672049224C85417BCCE711CDACA605C63A2E029340C63178D1BCDBED7C5910267EE078025AA5E977EB335AA339AF04F6CF0949DD4576D403C0B67F9E8F592A44B3E1BD5FCA71097C5693A452D3CDB46241AFE49592ADEF9CEC9CEC4F13467F767E954045D35F8C3199BF8B32133D3E5B33F8A34FFB92BF54B645F3A87BC7C23D88975EA9282BAF2863DA2F5C04581A7CA16C471233B9F45A72D7C7278BC6D0E50EA12D42C4073FE78A0651DA6DE52\");\n            yield return (Hash: new uint[] { 2035458687, 2825151559, 3872218602, 2335465966 }, Seed: 808303083, Hex: \"54558ED52DEB14FC8D6EEC31D2EB7CA7C437950C43A94B28461C9EEEC24DD4B93003C4BB501AC40ACF2D68E8C95B34FA4BB62189A2755B1315001626701CB5EA7031FE9BDCD697C769A685653EF65F4AD59B1C9E3DD84A244CF187572B5E515B6ABF1C24F7F1665E98630E2B19D73AA5DAF04250D93631A9DB59AB439A8124C6614E1D3E9A0315A0A58128F1E431E45A0C456DC2008753B52F93883D84E8210FBD3F1AA6E02493BC305A247B38E215D42F7C6341C09B6B11FA7F06E342F6B61B320B6743E32916CB407CCD7E47D8600F419C7BD67CDE51BD84474930E6D34B03EF2D305361BE58871B0F4F8B93A1F25BB43E4781A7C97BD7A93917BA9D50BE2DE5153C9A4A57BB60416F1DA7A50137D812236A0A6CF949B0BAD3CB81200E59DB673B55E28A1FEE884D8C692C61204DBC9033CDD0C519B61F012A4E067B6096E1A2022DFD52D7565872D84035272AD7601EE38819B210AE498A43A19862681BFE5F990C38AD378B54C066C55826D5B24558C1403A323E2D385DADAA0446492242AE4EB7AB78A82ADBDC49B982F2E143E5F88166B73937FFFE1EF5F63E87622C0137ADFD6D70F4A99E864195F300D06D9F64310C9637CADB631B9DBCD8EFD9B84F0CB2D1340663EE7F37DF10AAC5B966246D9F5E5A46BAA24153BC9FA610C1F26D5E12241710\");\n            yield return (Hash: new uint[] { 3869067115, 2327406371, 910667647, 3949052689 }, Seed: 446609978, Hex: \"FFBE257BBE3B8F0B8E8069ED6C65826881844879456FA42210AC92DBE6E8FBB0DDF44F8ADD7B6C15654458AA1AB0C7FF\");\n            yield return (Hash: new uint[] { 3560873020, 3476187122, 2630831519, 741958050 }, Seed: 1403741248, Hex: \"8E876A88F673C4269B000672B8E31EF5E6B01289165C91AA6486EE39159E06C1B2C8889044FA4E0C96F3DAC7E36F38205A98FE584B369B8E5AE890BA2B59A965B27A73E5E8D8D60D6CC68532EEFD6D171C3ADE23BA6D68D290EDF496FA23BB131E767CBCB219D720EF93E87E75FC46C5A2AD0E51BF5F0AB1C5E9F85A5B8586EDB03DAC88EE492CD1119E3DB2E06340642B418D08AE65AE3B8D44751160F20295D12F4D1D34886B2808DCAD8397554B7D3F1AFB86828E20436F0D3BD5237A57DF659519B510547A94D885EE03AEF87E5AB18E136CE38E873BC416AA97F06A2D2CE56D1117E79F98594CF89C69005E18D1A9912991E68B117EF1D2C14D33B6FE07D984E470439608568EAE68CFED0812D855DF2D9A490CD178D7FB82288C355325142198525EA6BCABD9492404DC835936A4A32E9FE7E3AD68DEC85DE5777A9053EAB72AC3333D5B876F41077AE31986F7297517680022540F43E69B9B64BE7C62E0521EDF1F2F08EDCEFB71E4DF66ABC367F4E3089D926E848B5AFAE7F7B7E4D28652DA858B61A02CB3BDFE2BD234736D21E67F9F\");\n            yield return (Hash: new uint[] { 2014785615, 4035250098, 1422993329, 393814755 }, Seed: 802618590, Hex: \"D4F78DE49D31C3EC52026904C35F9AE2A30C203389EAFC600EF2A9CAEB9B013DF180D915D51951143076D08E1C26F0E4437E0A53851A87E76C97C235A200EC4B673FD9B47323D6D9C0C39BC2C5DD58ECBD76A9855C9B421EC5374F0F61196BAF15B8924DFC085B3F528715ED9E91029EFDFF16E4613C51ACEB85EC3921D5D6FA2841BB6DD12E2C85D3499AACAF6DFAC4F471B580CD6A92B360BA5872395C90BDE270A63FB24569ECABDBD6A67397C5ED759F36A5F98BBAE309F957316A6AF436E9C4283F12DFA1625DB93B54E35768251FC4EC2F9335C56482BCDDA554E9E1B98B9542F7F56A09D5A0AE569333ECDB3FE7AD15C922903C44B2B8B73B472D4FF2F31492A471FE5EFF5C69C084321349EAB793158327B153B56C423A2F603050AC05284FCDB5D111A0BBAB48C71400FBE7A866FD2BF00A8FE6670894D0CFA682F268B731AD981383B1FE0C391AE8D92D18FC26D893428F8FF22A67480C30565166FD27FF8F5579F1D38DAB57E131D91B787D2BA6131AA598E5D3B615E572BDB1E58D4EAC60D62809973573E4158301B55DDBD9944EDD76A52765E101E243122F969DC26EEA1E8794713F9EF31D6AF13E6B8256CC776D9006A29F30A2DB1E57E496D6C61C7DC32F9C5B42A7B50A73C3E515CF060AAE81430AAD\");\n            yield return (Hash: new uint[] { 2828942937, 3451208637, 965542466, 2786067467 }, Seed: 40812548, Hex: \"37F85202EDDC93150C1B7A03AC6EF48C960394F5334481B19FAA587281B4C18B0C5D03845B44CAE818038FFB0BD345B8AD34\");\n            yield return (Hash: new uint[] { 3589956908, 3590500684, 3017987886, 3443978466 }, Seed: 410620752, Hex: \"6564DE4783F22BBB50A4B95AAF0C6DEBEF1AA7C765CE8D54A0ABCE13E936DA2C26E01E0AE7CA6B32FD4CF246026C46BEB60FADCB63AA4F95974093A9CB55FF0BB515DA35BB4DD2F058958A49E9A7E9DE1A4CAC6AA2D2271CF8595B12DDAD02E12365BF7CB43D547EFE6FEFEE5624BE9BF497A471AD92ECA4F70A8A1A6BF055188A993D349F82255F1D4941625249149BBE3306065D\");\n            yield return (Hash: new uint[] { 3924202163, 1178504917, 1449920568, 3374255278 }, Seed: 279326167, Hex: \"E259C396542B4745504E23C429D82D5E272A48F6452DCAEA52B17F88F3C0B62DEFD35CA45B89FD6E9AEC8D48633E37D242A1A9CAAEA3603ADF6C71B4F9D2B03233B3AA7BDF2C17A94BC370C34A47040026596E681631364F8F1F45B7BACAA98EB11F88E82B071563C29642AAD16B3AACD800BE37A1D6551F3D008A8561B4D3A4CD89F1E7498A0B0BFBA3565ED21AAE8E4995A249C374567DC3A697A894608AF2F0DE7E9EC9B474E294856750463B5D72840220EA5DBCE1EC2DD359F923A13F66012C257060D6DB37EC32C518ECEC0712E4F50475A0B08189C431D0759E9D619072\");\n            yield return (Hash: new uint[] { 658929427, 4284387, 1171624776, 2656296460 }, Seed: 781735847, Hex: \"3D9BEAA6EB3548524DA75C250382C4A46474DA25270C0BE63CFB73D4026F836006D3D3E032C686B700A02F159F34AF3B19C463C304CAC313FE44AC931ED11264981996EE6089E3CB122151229E03C4C86181856E15DF020EB231C263D2B8CBDAB5B065AE7569D4EDA225F314DC2DFBD40722DA812AEFE15F561959B89C9C4DE6EE7DB3B14E477BA99BB9A0146E5663D6A66358B755B4ACB2DB7AEBA779B9FB36E4206A3E1FE559DAA3DFF243B8CD32551EF9E249615AB84C889127190348F9312C17384BFFF1FF11FF882915E90E9D6B4BD1C4E779562D54EEB4AC3909BB304150E6C9BECAA2DDD70029D3CA9B70F7D131D73376A80EE5C28E029E8570F5CF02F19C6549A09E6F8AE7A2B25F8C15EFF2AAE4FB29DEA6DBF3AC4A\");\n            yield return (Hash: new uint[] { 229356069, 4282221916, 783138451, 3594098843 }, Seed: 1329735537, Hex: \"43A9A2A5C1E12C0353959C26FE4A6351B8A5D4110C43B692EB1D11BB976941D185D05AF9247F7A64245721D7230760C808667395D9C3ED5917FC46759B6D31475190CD0F2F2708620CDDF47B8FE6F51149E94479F1A62C6E0A1E70E737D6B4CB79E028C59149EA3EA4F4221B17FAB801512CBBA78800A4386360EC9B2D71A70F086FE6D8DFB78ED869283895747116F4366BF572471C77307D8D60CE5629FABEE84AE5F1A7EDC92722F1740364AA903C74D5435CA46DFFDEF6960AC5B8EC784C33C6B2C649932D0CF26B663FCE72FF125087A1E62B9D9983FF05A69B5E1607D4A0F7155C1189368E6D2B999CB81601040902D9FAB338DDD0241FD6F51DA713196456CCE2969221AF1A8FEFDC73FAC383CB1C970CAAC6436E74BC3D7CA0A3F82B583BA7EBC6F2F8DBCEBF6F5C\");\n            yield return (Hash: new uint[] { 2665586332, 693715827, 131939404, 89401860 }, Seed: 1332482916, Hex: \"85FE086462FAD83EF81C017C53F8E4D75A531D29710E703CFB039FC76623180FF242A08CA8AFA1A0781BCFCCC7EDED845EB65A0651B1A557F65EE67894364AC0E3CF96530D37FBA53B20D0AE3A6A9B2F8DF584555BBDAE6BC256C1D3C437A89BEFFAB12974BC9224CFE3F94EACF89909A6BF4358AC5014CE6EBA9BDDF4B9FB0094DE3AF939BCCC816BDBF21DFD9FF5F7C240A7CA8DE8B5DD907D88DF7F97F3BC94F9A8756558B3BF67720F56950F4EC4BFA3E875BC05EFA12C8C4AE12C3E7900444B29DD657D3207C37C128DAB2F3AAEDFFFB1FB052AB2024B15AE3035E2C421A962EBDA1278498F61769367677D6A1B48F4BF4C9FE1F94ADF36B7AAD72ADB5984A758A6EFDBE248466E11F32333773FD020BFD60B7BBA78625DBFE4A2E025DDC3542B782F22CFF778803879803F25D553806DA736AA096888B7C04C9C4B8EB06ED6780A50942263291D4D5CC9A93DB91EE535BD854E1EBDAE01607351434377177E28217AD188A3E34B26D686C8BF3942771A433D36BAE9C8550E1C902A7A015ED239DD6C5F4182FB6061D32A143F34D0F8CAB7BDB138CB609258951731C2B50B2C53B603678B\");\n            yield return (Hash: new uint[] { 3063202361, 1617707121, 1106014897, 3911292597 }, Seed: 269828696, Hex: \"C5B6CDAAA26705A4EAEDA105016F1147D0FA02AF6AD865E75849146D7E7C6F11913745ACED5F06C63CF0FE4F369EE9A09FF57EBC572621834B3EBE8D1CC77F4216BD96DDA1302D2284FB3F4A1ED79C48C7E4A1AB61DE335AFC689BF8D1B0CDC82415090F21CD55BF2DC4FC4B04A73D8AE8EB745B24A6C173F46C625DC90F5839D8BCFE972797B191224676B32F58C71FCE61F9D6EBD32B07FD5F80A4737873459F9C5B06ABE8092CA486ED5E5AF446E96B03363B1819E59EB23C691759ABD8A91348F9CFA4959A2A7614DC94E99987DBD4214725C51890C90AF67D36694AB1B880098CA314FCC193B624EA58C67B3417EE20BA1A4B34191F76DFA5FA0697310DCF68503B15E87B58E9527722E19C330A67719393425BC325BB8795AAD156245A0899B5C39E95BE7171CF54\");\n            yield return (Hash: new uint[] { 3061186929, 3371300943, 2953555265, 121144900 }, Seed: 204993781, Hex: \"ACF0A1E3EF6776B9616ACF11030467A4095328B26F2CD0C8214D99F9FA32E9159692F6149F3C7843B49244372A47FBACDEF7F244D574FFB1DA7A08551B9D2BC5C066F0153C4D01A64ACCF8A465E42D2B378F85C429FCD9721C3E305A8EEEA8FB7173FAE8DD64E5F3C99E165E8C1ACEF8F06B9D4B6C8FAB4672A2D14B8E0BB4CE0E8E573E2E82F9E1DA55E9A624B2339BF7EC81B960F8ECF886B1B43C171CC13CBDEA4A0D8D35A8FA32EE37E858481A44924C7CC76CDD66933CAC53744A7AF072467C7875B02CA401346E28E9DA6A9C0335A3A08BDDEC74BA40772AA283C167416B47B1CE7D8AD57501D86A8E68AC77F2C7BB0B8A067DC6916A0B9F75666E3396F97750D5EA4B608CC7F4288E0F9C238DCFF1882E39B8EC16597B9EBA124EBA6DB525951DCD53CDCFADFBB28E50C96F902B4316C9C8575CC5E9B488E8\");\n        }\n\n        private static IEnumerable<(string Hash, uint Seed, string Hex)> Murmur128BitsX64TestData()\n        {\n            yield return (Hash: \"053E220738B54D6A0E2D2CBEFB3755E4\", Seed: 442104284, Hex: \"33D3E409C6A5F766B2675345179928DA639B33B18CC8F76B839FFA5897307CF94A780B7389B1777B0FB5CEFDCAE376FD36DA61D33E95C597E1581D29C9BD285D725A5A8D0A66D6D1EAAE714E8D0A0A22B8\");\n            yield return (Hash: \"FB42757A2D248AF3E7D1A34E639285A4\", Seed: 1357460742, Hex: \"8AE07F8C2D9BE3564BFA33838CF30F91ABB68A3129C0C51C9990BCE5074E6E9A219D03D2D01EDFC95E8699095359A0AB03192B2AF38112BB875C5F8FA0D28DF35BE4CDD03E8181A1CBF8011F8D27D4050B5D39BF3E44A255DF932AD8789570404A564D84B295562D1C268DC441D390C94D11850679AD2322C8F53CDE63D292D3C64569DB5CE7521CF14C1F7F5224027FE5E60618B3CE88821246280017CD481644149D848D335A05A672186DE213A9E4D36BAFA371A080EFE26228E462BBA89DF21AE1AA5133EB79E08FB07B89FD3DF0BB34978386A40C09B9A39E4E6BA4C3833694A8605BBC8AC21DA33FC868C86CCBA32DEE52223A5EE91B2F813EA0C276E3263E29EAD8F05790956251EEBA27F8F7A3B2F7F891B6E50500CBA5DB20E8BBB9E470A2B9E0DE7B8AAC179D74CC22009DB0E8016FB16F2852B613E293117585AE26A244C20951B5FF9193FA3A0497BED924C272E619FBB7FF21281E51B4B8B1902E226DE246806A937F90D0C1C6DDAC6E8FBA8E11B61B3D9C6E9374B716697B3769D3BE7FE5BC5B8A9025D5281719C39E64B0\");\n            yield return (Hash: \"65955D97D57B6CB2E181EFFD6AC9E986\", Seed: 177303879, Hex: \"CC75604675EB86E2379D60B87162DE477D39B033294860BBE70E5E25554CE1A7EA4A70A32B8F704964DF63273F00BFEBFBC20610A24D185D638F4577A7F342C2DE1CD05465473F947B469B2E1D77C6DAFB8EB7F08CC8CBC40E36371D06F9204706005EC93E19DBF004A1F1B800E0FDDB48F887B6C89422850DF66C023681DE66B50F9B73FF9B2FF219C648DB9602C65C4C7FB17636A305370EBA840E2E61797A9C070B36E0DB60D3635FC0A94085609C708CADB20BA1DBA5A8A24FDD644CAB1C38A5006FCA3CDAC1D46547FBE77874775A7213E3DB03BD421B33993B88E6C799164746446C47E3006D36321DBF1542C7B64F216E77FB5D93376EA1DED3F254F6EC07F47F44B8149328A1627CE1260B9368\");\n            yield return (Hash: \"642F38B89D723B6C28B0643E08098E7A\", Seed: 774843835, Hex: \"F846A840228EFA362CAB1D2B0FEA2E861A552CE52F846DB939B351DD150D0C349316A8464E11CBDCEC1C6394C1EA5491C0939E434824A54EB21F645846BC8CCB43D1291419B7E9FE54F714088370B64713B2196B978A51A69E7E084382828EE806DB5CB3DD5D201BCBE240F66FE64777C0493DAB45FA30594D551C8A4897FA49E771EFAC9D7410D7F0436D5FA62B4A63D24F6C5F6CCEA8FC19720575C72A512AFB71C24EB1E471C69D4817B92AE613FF0A8F08634B308217657DF0E3694A79B2884BFDC78B4F9F8A033C4531D6FFC50293D2973AE1A9AB22D5BC179309C3B60B1B87808454E366FC3308E9BACCCA6752BE34A1E3EA2D99607BB8FD2D4A89A4B305F7B2F4CA4C837B2B4143CF376003B3012AD4B863FC3A4F2960AFA632C049A2DC5AA4DBF0778D1ABFDE45448BA596B8C726704087D7A208289DF5DEB90F48D9D0B3D3C4EC471FA0E3A2E349AB70C2D3EE70A1E592E8B53D74E17E035E49809A\");\n            yield return (Hash: \"55E46A80040DFE4BE7EC46199A994CD9\", Seed: 667854458, Hex: \"FEBDE4BB5289BA34ED37C8D2B15620AD37225C4E05F4E4EA50D5FCD8129A931B95413C70A68F51BD1C66111790ADDC7169101A634454009C7C0C658435E12DC47542CBDBCA1CCFC4C8B95FEF25FA370F76BF1B4887A3D0E31498618D6C645B2982AFDEB4896E311A1ED20060221FA9827326284AFD01399A9EFD450988F03DC5F5B039C10A29DC26D788C38A86E1F604C887AAFEDF5FC0F8C2227F331A81034205DF2C6AF700BFA9A41526126818885B6613ACB55A9CF9DCF3E13B7E54022756FBEC1042D0335EAA9805C45681102C3A9BBC59F3472C058045AB5F5B1576052F308D66B60A241F155816276F8EDCA216DBAD818236D64081144DFA6FD0D0204A9D0BA2F58C4DCF5C316C80F469FA339D3DFB2917E6A6A41580D801DF89CF83AED9CDBBA74210959551F795032126296ACB1EF80363DB2A2A1929F1C1E0266C96B0AB8C5A0FCF3437DBABC3B63CAA331D4285C1\");\n            yield return (Hash: \"BBC25A303874607CFF5ADF7FA1323EDD\", Seed: 1251568209, Hex: \"6005A591F59B669A760DC46402FE50E0FB55A020B1511E10EA4DE2A0327E4ED80F3F8B28BDD63175D226E915A0EEA0D026A67165622D793D6C15A3DAB0116A5A5704122B570BE2B2BFD3CEEEC5486AC18565C929C1996281\");\n            yield return (Hash: \"705C6FF31137DC8238076C549D6086BB\", Seed: 2007753322, Hex: \"E9C99D0E189B2E7366A176A4A508874F81CA701D8D23302398B94D27ACF55C56DAD4AF522D71F9DF300779CF2A7AAE73B7D10333EF79CA1BBFDC8359695E222054612F646C5C60615F7E22756BC589D072DC72E7EB41C3322DDF4BF2C2F31962DDC8C97C5230F6B50E03455060C6E3BCFF07266C099C61C24733DE1ADF8F886F78CCC24D817632781E370A81C3DB8750908D92B6845A9469667B597995ECA958A8F42B988BD4341F789B84658658729068590A32AF315320325F9401FE89399FC2EA13ECDD968A523EB3F1DA564DA8F8F539289AE7397307AFE35E3E5B8A5D0CACB5CD1407DD41729278B8BE576A7614\");\n            yield return (Hash: \"1B88673DB34BB250E24149AAD02658A7\", Seed: 1127642991, Hex: \"56F46746F65C925521263C5667EEB04290FA1F2DF8000EF9616A804AD6F9ABC220357FE268ED5BF1727759392FD39178F37C2E24631FC6453ADEE360350690781A1236EBB0125C2FEADCC5E34CE7CCDB9DCF6644095BB4271B3224F51539E1E64480667518AE2F34EE2B256C789D19B08803DA42EC23233BC31979401E482FEB8698D6CB21444BC0056FF34D1405A1A097B526293C999A7048E6DE585B981F6E4C893695ACC851EF8D683289894F2EF98B60823F5064627119282D67C276B5C8C0D42D837C0E80FAB2680F902FCB27D9011D3B6BEA0CF31CF41F8E08DD2F69258572B1790AEEFE724E26FC0ABB17018AF862330F494A993D976E051B6DF8BF62DFF752394161D68AFFD8EC9E9167400808164A4975ADDBE7D3525335D10308AA280733C6686B685DC37F5A18E6274BE2FD57DAA0E6D19976151BA3FDCE1BB94B06F5D481B44F943A39915BF1DED258417D964DE6BD02B963E906AC1E9733867D725C97EED4439EE6A5171C2C7BC490070EE9B59B51F5CAECD1127DD7D688F4D3951A\");\n            yield return (Hash: \"CF3DBEE65230DA5335C4D06E50691FE0\", Seed: 1681892219, Hex: \"B2CD16A8E752C6B2E89EF4558EFC3AD826588C99789B6D0E509860533192939B9511E5C85221032268791B42C3BA91FD730DE45B0050ABA221E3246590B53E71BAC943F4F0E5C32CE8CACD6B7ECF0AEE3F136E1EFA830D64EEE63E81B1F631B6DD0012003C926F24E8F05393D8C1EF8C64DF8E25D76F9D0DA242D124AD905D5101708311AFD4ED365B0AA9670F970C6D7887CAEC08010A1A0B3FBA17947FBF8C1AE82D7D2D24A7677D64986DEAD40B9D8C9F20E4561C0FCF950C058289B978962A9FEC37624DB19C688142C9D4A0484D7430B9F892B90EA709B7227B4D5FF13D\");\n            yield return (Hash: \"1DA6E12FB17F8BFFA43DCD47E73172BE\", Seed: 1624408977, Hex: \"7F68D77FEDA8EC5E6A83C4B7F9FE35019840BA3AFDBE8399FD7F4DBB3D21DB960F494DD0AD8096DC1FD6123D06AAD31FF03CC1C718C1EBC1CEB59C82F7B90D12F95F39FA52A30AF75E441DB781E5919505E51A15379FBB1F83647A7307A87D9B6A08FDA718F94996A75D657CDED46C1543D208DBD3B77521AFE373B7E9CFB742044FDFD10D1F5AD53A8549685F9E81548B4386A1E0553A6C84944C511541450C53441E74E73E46B19A0D4D05A58F734BFB190993E9633CC5FF7B6235AE7B92A330464CF6ED140863759EB785A2D39B3FFAF3124A6DF43E7292100F72FBDDE6099DD75AE2FCDB0240F7AD33FF7357913D47C04E0E8FBAFEA277CEC4D34ECB13AE6C1967D56598BBCA6A82D5C000B909843F0F72881DC54623952D10FA8F0239C58CE4ADF127082078DD1D339925DEFBBA3303C35F5B6D5E3BDB608D7B069F5D695D095F89F5E21FCEA6E524E5D54666B2866B8268F173C37D64527090E86C248AC0EA37F561B028C9CEA6D76B89C0FA5F1E5510EE9823B37B0FAB875C23ECE812B9BEBBDFA1A77FD21799778E3875A1\");\n            yield return (Hash: \"EF842534F0410748B1A7B5D26B4F3097\", Seed: 1037422033, Hex: \"A4C380E3AA2539BE03811B6B9CA8283017AE902135F51CB82192AAB9BC92BF38EA0106CAA1A4B5\");\n            yield return (Hash: \"D4F9FACAB5C40212B53517265DC04412\", Seed: 1239400513, Hex: \"12D21A64E3BD109194CEBCB0F4F5D4964D0DAFBE1A9D15B0FAA111021A35A571550F5D74996F6E801D7097FF2A8AB280C7C10CD85230FCFCB98908950C8BD0847BDE33C5B3C6517246CD20A7067980826B2AC3A7245DF38DCAF9F44EA27DFA4AA97DC32D01A499EE60CB57BF7B7086C4E060F6C6074A40787BBCF045FA2E234081703ADE2C10948396ADE5E9\");\n            yield return (Hash: \"BFEC9BDB9CBB637FCF89289DD060C8AE\", Seed: 883283327, Hex: \"7065FA8D1A5A8417399934BFC392DD6D0487B16CB95DDF2B185AF82C1947EF93FFDD09D7FE00FC026A9BC8DD27EF5FA877362C6D3E38419C68825661FDE20955CE6A9C7AC6C2F72F16143E34DF3DCC476CC76D6B7A42D9AF7F10D1192D2102101900120459B980EC9B6B56110D36C495567202B2FFBB4A79DC3F435457506BB70ABFC08D24EC7866A6C0B46E97C22D180972B54D0D1640092DB4CB5CDDF54CE3094403E858A741338D1976A395DA22CDA88699DADE75F3C171343B5ACCB9077C0126F68153B9178CDBA85C7BB0D5449CD152F46067507EBFA8F95EDA7C749583C30ACDC2D6AEDD5341DF129AB7E5808C022BAFF4D3C384D662F62DA85F1C3B9DDD5C5392B29084DDE9530CA35BF23531A35B0B8177FA2DDE8E3928C1B4B86F639FD08982EA72989DB14967E2D9E7C9E13D7735FDDF9475843F9693F70E84581BA71C74B25FD767EBC367AEA39A722074CAD71FC18DAF32C3EA977F1A6BDA73B3A4D240808718697544C2A11346C20CC045AF13BC215ABD603ED8E261A7CBE9B37CA647CFE257E44B5A2889575DE53321A1842F367121CE0F599AD1E8C088816D59\");\n            yield return (Hash: \"F215E79303822A07E30E23F215D036F8\", Seed: 1929173452, Hex: \"4554FFFEF1FA560DC7776DB345266C805FE06FD67929E0FC1CD02E7075C7CE6FC103BB9F36F87505031453A623C000C921C86171A93957431E2ADD7EB6573A44D38C5B05D1960CA0DAC91792B64B79E8D8E15362F08128F3DBDAC174DB3D736FADD1F4662B61BB96930F3EB01709490005D59B91A6624374F9DD0F17\");\n            yield return (Hash: \"11528C465BE2DBE7095DA64D91F95EBE\", Seed: 1496881455, Hex: \"44094D7A9C217EDE9AD267B5F1390A51C627897DC674E2B6A9992E56D657CC6CB51BC2A3F243545617F40119807929DE39B7FA49054C548B55B58C294CF7809424FE38D60889A6F2EAD48F88FF994B8146971B2D7B190A69DB2A291A65D046BC391FFFB287D9BDE41F1410B6F8274FD2B43BD85523AE617BC32E3BB34AE13AFBEDBE1C93EC678C77E6F2FD50A510F4C4E50FBEF1A631197F0F88C12804FF94F288C1CE527FF8CC1A55BA2B44067EF04955B5A5D1073A3678358EC351F389B67E9D4CE47D7E44ACD5E71370B29D447FC893E72F54D9054613305A2D104A2F5A7BB0EC327367FDFE759E5FDF8CB5D69B68628E911CB97C0DFA814BC1A6CBB416899F38E08BF7B1EBC4E6D35035A9A5C72F1FDE26EFCD40A5F61628036DD369E1CCB71DADF6008D70F1C53084BA00FCCD8FD9F8E9AA14967F\");\n            yield return (Hash: \"9A8203ED553457DBE4D3AAB6A5EB0E0E\", Seed: 1671635939, Hex: \"996D1DF16DF651D5296D22F3987FBDD5C78A261C5D3C309F3B0B3FE33AC6D46CAD7FCA407FD030BB61C97CDC6F67CD34EC0501E6890654420CE68130A68E0121213228994081263FAAC5B702F1084DBB337B4A5B769E2B79D2BFCF2F0E83C7D9EE06C1F673E4B90E6027FEBD7DAEAD809E2670168D660423FF89B0547BCE0D9F4DD6AB9BFC8624B5F817F6423263D1350FAA1287E7258BD169AE6498C071EA295D31808480AFEACF656C4461EDA17308E57FE57B1874BB0A785286523622E28BBAA6379BD4CEA30003057395A905E3D3A0A74EC64857E181696DCF312237F33791278DB84061B0521F5EE50CE3CE23F6B4229232B2D45C123DE86CE6437EC93D3481F914512A9A1B60365E3E5904871F4333E6D8A98F65DA\");\n            yield return (Hash: \"CE44AB656FBD993B3478FAC5A2A94839\", Seed: 1389475359, Hex: \"D829927B1773DE05486F968E7ADE39E7DABF1B9D836AD3C8CEF9D61BAA3C585698D2BFB8\");\n            yield return (Hash: \"52CB576B4A741D30CE9182B086C41360\", Seed: 759328755, Hex: \"149340F6789ECA9DC4B99A9F3EF26D051F598C5068240899F5B9EBA3036693F7D47CE9F7D07B2E3226FE481247C318CD6714EC4CC23D6C7075A03A22FD9148EB2E08C92C7B84086EA6A242C7120E81DDA0B7749BC01D18FE966DD3E3CC2F0BAA573E007F5628A128085AD4D5824187A97B8BB5CDE5CB4AF0AAF508E71184159990E5C6745F5023181BC2BDC7D7BCCB302F06F8DCE8705182F0CD034F37893E501A6FD3DB62852E401E257B5A6B0867FE046A677E404966254AC30F7CC06DA838381551F91567AF3630A25526F3CD3DCBA600543284CAD1DF9C2EEA23965C09C6F22FFB9A1CAEE068454755AFAAA975B362190B6A7B389E2C833E9A37A0B3FB5D008D18B0F3B957737BB93C766ADAF5CAB03C1D1B63706D2D93FF6AB65F5ADD904B4EC3A95E1109B75D05EC4D08FF0157ED1440B7359A983374FD5CBB7A155B253945DE7EA72373E91987EC0FBECAE9F96B9D8DBB155923B3118E830016738D2C076FCA553892935955F9EDC4F60238AC5C8D63242983EA29CD03365E2564BD4099198A4CA119935317D09BBDBC16\");\n            yield return (Hash: \"589686298090DCBAD62E78BA742AFB8C\", Seed: 146894225, Hex: \"FB4441A6FDDFABE3CC8AA2B6A8301CD2DCF08F6C08BF8FEE4D51680954C0DB1BC7F6793BED0D72052478BBBA1291FE243EFF7662CCF76FCF780B4995D7149A1B3BEFE4278D8481B63E25B35D7D5F9106DF1611F0017C60A14F65C99C7B7903815C500EAEB10607E312E0EB0B71A8DDE129FCEBB964DD39BF81FC57AA4271A7D0CB21F20A845273AF186908C9B291F034902671B8133BBA15B0E8AA4E4CA5A8C18378FB034F38A36F68D3E55636965F4F1D85C0A4230F0FE4A57165DE1EB76FFDFAB071CBD0C791D26BE3D93672014DE8E590168330CBFCE3C28BFF3E550A964309DDB1CDC62BE1751114F6F8528AA18A52422A69103B92D0749E2685CE99FDC46E1FC0322DC82252E6B6E08E793331670C0D0803ECD4C9663D4599A7326F32E9205B8B5804944DA8A69C2CE0B51233AB3FABC77B2056CF2C8D648E35A9E5FA90A243DD73FD1D7931564C58987798F5D854E5F0878E796FE9105640EB133664BCD0BC9FDB86EBE0E8FCD44DF0CB0A3011A71BB12FFB0E9E00CDA2D53586A1E3BD346DC2B2C7CCB9B83E4D9D4EB15C1A2CD5A0FEBA0B81D9C14AAEF4975DEE54BCE524B034E7605F7A5E88968131403BF0F716CFAF62F13C8657449B1136A18A8A41770F440033D5\");\n            yield return (Hash: \"72FDDF833E28A3BF414E99B39A03BBC1\", Seed: 609010140, Hex: \"7BD618E3E0010A5A7AA30FCA2F52907BA322E44CB3D436728724601F6E21C24155E26E55F37AD9E87E1216CB1862E94C8AC54C397F9DFDC49AC9E20CDE5EBA377FFCD7D277A8235FE6FECCDA00A5C3191F3C0AF215A2F92CC1698C14F39F936B33E0C73B69362A8B36D3993521CA1254138122613EC3FBE6036A069A2D61A6646C942E5C638A1EB54FDFF0F1C0921C572FBA9C49AC41E693FDE23AD150DDC59DEDAF68ABCC3BBB74492D1117933EE2FC586FA27FF62B2CDA052617393423CBD33B0A150CDB4ADB5AE01DBD95612F189B6E69F9BDD7E6F5659A1A92E33A1D66086929F476E03E8F813138F4C749EE550CDAD8D10A7B7A\");\n            yield return (Hash: \"0B1007134DB0427E8CE40D947C084D61\", Seed: 1450199109, Hex: \"64C644A6BCACCE07DE37219B5983E8ED023E4BA1F0633981DB20C25255CD7F9D9E2180C9429F9DDBF8EEDC389C3380AF79B5B7439C42A07DCB5E47FCD3CA13FC8339B7F284E8E061C64047C221ED5A0D3EB121EE2A91B831E233678254274059BA088B02F6317BEC129EA7120F773A5F469519C18BACD3DC5DF9CFE02BA346AB289BDA5AD2390DB1B452290F8D2B24B89B29CC2C33CB887D5AB00AD0DA326B0EDFC53AD5C92B3093264B9F1554EC1391A39C1BEFA4EE332A1902F85856AFEB354618B634CFBB35032C8FCB143A21CA8C9C5A02937C577CF910D991C2058E86B91607AF8E59856D484994370E0AC63BB989E426B42EB5AC72B3A5797283C799A9851467958E13848370F4DC80E5DE7FBA1CF2141BC62D9EF6C3833E1453EF0ECDE90CAE4EEAD55FCE44369697CB7606271C4A3331CA1F6E8442C3255556ED73F988DC2AD005050582B34886FA80260BC49C52E847E247BDAD8F27C0542E83C189760110DBAA0057BD95184C41A4849DC7BAAE8082B1ED3E18C0BC994852CF450E793C0CA23FE0CE92E7B0160EDBFC62F3189E74520F79A3F0CFFA6EFEC0F9C5220FF8A8E383D0135015651A7AE2A77509F334BE890E9A75EFC23A0779F253CE2D5720DB54395941EE1CE1A71C4A6C4444CF98\");\n            yield return (Hash: \"E4FA8D30EAA2D945A1F2C11D54B162EB\", Seed: 882253130, Hex: \"E00254ADE52C7EF13AEAFA728995D86848C29FC6F56F2F64143B286735245A13E01D437D8F6F61F399F3AFAE42A838E79FB0D946CD16C54DA7679B87B1B8038B97A99FC8570FE3D3C7BE8417A7056B340D1198830C4EE7D95FE7760F4062A33285766819C1D79F7BEBFA2F4FF7781DBAC2DC14646FA37AADA4E7EEA2113085CDAE7E01F7D89B9ECC167FC8F4773887879B6A3F12DE756FF3412C0B3E2D5C3B620F19B4A6D43CFB52A7DC928CDC5048F6A72F82C98EDC3AD789CA18B38DB25C4FD3F5A4A6254F73EA207DA9ACABEC1B5779DD61050ACA0F40D3BA2DAC3B4DB1AC45E8397389325D662D94AC27AAE2FA4583EF9386A38265D70F8784F01FD537A1B8B6B3225FD202719C5E64C7C697EDB2480DCD10A7F0E584517C94386AB89A85990CDE7E04E6237EB91BF3717BA13C287EF53D7B3F59C01E53D62733DA694399BF7727D9E364483B90396B515F5E30D07D2C6467E4ABB8F0AC109503C24A2CAB6BD7A31273B7157399CBFF89BC3274A5DEAB9013D41CF1D9DC54299AD7AD81C75851146402CC9C008710E9E915AFFC8527F72B\");\n            yield return (Hash: \"133616C38F1F5D58633D9796F7914312\", Seed: 1680432040, Hex: \"36676480E44C8CD45787863C7F77668C65B0EAC82F0ABF50F9126320FDF6DD3160E992EF570BB7D60469F8C11BD9C2D11279D80E0FB1A232F53EAFC573D506BDC3FEC1E70A6AF9D8799BDA2200B43D72048C41A938C21EE670B6F726F63E351672D13C954B56FDA64FA56D7F4FE79B2FC7CE7E5089A6C15F5C6602FDA820695ADD09DFCA233C8110D5162629D9161554F820290E3A5DA33FF75B89A9F56A92AC4282B196ACD2FEBBAB9FF4F8717F9BCAA1752D24AE32A3D93F699B51F2A5560B6BD5C411D496AA704E06522425D6E87FBD76F430B75CB912D02E0BC9C2D6130439A45ACE377926F0A32DB4AF2F5436017E2E09857AD17F8ADAFCB59FADCDC37BDCBD93714505E8EAE5A8B72FB25C9F3B2565A4422A0B3A6FDE321D8F2B30E3398F469C2EF8979A76AD4C37AD0C8515B28E27FED7449F877994224CAFE25AA36468220C6F9C2E3FE81FF39F8F2503EF0F780C23CF948DC3339964AC0BA3B3D3330746986ED7DCB632DF5985000E987B813B43CCCDAC1F638FD32C44DB82F67F1A300C5AECB3F23ECD6758D535AB4B3B042DD80F1B8CD308EEC14F7D8D5436D03A2C9611285E40958804460B2B5A29E7690700069AE80CF7513A488077FFF843C70333010A66E5DE39E75D188664E0E4D17B4A812C0D721564ACD955FF898AF593D9CE937366\");\n            yield return (Hash: \"F520644E451B24D627E05D6A27915DF4\", Seed: 745299780, Hex: \"E8E9FF27E3631E970B690B149957CBB4461418C203CC9161FF6116C372438C92AEACAC54D745A1C2D4CC7224A53254C95CC788A7EAE11AA0F134AD646CBBE716B894A8CD7CAA30CBD3\");\n            yield return (Hash: \"2D58D37F66704BB19CE9D8375F3357DD\", Seed: 798309683, Hex: \"39E0B10CBE34A4AC06E84F1747C7CF7A715BCA736E59E25E7778108220AA9A17B6399D7B4A302990C997ECAC5C76E6944F7A2B7E77CD8736EDCB953F6D2FC4D839D4BDB67206DE2B0AD394DC4387ED3EE77844571E0ABB99DA6699EE190D794C79BD1F3B7434319A56250DB87C2E2A9CC543E1D0BABC0FAD4A65C0648BB68631317CA04EC5936FA321E38AB1ECBB39E405672E6ED3D17F89263DB0FDA33BE12E76B08213FBFC538AD4FE05422F768B8FD36D914FEAC37D0B5A8A57862763B7CAEB94BF81D8A0DEEC0DE54255A7891FB64F1CFA89F883B0EEEE3A289EF18071B0CDC64CCD4604A7F1B4757A2B900F64087A812B3147ACF7126C0CF0FC85D75A87869F545AEE65B9912E8B3E5810D0D4C7DEF05A62D2BFDA18F05163EA839924B1AAC49BBE09B4A68EBC0B3BD1F354963E48D4F49A077D152A67FD1203039F30BE5949551E6A50D346BBEA11DD4BE26702DA23288399111B6B168535A156E05B936D3624B27FAA5F4B4B01FCB9119E53D1A617E33F27F510449A505653E9B2F86745E8489B845E8F7143CB84A2457F218A6792740E\");\n            yield return (Hash: \"179724F010611F00A811961600C43B5C\", Seed: 293123950, Hex: \"75B6A11AE000B76F7AC86BE98D4F2892C9ACF54FE10CD949F3A64F07694CBBAFF9EAB1353164427B534D4E0F964A5410E20E7B5F76F504AB6CA7563A79EF78738ED837B0D760877582ADA753D5284938430AC37448A65872C01F39131D5DAC265A20BA9447749CAF9750997496B6BFA5BAA2C2E195E0940F948139898B7C2F1A8F0AD148D0F603C330F5295067F68672ED20BBBA6DBD2F064500EAB89D2BE7AA67814FAD61E54CD7DDED7BDFB5C796D6083852F591DE546AB51F4B1CE808C3C8425C7C583A2E8224458679D94EC11B63C806375465307C673B616E57B370656BA97FEF750D8789CB6E2F62EB654BF0F826AA8163949494B12ED4D3618323BA69935DFA8321E1C76E3D4D7CE162D8D00F95AD0D5C70D9B3AB50F6792FB949486BBEF91CE43037D8135CB300D4DCD6278C370E1F496191B79BB9180D2369E4DFF239A80A88BFD66A973EF4B1C05E34CDC78597BBF3F102DADA550871A05D90C0041FF07093E4EFA158AAF6743880ECD1B91C33A76535F87A7D519970504DD20100502D5BD2C5F6580736253712E1B842EE277D30343ADD2013EC36A7D8DAE5373ACFE9489BFF4462BCAE543AFCACE4B7487ACC80E76EA12A88AA\");\n            yield return (Hash: \"EB966730FB43011CE96BDEE9FDCF9E7E\", Seed: 1867967606, Hex: \"E251FA5CF42376BA33F2025F6268FC20B65F4644B1DE6FE2485F21AB6E947383DF2E07EBA16C6A22D76DB3849171506DD5500DE36A1BCD2A983476E93AD062CE478FE144817F26B439CFDF2530030D36EE46C0E33B82217CB2A4BC43369DB8591E0BB6BB0B0FC619A813C70B91\");\n            yield return (Hash: \"F60A163B9CA0AD0533DB35072037427B\", Seed: 2036398956, Hex: \"066228F9D6BB33281EC2B000D317383B5F94E8664A83BB88E37BA052FF0BAD64D67543F1ABF396571A233795465CA3D4D88D25A4CB3E52A19CF46ABF2C39CD9012E7E89550509AE804BBA72D10464C21B1A76B1A9BF484C14D5816103BD3ECC72674865CEB2F59F0078C5A57B5CCECC3A2773890F0D95A691C3B7AEFE012238E325B14924841E6D187025ED390BA851A7D383F07ED891B3624E742449429EFD6C05623CBDA4421AE3907453ADD7D35B6F90611AB4926366BC7CE8BE38319D8701288DB9F11437E73BE863CC27DC2D860BF35DF549A52B6DB7E3B96D6F178EE5A5954FC8CB664FAA8D0ABF6718E044DC2489EF8F092ABA15FA2C593CEC24E00B216C088ED29AE33443CDC060B26E3A4A1CFEE6FFC5188219EA4CD506AC80670FCCF2A5B2F15CCD662D803EEF0511E8E8E089D1A6F8A7E57F2EFADF8E843777E6D82944C4B129D99FD370700C985419FEECD46BAAC6DADCAFB28D877E648EC4A195801D1C9F2A4207A5B341180D6CC31694D1CE5E932889AA5\");\n            yield return (Hash: \"1A1F3A12426BBD3CBF1D756A39490083\", Seed: 890454222, Hex: \"C54219FBFACBB4F065F9A89CDED542EE0659D9440478F7C484A89D3154D648B9FF8E0C34A55712697328BA04E229C29200B29B9C77CFE47F3F9A8F93F94FD2D4B657F273446DEC323FD4785D10D181F92155A1251F02E8BCCD8832C452D51FCB7BB480FA9C37D8114E6C879277ED6A72CB8E03D13E5BE0DB4E3300EED4887F39F260B3DF926DBEF89AE35255BCF2BFF027DD895B11275107F38F2F54E1354AC66BE4EF09AEA9C6CDE2AEE5825477160AB049F82667C3D43912F012754E6785F4C73B295911000B913AF81226B597631FECF819AA25D2A9555D16B61FA808FDD614D0453E5227F189DFC32D153CF57E84CAE8AC556E7003702792DEE3F88A491F88509827D6CE365CF5F05DFA1A4ED130B860A804CBBE60\");\n            yield return (Hash: \"7D7006C179E094FEEDE44D91C57F0CA7\", Seed: 8475956, Hex: \"6037DC70BA0DE2E8AAD0CFD08775FB327C6351934085E73E8DFE543C2EF908F4FB2F27F465B4B29F007B78B0D2D6D52B028988F7B597429ADD0B36EBF7406D92702AE84336673B2CE59ADC090B1798C91A40EAD60B1F7EF1BE1872A5C9FBE66675EE88D9FF67FAC23F4307B27CFC42288990340A009C4B12A1425E3DA13775F6758A4A68B4D748041B5CBEF295F6F4AB4678B52BB1BCE7814D05D1E6EA037992A1DCDBB2503C206BE54DDC3D05FB0C69D8409434CFDD73B425EB059251DB339979FA6DAF364B1A8B2EE4DC28999D184D\");\n            yield return (Hash: \"438B4961F2E200CEDE1B0BF0C8337F27\", Seed: 501492696, Hex: \"E292B22E6A54CE234AFB4C13CA7E791F8D2373B55BF147DEBF9B1C4D6A53CDD28959D7D4267F4C3DA1585C038AC5C48A43405A2F675570D1143E5DDF572FF731186FB1869D5F84F0F3D4B058F9F08661022BEE04CEB598F97E75646640E4FF621B511476CD4FF7D6D8E25626EFE682E02767394B48F1CBCFE57CFEEC4DF396C9C4F371C7849A9A8503840ADA9491B9CC8FFE91758A8722F2A0C0318C133F81D9D41B41858A1E4B6BC8E1035943A85D2161B2785C0865E05442C158EC26D1AACF74FE3EF1586DD29D0BC927CB8A9343B960F6CEDEDD8192524E8964682DD0101875495ECBD20774EC08C4DFBDB7D3973A79606F94CFA869F67E148965F8212B69DB37B71D0B5572AD80FB01987367218ADF025793F501967E7EDE7BFF583801CB08E69CB5CE468E6806D9B06399166958C4001290184AD3B3413CA90CB1B97098384AAE278EF993F71AA8FA87B5\");\n            yield return (Hash: \"EADA4E03AE7070B8EA6B94C9647B20AA\", Seed: 339517188, Hex: \"F12BCA7B24A283B1399098CEFA8024776EBF0088E431A016D4A945BE20D13377F1EA909E6B394260431EC82C9972A2D5C29467649F24EAB43F395D82BD188469264C84C5C03A5D36C26A9C58BB837DC1401383974D569961DF501F7F3CBF6249C4D59E12AB900D5583F5438F586135179348C0676E660B652EFC4EB479EDD92890E01D9309723B2E3F59B4FAD64242FCA58B1E840AB9353B78626780593F4A8A95FAA6D91EB6F53B0A301DE8C0B53676ED9592794A9A762CC73731F0EB30B9F7C57974594A5BFE95CB5D64EF74FE1CCF2FDBAF0C2EB6F1D0A9536CCA13598F126385DBC5D1EDC5B9A3DF594434EB0CCABC94E143681F5711820CAB2AB838BE7B85C46C27F757A9A9B5E17AFFB2379D2B36B236FC86669D3F7F237877E5725514DC6E5EA31FEE19B78A918686DC38443F4EB4209CDA2A542377FC12B3633C80E3B31B26AF4BF0DC29F5A76D53C84655573F28E2732632C527E1738440742394B75EB5ED1CC2918C910F1C3E0C46B4DE62AF8BBD0664CA25283178A262F7603F2E9EC38B3AFF4BCBF00537D2EA0F04536CBFAFFE98DE4694BA80C109D563E0BE75A7ADD8B3A6E8B305CC\");\n            yield return (Hash: \"543CB8D3E46ABD6144C886C1E2D8047E\", Seed: 731757412, Hex: \"17EC0FD230A10FAE61416FE16CCA5A6EC66DDB0216C88478CAB70BD10F2CE128C3A61E30A97BCA07C7B1B5A51352CBDACF92AC592ADD76FDFED1708D55\");\n            yield return (Hash: \"F80FAD62EC259069CC0373CB6A808548\", Seed: 1054431549, Hex: \"5C166D36ADEA2875D1A371D1A8BED349316BFAA57175CC46BD0DDBD79028A674659E4DEF5BC469FBC1CDD1790F89FC78AA63D95F0AF442A9194B36F5CDE41BABFAF0CAB5366916A2593B469663AD5EF54D85349CFA1E8202B826EF216F969EBE84D02EF6001397CFD1613DA70454BEA69B824E98AC8FD4699439A427D4AB80BDE968776E80A58FC94AB2EEAAB262702EA914188A642E96E390856538E48A9916E126FE3AA64323C232A1193B669F3A66B88B78235E823463BC07B9BA844AB58D527EE69FC406D40EC10AE6D0D3065EFD28D59420AA13B104449F382E7960B40981613473F6D0828C7C8EDBC9A6825F485F1C2E8055F6CAEFFBBD446F1714443D01D583F1C45F93409AF0AB6A6B671D732BE4BE69ACA2E623D0777B6D5D790AF74EAF2C3401D4AE0D781206CFFC44ADA7F87DD2D4AA2F133DAE45A5909F50AEC085FE7A5C11D45D2545975B51CF3955D55FEBFEF289A3BFBB9177D2600465F196F28706D080AD10CBB267879DD6997E98E4BA604B4B6082C289DC7D04BDEF219B07DE60FEB76195AAF01829FD7319C065F1B42AFD5713CD155465BEA0968712CAC544D70C869524FADACD1A68D8E21D30507AFDDEFA2EDA1D6010BA6EED9D82\");\n            yield return (Hash: \"B6B77C0BF72F7E788431CC148A98ED1D\", Seed: 793190462, Hex: \"A1F9424500DD1737978FDBDDA389A0D7473B458190E7A85DED614E960DEDA0759BBC5273830CA948DECAC4312AF2\");\n            yield return (Hash: \"3A489DC58B1C4C3C532D157B5C511DAD\", Seed: 1955206138, Hex: \"51392193F66B32C878A4425E1D1EE2EB3097D4E13A71F4437E4881E58E4B09DF98FEDA35A7301589CDDC298266631D5B0E132155B71DCD40EEF6300C5358A2C9613409B5409DA98140EB8DE4DA8AEBDAB7DFD11399F76ABEB37805CF4496DAF14E4EBC4B3643ABFF0DEE2B465E84D2EEA37F7B0408E8F26F94D9333256A04044B2DE1A45623856B6289B47FEDCD89222A5D90347D370DA5331F3E76EC937EBD58AF3CCC2E96D94F3A7C53699C46765B80C6A2A1B722B21ABCF4FAB43BEB43D29C19F0617AA8CE32C070CDBCDB67843490DDCE4B96B0A23109F1FC1DDB0944418223B0858CCBF1D749CAC77D62EA31AE7B38211AECFAF1BAC3799E8B235E443577633898D27DE0934C3E0FDBE9FDB827CF93DC3BD4403203E726C0354D2424A916453E368B3E6E6C7E6D60C2E61957BE21ED81013875D306C19B29C6DCAFA6A03A7DDCA8EA5984584ED0342C7B41A8290FA4945CBD0BF9F2DCA74D46DDB01732DCACC28BA6B8991299AEB85D2C01FD7D7B497DD590C3B31C52EBA72FF89DABA665A6B9E47A2783F978B25AC57CCA6229B621C8A15232C8561FEB2FB0F5128AE7BF9B2E4A68BDF55428150EB9A3A7DDD9C8953852764F830F42B57952B\");\n            yield return (Hash: \"70A0C83C5C734BA2D2EB5A4B257C0FE4\", Seed: 266936576, Hex: \"24E66EE187958ABECDA7B32943B457141B8A8B2872B8E5A32D60219C4F0C8A51A1B17DECCA660C02B7FBCAA356802DA29C9F245618A9F19C63B30C9767D6CE58049C811B58C9A069A5C2ACD1A3B96CACFEDD47FFC3C5AF2711FA4C54DEA6670BAAC04FD383287DD48AA208838DB3D38D606ABB9CB7601A3C1ADA3BBED76F0B8FC9E34849B3E16CC94C492BBFF233CAA4B1406511ADC3CED05502C416004A2EFBA85AFD8733002C4E8671190313\");\n            yield return (Hash: \"E34136F1C60BFDB77945F9DCF724A5EA\", Seed: 292193617, Hex: \"6EBA7BF68EF353310B3A0EFA217625EA6562B03B213D6C99AE86B982F88E769E32C3B85DB489\");\n            yield return (Hash: \"A1E5373A9BFD1FB2613518D275F1FABA\", Seed: 187007621, Hex: \"A28894F958F82461DB49B940024131CB1660A9CA26111EF52A8C23C482217D5A6D207841BB40F894539F1D4D05787199BBE666A8A3C223629B6A6BB1A2EEAEB580057ED086FCC152533302C3B628EE7A17D2CEADA9A1A01F3F57B52184B81178B57A2256E324DB9058B8B647E2E73385FFB85F80A771A4E1D12B6AD9CB6D527D6DDC2D0AB5348A4165A67A08A8B9959B8DE683E1600AFC15A1E80692C04D3675957DE818B89840BB2A70AA16A958A8EE3CB50680D34C63CA662A921055697B47F770EF2FEDB9443922680D85D47EB5A06A1E844AF9BB1F5409A2F2A77031D3C61245B69F30654FA905776297E27AA53BEBBBADCE972C00E8DCE26323A8AF6C8DB40D2087E9923BF96C7BE63872595962CCEE5578F66ADF3598226169545394043D716971A0EA7328D00CA1BD1B560D2C55C1F9D1292E660B4C63245397D5E438AF2209529F1DAFAAC02573572E11C9D659709018F91F651A5CDA1FEA5FA0532BDF6607887A9CFD67C2BCF30014934F24A1AA047EC1716AACB500847F8969F4AB2E4879658D3A230A674052B3B58E193A5057725690E80B95CA7DEB184C4E706B5852BDBE2530E0BE6587EA3C9098ABC1060DC449C357301F19CB4D33319768E5C95768781373CEBF3014242E\");\n            yield return (Hash: \"BAEDD366E4E621B6A4089145A9019ADF\", Seed: 1848660263, Hex: \"7699C90DFDF94842A7D5A0FE0EB74CF241FE8104749A2D0E170B527E3D17E0105123594DA43856C61EAC70B47EEDFC0197E5F27CBE0D2B8AA9ACD88A505D85D86BC4D443CA12219BBCBE12696CE28376DFE84F394112B5752167D3BD3F97AAAA78C18A\");\n            yield return (Hash: \"13EA1A9F928A3C1E916E6756F31AC5D5\", Seed: 1847583846, Hex: \"9B0BD49CEFDBF6E611B15A36174E207B05EC2776312D2945CD9E78371391E533E87D35FD728CBAA308EE6FB41BB822484011244DDA3E063D16AE711C7C307B9DAABB25C41FD57B8FFBB49311FE4CFA0B8636EA946F82441F85928D2616163857ACC9AEB64972\");\n            yield return (Hash: \"F651F2257CFE64E1F2B6B8F82895C844\", Seed: 726554, Hex: \"769A819CE7EAEE18DEC4CA2E30D17E2BFFA78BEB87B87F3BEEE753B9ECDFBB23BC446632B1A0C753AF5A0DAAD4FFBFEF0554DACDC4F04C4E4523E5141439602C2A6EB49A0566C17E397E010F693EE18B6F9E4186CA2293BAE1A61691D8E9E24BBAA76B374FE3DFDDCBEE463D40AE1FEDA77E54AC7E598033C2DC485457988670A27DF4FA506825293A7E71A3155CFC70FCDFCFB610EA3EA8C6F58E496B73C9D32DAFCD768C10DFF3420465A714760F7F6A8219F9E7576116B0A1E949576546DD\");\n            yield return (Hash: \"F3794F955F5ED05D0F9E02AC09A03FD1\", Seed: 1761839230, Hex: \"B7CC7930A309B048CAFEEB40675E6E652E6D670747F2DD49502A9AB4606A59AE0DDE3B4EF9D9A6253DCE7F1FC5F7A74080FA75E5402EE28563D4C35FA1AA2AC8248A7108FCACB7F343F60E2702FBA183C87CC50EA28DAE7AE73A1EB8FD8A84970D56C48449AD0E9B36A22CC58A0E352E7CA5EA8B2D9BAB92AB19730AF0DEBC490AC4CB4C415DD78D9725428A5D6365A058697EF538E88F80E643451EDD8C3A9B2E740332\");\n            yield return (Hash: \"52B7B8885C3FEE5FA4663C1283FB8BFE\", Seed: 1830390006, Hex: \"30C4FACE7805F079013BF45B2A53DCAF8DC3EEAF53632140BACE8FACA4EA80B7C049D21C0CEA1AED33B9C95281D739DAF106D00A2418ED49D657804048BC75A6018930E08DCDAA4AC615CE7F4F3EDBB610FCE2377E730D4910DB0996FB15D04EC5CD80BB5A81988839603B5DCE68D37826F5A5EDA5709CECB389046AC2AE225A32257B403A0626C5E495D67693E60A2025220306FBA8D45A434140E4E628BB5A61E6D5973354675078C756D17DD47A2DA487F3493F7AF1B3E8550E1AF8B2D81C6692B715863551F62F23A603053ADFBD9F2F7A442EBC1CB42647535B52A3\");\n            yield return (Hash: \"093100A8154593FC4826719FEA39819B\", Seed: 106964303, Hex: \"397E833DD6147245A17DE2A8D6B097D6C8474B7A9A79B97C53D33ED475670E966BA30294E09DA4845F4C308BBDD3EC674D75BB20299C45B5C740BD80EFA7150546178211B5121E85AC49BE10EEB7CF5C74B498EF24412EE856596B1A9C074C8D2DCCA6FCA7EDED1DA6CCE9D815EF20F03B365080A192420C30086F8F38D303261B2AF24069F4004AFCA9F3D7915E38D77A5EC675E390E94D3458B9431589A4212AAE5475DBC6BB4A85F2AE8DAFCCBADA7E9F58641775E0658296DD2242E332AE67B9CFF9FF375A3612FBB88A\");\n            yield return (Hash: \"9A36AAD0E82356BE98F4F51548F008A5\", Seed: 1561701609, Hex: \"6FC5C8E110560E6249A06141526B8B479F7E6968FEDFF7ED14B8296EE7529C25B124CA6567D69926BDF50CB56A0DB71B03E798070E585606142040EB751AFD675CBEAD85C8311D98FA3CD2285854F0C52F16141764F333432766C3FC\");\n            yield return (Hash: \"46D424ABCECB85C1DF35E746270FF34A\", Seed: 693213250, Hex: \"65C0D959584640865F774AD10DBBD75B1A4374F3ABFB6D136F78B0BC9B5CAC64D28109E8A400923F45E0F806BA7AB04484FD5EF091F63BA90584D455F156D9222EF86A357C31FC6A82ECA6E5D27016DD39430658C33E9E6E1CD27D56F008F26E4E2E60B331F68F1FD45ED3B3D8946F57C2DA4AF6E8BD7132302A6359391EE66264F4D18A1B8E0967132FE18DDF454886B095239A162FA9E668F124908810387450741E16BA58A20C8C69DDBB76BD70AFFDD3FBBBC989538B33CCDD2D89E96732CCF6E4497152488462C8F58F76EB1324D5E83DA3593A66F1D23B\");\n            yield return (Hash: \"A703A597FFF8225734D078498FDD61D6\", Seed: 1521464178, Hex: \"1FA90B9BDA4AC7C15E8C6C64D996F33DD8E515A783F5DC966A41457E35D2A7D435F8C2F3974B6F3A4023F7AEFC25D15CE862942B4467931DCF9B9FBC0B7C45B51A095D2B614A48C4BACFB0B11127DF0013DE6E0E861F07992C0366B9394015F099DCFEC0C5F6991F0F99716E361479093285DC34ACB733FAF1E15CBFA79E49519FF4BB1B47E9AF5B56BB296FE3F5B564A23DCD2C\");\n            yield return (Hash: \"A93376F50FBB9DB5163F0A9994ED0B56\", Seed: 1072264960, Hex: \"292AB77BCB393B098EDA59322F077A5EF9F725C78E4B5A79FD927808499A1B802C2BB13886516B6AE9BBBEE534DF057C710D202D9C63A2149DEE9524BBD6AEB63C48AE0F1F913A00795BD46B6C79C52C16DC7145785B7F2090E36DA211E2851D443FB44E335C14378756979EDDC6DD4C4E528B033E6CC96CAC1F48C97BE0CD391DAE438E40F8319F7A4927C07FDF9145A1041E112209B35717E64CF4F72FAB9ECA4BED93B1B637464A93E7B3DA1455274B95934A477DD6E30077B3024E4D550F4F8DD36FE2A2E427DF15C21D690665B020B972B3DFA436710DD6EFDEE1F56663F3C62BCD67B3A52CFB0C5786599593CAAAF4A3F5403D35F0532449FC80D073E4F5B67551AA3F8EE4F94B63F44797ACADFE61A97A7C6D2A26FC3974036D759660C4A2E7EBC4BC2B7F659D826EF6E74AC0\");\n            yield return (Hash: \"6FF1A93692A866E2A43EEEA435CD4A26\", Seed: 1351448939, Hex: \"80172DAD5A54493ED85094DF1B4DB61EC7E945A2530EB538AE84FCCC1E9EB12E2CA5B21B29B888849C178E6BB6290AB17BE9DB4868B9312457D2E3CB03460D967B48652058B48013EF854078F2839EE4DEB6B637BDE8F1A8715CE69CDFDB7118517F08D905BBC74CF9E76113D329D0253ACF8DE6129A7D2812095A6BCB27F553B8862CA953D182C8DF3F4BA9C409FC52EBD5666D2847FA98AD72EE21E5EF24D59E0A215C67E2FF51390F314CEFB84535D16112D7FC4BBD66F74AFCFB65F382A97FA85E55AB0BF701DC651FDE0B490F9A97DF93BA59BCC5F58D014984004F28994EC077BC80C695EFEF2BB887C4D6A801098038A83EB73ACB40D6E8B663FB94E1CD33FA4CD74F0D6DF67559CEDE9522D46FDD2353CFC83CF9B191F470DCF0108A1605621BAA2891347FE9729E88EDE2A239E18363E8B595108EA58CCA9877A420B37D4DD2DB44253EB6BE65E34A3D90F7446A2E8107B6076D4F789BFD8792EA8DDF67DFCAEAE2475E47FA160F0DB3EAC24D31D23FA3214F0EC1C748DC2465619E0D563C9A8EA8051E8C9F44BECAFDB501DDA8ECE06B32164B4F6DD3D8B0BC18CDFAB4BBA05DE0751A5AD1DEB143B13304\");\n        }\n\n        private static IEnumerable<(string Hash, uint Seed, string Hex)> Murmur32BitsX86TestData()\n        {\n            yield return (Hash: \"D53A67C0\", Seed: 170723556, Hex: \"21B97398C15CFCB20CE12BE0BCE68FD2705976AAC94CD51CB3774323EED798\");\n            yield return (Hash: \"67B59E61\", Seed: 975387919, Hex: \"6F67C38642BE8989F8CD9FDA458434E93BC53A0EE7F69AC931AB1C8162F16263C84B57BDC0EF1793CFDE38BA913C298BC92015D638449E080F034D6902ED38B32D0B71901C0ECAEB5963A6A243C7C41EEB16EF33772759632F4AD635A68E02F9248BE522AE069FC6634123526E307340FEAE5926009C65C667A260B10EE6F32259B3CB1E97BF2048887447727EB27B1B1E5C8F75C24F63EEBC22F012\");\n            yield return (Hash: \"28B6B788\", Seed: 625721906, Hex: \"7FB5304ADBF27E57B64E9E453371C03BD2211C7CD4798138D73B21725D02669929FA4866DF421F050847ACAF427C805A08D71F9DA0AFF1A18CA0985A9BFAA65E2F0E69F8F88A3592A6C44AB454A26010EDC79E44319E8442437F5C5C6C5A7690C7CAFBB61B285334CDD25BC54EAA6E856CC70A60B8566A80308E65909B91477A53008616D0EE9E45BE9DC2AB202D0BBB45D59D939361AA680354D04A0D9CE2526F085AF6BFB0227573768A9F52F7F2BF9DCDE3B619F1E870E835E5F2B03184F2D77CCCD49FA4A3A8D705D734C63849E9BBAC73C72DD6B7324C86F5857F34C469301129AE8DAE7545C9F1585E21946CBD1E9021B70BE46CB1CC4D7E80761532BB0A75DEC3CE63426CA9829EA00031329D108A55FEAA1AD867FB05A47E4CE3FDDF53B8BEDABAA579C74C0DE94BBD48AAF45A55242B1380891C3F223DE093888B9F50A398D80AB97509349774E1E21AEE79B86130AB83A28B29BC2169A41437D7E86104ABD3EC2A88915DBC3B0797381A28C54D92D52FAF3BC8D25C946E51EC74445A0906B1FDA9E873FF30917CD69ED742C10D26B9BE75171ABB433565344EFA5B127DC8E44D1CB4AEE2B69A08BC718025EBE327FA0F7082A4B9EDB1B5FB092BEB44E6\");\n            yield return (Hash: \"E0A93CCF\", Seed: 1402226386, Hex: \"FFF7A3687F3742C932B39F1AD5D7616629967FAF983CE6FD35D87D10B9A301B4DA15F5F7DE66BCC5EB1AB22D4C2697187CDDF6863AB52A64FA4A9CE1153CD7EEE49E68CB13B5A548E6BDE676E2C5\");\n            yield return (Hash: \"2C949609\", Seed: 966406493, Hex: \"39ADA114554E1A9E3EC4C13E079A117B0FED1536B25D3CCCD625C2C49E68CDB984FC2A0E54652FF6D99FC5C68B8919BD9EB5DB4CBC6CF151A9936397D2E919EFC1A851F757988FFAE9643E3E856B5A4A4C08BD94BFDF3B19090985338F5BE2F924AB04D5C361A80934C4F96DF69CE437692179D8E5E17334DCF6AD6550970438C6EEA1558F03471EBB7F3C286E36061659A65F06A197571440D7290C3C4DFE72B7773E042458DD3E6BB27523E548131B48545A419AEF5213DE63657728BE7D2D7F21544F5D97EA38BC635EA6FB077FBEA9888EB9C1A4EFAA3B221B4CE7F524E6DC63231CFF11257A80A8FDF6E96D6B428C8AC37912BB1FCD8A99FFF6D781AF85C9CDAD544481C36C0AA6D7A966A7AB1661DCB19F2525CEC99DFFCA88BCAD0ED9C0D8882F0CC718496EF438D56893A103244622DEFAE73A6DE96AED60A4245FB48706285C3DC850D169CC3A125D63E24101B18F4FD3DCE9EF6DBC69C6C74F3EDBF714481AA6271FB4A553335303FA20A3C3A7D069F7D470EFF2AB7646D7548B41191DCEF823BB4171BE7941\");\n            yield return (Hash: \"BF39B38A\", Seed: 438798508, Hex: \"06D3B33CFC0737A8B8D053AA488721B0D346B0ECBE07182CCDB7528D60178A621510\");\n            yield return (Hash: \"4C2E01F2\", Seed: 1900650905, Hex: \"658FBD79F58DE3E8877176F67FF8B0FA1CE63E39E9F2E9D99875248B38DDC355A4E378C0A8F7577A1BF774DEAF368A1599B864679BE9A8CC53B27A9FFE17B6ED53CDA4B6F8A19CB6DF9BAD3AE942BB0543250DE69440ED53756D8809CF011E59E3B26E1F944794C42BC813D8F3EC0536B6B31428053D73D668DB909AFDABDA0EA1E97B4E7DD76102B55B3E7327BAF0F9967A49DE36E665D02290A28297A1060092D6961CA714BB5FC2A14A9BFC5CA70D339F61384993A9290F272CD529F000B63C4285664600D14405AB288F2F807C330992431DB97112702C92758F48F5ABDC09059509213C097BBAD94232EF972289245AB4A0608B849092BE15D77D3B16664CCE71C9339C6A0D\");\n            yield return (Hash: \"FA7697C8\", Seed: 989050899, Hex: \"2908E68E04834F40A63C78BF62B91905F1573E5375E8AA1C3CA8468EF131D4A90579B5326D61A5EAE23B43DCFD3D193CE4783579113B846C1DE785372A17FC8AD990CEFF91720A48AC611BB450BD34864658E3FD4D3C897B0437A6FBA9164653D6CCD94ABE3EFB12E27CA1585D0EFEDD497771997D520D7AB261CC64567171FB141F1119D22CE694F4A248E476677D4C22C8C8954A73A07BB180184BC0B2657E49C68A01BC6CB1E5CA11DD3B9A770CCF15D8BF878217492770740267AEBA3756DC4FABC7EDBD071BCA76BBEBF719E8E898FF2EF19AC1DD73ABDC6746A433CA66D8658E1E8783D4A1719C6E8AEE31CE5D4EDE4BCCB86975B93D2F561F4E1A96DF6C1DD531A9FDBD948A441463EF88EF95A7AFC0D8A7024FB0E19EF929E54909AC2316368C56E94EE3A82B9A80AEACD02B78293E21DADA2DB94393D43CE4A92ED64BC34A8BF8FD3A553BEDFE4440B193F0C2E70E441512A37F3E570BA095C6532B3126F6079E3D04E8AC4907\");\n            yield return (Hash: \"236CEC11\", Seed: 81726960, Hex: \"A14A5B8B1422F08D9C53EA30F54980C69C99231443CA2B556EE7D5340AE81C41BEDC65AF3D562F66E65C6CBD77DBAA340F6BFCB505CEF3ADFDFCD799665FC3AD74E3528F1F43875169719DC21F71EF42C7DF2EA64945DBBC6EB80E4D33957AC571CE7B12743BE1D294256EB7F8D9D0D1143AE3474D9BB3DF5AEE1FB99F20884B285371B4035B99C8DE83B8A3AFFA08DDBB6B6D85604CE4BAA7090E72836C77C8C10FF6D55482802769A30D37567B1A0E44C79DC158460A8F41106449958DC107CD3660B6255DE78E76031C3F742BE1035DB27C4879CE4BE4885772DC3FC4DB4CB36A4CC1F13729CD5251782E235AA233854F734C\");\n            yield return (Hash: \"E67D23FC\", Seed: 1816018064, Hex: \"9BD5184983CC5006FE6160BFD25F0B40A46249753A85F236752C253531563D79DBC86555354C0647FEAD0367AF984C0AB669AD61D2D9AFA64A1EA75DD5FD3A4D363477C69025D27E159A54A374DDEC7D\");\n            yield return (Hash: \"50553A80\", Seed: 1041377529, Hex: \"2D70759023927560E578715C2D52E1F49A2E43AFB63465CCBCB389A0BAEB221E8B89A996EFCB51B9A6C94520F381A9D594F5AFAE7153686B4121320A5E0CBCC2771FDD24EC6C2F91D0A063ABD7411DCA158592DD109FEB01F4EB003188A913B074D3DAABF501E04AC7D882B28A853D71B611957ACEC5B2EF775C5CCA7D3D54BE7243F0CB2CF6EF029EADD140D4881F0492A392025C98452B9CE26385CD8A50F3A309F93A5F994D3CA0E8FC9795618D9E55D85667F668EA68B62605BD4A99B4414987DD4AD69C91A8AF6E62185CD1239481B5C71052B6B7367909B01F0688CAA0E39B2D2B99001B4BB01422AAEA572BA0E8D3E72BD8E2F3779E140C335AF64037E3FDE0E5617FC7411195CC09289F034D3E44D281FB0A47DEE811E4937895428B67BF747A4222E7EA6C8FFE35348F4E9F672C7D2DC7DC3093ACAAAC0FA899BFAF5A13EAEE1EFBAE018E6440C6551BBAEEC23536E728799D2BECDD3B388CB2B9018BB77A2930B8A134C27D29724C9AEA9CA5\");\n            yield return (Hash: \"F438D9D7\", Seed: 671833021, Hex: \"24A368434F35CC1DBD1136CF1DADB380D44615369AAB4E4CFF6C313EF4C283F8A89EEDA391D8F2BD62001F8219C3EC371719B2DFB0DCF1D25C7515CDEF5626F1E8E2C1323A4CA57E4A30A88715BD266D361542AAED1750230352A4C09C7F651A3A9FDF1B582214DABEAC7FA1EDDE58CF7B0888AF49BE6990D3D800F4571AF262BAE01965F68F05AC0DFF5788D4113DE2955B4603E9B590AC2F5933AD60C2B83F44034657CFAC481D8237B3D84F15DCAB8985B66E8C4F6D279EDC9D33A546DD9F6B55E7521F5FB8C4FE8582A965411E2E76231FCDDE29138B613CE66E4CF1BFE86D8D10F94E4A10EE7D0DD60DDF635014C66EA2CBDFDC0028443915D26A5999494FEFD1CE4F9BB0A87A86784316BB8B0112EF671114DA1C22317329387AFDD227EB53965E155DFCC5464B1225FC4ED9C313EFCAC5842B046FA1B4F11044F7E00D7E9A6D126FF140D89B4D726CD0E246526223E68BE0A0DEB992B6D78C1EA3A65010CDAFB501B5\");\n            yield return (Hash: \"5B35F031\", Seed: 151857919, Hex: \"5D5E19BD6FDE1F558CE2508422AA39B6F6FD12BFB26BD8BD19108688504465DFA9C59BD90856019CA183F79A40655D234E0666191BE799D3439FEC7A2F6FA7801C14106002CE29BEF93356551E0AEF5C6EB3DC92B6BC3D063B9F42E05BC9A66010C7C6254AC8B3654E6CDDAEE4DAF9B2F8B697FD0E209C5BAE0B3DEC41D788C2CDBAE0521057A526B7A2FDD6DB36A2CFC1526CC759511BFA62E55D5EBA3C4024E759F15191CA8E6636CD588844F53F5353BD1DDF9E2BEC09CC7E521D433159FF64F998F3302076D3D7DBC9132C675E6550E8B16D30B47213951DFB30624271537872DF38DAD4031167E811242437DD3E4F41DE98758FAE8F2AD7A5053010BEB32324017CE3CE21FEACE4314E014336554BFEA7B6D28A691971FE35C78ED2A9A0593EBFA1DE4902AFFEA41232F468E171E5C461C9D21B8390B65311415E0BB554161CFA6BC18D662CDB577060EEA8E2909ABCF23C6DC3AE1628B99E9F10B23CC079ADD69B23E1B41C600E0495C07D2856375214505073DE7CC3A1CD26AE777FE2A19B0E38B8A75CDD781AA0B9776910272675E90F7FD66C3E384F92D932F78B945CCDA5FD1427F5FC9B94B22A66A38D76EB8A65BFD70203C059748CA68470CEBBB0501D9823B91311501057796687B87AAC7BBCD68850EA0DAA101E9A2840812AF93D6D9D85\");\n            yield return (Hash: \"0AEF7351\", Seed: 1257387532, Hex: \"7A3AD2683142DCDED1F761D03D54983C83323F4BA24AADD9B5D42F174FFDF7045DFC66E94DC4716D6753B67009FF0BC9232F82C31F21285F65964FC979C0367CD1050BADA55EAEEBEBDDF47B4F500DB5B93EB4E679ABE982E86B874BFF4E6860159840E4FAB89E9675882BC5E337061584F0A18CA94250AFBA7B49FED03490E3BB66F09EBAD65E0739724993E606112532B413A6005E50272C6CDD326E42F3B1EF40B3CC582FAFF3A7DFC920ED6C70F4903454BB5225361F8DFC0567CCA97C276538C6958087EA51F1D9EBF66D04F796F0735A6DDBA0CDD7DE42194D9CCC504F86BE4736AEFD277BC8DB1E157A836D830CBA24904DE3EA0F6CFEA466B4DE688CD3\");\n            yield return (Hash: \"626A20AA\", Seed: 1971886244, Hex: \"\");\n            yield return (Hash: \"58062C45\", Seed: 1473444627, Hex: \"C8C772CA762C18AFCF6EDE17CA046625B49853FCA54104ACD123FF9C5CBDC98068C756D0F672EC2EE7DFFE7DB798D5AADAF01B79FF06210B8732CFC0F7AD6361CB7BC0CD2CB9F63D43E820B9B45BC629855695390FE216C98542A91C3404AF8BB9C0EA\");\n            yield return (Hash: \"615D36FF\", Seed: 1199943458, Hex: \"1EC75C1138E63C81FCF3D1AD572B6EF25FC3EC47FB2950D8FE117B990024FA101C0A438B8A57C6A637FF186B68728E6B46F54A563FBC0706655ED43011D30C2C92C79AA41D1E1AD0240B8E979029D5FD572C17965DE07A291E0DD9A244CCC644009D8727DEB6FADC8BEAC26BDA133D44575B13D98DF256B4AA499051FA71758633D30D8EC8233934C6F4F01DB4B42AB201976C4C5DC80C8B536485F80B6DB7EACC4AF4A427EB70F2F394DAEA846D62003AECD0A5DFC98E0427CDC6B84FEE7828CAB3B03024E431266E9247E5BF859D4B40973BD30813D894EF90CA355F77CCE0C9644386C676B2E8D622DAA1CCEB1AA758C3EDD64485A9A57DA7638AD131115047DA9DBBCC383E0A1EB460298FB4EA18\");\n            yield return (Hash: \"7E51594B\", Seed: 1180383412, Hex: \"FB1C84ED7BEED80D423BF420CCD10CBF8959EEB56C0CF9B1608AA4F6BAAE54274501901660D9A79606B4B07F3FB4A67EC1F11F7EB18D83808E866BC5AE4A5CF0A0829483955E2538447FF8765E388F0872807829B02F5257C16920FAB4A8D0340C15E4269D8C9CEF31730902EC597C059DFCFA44AA9A4D8F99032FE1DA54868ABC2A7B05593F5D2F47704216F572B4D1F48F2E14F92E1279A4D53449DF4BB2B714FE8D61677AFF1D15D070C8D4CFE6A32F4E7C129172CBA4B1DC8679F503ED8D0B87F6A55B2982080BC7533860243824B71CF2FFDAABA6A814FC49B233BA075AEB618BE31E3810E2F8BDA3F91860388EA3A23765C4D7F40C9C2324730330C75527AE893AD103993AFC5BB9F908FC6545C5D3BC973F297B61F35CAE7A2B7CD6D97E64EBBC025B5F9FEA5446989356A6F79578C70E4A423C8C4BDAE9A40B03526FCE57C88DD65EEE0969315B22AA74C196A06C8CAE6A50CE54F52DE9A1CFDA6D4DF2E20D2A38CD640C35FCA72FA3BB33C120E22C140E56462B67F13D5D38FC91536942A0497AB3BB15B8C1371F7B1A31CAFA47B1590BA4EFD7CFA15C6969E23B1049DC189F53156F7219E9CF31F98263EBFE8315FCF550FBFDC8C93C1E9D688C96A76242367B730F2B2878B2BE5911EC5D50B7408CFF8A1D55BC04A5930669D7C895D6A89324CCEBBE1085A7CA8E8D6BA60570C48E3A\");\n            yield return (Hash: \"FCB8A112\", Seed: 1807159516, Hex: \"546C54FBB231427D5C7905143DFCD5B09B29D5E3FBE43B0F1CCA350D696813700B19483B1F9458E868B519BC8D6092F8D4CA8009F46F0EC584147CA215946D75485C505B453F919ECCEA7A1573B60382D5D7346C909AAE6CDE26DF17FB7DC1BB733875DB21ED6DCB6C37938764D48737CB6D83AF850B85F94229111112011B65F4FA9D50FA961994E3FA300E797A2008FC765CDA4E5400A5330730528F0DD932049C8B1C37F03AB846F5D5AA96C807DDA619468CDF5F73B24E26444B4E112BBA4490C75D50F6FF6BF3769CB8A307D1C67DD55931FDBB44B292802E554078EBF1E19103F30F54AF7AD863A4313A81BD592B1730A384A09F255838541A251F1BCCA2DEA35724932A6139A12DB7F38635CCE30F3696504F3BCF08C575C192A767BF32C50C3C36FDBA6E24E251C46C506E25EB440D6D598D293C2A8F85BB1C399AA70133EAA2B50945CD6CF303723F7E3D7BD729521E745FB30B45568AB93301BBEA062BB9FDD8FBCCC16786A13666353B1DAFC35DAA4E470037FB3403ACFC2D2A505BD9EF6E09E9C0AE6C433433EA804851D44492F7F0541887356CF2234AB0102A9E6D6904A9\");\n            yield return (Hash: \"292A8460\", Seed: 1510874838, Hex: \"BB420B654BAB218E1387AF3B375B8914F01B59BB14B7F84689611BDDB58013F88AB6B5736DECF79B3D47B6\");\n            yield return (Hash: \"5B769E81\", Seed: 2083387948, Hex: \"4B9FDD56AF8AFF384E1CCACA1430BF53DDFED32052C32DD1A08B3851004D32BD49B5AF9A3475185F149F186E6B85D54D69A36FDD27A2246CF23817DCA81F65F4249F75CD82DA6C142483311D63F6452AB38C09F09F2EF49F307279C1FBD9345A2E830CDEBD02651AB861C2A4AA6CB513BC0D20EC81319B7EC31C2F97CA7E2ECAEC2F86886F131FFA24F605FFA80ADEFC3B902B0E2B7151DBA47F97D73E5578D187EBADB4CE264C713733E734E04F856E7AA0EFD4E9EB9CF3F444FFA7A2E3BAEAFC2DD1A66A561B40694979CB01BD66A62972327B58D072B6541DE1F962724C153F2930CC94EE40293C091EEA8835AA7507E29343DE8D3DEE142D25E82440B0FDA336DF5422EB80DCD6DE5C7BA3E980\");\n            yield return (Hash: \"D5D56A25\", Seed: 1997473818, Hex: \"BC0290C957E7D4AAA6886E9B0E65C855C1A5D67B05681B9960747915A3EBC2DAC29A25B442BDF59277544B7861E89DFC5378E8A2C47E9F24777CF9116B23CE46C957BEE2D5B181200F53CE1A616647ED28EDBBD6B4B18AB1F04ED993836D756949CD3B5DF26B1DBB34B9647389A2A24D61E491556A1D02AD4959F71F0BB6D6D7AFBF8C65941022CB25A8593C548F7012FAB3AD0E188FE4D56028D390F07B0A21C27B03E9E205CB4C4E1919B22A7F828A2FC12AE87BF90F290729ADC98E8A0837ACEE94DE3D83E952F07D361CBEB2F5A99B6BB07EE46C0CB1E757D93F22EBC4C0BB9A61D58DD4B3E9BB2067E52D\");\n            yield return (Hash: \"63A3E2FF\", Seed: 688400552, Hex: \"0D4E903F204FA4E179F530B5C5234E7BEAA53122EC820FF5D68CB9C9468BD212043D50DDAD39525C8873C5B838227752032879EE11A194B784\");\n            yield return (Hash: \"D870D72B\", Seed: 32617930, Hex: \"1BC897386E56FB1694B9B06966027CC8A3123395E00709C5AF74180963E81BA14D1D09BCAA9204D0A2EC7DCA4641B07246C152A70A9B3D5BA87785785570197720C1BC6EEDB118E45F1BB20FF435B7B9135283C806F36DE28FE2F86E70956CD859B6404134F56D47ACB577648AA63710363FBC33A2437AF2A7777E75195674167977982764D2EAB8BA8041B6527F1A303219D802E47BCC2862D2F659BA47F8ACB242EA619BBBB08FED0B43DB223C87E1B45544EB65ECF161EAC1EFCBEFF18CAE81553BFFFE81D930F62426620433F9F69CEB2D46D9795EB05907E5CC82E35140DC2197E6DBDCDC8D57F13E18578870B74A8F2E8A5CC9318D9C5FDCA531453D1D00F20089E5B506A4347C4D1B92EB64ED01163BE4318376CEE5A596B577BED3C8E5D9CC30CD35F322ABDA21AC537C22FC\");\n            yield return (Hash: \"7C56E79E\", Seed: 1947383842, Hex: \"897A87B55E042359C15CFC6471CB7F9CDF818DC4C24D4FDEFF6919ECFED62B484AA996E33932C9CD515CE65A18D19C5777DA8D3A09372BF53B86B23FDADA6C7903869FD72866172E336A1CC1174345A067D2ACB0D374AE8B64E759CAF47D86B225D48B071B7DAD1A4F7C4D06C74A4D13C559F974EAA3D4F74DEEAA15B88860B2A90EE31313FD2D57FC2A98802CDBBBA4F3\");\n            yield return (Hash: \"A80E1928\", Seed: 1821412684, Hex: \"B09F09348CDAE0B5B40AA991A19734559AD88A5A2353C0F478B7C13D37F68C710E2F78455AD0816E6EF88D14054406F92D45DB9320D32B46F8B2C0927DDFE6268851BF4B8CE74643BBA64246F6AF96B8CB8BE53176486BC60344B0D775A4AE68F7D4222709665B79B69A973061B9843F5ED1329D431B124F77504483CF68FD809D80C1485D9A85D65DAE4E37C94A32B0F5641579A52719F464225FDE1E73309DA438DE32A9D5A163B6456C04D00BC3E76CBFF1E03E382A6C377844092B2B3FE9160584E1034C332183EF70057FBD1DC9F25125259A0A1B3E6C9E87B45E72F2C3033C6F9FB04A1F7CBF1F46A34F8C78B93D1A1711F924ADA306BA1B691A9CB3AED8A84220BE6BF8AA0E88E19F1A6E56E07113AA14FFA13489C2AE0CF7E5EDB256DC8F91B774832398731FFC21CBA3D2B70841D7E499ACBDE0FEEA81C2F253ABAAA942D0A2B75EC03AA9331C3CF7E4\");\n            yield return (Hash: \"E5FC50D0\", Seed: 283028967, Hex: \"926C7F04CB52790196492E3B8D53597410E90C18F73C04B3D342820B0D8AC455F97EA43279AA22CC9391594B2B363EE7236E56588C33E2707A5E56716C6262B3BBAFC95D58D457E9B727804DCA23E721811CD30BD16763548A5A078E52D4686EBFD306E86065763DDE1EFC44E6B8F5BB571A1E606D971E2C86C2E44978422A62AAAE4D8AD9A06B433795AF2D905C34C29F54A0839D67666873D3221E89F62175F0AE9E6B4FA0A29AB6801A172114F59207E64B90467A424F\");\n            yield return (Hash: \"E5293797\", Seed: 1658208092, Hex: \"FA4D6E9FBBC1A59831CBBEFAB85B3EE48628A1E9627EF59CD083758C15C37E48BF856BEC4D0EF656138ECD788C488AA100DE625A40065A2DE5ACD45AF5CFDEB1A65F20FF51B264909EBEABC29C778A85AB342765FC22D9C864516F9EAF8C0A9A58A5F718ECBD779E653BDAB7D7F27473786592314DD149D98D255D619A9B5DC4D903FB7BE09D4DEAD653100950BDBEB4AD6E36DA5D075713391888155C8AB70214CFB155EEA2BE4E907D06C465EFC1D02AB35051A1A2\");\n            yield return (Hash: \"ADB80986\", Seed: 151473691, Hex: \"E86C4A7BD069A83F4E4A3823DE67972E84D802114482069354BC8651E5BC099D9871BABF29\");\n            yield return (Hash: \"925450F0\", Seed: 1968520370, Hex: \"C5E8A1E4932EC948018F33F395BBAAFA3470F2BF2709A3E66470A75E8D9A77E3F7DA781D6493BE766CA072C202C94C54BFB59357327D3BFC5C10F5F4A7DBC567A311A9BE6BB9B3840D10A1E58056D790486CDC39D8EEFEC27F52E4399FAA3EB1C2359B24913D94AFBD7A777C690C6784C7E50CB0B7AAD7A69480B5B90AB9B0115FE1C43AEA454F51E8437010DA55DCC2AEB1173D375BC7292BB766445703526748CC410F07C881F415F99F45C7A645EF2C8978B00E3012C68A4B\");\n            yield return (Hash: \"70A0E0F2\", Seed: 1354163587, Hex: \"2EFFB8CCAE6C53073E6B786B00406A1D66CCEFEEF65DF10571BB4FCC4E291EDFB06332669DF8D22F2A91DBCB565A75493D28188953517B3BEF2EEEAE759B3631250A8DAAF355CB8157D1FCEE4AC13753BEB3E9A012C52FEF2AA9A8C6050692F840D704CD0BAAEF4F182C9F00\");\n            yield return (Hash: \"2DD43C8D\", Seed: 932212120, Hex: \"558581FD7613F793B5647064D7E98E2B57AAD87564CD0AB17749CEC6253ACC64FCB57BEA89FEDB84C173D766214B994F74DAE24B9D75299D5C1843B638721D61F267F48355FE72D2061F7C807D8203C18D43B20DBCD3DD02D09B05F7D6AA8FFD71FE871B63CA3DB98F2A9670AE7EFD96091C6DF652A1874DD7517CFA5E7C7754F7140598A31C0B9B920001D8A4B04FF8B5EB1836AA67FE87A33E61E311692788BA56FF833E70EAA238B4231AC886BA\");\n            yield return (Hash: \"25ABBB60\", Seed: 73970258, Hex: \"150DE8F81925C40C6677C68827CFB8B72FE8BA22A47AAC8053DA16909E936BB20DB79BEFD7EB172BE1E259F7941802ABED7E7D4F2CF114A1A2A5E33429258E33DF8982A3D88953831E4E21FB21F95EC12FACBAFA0BD177812671579E65C63F3250069C2D3F8D245D892CB110C493514345A09E686AE856611E54608B4B56E6C5A9C1D15DDB438ADB1C678F061CAD982168FDC50D3EFF10C487608A454B48552B78B4E944D28744D49905802EEFCD2A7FA87BE3EEEF56B43DD310F1EF85B5AF8E6E5763F096AE6B0957FB34DBA1DF9B1BDAE9666F7981B250B3B8D826000F6B7FFB564392554B2559BB6A2B3DBD878054614C355D99CBB9E9DA8A43DEB08CBDE3330B53A38E4CFF4A88DA8B8530E8B0C25EF9D1BEFFE1B9E65A8050CE5B18671A896D3E9FD75F818FC98765DBC90C3D4E0C14D097EFC38810995776DA7EC5A1288AFBD2F474E079DB36BA98DEBC24FF9CE6ABC79D46BAE2E98EC0B80A3BFC11D0742D4651545CDD1C73ACE763EEC8FEF15BACE78B2F77BBDECB27537388DFA63C3E9E08D0FC26F375C5A7529BBB41FB57666144315B88EAE5D7A2752CBB1AC4CD5A7FE01A73AD1803DAE43CE0C46FADE16D6355E46C205A39AA69C39EF73C1A900956CF7F508203A0C686EA8FB0DD2BBE7C76521582D19C9181BCA48ABCCEBE121C3C\");\n            yield return (Hash: \"2EF59F26\", Seed: 1360755479, Hex: \"AAEBAD944AFB98245C69AD9048B7557C28F54DBE16BA2DFD3F105643975C59ABB119812703DD24561F32331058BDF9AFA72DBC3A52FA999D6B4FF76DFF4FDAA841925803F6E09DE01D6D816F6D83CDF35853B039C87A52739244E79ACD4CD061C666661B2E3491ADBEE37D4CB26342F74D700F189C62\");\n            yield return (Hash: \"9F41E669\", Seed: 1496991496, Hex: \"E105B257841EB3D0C115CEAEDD8CC6625E1E1B9853F74B5BFE7B5D853B08F1B2273028F2BEA6ACC2835749F5E306FF0DB6B2DEEF2D64CBA680500489A9FD63B26AE4\");\n            yield return (Hash: \"85D9CD6F\", Seed: 1181809664, Hex: \"D1EE302FAB76698C0F463E899FEB611D3CFFE45A5A9B065F12FC0F0729EAE546AD524E4198F6E0AB0EC9E37D822637EF930488A69BAE5BC08E6018499FDD5AD0A14F273C8F9E25CE8249FBB048C788F1AC59538D3D8E37B686BADF013344400971C19512440BCA2A50F6DD78868478399D821412FD93F58EF7A6A7E63CE2B70717490422EE269CECFF610CA9690D5B434C459C69943E238B73E4053DB64807114D66AB3F5DAF804F8AAF75ADD23EDA4081C3D847EC91F73FB0F746620DD89D48902A2C458C1E30B76B4281B15F2F0C816B0D7C0B5FB889F4E88EE5C34167CDC4805EAF31085F8BACD63D21DCE68544AF801997F7E8A41CAA86E91443EB4BF019DB119DD0A9F7E3140DE163DA9E8ACEBBE9433ED14212F65FCD7BC72C31B76ACE559B0588ABE93E294B4154C9C52DA1706B0559D73DA159C57C7DAC60E6172E5063BC42A8EA32705CDC95D57DAA4FB3C64F9F6CD07B6A5C236D91CAD7BBFE2727A9B01192674B58ACEF81C3C5E0F3F600E6F5C1E85064D2EC60E454DC2FA2\");\n            yield return (Hash: \"B1CE51A8\", Seed: 798402160, Hex: \"B4215E44B0BA0F3A3D05D226B1BD9A5B10F93A11D77460CD2CA62CBB8F06CF0011008A8F4E076E09AE0341F455FF872F1B9FF9F81BC73536AE69B437EF6E97CBFC52E2B33BC6C23E50EB45CA5E884186E6AAD5933DC546D077B0B0FE859AA8DE7C7DF89FED6BCA3A810248F5DD3FC423606683A30CB9CD82A1DE3239211AE975EA10FA8D9CAB8AFE5EFE45ACDE3AC527F54E9F1F089EACAA67B03BE7B78B2C712A77FB669AEFACCB8E0CF2289239691D14DD79D302BC2B4C31B415F5BE93B23296EF2A46354DFF1386BBFF8A5CEC430AA91765ECCDF38F525B53346EF693514FC05804181058EA731930DB7B60284089931E7FC6E56C0DF8A3C61CA581AFB94C985416877144455F7F374EB5D80235824555C491DE52E9B6B9D91856DC79AE36215FB4E4E8F99DAF54A14C7C0D091B406579F203E6FAA515DEDF11DC0B5EF802C9E0300D29DBF8405B690148BEF2784B4F9CB6D0AB\");\n            yield return (Hash: \"E5BD6AA6\", Seed: 1500831520, Hex: \"C45B59595490940E41A798F5774C236CCC248EE4837A042109BFFBF7732556C9C0E595265469164B9D0B84C5A7F341756B040930AEA78F902958635180DC6966906671584C6944D635F3BDFCCBFF22CBFDEFA2D25DB16B20DA2E6CB4A17C37699366A1611873E86826CE17138ED8BD6C7FBB6011540586A47C31B73D63DF3BB774B6BB9E5A14392DA195877B88E304B2A455D2ED2DB30988A991E60F148B1C5B9FDF004B23968AB1FD19D699EF4EBCEA045A117B5391DB01B914E0074F766B2746AFA4CD0AAB6EBAB6CB352259A9EC2DEEF1ECA7ADAAECB5BE6BC121D28DE942B8E9413D7B9C8184BAF1A53084F3FD7BB60E61D45E70FFA12D49814171024EDD6DF407123EC93BC2812D793432A4514ADAB2604D503EDE2354F84BC0D1AEA2BFFC342EA74891E22EFF746C44A3AFF93DBBB626C3DFE9CDDE09077A35A9B8CE9BBE73779EA52FAED0AC2BA67F5B94AD442A1D3F02D65B1767539481F47424D137976E743425B0039CCECEFD591E840B1D81E20F4A897BB6B82A65C797965D9E826B177D60AF1B1AB3CADF5C17D08168A74AB50B6EFA70CC62828A151AD949A19AA1E77837B0AD7E6776EE\");\n            yield return (Hash: \"63F46031\", Seed: 1197644485, Hex: \"75B4EC72660ED95500CF4A01B0BC2B1A73FEA32190140317B6AF1922340201CFB39FA10FC0EA274EF0D03B3F846FC1A0AD1F5D123C573631678FABD591E86CF537EA5722F6F8DA5C7D5B1AD36731D8A0E39F125CE5CC25E327A4477CC891B9C3510C29075ECA3BA7EC524489FED71FDB40B687C5CA03CA393F1544BF6EDF66DF5B066C7F466DE845CD68ED5862E16D45EAE128A40D46715DDB02F35AD5C16A2AC17D9B98644EC2F7C27AD92F5D7D04F1FF95770347547C62C89564383B46D9BE4ACC4EE1DC3C8454DF47021DCC39764D7355424AFC835F4980EDB25B92716F1FAA385C0FD2698B9919A80D5D315DB8C1DD601740DA98F91928B0F512EA9F66C7517EF1B7CC24880D9890345FC4E6C2334E\");\n            yield return (Hash: \"327A5D60\", Seed: 1080919065, Hex: \"53798142C8CC651C86AFCA9BC751\");\n            yield return (Hash: \"6BFEA156\", Seed: 886511778, Hex: \"9CAAFF841356D5D867B1DCCB21221E003AE567BB574514290DB03FE779DE022852738AF0EC0949258FAAF5D0925EFF67C9398FBA349D89909CA98EEEEDCF769A0FD8B8B4AB36163F5949BE1D7E784D360F53AF3F96424A42E6E475F046416E22951B29DF04C5F876CC1318AD70C657BB3E64A67E5FD4B9D7A83A0818BAC699EB5E2039B005B017ED43052CCF10011193CD66DFE0DDB7AD6236\");\n            yield return (Hash: \"D2AB3F17\", Seed: 360836487, Hex: \"D2E6209229D4F97315D2835A5134663C20F7ADE1A22C134B63B96752F4649D89DF7D9A2AD56CE29F6811A95C74F3B66A18A38C62007707E921822C128AA5DC6BBCDC635FBB6BA370B6873EAA4F174EC2F2CEFC8935EB5CF58FC2A3563BC3D80AD13F353BA510F74B34A6C7187BA5644154C3396CD796A09B730E7A3805355BB7474C243342417479B24A74F4F0B4F5B775670B95E0585EDBEEB955057A152396B988816F92264BC269E7F0F52633789EB9F506B2728F816D2CA1D3140A075F3282EBFC15E0D5AD68470631494E9148B84B3BDF65275B37ECBB56ED134DCA89986474FE7DF2502CC959ADA1C230A0B1099EB6D3B7808923CCEC89BFAB8DCC36EBC2820897DB6F5E5757EAFEC8F545360B446DA4B26E4E6AAC6E14A5960DEB9C45B7C294A30C3645DCAA61D6743F93627D7D13D940F81FE0522385A3602DD528F5ED0016C066A5950CCF8FD86649B3128AB0D2\");\n            yield return (Hash: \"A8F98BF7\", Seed: 1179355484, Hex: \"DF76A97E1ABA6D5154F5B462D353C079175114CBAE0A9793D2528B22A8A860F5D6CEA2D141FF6F1C7B8402BB6E2ABA23C159D967099180DB9160BEE81FF4918347B167EA69E66B6A18185AA73E75D77C956CD2B9A78B14D29CC50F7AB77927319FC07360D4070D3BD0F7B1BE017AC99C5FB66722451B4E206F36398F84FB6E57E17290B63591B860D8E9350FF8072E8C062D2960DFB504DEF85E64A38ECF8527D9ECA8BDCB0B33DEDBDF2B1D218C8019974BFAA6B12384E4B6021508CE07DAD1A45804831AAF9B66DF798EE1905BD26370FE3322F4039C9CDA5CA929D46D5FD26DAFFF765D2F5D09537F95B42D598616787C9A2F3F5BC39F138F3C1A7992A071825FDC7EBB9082C70C6841A61A7CA38C30451B\");\n            yield return (Hash: \"AE18DA2C\", Seed: 234268553, Hex: \"B00AA548A4448D0D1DB2EF8AB558DF49B99FD8A0C9A51C598C3A9CE06A4CDFE470163B108E6A14\");\n            yield return (Hash: \"98E7A60D\", Seed: 1545982443, Hex: \"5CC053544D892B23B013E0974D88368B7BA5B98389F2DA77A331592A95B77434FCB811204B5CE02C4C7A7FCBE622B49DC472D7F7F716049538037F052E34449AB616B8C4F7F9F0298FD3AB28628E10AA9293BA65E212705118DE591AC39E1ABAF7FF39EB6640A9B05346D2599A2EAFC21670D42600B91881E42C57FB1488DAB8BADB0C801A3E9F98DB1B688AD2AFF71E11BAC63FAD659E467E432153DF410A3BC9A403094954C7221585C5F012F0AD1587084197B0675C662FF836B47C6F3C44BDFA1242B016DE746F02968DECD952EB50FAABD690BB0FC3D323AB29BFAC4B1BF87153739D81781C898AF31459F14725300DBE53A5B9A4EA98A7B5058489B1354728EA7F1B35301FC6E7BA5512F88AC6721080329E4E8E6B843E5188393ADB9D2308B087783E06874E5F76AF07A892EB809B6B22C29E00C7F18E8FC800B3F2ADE33F11742366468045221A8C35EEF84682743D201FBF509A4268A4C8EF9F4F019270E5046734A6018728CDFE82717903CC73867F0A7600C94E5FA0120FA3E14769D19536EF515C9CCA7F29B0683953210F66C2DF7BD5BEB1C9CAE94AF628A181\");\n            yield return (Hash: \"FB9E6C40\", Seed: 886675031, Hex: \"D767AD8DE0C110CBFA0E063D06DF38595D81025CAEED5D773484810C41B11F2006D3CD8077008FD3CE69CCBBCE483FE5521733011285DC471641053D319DA66388066C6A9C50B09A5C6502108E3B412D1FC937FE82F8C987C4EA2D\");\n            yield return (Hash: \"31E8248A\", Seed: 878547745, Hex: \"DF5C9EE1D2783B56122ED59D094187D8B45021DBE8DAEE0D54248A97B5A251BA55E50B7657C66BCEFDADC10917F0F13487138FAF3D7015E1B75748C4960687D41E9B14F9E09BED13EF0836A51DCBBFA1859A9844AB5FA5639EACC9C6C9ED0C1396F555E818990C3F077A3D19C149F957B0201917D0F398179DB2ED3AE64F5536743BA8B25D5546C37A0C6CFEF86219788205649DABD3C97A20FA1F1D180FFB180970E61E9ECA280FE89D3DBD7330509CC4C12FE998410DEC501B62BE3E05CFF3834B8011A0D1C9D907DA2470135BFBE35CBCFBE11B15AF4C8B10DBAEB0CF3AA7B1C0E83B28B77B560639A80360D46229B21148445026EA503FCD315A589F551C7950E9EF855C84A221A81E94EACFCC342B4DE249686DF9486E8C27D832FE3792C4E661A7F027D9CFBABB21FA56587E6C3B92F400B9CAC50EA4B4CA4C10B9DEF504833E71F64927092FB50FFA0DE29F9783709DF671B05BE83064E92714742B3EFF25B439CD4379C43AB399421053B5C02D38F6720B3E606B04644099E89CF958A99EDCF2B011F853E27CBBE2CA991B00682F3EDB6CD8485E8EB2FF3FEFC2AFEE051E4120A111055E19579493DD81D0C18196A46B221220852DDD40297F3EA123D8F79A613553947A15003F54756FF6EC5F3A1883C0CA9D41335A73B5A8DDD4D59E330E6C25\");\n            yield return (Hash: \"81172AAE\", Seed: 1073801165, Hex: \"A236CE9B844ED217BDA00767828F35517155DF5E67C459906D96BA1C3886BC15423DD72F9B0C391F4A79C68C697D145CA172FDEC72E99A22D5C8AD8B8CABBBDBDD3C1AAA7708EFDCEBD30DA0063026749BC910E46803671DE931704FCE4C4F0A7237ACE4A28C03B1CEFEE1031CDEB09E349B6E73E31F4FF5E21FEA275FD212D25BF45D6AB986EB11EBEA4F174CB1F9A51225CD27F2E5AF9283368C66773E7C31BA74246F526394B0D2DB20A16F79201F53AE05B89CC71E6F1A3CB9\");\n            yield return (Hash: \"06BFF63C\", Seed: 2124737180, Hex: \"642901807F73DB249024C104DF41D700E27A01BE527B9E5F9A7DFAB8698ACCC66F3ADDE5101817B891FF8FDEA66810FD4CFB0903AE0130D21CE7E110EB06F2922ECB9E66209A40358B918A3743AFB50D49757E703974D3B149537D9A8B31ACDBED2EB6B136EE11C8FA61B614966CF4A73811B0029CCB6FFCA1C4D98EC3C600036C774B14105FD6E53671EAEB7A2429FC3971D3BF08D392B7FBEF752440CB188B4F48C1F099488449ADC76EE4BEA7A3D09738266919259B662F8BB85DB8827571784B88A0A0126859097168821C770061D884535576588B01F3E8A62E4256DF617D2B98F6CAD74C6B83A3A529BA81C4C46E5064F3EE187917D0E6B418E77968F1920181D41B34E39BC650B860DAD38DA3501A9EAE420A8082EFC17EA0E2E59399B90438E63CC10BC116742437BDF04D6759D587CE48B75E95138A769AB2076C3EBE99BF2DEBB9585BA27DFC9A25536A3E4D2E307908ADCF659F93CD5C067310363B92DFB9C5333BE6A81BDC6FA8764479AD865513F6B0EA8387\");\n            yield return (Hash: \"AB6A52FF\", Seed: 124698114, Hex: \"F46856C173F1A208DBACFD4B218F7977CEC3DF7BA0F00B5F51507A41DC6C8064B44B0A1945AEBF02CC4E69E1DEF8C5DA2416F18AB118EE\");\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilterTest/HashAlgorithms/TestPayloadParameter.cs",
    "content": "using System;\n\nnamespace BloomFilterTest.HashAlgorithms\n{\n    public class TestPayloadParameter<TExpected>\n    {\n        public byte[] TestPayload { get; set; }\n        public Range TestRange { get; set; }\n        public TExpected ExpectedValue { get; set; }\n        public string TestScenario { get; set; }\n\n        public TestPayloadParameter(byte[] payload, Range range, TExpected expected)\n        {\n            TestPayload = payload;\n            TestRange = range;\n            ExpectedValue = expected;\n            TestScenario = \"\";\n        }\n\n        public TestPayloadParameter(byte[] payload, TExpected expected)\n        {\n            TestPayload = payload;\n            TestRange = Range.All;\n            ExpectedValue = expected;\n            TestScenario = \"\";\n        }\n    }\n}"
  },
  {
    "path": "test/BloomFilterTest/HashAlgorithms/XxHashTest.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing BloomFilter.HashAlgorithms.Internal;\nusing FluentAssertions;\nusing Xunit;\n\nnamespace BloomFilterTest.HashAlgorithms\n{\n    public class XxHashTest\n    {\n        [Theory]\n        [MemberData(nameof(XxHash32TestData))]\n        public void XxHash32_ToUInt32<ExpectedChecksum>(TestPayloadParameter<ExpectedChecksum> parameter)\n        {\n            var range = parameter.TestRange;\n\n            uint actual;\n\n            if (range.Equals(Range.All))\n            {\n                actual = XxHash32.HashToUInt32(parameter.TestPayload);\n            }\n            else\n            {\n                actual = XxHash32.HashToUInt32(parameter.TestPayload[range]);\n            }\n\n            var expected = (string)(object)parameter.ExpectedValue;\n\n            $\"0x{actual:X4}\".Should().Be($\"0x{expected}\");\n        }\n\n        [Theory]\n        [MemberData(nameof(XxHash32TestData))]\n        public void XxHash32_Append<ExpectedChecksum>(TestPayloadParameter<ExpectedChecksum> parameter)\n        {\n            var range = parameter.TestRange;\n\n            XxHash32 hash = new();\n\n            Span<byte> data = parameter.TestPayload;\n\n            if (!range.Equals(Range.All))\n            {\n                data = parameter.TestPayload[range];\n            }\n\n            while (data.Length > 0)\n            {\n                var n = Random.Shared.Next(1, data.Length);\n                var d = data.Slice(0, n);\n                hash.Append(d);\n                data = data.Slice(n);\n            }\n\n            uint actual = hash.GetCurrentHashAsUInt32();\n\n            var expected = (string)(object)parameter.ExpectedValue;\n\n            $\"0x{actual:X4}\".Should().Be($\"0x{expected}\");\n        }\n\n        [Theory]\n        [MemberData(nameof(XxHash64TestData))]\n        public void XxHash64_ToUInt64<ExpectedChecksum>(TestPayloadParameter<ExpectedChecksum> parameter)\n        {\n            var range = parameter.TestRange;\n\n            ulong actual;\n\n            if (range.Equals(Range.All))\n            {\n                actual = XxHash64.HashToUInt64(parameter.TestPayload);\n            }\n            else\n            {\n                actual = XxHash64.HashToUInt64(parameter.TestPayload[range]);\n            }\n\n            var expected = (string)(object)parameter.ExpectedValue;\n\n            $\"0x{actual:X4}\".Should().Be($\"0x{expected}\");\n        }\n\n        [Theory]\n        [MemberData(nameof(XxHash64TestData))]\n        public void XxHash64_Append<ExpectedChecksum>(TestPayloadParameter<ExpectedChecksum> parameter)\n        {\n            var range = parameter.TestRange;\n\n            XxHash64 hash = new();\n\n            Span<byte> data = parameter.TestPayload;\n\n            if (!range.Equals(Range.All))\n            {\n                data = parameter.TestPayload[range];\n            }\n\n            while (data.Length > 0)\n            {\n                var n = Random.Shared.Next(1, data.Length);\n                var d = data.Slice(0, n);\n                hash.Append(d);\n                data = data.Slice(n);\n            }\n\n            ulong actual = hash.GetCurrentHashAsUInt64();\n\n            var expected = (string)(object)parameter.ExpectedValue;\n\n            $\"0x{actual:X4}\".Should().Be($\"0x{expected}\");\n        }\n\n        [Fact]\n        public void XxHash3_ToUInt64()\n        {\n            var tests = XxHash3TestData();\n\n            foreach (var test in tests)\n            {\n                var data = test.Ascii.ToUtf8Bytes();\n                var actual = XxHash3.HashToUInt64(data, test.Seed);\n\n                Assert.Equal(test.Hash, actual);\n            }\n        }\n\n        [Fact]\n        public void XxHash3_Append()\n        {\n            var tests = XxHash3TestData();\n\n            foreach (var test in tests)\n            {\n                Span<byte> data = test.Ascii.ToUtf8Bytes();\n\n                XxHash3 hash = new(test.Seed);\n\n                while (data.Length > 0)\n                {\n                    var n = Random.Shared.Next(1, data.Length);\n                    var d = data.Slice(0, n);\n                    hash.Append(d);\n                    data = data.Slice(n);\n                }\n\n                Assert.Equal(test.Hash, hash.GetCurrentHashAsUInt64());\n            }\n        }\n\n        [Fact]\n        public void XxHash128_ToUInt64()\n        {\n            var tests = XxHash128TestData();\n\n            foreach (var test in tests)\n            {\n                var data = test.Ascii.ToUtf8Bytes();\n                var actual = XxHash128.HashToHash128(data, test.Seed);\n\n                Assert.Equal(new XxHash128.Hash128(test.HashLow, test.HashHigh), actual);\n            }\n        }\n\n        [Fact]\n        public void XxHash128_Append()\n        {\n            var tests = XxHash128TestData();\n\n            foreach (var test in tests)\n            {\n                Span<byte> data = test.Ascii.ToUtf8Bytes();\n\n                XxHash128 hash = new(test.Seed);\n\n                while (data.Length > 0)\n                {\n                    var n = Random.Shared.Next(1, data.Length);\n                    var d = data.Slice(0, n);\n                    hash.Append(d);\n                    data = data.Slice(n);\n                }\n\n                Assert.Equal(new XxHash128.Hash128(test.HashLow, test.HashHigh), hash.GetCurrentHashAsHash128());\n            }\n        }\n\n        public static IEnumerable<object[]> XxHash32TestData()\n        {\n            yield return new object[] { new TestPayloadParameter<string>(\"abc\"u8.ToArray(), \"32D153FF\") };\n            yield return new object[] { new TestPayloadParameter<string>(\"313233343536\".FromHex(), \"B7014066\") };\n            yield return new object[] { new TestPayloadParameter<string>(\"3132333435363738393031323334353637383930\".FromHex(), \"2D0C3D1B\") };\n            yield return new object[] { new TestPayloadParameter<string>(\"313233343536373839303132333435363738393031\".FromHex(), \"8ED1B04E\") };\n        }\n\n        public static IEnumerable<object[]> XxHash64TestData()\n        {\n            yield return new object[] { new TestPayloadParameter<string>(\"abc\"u8.ToArray(), \"44BC2CF5AD770999\") };\n            yield return new object[] { new TestPayloadParameter<string>(\"313233343536\".FromHex(), \"2B2DC38AAA53C322\") };\n            yield return new object[] { new TestPayloadParameter<string>(\"31323334353637383930313233343536373839303132333435363738393031323334353637383930\".FromHex(), \"5F3AF5E23EEB431D\") };\n            yield return new object[] { new TestPayloadParameter<string>(\"3132333435363738393031323334353637383930313233343536373839303132333435363738393031\".FromHex(), \"45A03ED59AB5CAD6\") };\n        }\n\n        #region XxHash3TestData\n\n        private static IEnumerable<(ulong Hash, ulong Seed, string Ascii)> XxHash3TestData()\n        {\n            yield return (Hash: 0x2d06800538d394c2UL, Seed: 0x0000000000000000L, Ascii: \"\");\n            yield return (Hash: 0x0f99783e68de7322UL, Seed: 0x00000000000013f0L, Ascii: \"\");\n            yield return (Hash: 0x75ab6ee9a6901973UL, Seed: 0x00000000000008baL, Ascii: \"\");\n            yield return (Hash: 0xa278b85b25fb1092UL, Seed: 0x0000000000001bc1L, Ascii: \"\");\n            yield return (Hash: 0x2753d05a8f320003UL, Seed: 0x0000000000000000L, Ascii: \"Z\");\n            yield return (Hash: 0x826ed41a6e3413f3UL, Seed: 0x5a7a3a6dd84a445fL, Ascii: \"f\");\n            yield return (Hash: 0xb92fbf351dd100eeUL, Seed: 0x0000000000001c09L, Ascii: \"C\");\n            yield return (Hash: 0xec9a584c5994b0fbUL, Seed: 0x761747debc4bf2fdL, Ascii: \"e\");\n            yield return (Hash: 0x123a6f50f1ca0359UL, Seed: 0x0000000000001cf4L, Ascii: \"V4\");\n            yield return (Hash: 0x30a9330b3de18584UL, Seed: 0x27f065e4850461f5L, Ascii: \"HA\");\n            yield return (Hash: 0xccdf6c02b23ec3fcUL, Seed: 0x00000000000017e0L, Ascii: \"KP\");\n            yield return (Hash: 0xe90908587fefc64dUL, Seed: 0x000000000000200bL, Ascii: \"5O\");\n            yield return (Hash: 0x0c3efabfc49a356eUL, Seed: 0x0000000000000840L, Ascii: \"H4p\");\n            yield return (Hash: 0x5ab2c95dccb3f945UL, Seed: 0x00000000000009d0L, Ascii: \"9Vj\");\n            yield return (Hash: 0x9a892645f137e437UL, Seed: 0x000000000000198cL, Ascii: \"ajB\");\n            yield return (Hash: 0xf917a1f0983dac91UL, Seed: 0x6f3502011f621a64L, Ascii: \"kLi\");\n            yield return (Hash: 0x17ac41dfec94111fUL, Seed: 0x0000000000000499L, Ascii: \"KdjE\");\n            yield return (Hash: 0x4d5538d13e22c840UL, Seed: 0x0000000000000000L, Ascii: \"fCiJ\");\n            yield return (Hash: 0x9dcf0899dd62c721UL, Seed: 0x0000000000000f04L, Ascii: \"HZOD\");\n            yield return (Hash: 0xc9ad4f8ad28e7a34UL, Seed: 0x0000000000000353L, Ascii: \"d9v6\");\n            yield return (Hash: 0x0d934c8220ddb29cUL, Seed: 0x0000000000000000L, Ascii: \"Zx63J\");\n            yield return (Hash: 0x26783423f8cddda3UL, Seed: 0x00000000000019fcL, Ascii: \"mosH8\");\n            yield return (Hash: 0x590582dbd7951c71UL, Seed: 0x0000000000000faaL, Ascii: \"QDajZ\");\n            yield return (Hash: 0xcec252314949cad9UL, Seed: 0x00000000000008baL, Ascii: \"DNHWf\");\n            yield return (Hash: 0x08aa5f0f720ae20eUL, Seed: 0x0000000000001062L, Ascii: \"yyaFtP\");\n            yield return (Hash: 0x6fb29121762e6cafUL, Seed: 0x0000000000001d89L, Ascii: \"kXzedT\");\n            yield return (Hash: 0x96512f40427e1ac0UL, Seed: 0x4ef78ad67d7e2c8fL, Ascii: \"E27wiW\");\n            yield return (Hash: 0xce7488a13f8d420eUL, Seed: 0x0000000000000007L, Ascii: \"M2sgd4\");\n            yield return (Hash: 0x06d440b83bb784dcUL, Seed: 0x3d065f4429458c97L, Ascii: \"ZTCkePQ\");\n            yield return (Hash: 0x4800a99607b5dd43UL, Seed: 0x0000000000000064L, Ascii: \"klpn67g\");\n            yield return (Hash: 0x8af732c34a639748UL, Seed: 0x000000000000158cL, Ascii: \"lPOSwvf\");\n            yield return (Hash: 0xea66f11e39e4f703UL, Seed: 0x0000000000000000L, Ascii: \"SbmPVuZ\");\n            yield return (Hash: 0x20497948da5b72d9UL, Seed: 0x00000000000025daL, Ascii: \"TLRDvLvS\");\n            yield return (Hash: 0x4ec57c9f55c9ace9UL, Seed: 0x0000000000001a31L, Ascii: \"5kKXT8hE\");\n            yield return (Hash: 0x62157038eaeb8c3eUL, Seed: 0x0000000000002051L, Ascii: \"UHj4U70w\");\n            yield return (Hash: 0xcdbeb38547e4b777UL, Seed: 0x000000000000095fL, Ascii: \"YYiJtbOe\");\n            yield return (Hash: 0x04661f74a752afb2UL, Seed: 0x00000000000006d1L, Ascii: \"EGM4yxHgk\");\n            yield return (Hash: 0x44dd2b3ae480a960UL, Seed: 0x00000000000014b2L, Ascii: \"ixKUUt5pO\");\n            yield return (Hash: 0xb41154e8ba2baabfUL, Seed: 0x00000000000022b1L, Ascii: \"s6aMbUVkK\");\n            yield return (Hash: 0xed6cfa6cf621b996UL, Seed: 0x70cb1cd220fe3a09L, Ascii: \"SsNiqNqBf\");\n            yield return (Hash: 0x0d22de1c27057d50UL, Seed: 0x00000000000011e0L, Ascii: \"Ov4zwcvLx0\");\n            yield return (Hash: 0x4e63d12e391a9a8aUL, Seed: 0x00000000000009e3L, Ascii: \"bM7sIUkRTp\");\n            yield return (Hash: 0xa5054a02a7f16c39UL, Seed: 0x0000000000002313L, Ascii: \"sitCYl1zu2\");\n            yield return (Hash: 0xe54c8a2fccdb7591UL, Seed: 0x0000000000000d3bL, Ascii: \"Ck3S0qy5xH\");\n            yield return (Hash: 0x0a0e6440ed0570ecUL, Seed: 0x0000000000000bbcL, Ascii: \"Y4lXHPbJCix\");\n            yield return (Hash: 0x4e64c242787c849aUL, Seed: 0x00000000000022bcL, Ascii: \"yD0Ex2vQ9zW\");\n            yield return (Hash: 0xaf35b06df6c0deb4UL, Seed: 0x0000000000000000L, Ascii: \"uOnyD2tQQ7v\");\n            yield return (Hash: 0xd4099716d18b65feUL, Seed: 0x5539de8caf41e41aL, Ascii: \"vTU3yFsqOQ6\");\n            yield return (Hash: 0x0dc3040691a8cc19UL, Seed: 0x00000000000013d1L, Ascii: \"Hy3emis1M7eV\");\n            yield return (Hash: 0x61108305768a1ec8UL, Seed: 0x0000000000000647L, Ascii: \"ZuXRMHrPQHtz\");\n            yield return (Hash: 0x9a8ea6134e5461e6UL, Seed: 0x00000000000017ebL, Ascii: \"TsKvY0FLKoQf\");\n            yield return (Hash: 0xd2b05b5c183fa6b8UL, Seed: 0x0000000000002512L, Ascii: \"s9hk0ogUPKf1\");\n            yield return (Hash: 0x03de059a47bfbfdeUL, Seed: 0x00000000000013fbL, Ascii: \"kdFgtjHcConq5\");\n            yield return (Hash: 0x4ccfe5fd6a859e60UL, Seed: 0x0000000000000000L, Ascii: \"PfI6lstr0ZLWG\");\n            yield return (Hash: 0x61ff51beb0b90df3UL, Seed: 0x00000000000023e6L, Ascii: \"0ryRPmjP1mSun\");\n            yield return (Hash: 0x9c8c9676c44a36c0UL, Seed: 0x0000000000000000L, Ascii: \"XEjB6XqOe5ymx\");\n            yield return (Hash: 0x2ff10b4f7a6f229dUL, Seed: 0x000000000000139aL, Ascii: \"64WbTFxlWe3U2k\");\n            yield return (Hash: 0x6476707f23af49b8UL, Seed: 0x268e74fe41033efbL, Ascii: \"He08m7cz6BVUKB\");\n            yield return (Hash: 0xaa6bfbd9cd147f56UL, Seed: 0x0000000000001fb0L, Ascii: \"Ij5MBfLKVkAFYF\");\n            yield return (Hash: 0xe1a273836f10f13eUL, Seed: 0x0000000000000000L, Ascii: \"VSVb2538wGyeRM\");\n            yield return (Hash: 0x1da17de175e75458UL, Seed: 0x0000000000000a27L, Ascii: \"hueNVzaX9p7JdKL\");\n            yield return (Hash: 0x592f09e9c3566debUL, Seed: 0x511ca41ca4193614L, Ascii: \"kpx0STYilb7EM88\");\n            yield return (Hash: 0xa11baa85f15a7499UL, Seed: 0x0000000000001cf5L, Ascii: \"dvmStMmz8Uhj4G0\");\n            yield return (Hash: 0xd5e01daaeb4f38feUL, Seed: 0x0000000000002464L, Ascii: \"8csqW0j3hptGCwO\");\n            yield return (Hash: 0x0429af28bc6f6ffbUL, Seed: 0x27ea2fd22273f024L, Ascii: \"fcuQxJ1a7XHWjOak\");\n            yield return (Hash: 0x2431d2099731aad5UL, Seed: 0x0000000000001d88L, Ascii: \"cTXadjhxzktQVtPW\");\n            yield return (Hash: 0x80679dd3f86ae2cbUL, Seed: 0x00000000000011ddL, Ascii: \"VdnhfZNlPd5zBO9G\");\n            yield return (Hash: 0xd5763efdea456f1bUL, Seed: 0x00000000000001f1L, Ascii: \"sRcoac2Z1XKinWsY\");\n            yield return (Hash: 0x34722478aff47051UL, Seed: 0x00000000000019c9L, Ascii: \"4pgR1N0LgL2QpoaNc\");\n            yield return (Hash: 0x4c0ac7afe9a5226cUL, Seed: 0x1e18b9a7c8f02d7dL, Ascii: \"ZJaCUfU0OXHoLCEfw\");\n            yield return (Hash: 0x9ba45202a6afcac5UL, Seed: 0x00000000000012abL, Ascii: \"uUFLXT60uVkCOXvPj\");\n            yield return (Hash: 0xc2b5a839acdee53dUL, Seed: 0x0000000000000a7aL, Ascii: \"uLLdztp6cDZ1pL9BR\");\n            yield return (Hash: 0x2614fe7c344553d6UL, Seed: 0x0000000000001962L, Ascii: \"LuOyAcRwmGEH8z6k6m\");\n            yield return (Hash: 0x67eebe861528b20eUL, Seed: 0x0000000000000000L, Ascii: \"KDuzVTjAQ4xNGS3WF6\");\n            yield return (Hash: 0x9e5bc927cf383a51UL, Seed: 0x0000000000000ebeL, Ascii: \"A1ihuWZ2uERWycZxPa\");\n            yield return (Hash: 0xe50d6f0e787320deUL, Seed: 0x00000000000009c2L, Ascii: \"3Ux0vVy8UG3pLbfakF\");\n            yield return (Hash: 0x08360533a677c793UL, Seed: 0x0000000000000000L, Ascii: \"kZADmGnOFWl6Phiu8tE\");\n            yield return (Hash: 0x61f6649c1ab518d7UL, Seed: 0x16580c02347e75b6L, Ascii: \"86PTDY6UXtSuJUe22wA\");\n            yield return (Hash: 0xa4560f70262473dcUL, Seed: 0x00000000000007eeL, Ascii: \"PVFVy0kMDJgMo593sxl\");\n            yield return (Hash: 0xe4d1e6d36023f575UL, Seed: 0x0000000000001571L, Ascii: \"aerl20lkguiB4Gf3T9R\");\n            yield return (Hash: 0x057b70e73f6feeebUL, Seed: 0x55babd76a130f515L, Ascii: \"aGfZbBNKvUGfWCu34gub\");\n            yield return (Hash: 0x4c77121359ed6b7aUL, Seed: 0x0000000000000000L, Ascii: \"VMkxhcMDr321w7YjThXV\");\n            yield return (Hash: 0xbae9f139b3529d39UL, Seed: 0x0000000000000ddaL, Ascii: \"DmBC0bnc4kQOA6YCsPpe\");\n            yield return (Hash: 0xde20a5d93eea1fc1UL, Seed: 0x000000000000074dL, Ascii: \"RBwHqQrG3cyoDw0eLlT3\");\n            yield return (Hash: 0x403f37484e27af18UL, Seed: 0x0000000000000d19L, Ascii: \"HpsRBCVOx5SkugteBIbaQ\");\n            yield return (Hash: 0x75d397a0198bc05dUL, Seed: 0x0000000000002214L, Ascii: \"G9YRrhLX02ReHdMSPJhsn\");\n            yield return (Hash: 0xacdcd5b5c59a703eUL, Seed: 0x0000000000000000L, Ascii: \"x35LiatiPGJa74outlVGU\");\n            yield return (Hash: 0xe91b05011de3fa0fUL, Seed: 0x000000000000188eL, Ascii: \"AsHWiTENK1HPZr0XPVA9m\");\n            yield return (Hash: 0x2ba03c29455e3a6aUL, Seed: 0x000000000000245bL, Ascii: \"ocWWrY4XvGhWB3fRZfuOHP\");\n            yield return (Hash: 0x5da13c420b8e89b9UL, Seed: 0x0000000000000000L, Ascii: \"Fjc59qu4SZWLuTuklHLxk1\");\n            yield return (Hash: 0x8f9eefad3576e7faUL, Seed: 0x00000000000018b1L, Ascii: \"oqcVab4jAR21vhNpsbp2AT\");\n            yield return (Hash: 0xba1e0b99acecb848UL, Seed: 0x0000000000000000L, Ascii: \"ymXSTaCeolI6VjlQgh6cMl\");\n            yield return (Hash: 0x099202df4b39be46UL, Seed: 0x000000000000070cL, Ascii: \"ug3aKCkY08yMF2Iz86ig55v\");\n            yield return (Hash: 0x5f87925ff0097ef6UL, Seed: 0x0000000000002535L, Ascii: \"rDC2FcItWoHusdg0fedMIB3\");\n            yield return (Hash: 0x945edb7bc82646d6UL, Seed: 0x0000000000000000L, Ascii: \"9vM6157UG2KPMPYg8bicb1e\");\n            yield return (Hash: 0xdd7b4d4929182d16UL, Seed: 0x00000000000015b3L, Ascii: \"Z8LQMWuVPsXAB6IuP15y25c\");\n            yield return (Hash: 0x127740d090c82baaUL, Seed: 0x000000000000252fL, Ascii: \"C7tG9KNrvX7GP5Fb4AONOkLt\");\n            yield return (Hash: 0x52c8cc12015f61edUL, Seed: 0x0000000000001587L, Ascii: \"YOI0xGx2Ge1jdh6k6KsXCFXI\");\n            yield return (Hash: 0x94635c7dddc8fabaUL, Seed: 0x0000000000000000L, Ascii: \"7iOlOMeM6UmJnavHzgMSUdZ9\");\n            yield return (Hash: 0xd30bf4d0dba16b6aUL, Seed: 0x0000000000000000L, Ascii: \"CbxYsDsDPFbc4H0qmKCvXr3m\");\n            yield return (Hash: 0x0df80cb457801da2UL, Seed: 0x0000000000000000L, Ascii: \"kcvageMDWBf8N6f4QRjW8492m\");\n            yield return (Hash: 0x4c79f80af77b5840UL, Seed: 0x000000000000107bL, Ascii: \"3hatHgqJ43eeWMVabG3ZmGH2E\");\n            yield return (Hash: 0x77ce822cd1c1073fUL, Seed: 0x00000000000014f9L, Ascii: \"GZZO2HsROBhSwPibHjl3C9K9r\");\n            yield return (Hash: 0xd0555d7093b858e1UL, Seed: 0x00000000000003d8L, Ascii: \"sy5RrooAbS2a4spp3UT3g3B8s\");\n            yield return (Hash: 0x02670b0870103b6fUL, Seed: 0x0000000000000cc8L, Ascii: \"GjnKAVokRisPBwjCceOHrVnR9M\");\n            yield return (Hash: 0x5b7593ea439230f9UL, Seed: 0x011a75bcd188cfd0L, Ascii: \"5qzewuqd4RMJJVBTbd7z4vEv5Q\");\n            yield return (Hash: 0x9f6aac7b239f2b8fUL, Seed: 0x0000000000002085L, Ascii: \"cDjSOSHGn8nM839nFvNqPc0oLw\");\n            yield return (Hash: 0xecc9c9db6cad174aUL, Seed: 0x00000000000025e7L, Ascii: \"zZWOvuCOQ7S78PmteXs9orf1sW\");\n            yield return (Hash: 0x672aabfd2f0b4085UL, Seed: 0x0000000000001df7L, Ascii: \"Equb0NmabCbKGaEmh6dE8gjfL1E\");\n            yield return (Hash: 0x7e86e983230b0159UL, Seed: 0x00000000000012b5L, Ascii: \"X7vd0dgpT9eRzMHx3LDgjvEQwE4\");\n            yield return (Hash: 0xa051089a6817d0abUL, Seed: 0x0000000000002370L, Ascii: \"H8QsGBXFPf89x5Q47qSBj4AhT3u\");\n            yield return (Hash: 0xd56abc34b1f205d9UL, Seed: 0x0000000000000000L, Ascii: \"8TRix56rWbRPISXdMbdtjKAeZRZ\");\n            yield return (Hash: 0x3b546053f97b22edUL, Seed: 0x3f54eddf60ada18bL, Ascii: \"icq9LPMDvmULotIweEESeEDVi0HN\");\n            yield return (Hash: 0x6d702a18e1da1a10UL, Seed: 0x0000000000000000L, Ascii: \"i6PCFvzKoWZ2qkeiCTA2r8rywUkZ\");\n            yield return (Hash: 0x99d4d5f72c5eb24bUL, Seed: 0x0000000000000a63L, Ascii: \"b7zmpPTGOXWgpxCGNrLdGrjgpUkp\");\n            yield return (Hash: 0xe2fe210bda3b56adUL, Seed: 0x0000000000000f88L, Ascii: \"7ER0gY3jYRTc7UuQX0jy4ILm0QxP\");\n            yield return (Hash: 0x1548e8ff243cc27cUL, Seed: 0x000000000000064dL, Ascii: \"srmanGgb2muidgoV99SSZDXii7Gf2\");\n            yield return (Hash: 0x2540e9769cb8473aUL, Seed: 0x0000000000000000L, Ascii: \"SkZnT9dHnEaafaU0YQIBnB735xYcl\");\n            yield return (Hash: 0x70d7833e87378050UL, Seed: 0x000000000000162aL, Ascii: \"dl5ZP6cffXfE3l0PAWd51TBvSsG9S\");\n            yield return (Hash: 0xcab5c24ca2ff0806UL, Seed: 0x0000000000000f18L, Ascii: \"CSQBwJqxtVJeMOv5mqzH6g7ZGnPyh\");\n            yield return (Hash: 0x25bf4077891193d9UL, Seed: 0x000000000000222cL, Ascii: \"tTGa8TJUETEztj5zsfDWU2BwGmB6Ky\");\n            yield return (Hash: 0x57a61f0b582ba1e4UL, Seed: 0x00000000000000d1L, Ascii: \"ZakSEMaZxYJnhoj40dgW0Od1dBrpBd\");\n            yield return (Hash: 0xd9d0475602625ac7UL, Seed: 0x0000000000000000L, Ascii: \"b7k1mN7utrKrm0UCDOArIhg6D1xEg9\");\n            yield return (Hash: 0xfbef4b2e4411617cUL, Seed: 0x2ed1256a014f6d46L, Ascii: \"ECJ4VLtsuggTR4wcLJjTm8x6DXFhTB\");\n            yield return (Hash: 0x229c0bf438c8da38UL, Seed: 0x00000000000026e6L, Ascii: \"DiRtMWxnI3qkMdYanz82e6bfpp8VUTw\");\n            yield return (Hash: 0xbfc14691671de964UL, Seed: 0x113a1735f166548bL, Ascii: \"4gIXXrYOrAJpQZtb2lYLqsqzrRBdRh3\");\n            yield return (Hash: 0xe09c1376466cb2c4UL, Seed: 0x0000000000001d1cL, Ascii: \"RuxoiJfBipXTwGRnMLXS9UiaQDLYy35\");\n            yield return (Hash: 0xefafa5858404da47UL, Seed: 0x0000000000000000L, Ascii: \"Z0KHCqxcHGVVuwQUDbQMSqYJcBl9y6U\");\n            yield return (Hash: 0x152be6c70f087d72UL, Seed: 0x0000000000000000L, Ascii: \"Tc8otaCWJhcl5Nz5CDz7vFJX6zsYPl4I\");\n            yield return (Hash: 0x5c9088739d896821UL, Seed: 0x0000000000001162L, Ascii: \"H3tw59bhz1T1nnR3phpWiSkdwEpOuz5s\");\n            yield return (Hash: 0x92583c591336cb07UL, Seed: 0x0000000000000000L, Ascii: \"xB0c6wK9bmxwnzf2jvZNxOYJNM2fGL0r\");\n            yield return (Hash: 0xcb6af9e609dd6d67UL, Seed: 0x0000000000000b0eL, Ascii: \"lDzIPQrmi2UvgSSWTe0sMEXWNQX1t3ZC\");\n            yield return (Hash: 0x28f28fffbaa365bcUL, Seed: 0x23eaccb8f24a289dL, Ascii: \"6Dj7XpVnlDS3iskE2RiCX7f46L3pxayir\");\n            yield return (Hash: 0x3c803ff73386886fUL, Seed: 0x00000000000014a7L, Ascii: \"k2TsCmhgBSoOIYeZduUoVjR377OQE1JfY\");\n            yield return (Hash: 0x5cc468d1bb02773dUL, Seed: 0x00000000000024acL, Ascii: \"aOR7hd3xbGoB0FQGYZ2ufM2ueyyDV0L93\");\n            yield return (Hash: 0x9b1dd59595474167UL, Seed: 0x0000000000000978L, Ascii: \"L9E196PbLYnr7TKQb44d2jPAjLDuE2xMq\");\n            yield return (Hash: 0x250eb2532a17a05cUL, Seed: 0x00000000000015d7L, Ascii: \"X1a9zapq9YvpqtP0LQwkXCacvz8TTJrR5m\");\n            yield return (Hash: 0x63e2bbf8b8b0118bUL, Seed: 0x2ba124b4f3ead0deL, Ascii: \"o5t9IPouVvQ7Anqa8b96M0JKZEQer4Io87\");\n            yield return (Hash: 0x97f403f9055d5aa7UL, Seed: 0x0000000000000000L, Ascii: \"vRTbTeQP2nIh2u5LeK5w4s2Pa1kjw73Vwk\");\n            yield return (Hash: 0xcc696c60fb619b50UL, Seed: 0x0000000000000000L, Ascii: \"30vfO7V1QAAifNBsjia1qbCIP80KqjvqGf\");\n            yield return (Hash: 0x14b5a81e02ec30d2UL, Seed: 0x3ffe7d86a697da93L, Ascii: \"FAIUOWamAotqfoHv4Ie6Iib8Z59ZSO3nmkd\");\n            yield return (Hash: 0x386bdddd2c078a05UL, Seed: 0x00000000000014c6L, Ascii: \"XS8b1YF7ljMz6H6XcUtNA5VTQ2noYWTSHDj\");\n            yield return (Hash: 0x51c613ef1538fd3cUL, Seed: 0x0000000000000000L, Ascii: \"yFgI3MX0SsxIReDPO67ELAEPam8KZB38hK3\");\n            yield return (Hash: 0xde9d7d5dc939e29bUL, Seed: 0x00000000000014b4L, Ascii: \"Zj6tDKmocGIFyyCmDJf2u91Sabx3pLiQ5Bi\");\n            yield return (Hash: 0x2c94e3882d1a04cfUL, Seed: 0x10ec20959d09dd55L, Ascii: \"xOwM20yHXHCf6d6a3KbbQfLGeSLZASkWILAs\");\n            yield return (Hash: 0x54b4df8cfa3d0c83UL, Seed: 0x0000000000000a20L, Ascii: \"TZAxr2MOi7t5U4bY7ViTVRFHW2k6GLa03a0X\");\n            yield return (Hash: 0x954b3ec784afebe6UL, Seed: 0x00000000000019b7L, Ascii: \"04bBCjlbOURXBpQWFXiyqnpijPdMBjSQLY9Y\");\n            yield return (Hash: 0xd096080f7473373fUL, Seed: 0x0000000000000418L, Ascii: \"4OQFyXv26youfQn4z9uBe4dEcqxXuvmA5FZh\");\n            yield return (Hash: 0x06f49b83f5ee68c5UL, Seed: 0x6aaaeac1e226ce06L, Ascii: \"eFdnTZwHdKvPkPQ8Bo5bivEk6mHC4tNjoZ7l3\");\n            yield return (Hash: 0x4b300ae419a18d19UL, Seed: 0x0000000000000bfbL, Ascii: \"WOnlojc8sZner4PjtLzhHkh3Y4OGqromTrsWx\");\n            yield return (Hash: 0xd1ed88c59d79c41dUL, Seed: 0x0000000000000000L, Ascii: \"7W1tr4qALkdKhiOwtFHbNxWh949TA6fRPNAED\");\n            yield return (Hash: 0xe6f3df2739d23499UL, Seed: 0x0000000000000000L, Ascii: \"GjIC9TfpZS187U5qnS0m5BjlFYIlCb65drVYx\");\n            yield return (Hash: 0x237691202aeda700UL, Seed: 0x0000000000002096L, Ascii: \"rq1m7dsJynO2hnuN29L032MvweATJteQzb5s9m\");\n            yield return (Hash: 0x31a702a70da83707UL, Seed: 0x0000000000002531L, Ascii: \"pcop6coqVECPZ6Ywdfw0tf97F2gIUIQSIlYsGR\");\n            yield return (Hash: 0x5eafc9710eeaae4fUL, Seed: 0x0000000000002612L, Ascii: \"V0tLcpF0mLBRLatMz67ME7g2R0uZVsFUG7HWC0\");\n            yield return (Hash: 0x9694dd8f834c08eeUL, Seed: 0x0000000000000e20L, Ascii: \"FgTTUKngL13WKXstwuSKGAsEmrKxmRm29WD86d\");\n            yield return (Hash: 0x246663478abad07dUL, Seed: 0x00000000000014f9L, Ascii: \"VSnKYX4NmxyAAoVJAS5YzzqqwtJp5DjL9ogkvaY\");\n            yield return (Hash: 0x5a792535e570b41dUL, Seed: 0x0000000000000a69L, Ascii: \"dXgaJgKCJ849AED2FyHLi2Hjd4wU7n02iEk3Haf\");\n            yield return (Hash: 0xbe902a5ce92bc49bUL, Seed: 0x0000000000000b25L, Ascii: \"yTQVdgm7uIuiAaz1qknDpajdBTNMXMCbNZR4MFX\");\n            yield return (Hash: 0xec6ced4acadeffdbUL, Seed: 0x0000000000000000L, Ascii: \"CTiZlNvCQ3UGNvemq0dPvPKqyhMn316cDcPJSqG\");\n            yield return (Hash: 0x210ebc3c4827de7cUL, Seed: 0x7b510ad4c9cd1f2bL, Ascii: \"vQMOlSQtz9Zs9EX3iUUVdabSsD1GVaXEf99LFt08\");\n            yield return (Hash: 0x6152a880449937bfUL, Seed: 0x3c2edddf6ae3473aL, Ascii: \"VfPMDOuJiYd7K35LzrckzjaCaEhY1YqtrdModUEb\");\n            yield return (Hash: 0x9c3e336220670dfdUL, Seed: 0x0000000000000625L, Ascii: \"bdtPfyPoSB65mUWrLWvDQ9YcPmf3aYDbTAP3qTiv\");\n            yield return (Hash: 0xe63f355460e07a2bUL, Seed: 0x000000000000248eL, Ascii: \"a5zgDNpHWC0CvOccqiABGDcnyZwwRxbD2bpj90vl\");\n            yield return (Hash: 0x23c91f84057a396bUL, Seed: 0x000000000000183bL, Ascii: \"sACG5HtreqQdQ4H9yXLk81UfD2Av3aSTcZdqClt6R\");\n            yield return (Hash: 0x54050682b947e4beUL, Seed: 0x00000000000002c3L, Ascii: \"nFIS8engjL85yGKk6CHIBoi2XVSGnO0SazJEcomqb\");\n            yield return (Hash: 0x785cf9bf502cac9bUL, Seed: 0x0000000000000000L, Ascii: \"gJrLLQoUXbZrVIrC8hVi3JCvxDNnxmXJ8B0WpcbHc\");\n            yield return (Hash: 0xe66ea6dd2dc85660UL, Seed: 0x00000000000005c1L, Ascii: \"57C715ySXk7ymep2B4o0MNRiGEsK6esgnTQhv5q4P\");\n            yield return (Hash: 0x2b4db8b91d2cf41fUL, Seed: 0x0000000000000000L, Ascii: \"7zCrwP8ISCDHpoTWQLygqG6deBqXmQggsreOQWxxXw\");\n            yield return (Hash: 0x5f942ef992774194UL, Seed: 0x000000000000212bL, Ascii: \"KKQzNTI5jMtHVROqR85d8I4rpldY23KcCqVYMJvFIl\");\n            yield return (Hash: 0x8986c4368e995da2UL, Seed: 0x0000000000002281L, Ascii: \"9QvlFSi8AOwfwzdY2DVPEtKkysr2E5ec98EZ7laNm8\");\n            yield return (Hash: 0xa038d64ccfbcd427UL, Seed: 0x0000000000000dd8L, Ascii: \"tdZwMxNh2wMQDQCjrJAcUvbwnfoGGmDKgRxGu0Eanv\");\n            yield return (Hash: 0x41b1a01030d411f1UL, Seed: 0x0000000000001e5dL, Ascii: \"8eQws6NnMzpSfvW69EJnkg1gYSLKiuJrT5UVsQnrsmR\");\n            yield return (Hash: 0x938fc57e3520f7fbUL, Seed: 0x3269ffabf9fe4912L, Ascii: \"Edxrm8YOHQ69GcaJFDBDMS4t1tL1huF1C4l0YlTMa5j\");\n            yield return (Hash: 0xabb8b78eeb0245c6UL, Seed: 0x00000000000001b2L, Ascii: \"iIb3TJacRk5lTmjUVwb50hrGdnI9GbrJIZLDbzdxiEz\");\n            yield return (Hash: 0xcaa1c81ee9662cd9UL, Seed: 0x45bc9445ec98a116L, Ascii: \"QNGZnwuSJxE9w5GbecA65ajidWuNQWH9i7DD14PZQmq\");\n            yield return (Hash: 0x0b5c29236b8e04d5UL, Seed: 0x0000000000000000L, Ascii: \"TmQKZZKn5GUyOJDneWKHBkNtFHc0PfDRsUWTsdfvpnmB\");\n            yield return (Hash: 0x279dd90b59974c7dUL, Seed: 0x2c6d4115a33ec2b1L, Ascii: \"2esyriPaAO5FmQd0K8PqkjuQLUfw0rYxn2tpfkoRW5PO\");\n            yield return (Hash: 0xb1a629596b0a1607UL, Seed: 0x0000000000001d98L, Ascii: \"LMEKV14ZqsFpOq0izrKQphMbQ9JEmLuzLEMuJGKhUlUd\");\n            yield return (Hash: 0xeed056dc1ad7432aUL, Seed: 0x000000000000147bL, Ascii: \"uTrlb8pId8MuDzBBHgrSYiBWto8oIRcq25j6mHHOPnk5\");\n            yield return (Hash: 0x0c9fa3956a4b5964UL, Seed: 0x7c45ea4a6dba9f4bL, Ascii: \"Zld7gfG0QSNQTJXR0ejdBjJX6CcBrMUH09fe0CdkdWt9W\");\n            yield return (Hash: 0x51ad8f684d9f5c9dUL, Seed: 0x0000000000000000L, Ascii: \"6S17ZBT7gAnKSmTHLQZhVYvz9x7qJQSFXwg2TAgLN8o5Y\");\n            yield return (Hash: 0x6fb6b9a59a3484d4UL, Seed: 0x0000000000000531L, Ascii: \"zgOcPuSSNhWP4mtIsengVnbgCwP81Jn2Ywt0DvlYZGdAY\");\n            yield return (Hash: 0xeafb12f4d904869fUL, Seed: 0x00000000000025f6L, Ascii: \"Kf46oy6paO5m0BITkQBNDFj4IZB69QwyLLX9KQWj2naSZ\");\n            yield return (Hash: 0x2ce310fad5126d78UL, Seed: 0x0000000000000000L, Ascii: \"7yUQsmy2PUSXBj7wZ6gMyYhMYyeaOX7TZA1dKfYTWZ3lkX\");\n            yield return (Hash: 0x5b06c0c82e6a7739UL, Seed: 0x1b789758fc51f4ffL, Ascii: \"wsXMtF0seyh9Wq3TnVSOLCfrBOZGCr0YJZd3sBxJQgCyyD\");\n            yield return (Hash: 0x89ade0e7de6cbb97UL, Seed: 0x0000000000000c0aL, Ascii: \"0ruKjbSl8wBTihQRn41GAXbvYwGUo4OWGFLa2TwDJjCCg9\");\n            yield return (Hash: 0xd2e36a5162ea6be4UL, Seed: 0x00000000000018a9L, Ascii: \"4a32HpJhxXIvX8hUclomupa3QNdcc1pxnVowIs7zEiXj0p\");\n            yield return (Hash: 0x18a939275b26692aUL, Seed: 0x0000000000001178L, Ascii: \"JNBl17xyqUmKZljoCxnoKP1D5voTAdLpHJtF6jZVLz68xLv\");\n            yield return (Hash: 0x55721402fbc56129UL, Seed: 0x0000000000000a7bL, Ascii: \"xOTg2nw9GbYX5pPg0SzxC8q6IEybp1GZmMPyLzbtL7UYZcK\");\n            yield return (Hash: 0xa453728744c56b8fUL, Seed: 0x0000000000001894L, Ascii: \"EZRi4XK7jJTrgPKRA5SHoz0Q4sif7cQIHKFokZY8SSVEyrh\");\n            yield return (Hash: 0xdfce499ed2f17145UL, Seed: 0x0000000000001c4cL, Ascii: \"7OrNWNJR2u89m4WipmIbRlyNBOh01gpw7nerBk8R9L3tCrH\");\n            yield return (Hash: 0x1ebbfd6cc2ff9c6bUL, Seed: 0x0000000000000000L, Ascii: \"Ij6Ag30H4NcF6qeJEz3Wsz5l6Dq8l4mhhKBirBq3vIaqRRQV\");\n            yield return (Hash: 0x8d910fff635a5915UL, Seed: 0x0000000000000000L, Ascii: \"IDOWgPqCXnvFdmWDzqacG7q4o1A27CIXzbexey5B4UgPJJBB\");\n            yield return (Hash: 0x9e57344142b8cfaeUL, Seed: 0x00000000000003d4L, Ascii: \"2099xOkn9wkKjKY5CDlkDdHwi8D4TQJl5gS4d1hcvyR2RQtf\");\n            yield return (Hash: 0xe7a258fddd719822UL, Seed: 0x0e6a5f795944f2abL, Ascii: \"oeDsxodqj2WWr7Muiq077o5VrVaP5K2adfs2u5CzVgGHi3zI\");\n            yield return (Hash: 0x2907c6b2b2112473UL, Seed: 0x79ac05cd3e7e0747L, Ascii: \"CLWOfGOevFJeoegPEWvCPNhABOE0RwTyFxm3CQaFuhUFZE8Fb\");\n            yield return (Hash: 0x741bec58ed14c0cbUL, Seed: 0x0000000000000000L, Ascii: \"LGcQ0YebgP5cfln0Fd758gcv71YusgWgLF5pPPRQFKjnlrmR5\");\n            yield return (Hash: 0xa3704fc90279d6e0UL, Seed: 0x0000000000001c8fL, Ascii: \"lzi6j73dq8g9jSQWe8JiNsQBZvg28u4eefXWB0aZAnd1sAQEX\");\n            yield return (Hash: 0xee496d532d7b8262UL, Seed: 0x0000000000001e43L, Ascii: \"C2g2lYC0KNSl5ogPIeHDMPPIdTfAMX83NFOLTvzNCMOcjybVU\");\n            yield return (Hash: 0x21c59a32b56c7294UL, Seed: 0x000000000000202dL, Ascii: \"LfZcvbaYnMc7ilNCiIfqBMIUDq6nPZdbZADb7uLmeG4fZMgHcf\");\n            yield return (Hash: 0x3b6f5f98bcec4addUL, Seed: 0x0000000000000f7aL, Ascii: \"Ye9VF3LmVIom3at1cJeyEfEJ0FZNMMvkATqvW02AWyGSswPLDh\");\n            yield return (Hash: 0x5f8a82bc935947adUL, Seed: 0x0000000000001a4aL, Ascii: \"ZqWK3ZqTGNSC62HuKNbQnhU4iPL1AIaBsRKH46Hk2dekaEZbK9\");\n            yield return (Hash: 0xeb49e50ae5e96c29UL, Seed: 0x0000000000000000L, Ascii: \"IzxO16cucXkJxNAdGLv1vlEbpbvLh59hxMIDOKyiRHT29qo3Jx\");\n            yield return (Hash: 0x09b9104bc3aafeaeUL, Seed: 0x0000000000000000L, Ascii: \"Ls6VWKVpKBWkLqLn2Dcz7M9X3SyAd3pIgl7l1rk1sFe0OBxz8ig\");\n            yield return (Hash: 0x5e1f4dd12187d568UL, Seed: 0x000000000000150eL, Ascii: \"a9HXkqKa63WKbhvtg0ZBs9I8sF98C7VLpajeWEZ7qfcAKn9x2u4\");\n            yield return (Hash: 0xa02534406ce14948UL, Seed: 0x19364680b7cfae64L, Ascii: \"QxZmg62MBpJkk3hzweVPW7WuBg5O3lg5gogVKg7EvgcX5gFZg0j\");\n            yield return (Hash: 0xdb6693e2ed622d0fUL, Seed: 0x0000000000000000L, Ascii: \"ro9oxAxTDXRNROpQfAwZ6NEptKRF1SOkiHTeUuygMCgydNyONd8\");\n            yield return (Hash: 0x2619adf9b9463783UL, Seed: 0x0000000000000000L, Ascii: \"VgBPITWUgUJHF7eKLDrfatEay6LggqLL9PmXfmwYlBvfqU45s2QC\");\n            yield return (Hash: 0x773cf7a08f6b6934UL, Seed: 0x0000000000000146L, Ascii: \"AcnQHNqJ9CbnxgYAeqhpNvxTSviImLq98dZtTjXg3Ull81cKBASt\");\n            yield return (Hash: 0x9f223dacdfc02fc3UL, Seed: 0x0000000000001941L, Ascii: \"v1pEcieRUyQnEkrkxfCEgdhMuZ5ZJTCX9pygddRcQ98Flh00YOt9\");\n            yield return (Hash: 0xe9f0aeb1d0691516UL, Seed: 0x000000000000098cL, Ascii: \"kW8S6p5FaD0SWxtfn6rNgk6j0wVvJEt6jDz0pojRELPyrynVUyew\");\n            yield return (Hash: 0x14d78e65f45f7d81UL, Seed: 0x0000000000000000L, Ascii: \"gGTtJkt3jWNXV77yMOLHgWh2wpgK8qFcMs5MX1SdN35RNt8XzC8it\");\n            yield return (Hash: 0x3914044fcdd7e268UL, Seed: 0x41d3b15754067041L, Ascii: \"DiNDfLboOnvczVWhwRR7UPDsljgYz3mJazI037LfMMPVx4NUoArV5\");\n            yield return (Hash: 0x8c0701194f1164b3UL, Seed: 0x0000000000000985L, Ascii: \"vTQ7jBRVAlRRUjQVADVtixvS5QlaqFhs6Gq7aDjmVZIpge5abpjZq\");\n            yield return (Hash: 0xccc87259d135706dUL, Seed: 0x000000000000258bL, Ascii: \"JIgjs2RG2EA6NN56sZCE7hKybrSGCf9BgatWqRbp4XQVbtbIMKhhO\");\n            yield return (Hash: 0x0be674f9c6b485e7UL, Seed: 0x000000000000081bL, Ascii: \"ml82dtCvI9dWohM3KqakVqbrDVihy4ihUZwrf0RU8CC0qGJk2hi3Xe\");\n            yield return (Hash: 0x31655750cfc19844UL, Seed: 0x74b9e97496068171L, Ascii: \"9Q3Bp5kfmgzShiQhH7knhi65LLdxoEy2WmOR1eI7rvsnABhbF8DbP4\");\n            yield return (Hash: 0xb0b7c544680889e5UL, Seed: 0x00000000000013d5L, Ascii: \"0VYRaLR75oh74pxV3IlOWn2I3la5pjPqvFo1XqpSo3fiaQ66J5gXej\");\n            yield return (Hash: 0xf74a468b1d2cfc69UL, Seed: 0x0000000000002278L, Ascii: \"WEaHPT5CFIgnYDGEAbVomBtvu1LhyejKcwpzKXrPJRDWRHQ8UQrLR3\");\n            yield return (Hash: 0x1a15bafe86cc1598UL, Seed: 0x00000000000013b5L, Ascii: \"nGS6WGHxSo8vPLfVgA4dgokSCV6ojBbUu35fpVQuGVjkHGvYd6PlZ3w\");\n            yield return (Hash: 0x60933a1e4e010b2cUL, Seed: 0x0000000000000a8aL, Ascii: \"LpeQUOYVWJZ4CFpEGC9An1gSaE9j7FMjG5nhX8duWZD2hKaGrSXIg1D\");\n            yield return (Hash: 0x8c3895115d651298UL, Seed: 0x0000000000000576L, Ascii: \"AMFxrECxyQHyBnIGcz1m6cqwJ9nNuF5WrJgMNF548ajy4o0OVJAJzph\");\n            yield return (Hash: 0xbfde3b8fa98088d5UL, Seed: 0x0000000000001641L, Ascii: \"Z7dYLz1eVa1zrPrAL19mFtmz4EfWNxIu4omhJO0Gfg23KXYpU3IpVfw\");\n            yield return (Hash: 0x34790610cada5714UL, Seed: 0x00000000000022c4L, Ascii: \"SSwQgScmLMY2diX01UVpg2v2bnAgs6ZpsWv5PbDM4IwHslW8mWgUORIW\");\n            yield return (Hash: 0x5d129cd6ab2c9b55UL, Seed: 0x00000000000010c3L, Ascii: \"2tlEXjmV8Uiuf0c0wnSb9QvQobIYsg4BhbHOYnsj7Ry7WizG4lODAa8d\");\n            yield return (Hash: 0xa675f861e32eb4c8UL, Seed: 0x0000000000000edbL, Ascii: \"YQyUWpSRyow0JDpO9iE2niSNsrV4i4n9T2phg5AyGNoCufSHwIcjXPX1\");\n            yield return (Hash: 0xd4d8a718dd24c500UL, Seed: 0x000000000000217fL, Ascii: \"qChqIWMKTD93cd25eOcPmsXDPJN5doh1sweE2IOUeMHVtEzV2X6xAM8I\");\n            yield return (Hash: 0x421a290dc3731d13UL, Seed: 0x0000000000000000L, Ascii: \"48o2hjGrFlqK9fWKtPaGO0yeS7EinKtpCrW1pJTNZP8FdyNWRtRq7hLsy\");\n            yield return (Hash: 0x7f6ba93f1df37e1bUL, Seed: 0x00000000000001daL, Ascii: \"UxbCoJqztrbLN4tXQMN1Ub13Pb1LtlRHZxFpJqjxIyNeL9k2zbj2XtiMe\");\n            yield return (Hash: 0xabd6ad65e378f14bUL, Seed: 0x5e11ec7ccdae524bL, Ascii: \"zFuPfgSUIJrUVkfOItIrV9AkQrEc9lWOJREQIhSoCrilCPOlCoBbxXPr4\");\n            yield return (Hash: 0xe896841cadc57bc9UL, Seed: 0x5519a7394afe885bL, Ascii: \"hMVfSoFYmNPvgczhngnL2nmAdLM77JnCd5OzB4ZZxLd2GKCGyDgMCGld2\");\n            yield return (Hash: 0x1cb213d2c8720866UL, Seed: 0x2f50b68dd1216820L, Ascii: \"bDcIN878DQrQwGWieIjIRzucEWCxdqkmNsUetKNBo3Fc2dGHvLptSMbL0A\");\n            yield return (Hash: 0x4e19910e07a80533UL, Seed: 0x3022ec39e9bbb80fL, Ascii: \"5kGjt6moDX5CGU8My6gK8e0ia212HfJlIv6tmzLu57b6LlgbsQamVrqeWK\");\n            yield return (Hash: 0x999d616b08af00b8UL, Seed: 0x000000000000180eL, Ascii: \"C4gSolKgHsQLi8oQ7625q0cVMNSgrhkYKJkyvKAjydg6CkKEFzxCqxjbNA\");\n            yield return (Hash: 0xb37742158c17501dUL, Seed: 0x0000000000001918L, Ascii: \"GS0YDzYitXptN53db5eprQxfCof7LvTmC8PnvMb1h1NPxjpQUUcDkR3wMr\");\n            yield return (Hash: 0x2972aa344aeb7821UL, Seed: 0x000000000000259aL, Ascii: \"QHoMl8c7TxBkBCVhSwpMW0XlQUnetmkwEjEW1sbBMygvmWPnmkdrYp7Dx6P\");\n            yield return (Hash: 0x7351056b994c6a0dUL, Seed: 0x0000000000000000L, Ascii: \"qpWiY8KnV7C9gd0XrPZKIJQxgsGrMeFawP6jOy6EsCr2WhnBNc33wMHjkQw\");\n            yield return (Hash: 0x8ea6045dd6d64064UL, Seed: 0x00000000000011b7L, Ascii: \"dgqIgOoGQ70Vn5DHxW5ljVjhHW5XszxVMEjlfnKUgEJkJlql3UPxX4zArkA\");\n            yield return (Hash: 0xdddb6e26f236c94eUL, Seed: 0x0000000000000000L, Ascii: \"d3zh7ciWb42tmd8GVOFIQFlvRaJFd04AWJQgLZ8uEXYlYdxwuhyYMMDBFqZ\");\n            yield return (Hash: 0x11b32d9e43c17489UL, Seed: 0x0000000000000000L, Ascii: \"iFcgmFMBZmi4M91evoCByqY6lZDHtG08qMLgQqOMrMjjzlzPerTY5XiE0p3C\");\n            yield return (Hash: 0x55793d5dfce1976dUL, Seed: 0x00000000000014b5L, Ascii: \"CUnB8aP78JwmdOzqsHCOMkVXWbcrcNrGGmRaedmFnONXsBk2auUae3vxjQlB\");\n            yield return (Hash: 0x9e4a3c3a5d348d7fUL, Seed: 0x00000000000003b3L, Ascii: \"CgjMVFpO2wAny4P0SId20EJDrHUKPKwhXkYLf8TMSvetL75Hbd8UeSkjiRoR\");\n            yield return (Hash: 0xdacf77121c781d0fUL, Seed: 0x38f31597a69f595dL, Ascii: \"NLU14nP7C72v3yTjzULrMTgNWyxwNnGc9UC9fXLOxzmjcAi67X6nzAZXxK9m\");\n            yield return (Hash: 0x2801aa99bfb2decdUL, Seed: 0x14ae24b2073113f2L, Ascii: \"Vy6ZyYEuXWrz7Quv1BR2MRUCeCXiXnh3ZGuNncajoO9OInkaXHfWYGEtcxtbG\");\n            yield return (Hash: 0x51bc4970694f0f55UL, Seed: 0x0454617a8f747ce4L, Ascii: \"G2A72g8ejMhySFBmSH0CuvAEEjXbaFKmyicWp43YVgygrbq3FpUS024Io30zR\");\n            yield return (Hash: 0x8bc5ef0d1660b3afUL, Seed: 0x000000000000140bL, Ascii: \"ETo4HYuNApzBgyaagRiEwNlXGninxHyLcsW7vu8p4HqLsHmUoZ2wxIzrXo9HN\");\n            yield return (Hash: 0xd4939b0068ad3002UL, Seed: 0x0000000000002233L, Ascii: \"mswFyfJ4YTrRr5DnUhl1f9o8YjRsRhYL2nEqoGQz8iDamdkU8dRj4GNrM1QqZ\");\n            yield return (Hash: 0x1345ce78ebc56934UL, Seed: 0x00000000000023f7L, Ascii: \"rR2Cc5Tan4C1RpIXm4Vqbk0hQ44bcJT8FaPC68YYoVZqD8AYm4FNLFmWXK4w9u\");\n            yield return (Hash: 0x559b7a6d65837634UL, Seed: 0x0000000000002484L, Ascii: \"cDr9lGyW06vlulQKmPYUrm1q0XvRKBkz5LHvVfejtWjGovbtV3Ssttyop2SFRJ\");\n            yield return (Hash: 0x8b452c9a7257c33cUL, Seed: 0x0000000000000000L, Ascii: \"aTSzxIuznzTgF8UMqJc70DDDKWguVRuXJOtdAiCBnlg38XcmrD23HEZm3yviH2\");\n            yield return (Hash: 0xd6b589b67c01f79fUL, Seed: 0x49a9d98fa20a1fccL, Ascii: \"Af9PJlbMfGS19PiYKRS7MYyDlXB1xBdihQtv3PPPUQsDghsLrKnTIhPUuakcE8\");\n            yield return (Hash: 0x123d42e2185764edUL, Seed: 0x0000000000000becL, Ascii: \"dChRHLmoLX3g2ZOqvhHheCcz4Pc7Qipaz9hRhIVPogE48DjMDDs5aNDdwYrf9la\");\n            yield return (Hash: 0x3f396384ced3c48fUL, Seed: 0x0000000000001cfbL, Ascii: \"E2KhIsi9hBmz20c9ljrFZrHI0FzzXbhvDJCjYOovgj9bcncjPrLCMhOzOOHUV7j\");\n            yield return (Hash: 0x84cd838237c7d8edUL, Seed: 0x000000000000048bL, Ascii: \"IsI2YiVzaCDbfL33z1lO72OhvvfcCyFrLuDBZTgI64V7GFEinbuAMDA30ZFauvS\");\n            yield return (Hash: 0xbc820aeb39d15c8cUL, Seed: 0x7fac3c7a00d71af5L, Ascii: \"Ae8sZwZzuLjWxRzS8Xvw3erSRWskQCxSLZ0o5XrABGJN2e1LByA28esW9caWILS\");\n            yield return (Hash: 0x12c999733414041fUL, Seed: 0x0000000000000000L, Ascii: \"TvExjicqiLQwVII8NV5YKv9VKavvOsQOpsUgdDHQXBcWygTFFcfe4uhWRRxRnCNC\");\n            yield return (Hash: 0x69753cd2983fd92dUL, Seed: 0x0000000000001897L, Ascii: \"XPqxjOibm1bP65xGaaRsetVdaPzr44WYu4pBFBNyPiD8XOfb5UDhFVEoLercZco9\");\n            yield return (Hash: 0x84ddd5d04c6e29cbUL, Seed: 0x0000000000000c25L, Ascii: \"i0ZFqvtSlIKdXfPuKoZTeTEb9L8WLptyzEq4FZWznuBban1DwTWhy8KFTNS287KZ\");\n            yield return (Hash: 0xc3fb0f2dc686dd0eUL, Seed: 0x0000000000001edeL, Ascii: \"FrSgpf1CccjeB6aIMtu0YyDhnD8YVF0Jz8zo7tDGOVzhKwEYrbEVfhYVsVAuURQr\");\n            yield return (Hash: 0x144f5a4fb507fe48UL, Seed: 0x332504d827fe35ffL, Ascii: \"UV15wti7vDPvp5vdZDqLsOmiSiBymdWYH8uw5TjPqV4QpEXDy42REJAkj6PiWi8SE\");\n            yield return (Hash: 0x3f8a8ae63eab87dfUL, Seed: 0x0000000000000000L, Ascii: \"v4n0tGBDBWlHljIM0I3XM3oKIBTT8Y4kSWkT42r7PyoD5I2iSJyrUclS3n8h6Xmzg\");\n            yield return (Hash: 0xa99011c00fa8c6a3UL, Seed: 0x0000000000001b2aL, Ascii: \"9kQUYZUF3VA20kgGgNujYD22HiU5onoxWxvQFmMlxlu0fzEv7962PSTejq8gwfvrk\");\n            yield return (Hash: 0xb4ec41725d31b11fUL, Seed: 0x00000000000021dbL, Ascii: \"Felb7yzSkykG2IkOlrcubpQRnw2eoG8OVsB3cs4MKKeaQiyl5WVbLKeajEuH2R5cA\");\n            yield return (Hash: 0x0ac357be59fe1826UL, Seed: 0x2d5b9a19d86072e2L, Ascii: \"m5VOpDrDiurU62bcoqXWfzW75UUtAYcL9uh5SmOubsGBCL9lHeSAeQ7l4oh80nuHa7\");\n            yield return (Hash: 0x3f9547e24f011de3UL, Seed: 0x0000000000001413L, Ascii: \"YA3eHmH7HwBnvh9kNXMlv1RZck99qhkZ6fJyUaUnehTIEd4gIWNhaUU06MrbwKt5ox\");\n            yield return (Hash: 0x9d78ac8a01950097UL, Seed: 0x0000000000001de9L, Ascii: \"pgOW10uGa4dqCcNvrYlYMGErIwRX2kjIQvutKi7br1O87xo2aq6Sy8Odqr9TF6mI3W\");\n            yield return (Hash: 0xded572bebc745376UL, Seed: 0x0000000000002584L, Ascii: \"OKBXjBXOXm0mmdORpNwqdwY2oItFNEn0plGPXWyWRR8fzVJLvdhOBO1jQ5XeoIdCPu\");\n            yield return (Hash: 0x3ef07d2e8f7e0ce2UL, Seed: 0x0000000000001676L, Ascii: \"2mueH2ma9BTIgNpadxRCb0RFafKa3j91pRC5on1RmRfjBZEpn63mQ0CLuLJwIqnZMFZ\");\n            yield return (Hash: 0x86f20b74b8b59527UL, Seed: 0x778837d41e84868aL, Ascii: \"oFIt4hmqFm5YkhRSlf8egNhotDP3rpgIcsUK4bJjrxErvjVjFOkqZOLeBnSSEoDIi5d\");\n            yield return (Hash: 0xb26b0ea7adec6243UL, Seed: 0x57c7768f23d56971L, Ascii: \"MH8bsvNnxc9zlZbxu3xpSPvEdAH7T2XPG4X8SPbu0fHxTGozYB4OM3f4QCnMYqxPPKk\");\n            yield return (Hash: 0xf03659116b400e37UL, Seed: 0x0000000000001ed5L, Ascii: \"qoaBsrdaeTH8fkhlC7cdQip2rfta3FFf0wlzKcFT4dBDvogACjVRLx2e0vQ8X8zogB3\");\n            yield return (Hash: 0x0246063df8883c5aUL, Seed: 0x0000000000000000L, Ascii: \"ryH9tH9CiBS8W0mFlB7lSmjxAtjZ8hVCpRr0SHzX1nqlAnD8LZqV8Jt2bGnwvr97NEdo\");\n            yield return (Hash: 0x55f88ef61f570868UL, Seed: 0x00000000000025bcL, Ascii: \"khdx087Y0Ha75yBiMVEsIpvhpyAc5kUd5yl0nK9oSbSudDzAP6aS7rwZJvdeQaKWoCkL\");\n            yield return (Hash: 0xb2f04eae0dbf2d1bUL, Seed: 0x0000000000000f5aL, Ascii: \"ag6kjPG4042HDDC1Y3G1HQLJkglVR7d7Fcd2lsuGieXX4jcURYltTkKybdec9GMw5PKs\");\n            yield return (Hash: 0xe8e74b5c82234140UL, Seed: 0x000000000000208bL, Ascii: \"8TVDv9CQaAsdESpuhUWT6fkqCBTE5y8wovp81YSEdTchBLcoA6sjVtB9BYR0WPHamt7U\");\n            yield return (Hash: 0x11ba44c21db0900fUL, Seed: 0x0000000000000d1fL, Ascii: \"iKJJLsCO8sDlFFzEKAUATO1jWDEQgfrufqdnZU66xbma8LqFrac7kHqiayzPuP94udCv8\");\n            yield return (Hash: 0x68049fd7058672aaUL, Seed: 0x0000000000000796L, Ascii: \"ndk6VGpA9umWEGNVU3i07c5CnUCotxkuWgCECgKnpevbEZu5RCCvqOoP9S4lv5fvwhxN0\");\n            yield return (Hash: 0xa7176e82cab215e8UL, Seed: 0x4d98cad46acb947bL, Ascii: \"crOzxbA8fTVCM38ypXFpKIJieKY9IxwIToT4JhTstdb7RV2jlZXfwJu1gMYmxTjfQO3nN\");\n            yield return (Hash: 0xcca4b8f0da02fe82UL, Seed: 0x0000000000001f8fL, Ascii: \"JWBq1w2WqWsRY51JvcLnPI5ceeEdop3e7pxZASclMAglJh8dg9UKS6LzMB1ekr7gprpuw\");\n            yield return (Hash: 0x2d17cca2ebba3d6dUL, Seed: 0x60e925ed68699381L, Ascii: \"spTdj3N5564MmYgvK9tKn4cZfPlp3Fjksyfy33TBH6UwwgYIc0asipqBXrjVlyP8GNibWD\");\n            yield return (Hash: 0x5dc630e382622b20UL, Seed: 0x0000000000000703L, Ascii: \"C30wXszDqwix9JqtvRST0YzM2j1W47KYRJHeIPMYbsDx32JnVHysFYui34Qaz3xHyXlQmR\");\n            yield return (Hash: 0x877bc115426c20edUL, Seed: 0x00000000000023beL, Ascii: \"V3cBt2iuYUdhvnnTDjqRE01fAHn133BGUZVNXeP2Az5zvyLv9OCEiu5DQYWhYHaLpUNWTJ\");\n            yield return (Hash: 0xd1cacc82fee9273fUL, Seed: 0x0000000000001c61L, Ascii: \"xz2M3W2nRYKXusjtGRHvjmvQqPLPXXamYCn9EcOni72EpzD2yQ5qnkQ7PzwbwQCCTIFUPF\");\n            yield return (Hash: 0x0ca7b863463b53ffUL, Seed: 0x00000000000023f8L, Ascii: \"hE01bC95EVZV34bnQKpKn0Pkr3bZA5ZNZRS7qNZLi19zAS8lgBliLIlLAhEe13KmsspLeye\");\n            yield return (Hash: 0x3e104f85baae61beUL, Seed: 0x000000000000257fL, Ascii: \"6e2BkJaZwEy5ufx6acaXPli5MEpECXo1aDiiOwprDIdiBU5TgiHydJ2dSmqpTXzaS3f7voM\");\n            yield return (Hash: 0x84b34b7437c095f3UL, Seed: 0x3d589af0acce8d16L, Ascii: \"BVt798Xm1REq9bzq5Xgn0Hr46JkvgCbJtCPViGhz7zKVhoLofiTDVNpagnGwLDBCDLgKLH2\");\n            yield return (Hash: 0xd7662aa000e1cc06UL, Seed: 0x0ca51c7b9a233d1eL, Ascii: \"AliAeUYgonrjyqZWlDRdNBefJW6QWqPo9rKKhPL6PMYoUfqi2vjEbejADiT4wRkbVnJjDUX\");\n            yield return (Hash: 0x11403cd8f7c78a2cUL, Seed: 0x000000000000104cL, Ascii: \"L5Jx44k6L0rtSagbPrytT3X6tEmYwKF0mN8oZgTAq3RSUWzrxHHL9VMdSDLFUVmRv5KrlNfr\");\n            yield return (Hash: 0x42c3af0c15f780c3UL, Seed: 0x0000000000000000L, Ascii: \"kXdFhAz02ox0GuVeSPsaVLcKMJePZkLQXbcN3kzmFMgWA8WpLfuJDj5rS1KGmwBqyh0Inl5D\");\n            yield return (Hash: 0x9b89f98cf687756dUL, Seed: 0x0000000000000000L, Ascii: \"ttMF9MSoQC8ubvtmrxKFbn9EPg5aYzJY6jvVjvaCgK68cmC7me1ikVRYqs4biHGwOpNKsqpn\");\n            yield return (Hash: 0xb5c452884af39b04UL, Seed: 0x0000000000000cffL, Ascii: \"HH7EP8PtwXPiJEcLrGXMYmyUc4ESerMA0mwIWj8esmTlUph4IIv3AHAmOcPxImannSodYltW\");\n            yield return (Hash: 0x1ca06db322628221UL, Seed: 0x0000000000000000L, Ascii: \"GrkDeCbWqUEesxt9uf1hLN9bixDxAYsgIMc50DFyteH7INNFLP5jgAFkBgrGHIhmpVQxeY1a9\");\n            yield return (Hash: 0x371234e9bfb3f51cUL, Seed: 0x0000000000000000L, Ascii: \"Teff5S6uVmhge4MmwnYTRRMLgStlo2StE4v5TGXWGVz27pM36vzOqTqTObKFrY47uCHn9YAZr\");\n            yield return (Hash: 0x8ccfd33aa10a6e9eUL, Seed: 0x000000000000111dL, Ascii: \"0ENitpVTcRiZ8Wf5NyvmcgMJODJq3j4HtomCzkGQAhh4HDCn6QUNSxpYOqk8g1ddyErIS4ekJ\");\n            yield return (Hash: 0xc7a2281ceb834f78UL, Seed: 0x00000000000021abL, Ascii: \"Dl5V5SLtpMUiJJgdLRXWBzRWbf7FIosJ2KyFd8LAm84AfusyRbhJJhF4NKmzcJ7yTyH89GuwJ\");\n            yield return (Hash: 0x1e71e538ed5cb5fbUL, Seed: 0x576729e915b125bdL, Ascii: \"AR4lc0CsPcQMjn3Rc7FQnWU2jsFwkSimhBZtYtOKSo7GPQ3T3Fl4jzIuVYTrBGT2gXIxeQudoK\");\n            yield return (Hash: 0x281ce1683b49e0a6UL, Seed: 0x0000000000000000L, Ascii: \"5jdoyrUYoR169zYY9rUMIKy940a5LRnhbY5s6zExO3PCmfvL2bpDPIY3LIwynXg2APdkgNSWSL\");\n            yield return (Hash: 0x762ec45eba3b41f7UL, Seed: 0x00000000000002e2L, Ascii: \"knIJ4zeR6ftmVtUOoKtpCWRKmdLxJdQCAevdcw4afpzeGaM3GJ7EhPUSDW0ncbATlKSur50xmZ\");\n            yield return (Hash: 0xbd2e41589233acc7UL, Seed: 0x0000000000001470L, Ascii: \"Y9P6C3lY0DnxGxipk30OhIE5JIzjmMHzjOe7BYdhBrRoEooQsEL5TdQpUlc2UkB2FyMzt3lERW\");\n            yield return (Hash: 0x2cff8b03aa9a3094UL, Seed: 0x0000000000000000L, Ascii: \"g5Bsfq3p8iytDC69UBlTn0sYVCLesPEX4Yje3nMyh46YkUkFlJlI1zh2fQwtApwjdVu0l2y569Y\");\n            yield return (Hash: 0x6973192c0b15018aUL, Seed: 0x00000000000007c9L, Ascii: \"ed8guoucGjtPkhLP5M6ukfYlfZ9nCrvKdSpJU9no7BqyYG9JbF34J7Ld4mFvvcWWMXA6R1tnEey\");\n            yield return (Hash: 0xb525ae1b76e7d944UL, Seed: 0x0000000000001e87L, Ascii: \"9gh52nsaHapnqgccLo9C9lukB5Uvn70il79LwLlIKDbwOmtsPePhm94wqtJ7Z534GHTEOz5mt09\");\n            yield return (Hash: 0xe53b99a77d004afcUL, Seed: 0x0a558d8bdefcd2f3L, Ascii: \"AIS4D1HaMvqRq6c2goG6qVXtmauWzSBHjXuURz7oUb93cYi1TRO33CgSnTQldVcyAEvXiN9hv88\");\n            yield return (Hash: 0x1a016c5b0b693d79UL, Seed: 0x0000000000000d63L, Ascii: \"4gLhTmcXNAjO5hzjFaNyJwZQA0xgvgXqY4YktLe5jBqXktO4ljSRIuSInx2jiYnMvyVQQDlSCCga\");\n            yield return (Hash: 0x65eacdbf5d144b05UL, Seed: 0x0000000000000000L, Ascii: \"yICRSATk9jlBrmGQkmpVq0ZTyIFbrqBYjoLaKxEKixNAfof1wwEHTuPYnDdaQkpwiqFyGDH0QO8m\");\n            yield return (Hash: 0x96ebff8e3c422609UL, Seed: 0x0000000000000000L, Ascii: \"shbkpE7GQJehIvAcFb4NpuoJT7ax8nJEBaDOCa6cwp4Mi60W59t8Nfzsp16QFABa4C6KNoRl8Ufe\");\n            yield return (Hash: 0xe5183aa46b2ce88eUL, Seed: 0x0000000000001cf7L, Ascii: \"2Xuzb0FSCOTN910D26le5DFMx9qJEPqugm6TZ202MUExumgdOSvpo0d7DG0vtaZUFeRBK006io2l\");\n            yield return (Hash: 0x21eea2adc5771f43UL, Seed: 0x64436f175308030aL, Ascii: \"q7sxIPRAM2Og77sNTXWkQWVdHicRlPFhWfyxtVlbcj6UgWWg25EiZ2PP3qrR7SHnOqZlySIYWJo03\");\n            yield return (Hash: 0x7bbeaa1592093a4dUL, Seed: 0x0000000000000e83L, Ascii: \"loMRiwlZaYhfjwHuBEPYjtNxS75MA6vLS6EGZmj0XNmMdHAHaPAq8ERDFQi9orBkT8rWBgKNsYkJj\");\n            yield return (Hash: 0xc00f016790c67d44UL, Seed: 0x00000000000019f9L, Ascii: \"4vAi26eGZ5TlYTqznrLKYcpxKJ4Y7883pgHBDOoGActgK5ZbrqppP150qbmNytnA1vqc7l8eT8oEW\");\n            yield return (Hash: 0xea989546b4676299UL, Seed: 0x0bcc809852294e09L, Ascii: \"rROwD6YwvSMx86Y5MmCqNKmUtIWMtMOXtLClOksIdal8lDboxqFWSSVKmwqdVBDoDR7elRYYM4PLD\");\n            yield return (Hash: 0x196710b15bc54ab2UL, Seed: 0x057a5a6ff3541340L, Ascii: \"bB3lurVvoz64fwEouyj9AsGxsnLdy1NDOAEA2n4Mj7tzENnt3WQNlfD78Vz02IhytA1bcoVn8KXQL8\");\n            yield return (Hash: 0x3ba9fcd3c3e4b4f7UL, Seed: 0x0000000000000d6bL, Ascii: \"sfZiQdoIaLFkM1XS159ya1TGvv8SrE2ahJP1D5fxelGzvPndJC4l47HyPyZ5hOxgff2SuuqbIhdKPr\");\n            yield return (Hash: 0x897bcd832fc1c949UL, Seed: 0x0000000000000000L, Ascii: \"jxRWEK6LJazWynCNTJLyg8nWsWnB38nYXq6cvSIzOtW091yMZEfgHaz5O05oI59UL7m00Lw6FYyGZ1\");\n            yield return (Hash: 0xb4f941105c37d63dUL, Seed: 0x0000000000000ef9L, Ascii: \"ZaxQFYVo7FOe51lc596Dvvtll8dQuWWcPS0mfBVENDWxNHvXhMQm4vfW0sauM4uE3qdeOUiDI6Ndqd\");\n            yield return (Hash: 0x08e32e6a7424978eUL, Seed: 0x0965aee13d012a9cL, Ascii: \"JtXkLq3fXKJ3yzMHbr3LbgpnKSdktDHkmD2v6yljj9eT6p5gbAAFPMQKrQMaxxiSYkutYamf45cW1Ar\");\n            yield return (Hash: 0x18c8c3c456e8680eUL, Seed: 0x1d7c540438c70dd9L, Ascii: \"HxYHgpI1GuU1GBvUCDV84DJXd08NA5pxEWQZbTknnZhw5pWVFLyBv8jS5UP31xUa5iwrgbTskSDcbG9\");\n            yield return (Hash: 0x9782f0656a1877d1UL, Seed: 0x0000000000000000L, Ascii: \"W2NSFrUjANeP4FVIhnoGVFe3MS48y7q61jghNQzH29cDqocuaTjAdPwgIaWjcQea7D8puxKPF2Re6ES\");\n            yield return (Hash: 0xc00a1964ce2d40c9UL, Seed: 0x2850993126a7f996L, Ascii: \"xKnvXs7ULC5O0on8tr8Cys8FbUehnJLCiETUAFRNiXvCE9SAnl1yF1lmkgv87lMG8KDdAbyX9QimPQO\");\n            yield return (Hash: 0x27db8c13dfe1490aUL, Seed: 0x00000000000020beL, Ascii: \"1xOzPHzGQiqo1SQqDzFB1gTdAoAo2MEmNdtYO1NeQ48mBWG6F5owFO9aLVlVLDHzcZEkpAon20g3xOF2\");\n            yield return (Hash: 0x5f526fa64614ac60UL, Seed: 0x0000000000000000L, Ascii: \"1CLclXs7CcEU5wHEhO9ENbeP6XItnXoAmc1dP1uWNiakHyAiY6FFL3z34V9iPRltZw36ACYev0eEukf5\");\n            yield return (Hash: 0xbe5cd8581d18682bUL, Seed: 0x00000000000024d5L, Ascii: \"9XiE8okSHwClRCIEt3FEOU07BDEB9CgAC8Adltc5jOGVeFnNktQu9aszHFgVGX3PZ9ILBMucYwOAxYYX\");\n            yield return (Hash: 0xe5dc0ea039f9a32aUL, Seed: 0x0000000000000573L, Ascii: \"wgMLhX7QoJbXANDELpVj95pKNQKAoYdB5cVO5Nv73p4373iciCh1fU0TacEEXyDzO1tgFUfKUKu1kgpA\");\n            yield return (Hash: 0x298907e22b5c320dUL, Seed: 0x0000000000000000L, Ascii: \"Y2K1guD2KTnldiKASvOepwIC4pPCLKVitKGNfXv1qNsCgPoe6DoqKlFAT73NZB7BALAFv5GWbtoT2MG8h\");\n            yield return (Hash: 0x6a3a3d2ac078a59cUL, Seed: 0x0000000000001a72L, Ascii: \"IUnCEf9bGM1nbosXqMT7AKto4tW8Me4AdiSc4YuxBukkt6AyWgXAWJMnxMzX8B7rAzf7DzfsIPX8TiFGz\");\n            yield return (Hash: 0xa607fb1f3425413eUL, Seed: 0x388ec634c9324d40L, Ascii: \"kHjJnGo4IJKuiK6TvKKTm9IomXlTSKoUmXKRGjdq2Iw4y57NsORDkhGtfCylmlA6n7murXdpuZEU8YlVn\");\n            yield return (Hash: 0xdb1700e996a8efecUL, Seed: 0x0000000000001a30L, Ascii: \"CD7bQOQNV2YZFCRsUp4ss4G0bwASuowA1gZIwx9q8k5IQ8MKQN0vQVmTJnvsYp6Gs0RSX34Mr4qbg9joj\");\n            yield return (Hash: 0x2ed04fb35df32948UL, Seed: 0x0000000000000e05L, Ascii: \"dtSPsb0jJzCZ1JrmsLMXJVXuyyDDTBW36P9ngdyM7VVc9ZXIBmVPyU13Cxx8uiSeMRgc2NvFuWbQf7MZ5O\");\n            yield return (Hash: 0x582fa2cc4dc2123bUL, Seed: 0x0000000000000000L, Ascii: \"JDMrnJeFOCgc3r2GJYyDJ4UwkWeZaU68lLVpygpyYos3C5t2yBxhes7YepAURnhmf4PouTq3ghDk22J4VT\");\n            yield return (Hash: 0xa7eba5e8b81aef2dUL, Seed: 0x00000000000014d2L, Ascii: \"RSuevETNns05LTDdUoiqtCSmB59b5mdJIhwGHYhmggWXvOHLc3s86ZpugUmMVQMJkMFdy6DrcbDTqnOBCy\");\n            yield return (Hash: 0xf5fb58234f775212UL, Seed: 0x0000000000000667L, Ascii: \"WmfzdvD8CMaFfI8fLcEjCialZSDn7lyQNmiQleDA0fX9WLGKWeRaCXM7gFJW25L5HGupr1RxYkRcqBGnrC\");\n            yield return (Hash: 0x17355a460ca7bc07UL, Seed: 0x0000000000000e8fL, Ascii: \"0vyTy1PsyfMtOSsWEORfWH2hJjF8mqhrAZKvhNTFPCEi4B6xu6ANDRnhR16eFNFA8AMkYri8PdNOeN3NNxi\");\n            yield return (Hash: 0x67272d51a9c8a4ddUL, Seed: 0x49379dc49721786fL, Ascii: \"DQPjKzXQJ9RHiloP3yzIo1mPn95mEf6NeNfJCghHj8NKyKS1IoBM1pexRmViojfnnmDaOtQ1UKkJ1ry0tdu\");\n            yield return (Hash: 0x9311804959de2917UL, Seed: 0x0000000000000000L, Ascii: \"GU8ISi5OBIWYBeK2RZnNscT6DEYN0uB11BpgKekeh56vm3ksjXA7YYE6jNiJ2jhgFHYupsUqW6GzAdPyhUv\");\n            yield return (Hash: 0xe3f0f4e01fc34a55UL, Seed: 0x0000000000001609L, Ascii: \"VjsOLFvsdyj2l7KrrZ9fyLsqc0f5w9ALbFPV0LYTiugCdip8R9WCs9DrpgxtgRlUvFGUnQUTx1KSySnOfbO\");\n            yield return (Hash: 0x2304a89883520ae3UL, Seed: 0x631139e5539f35e3L, Ascii: \"3E3UtumllL6ZlbDR30TvTbYn9SHqxRpnG7d6GyjSIcNB5PvcQaZd1IRFbSzgUom3rKQzIDqCrywuO3hLNnME\");\n            yield return (Hash: 0x56308ea08dc75459UL, Seed: 0x02ab9de80a052f42L, Ascii: \"LF1Yr3508zzhL4or5VAh0H9ztfDeHysy5gM45eOgWLDmIo5dZ4QuRWDWzx0pJos2oZUiTZQpcf8nF2MQBCOV\");\n            yield return (Hash: 0x969469da4d9b13e3UL, Seed: 0x0000000000000d6eL, Ascii: \"jeS5hvqlGabtRxiAyPQhQWMmnoRzZ6QMlaMsOodS82kdmKXGm0XfyglRCLutG6ZXI7l7vqIbTdLz0nvGLMm1\");\n            yield return (Hash: 0xcb8da21dcf29690fUL, Seed: 0x00000000000019ffL, Ascii: \"cpUbKnjYjWCEp4VqvJ7X3cBsiPYVLKOXDc5ZHAyQWh4z48YNFYbu1YExQKDo8aR2zdaYLRvntqFko8wRCBio\");\n            yield return (Hash: 0x0bde0cbce76e4befUL, Seed: 0x0000000000001532L, Ascii: \"jrS8UsCkonNS7kj6IpzzbIIZbHpJBsREwk5IC9rNyjklOm1PCvrmTBZK9eys51G7HMZIZZBjSCcWHn6nCOkHx\");\n            yield return (Hash: 0x5298f5290f9b3e53UL, Seed: 0x42375fa6978a8ce0L, Ascii: \"dd73diYCxIP1ws4uZjCgSMDSosJ94thLDPduo0jTqwdKZunPjMAupanYsSdm64zpN6NeQ1LGEKuG4wt6Y3SVU\");\n            yield return (Hash: 0xa16f57258ce63e9cUL, Seed: 0x0000000000000d6aL, Ascii: \"8qRe9e6PjnuT6dAQ8P1KdWwafr2NmdOaUqnCHrX8BoxHAPPr06gM4rSurQ4wO5btRSvdaAOkdgWSpQL3LmWwQ\");\n            yield return (Hash: 0xbe5002449c5afd59UL, Seed: 0x0000000000000000L, Ascii: \"Ys2i2ULXx10I95yTezfu5fMxIxY2lKI23rjhPzB0tSSR1mmCVfNk0MylEWDLrLJKDm6zwoaf5dW3lWs1gvOvn\");\n            yield return (Hash: 0x1b22ffa874aa62a6UL, Seed: 0x0000000000001467L, Ascii: \"RTsWdlmUBgkRcvDDd6NP4GyFgarm1I9nqAEyD84zhOylaT7JSxayq9eEPaDRCjXSZ4fittmekdaz2SNpMPnVOw\");\n            yield return (Hash: 0x4cb7b95275b52414UL, Seed: 0x0000000000000967L, Ascii: \"WzUnFL0OucevcOamRIuPYS07D125Qle6Lq6xT8y0oRJj6pcZfrTde5KDSt1g7IuvAVR34wD6TRqcdsi3Ul5SUk\");\n            yield return (Hash: 0x83d1079074aeaf83UL, Seed: 0x34710ce41037c450L, Ascii: \"HOqOvCuFWK5zJrbPrTuqRmS1Gu5iJnsy10GCBEqfd21vB6yhJX4UE44UIXxHiWaTd8kVZb98TstXHPpsbY9cnI\");\n            yield return (Hash: 0xa17c4e08e4349f16UL, Seed: 0x0000000000000020L, Ascii: \"pznGNp5jjnmpUPCia2hhUcCNifekLJ7j8WrBlDDMaeeWKEVAcnkezBSpeLIMu1Ug6ddZDdrKgB4vTKgATvuJr0\");\n            yield return (Hash: 0x0caeae29d25ea5deUL, Seed: 0x60e2dfb361ec07a6L, Ascii: \"icHYkTi8vGXsvjXjbKI00iY06R927cl8tByHNmk7oXIDCZF2Hv2qwpp0eQFP8BpXRXPKS7kZqF9LIOAUHPJarVc\");\n            yield return (Hash: 0x46c9cd1a30dd820fUL, Seed: 0x00000000000005ffL, Ascii: \"PV5W9JFi16GN7eVIGpPgyCjhaWBMGPmZgvdvTWJdLK6XcySgEbpvO1NMN37TaHGs4pQsZDPCIX70Iu6bo97TeTo\");\n            yield return (Hash: 0x7fa1d9f84a987ab6UL, Seed: 0x0000000000001258L, Ascii: \"oWBsc5EmYQwmbCptYMN4hmpN1pyeIhS1yL4dFajXbhfmgrxVmT3YfdCZeefAQkcxEAqxScBVDLVB3dP9xIpzg8J\");\n            yield return (Hash: 0xbe7ad921af2a5da6UL, Seed: 0x30d1280a2255cff0L, Ascii: \"Fdmm0omXgPBESo0geVOZuT28dNiz0haDn2DX4NYyfTEzSu3XKmtg8Ppbwrkw2YTe6Jpc6HAb9uTiMln31GaUTzd\");\n            yield return (Hash: 0x226482ad0a2c2f1aUL, Seed: 0x0000000000000ca6L, Ascii: \"msE9S2EKEiEI0Ckcv2tlMykdR2hAwu7bKOocWKj6JT1vkuHitZT6ltdUVKw6xzHrCgHDMCd7pDZlTyBddDq73OB1\");\n            yield return (Hash: 0x428b0b9ea4b1c6d3UL, Seed: 0x00000000000001e4L, Ascii: \"eN66tT6yA5bkLXKxju7LhsVsDCXh9b2nKAcxUMlLk6kOG9hgwf90jmR24jnufoW2Mhy4inON8yFz59jIWUWQiIAe\");\n            yield return (Hash: 0x7359fcca541066d3UL, Seed: 0x00000000000009c4L, Ascii: \"T9XJsRN6EtJFuhAnOfJmc4ebq50rHPxhO7BIVuqZzMmyIB5e34HAMU4gZHmKI5i3f2LXd8agHjiv9txK5EoCaCgX\");\n            yield return (Hash: 0xbd706fc291828469UL, Seed: 0x5745190cbbf503feL, Ascii: \"3b6fCjZVHW3sGOBouCLm9qnQhu2mqWDXLaiWZ3AULlb38LYnnpaY3BUUcFlOz6FQtjdjIFrlH04ht8fd1WTmaM7G\");\n            yield return (Hash: 0x1cab1caa20a63b8fUL, Seed: 0x000000000000119aL, Ascii: \"1h5xhrLp5Pm4aUTB2VxKj4tt622qO9eBswifEsh6AyOhoKUokwRMjVhIuiM3kPqXElD7yh2U9XyfxbR7gqUMVgXSA\");\n            yield return (Hash: 0x67723ba0770dc63bUL, Seed: 0x000000000000042bL, Ascii: \"CMMnPlYPFfpMQ2GFAxEzzBR6SYlEemynU4iiOkxcQnJ0gQOsA1HI4zOqCx0p5xdWvw6KKCT6SznlV9Rb8Pmfc3ret\");\n            yield return (Hash: 0x8b655ec79b658b59UL, Seed: 0x0000000000001dd3L, Ascii: \"805Kt79f2xIrEgaoLoYb2fukowtErK9PdjHeqTZNVxPVEHod0KSJVjSzNPYKP0hJmiALt65FpIFUUBsu5XZJqzr3H\");\n            yield return (Hash: 0xc18e84aa38fae6e7UL, Seed: 0x0000000000001c59L, Ascii: \"hrfOJ94OlRphBxBnrfLRNW30oUiDf8S8mLJL2CLnwga3PDxaZKuTK98GwP1Rr3mRFlRj2WXR69knsqmY60CeaC3a4\");\n            yield return (Hash: 0x09d16f7ff0ed09fcUL, Seed: 0x54cb3bfe8ca3fa31L, Ascii: \"mncxHLZA2MOTR3FQ2O9VAXPekOvJwy4qwis7dztqNGDz6rIhubuBrTwgD9MXwgdN9nmdAs8JvmZzMEodiaHVI4aJJx\");\n            yield return (Hash: 0x389fd001cc7be725UL, Seed: 0x0000000000001494L, Ascii: \"tkUoWSt4GsMaFYvzDYB1eKymiyFlW0kYGpWCH3RR3bKhGerJ7ZD7nKeTfyonVau3Q0XDbs2YufUVDKpbyo5K4pqHar\");\n            yield return (Hash: 0x5bf48ce4ec08ffe6UL, Seed: 0x00000000000012cbL, Ascii: \"QCH1shq4UBmQW8lq68B8Nk1sIBLqoRRqCpC6tSYQoxNZtvrVVyL32ziy5tFoJQYedW39KrycO8Bz7EMUoCIAvpdd9k\");\n            yield return (Hash: 0xec13fdbd7318eabcUL, Seed: 0x0000000000002142L, Ascii: \"A5PjqMnYlEFIsdQY3D6w34CLQRDC18OgGRwg1ojrsTg3S1xloYXDzoaM5qxzEU4sOSCW03BWyrLV9orKJYUowrwVWi\");\n            yield return (Hash: 0x452f1c52dee0a2ebUL, Seed: 0x0000000000001da9L, Ascii: \"RJWlnW50Y596v38EioTodlxPOyjRhs4aXZfuuQnNmRkcno0j7Wlas5fCBBKHADdQ357mzP16uNcsE9ZoqVKBj55hR0f\");\n            yield return (Hash: 0x5f10befe82e567e4UL, Seed: 0x000000000000078fL, Ascii: \"sxfHb96ETfH1gsllblJmHJ419swjLnVPGNh9L8kSdNgFNeK4SObPrb1YiHiP6q2GVWuuB7tDIDTTCT8Mw4Rv0StywGH\");\n            yield return (Hash: 0x94877f733cc71902UL, Seed: 0x0ca925d9e177c363L, Ascii: \"fxPzz16TkqExxzvWxgmVTppXlpxTpRnBdmGNTCmJT5Mv3JDlZGuUfhWmOmkBu7Vh2t4isZiJ48jIr556Ut2IfZDOWjm\");\n            yield return (Hash: 0xcee906862dc4a784UL, Seed: 0x0000000000001ed6L, Ascii: \"plbKTkmoJKnv4zlCt9IsROTrT4pkR0AdiU38pDjI2nlXdixf2uZW07InGOSI6E4Evn6LMqkUGuvzpeFkjIUB7OlqRdR\");\n            yield return (Hash: 0x0614087ffd6ca8bbUL, Seed: 0x0000000000000602L, Ascii: \"bsz8XLhzwmbIaM690caHhkWWxzXs8VUinQQLhQ9JfAe3lwPttXOcqf1eSngar4T3Ut6IVMWwfW43ENQneTjuuIwOWS3p\");\n            yield return (Hash: 0x2b598e9c129c5d16UL, Seed: 0x0000000000000eeaL, Ascii: \"QtnJzyD0qIHgIFuhTa95GWjzsMtz8EWYsGi5Kg5uY95A2ucHKibo8kr2ymepSYC8fKt8yivOVriciCagMB8wHORKO38o\");\n            yield return (Hash: 0x9b8151c029009113UL, Seed: 0x0000000000000387L, Ascii: \"UpXLB8btnEY2reXU3HGbjZ1viz1cyhkrVYn4BpSRwrFSesbm9uJvE3LQ3emRWt02X0eIQUAnUSA630GSrp97uWs8XIkC\");\n            yield return (Hash: 0xdb29ddde0611246cUL, Seed: 0x0000000000000000L, Ascii: \"p2ZHDFlKSGEH1FHyi8VL71p0mX6FConLxy0Jhaiy0tj6JMIWA62SxUw3jW3uluBBUtPyiyHCV7SFjFRmgTZK93VpIeWX\");\n            yield return (Hash: 0x04f0914eed2fe118UL, Seed: 0x27d35b7ad1dbb2d9L, Ascii: \"v6MgHS6LMB7OgVENx4TbtYMd1kcVwyvKNAXxsv4h7Pz67utR3mGj8hgxqFlC4jzIXPDQeJVNARK05tQ2mpUEQIqTjwM8b\");\n            yield return (Hash: 0x2a1c3f49c55ddaccUL, Seed: 0x0000000000001da4L, Ascii: \"sk5J8Df1UtxtOeUYFieEwdlc19AuNdW8wFkgFFFhAYBLHRjbQXbZjRug9jpWrwCNdo3gW6LdS5mHzyDi5UD1y2qpquCdr\");\n            yield return (Hash: 0x46a1a4f2145641edUL, Seed: 0x0000000000000000L, Ascii: \"AecznQe8iEMZeWWTmpTPQSXOWJGea9f7LtndRQ4phOtCM1PbAQip1QNIGqng8YPweeZHN0JBggBNiLe1UCTsJz1XLyhLZ\");\n            yield return (Hash: 0xe88b880280c592c6UL, Seed: 0x0000000000001e9fL, Ascii: \"yV7nZTSS6GgjMkj1npv2Z8rtqA1tOeQw7D4xyLL2lUYppZ9j42cazdHhf0kbyhpKtwYrFQ9mMcAdFwm74S2mpJAcII7FI\");\n            yield return (Hash: 0x11cf49be976874bcUL, Seed: 0x6f88fd13e34392a1L, Ascii: \"1Q2UdjUFr1gBxskQDm4Rla2CmaXbimwoMVnVqGP0MbpTIR5oor1dcTSlldIV5iP3PTwUoICH26X4gBnhg6I1t5fLIYvYOd\");\n            yield return (Hash: 0x87670f2eab7cbef0UL, Seed: 0x0000000000000000L, Ascii: \"O58pvF3a8YRtgya9zzl01iZ7QObwQNJ1Zk5FlsQmApHVXMtyugINWuw2gOzBNwMTa9CYemEDEJUqTE5bLojrHONUi6BQgr\");\n            yield return (Hash: 0xcfe511f77cd77b5fUL, Seed: 0x0000000000001700L, Ascii: \"GhtLuZMyG1XQnAyyIa7RCqT5sMQrywQfcjehPBvYWra9XHYq2l6ARUdod0Sa8FeTLSX05eiERBM23MmVdsA2OKLScV1OBx\");\n            yield return (Hash: 0xec7c228e580274e1UL, Seed: 0x00000000000026acL, Ascii: \"SZSYg617FijnkY3bDV4fXvrWGk88t78nvfURjMdp8c5HCGZMB8uVXEVYXdfqcrCofd4OF7gC4Vkr9i0tW7HwaHFl3jFPsI\");\n            yield return (Hash: 0x17e490b092d5f12fUL, Seed: 0x0ca6fa8ccee7f53bL, Ascii: \"dBaNLClzLlWyHovtJt6GhPRW0xZpaTFsHIt8dBUvezPPrGkqkgoBZ3TZ1KdgMjGCD4U9fODbDcahLmSnLgg4GDRBA90vPIh\");\n            yield return (Hash: 0x4c04462a95dfdf58UL, Seed: 0x000000000000112eL, Ascii: \"VfqlsjAkcKGLKdn3Uaw7CqBBsM97ZbBdtmCYeqtSDKSkw5F7Jsj7Hog0zQdRslNVL5jsjEYBTSJSHdQ1D9yeenW9SfvE1KP\");\n            yield return (Hash: 0x96fd16abc09847a9UL, Seed: 0x000000000000109eL, Ascii: \"2Ek7E3bnqhTtPcWwGmqBTU2SCXsfq5FPUl5huI1S0ybZi20XzG9GLjFJNa33NV3ymgwkMVZKBur8KHbEnuaHhDfbIbarc94\");\n            yield return (Hash: 0xb72a8cd0e91edcb3UL, Seed: 0x0000000000000000L, Ascii: \"Az7ehWUO16NwvRHyVdIJXEliFvTFhSnh4xxU2tZzZa1c7hlFZaS0ogKlYUSbmlGV79UGZkXNaWKFnhyNhP0n36MNWLv3gWX\");\n            yield return (Hash: 0x1b90993abc429a56UL, Seed: 0x00000000000004d5L, Ascii: \"aDsLKOX8ej6wfnhD0RZledxUxAepdUjpVTnQfWwi9fx6nOY9VzhsI33fQKusiX6FipsaiKoeAb708o8q29PgACXUnndM2BK3\");\n            yield return (Hash: 0x586b472186a33b85UL, Seed: 0x0000000000000fc0L, Ascii: \"DlXZF0c4JMLqt1lfVbCwp36tpCs2Hni4DaAiuAdXjQJLT4IfijfPusvPaOZOXujM3gPNOJCfQJloybPl4lmmVVnJABVAphzR\");\n            yield return (Hash: 0x84f7b324e9911c2dUL, Seed: 0x0000000000002340L, Ascii: \"enTD8N3YsFrowNU6lIBkYvdIOJlzAm17C88wWa8NLrWeUDwF9mASo1Wc4r7lZ5x5Hk59TaAYW5xFfFoCZeP9hEk0fUbSJCXw\");\n            yield return (Hash: 0xc983a6024a05331bUL, Seed: 0x0000000000001d7aL, Ascii: \"byZ3cRkWHTmzZYK2uWWYNI4wiCktVbi63lZWLgNzwWpOfEORLlzG6Nyqy9Bl1G3YmgwEIMbwXFXTpZ8krRkTC8NutauCE3aP\");\n            yield return (Hash: 0x147bb10c876c3f3aUL, Seed: 0x0000000000001c7fL, Ascii: \"YhKrs3ZYmrSa5VSRZGM4V8OYvXckAvoQNPtV07iCUJeKDmYOk1fNmkVLwSlBWrjslzkib2pRljteQWICxd4nR3iBhRu2SOHjE\");\n            yield return (Hash: 0x5023f2dd584a7ef5UL, Seed: 0x0000000000000b83L, Ascii: \"8xNVKxaxHKCpuyN99eRUFC7J0aUjryo19gTm0DTe3uClUzIAMQ5s3GRZtm0yYvLoMv24ZQDb5Eoe4BlX0vFfkFekryVZbnHhp\");\n            yield return (Hash: 0x9aa4fbae84568311UL, Seed: 0x0000000000000000L, Ascii: \"lEeV9huQLVCi6UVI2b97K1o5ELJHCm2sWBSUC8IVFGZavNez0OGxkIJblx2WowrsVJoL5xLAr8rLfOX6J8B3wSJaPzM3RsjrV\");\n            yield return (Hash: 0xeb4b8246daf6b081UL, Seed: 0x00000000000009c4L, Ascii: \"DIoXdkmKdPkqgmD754zIBJhvXejvnEVzCQVg3i51ShwxkvfsWK9VIkVqIROx5wpav0PyEyWWtfQ0M7pbVsLM9cOgowZQ8BR2A\");\n            yield return (Hash: 0x1de7529838e86b6dUL, Seed: 0x00000000000014d3L, Ascii: \"q1JfFrO90sN7C9FSs5fdL1jQqiQblGaKd6r4hc2exz9MSjBZ0AZi6tA7QK88Yp3lclgjP02GCS83QBhCfBeITWoA9bpz4tzDwV\");\n            yield return (Hash: 0x45fa0d4685c2ebb0UL, Seed: 0x1b540f1754eabeb5L, Ascii: \"muZJfTugpL1NztwGkqgXUcEZmNxJOEMCB7itdUP1vKp4d29NVA1SIWZAefELEt88YRZngUBsczSgCdojJfwk5b8XSkoNortOfg\");\n            yield return (Hash: 0x99a5a51d4a282b94UL, Seed: 0x3f25c8cbbe8d8cecL, Ascii: \"dJOhJRCO3QObtEcE37h7boKXSFBuyKkEVoPsU69Yy8jOJbBD8ImjW7AqvHYUtGk4FlJlTK1h2XzRgtXpIUxMUNeH9KQCeXgGIx\");\n            yield return (Hash: 0xe78112a8b92738fcUL, Seed: 0x0000000000000351L, Ascii: \"RUju8gCDfD28Gh28UsjsteaYN7c7PmnabjqBLgCvM8jzMfpFMF7OakYmtMAx9VBC7Xta4iT5Gr1sn4l0mLvhL9gEe8BMSuFFL4\");\n            yield return (Hash: 0x0eed250fb56d235aUL, Seed: 0x0000000000001448L, Ascii: \"lGWvIexcyBKiKnUMvSQzo9BceGBuAf4WmAqdgKgppmhSrvmdOdEVyxvxq7GftnfRx2HxoiPARdO3DK1bzPKMbclWs9NEM4oQB08\");\n            yield return (Hash: 0x8381613f03281997UL, Seed: 0x0000000000000399L, Ascii: \"P4cbUGRzgVYZQQVJSR9DnankJ5dWEAiQfnt8RMIfWaObfrrPTc3QU2IqL7Mp4oNtAydl0XGoFQbF2hJr3utSZclmSMieRJNGHOL\");\n            yield return (Hash: 0xa74460383890ca93UL, Seed: 0x0000000000000000L, Ascii: \"FiQri1z7OnyQOHXTum3o9AAZCz8iMWsIdADPtrIp6nHWgf0kf04CiWTdTEfhupYVt23z3UzycQzkV6rOg0uZvcK3gGA0ShYmnuR\");\n            yield return (Hash: 0xdf4bbc8c3cb72979UL, Seed: 0x0000000000001382L, Ascii: \"1MJLEsLLvs1aM8KICum2XF7Z148NFlYwPnqmoZ8SmLyqogW9SKtgI7VdK0HSQM3bHig4K5w3NXIRCd8BQ7kbW0hWkBszY9pWca3\");\n            yield return (Hash: 0x0ee2d04e985273b6UL, Seed: 0x0000000000000b98L, Ascii: \"KoKne76FGJfH1TokABK1wmFqwzJetkU6OO9umoiMoCBbnJywDbWEZF71TwAlVxp2HgXCIR5x7O9d5RRisvzHD4kwe9wal69kWFs4\");\n            yield return (Hash: 0x8d7ab8aa221002b5UL, Seed: 0x5676131a5b81e39cL, Ascii: \"vMsWYScvCxCi5txDAf4i2Abg6mnQpY4SMAxJ74eIelYZlAvN2ZzinYbCsNDcBAnFcnoR8EDsxdd2dKB78pSx6QdoejvoGNxXE7sv\");\n            yield return (Hash: 0xda5ba3da92a42e0bUL, Seed: 0x0000000000001345L, Ascii: \"xl8l6PuZIF5k8eBlRdhsvXElTOuMCRtKNSeNRdmnzYr5WSCkNsCMu31fYZkg0UImOkJmNKtaXno8rVFSpRz27aIFJbzBTJ9o7PGa\");\n            yield return (Hash: 0xe9ab593426301e7cUL, Seed: 0x0000000000000afaL, Ascii: \"CixcGldVkzXHsgO9NFfeEtr7uJAIyby5k2HTskxIkjbOL4mirmkUlcy5lrzRuhGJFpzEYfAutGqKGAYdnx9UkhApx5eDMzEYRG5b\");\n            yield return (Hash: 0x203f2c07c44fe1ecUL, Seed: 0x0000000000000f93L, Ascii: \"VJ2gEMmhpR0G2oN1nuX9wvYKu2e9cWenEgN3KQOk2Lp91TzB1T2gJTVgzH5HV3jR02rXLsVjHGCsPer4tzru56uUk3LVLsGWZ14gO\");\n            yield return (Hash: 0x58f729f3e80eefb6UL, Seed: 0x00000000000012f6L, Ascii: \"M8zzd22RD965pkcs1LVUciCYntDxLPJqlUB6S6mpCfkB2qAvrVA80oMMYHFKk8DkiKZIqJzKz48mdkZDES48Q1m3NIFRWWdqewFmL\");\n            yield return (Hash: 0x876b3b0b29ffe55bUL, Seed: 0x000000000000191eL, Ascii: \"4j4ol2DDiy5k4o1zbXj2dDJwsh4d9uL3MiWkDtwiHMrM2lDoE1HuGCG5nuL90ZTzeVvD3VMAYa1qTTFBaT8ksK0aLbyJg13zhO3VN\");\n            yield return (Hash: 0xcbfe84163ddb8516UL, Seed: 0x000000000000118cL, Ascii: \"2MCeN6Wy4zmwOjfQVMqcfO0kMtiVN3wsYBolyqurxKLHDkHkzVUfNBu7xcvxOkoIjMymYvd0O0YODxC0fB2HIqwm3JGYODHAkgkdg\");\n            yield return (Hash: 0x3158aa5aabc9d13eUL, Seed: 0x00c8c7ed5cb31073L, Ascii: \"dNpfYJyD1cl3a7bTG1S7GBtBnOFTsZgbk74LrZlcwmBP09aLuW5CeYaFHVKAAken0PyXel7YFNLPTUiz8KVgMffK2mWux6dHcqYqGh\");\n            yield return (Hash: 0x6dbb34cdb0046dc9UL, Seed: 0x00000000000017c1L, Ascii: \"dv2CvYIaluVrrg2Qpa9sUipj9yD6VmOhp21RA6XDibYrrnOFvIlIeG1IbVj1I9AGMsfQQHtXxBat3RTz33akQ1WEtimP3dp2n6l58g\");\n            yield return (Hash: 0xa7988f23ec9413a4UL, Seed: 0x0000000000000000L, Ascii: \"vRnEYJ42n6Lb8vaIhDfQQBgs15GstAYyqb1K1JKBPr4dfgjWxDxHgxThFgASYVtkNBaqnJRlSo8bLQHNbrPHj6sE4KcPwa9IrrSLPs\");\n            yield return (Hash: 0xd9ea0490dda36fccUL, Seed: 0x13a1b6117c92c32aL, Ascii: \"konuMUTcPb4YcE8rPUlrBKyQs3VyhESFAKajW61QircmO1PZSylIAsN7Rydpmixc2VAhOVoRrwjJMLFN6OynVC0eJA08YcatYivyq8\");\n            yield return (Hash: 0x0fa2b0e5d742b210UL, Seed: 0x0000000000000000L, Ascii: \"9at4zzJbKSkzZ7QzpC8XQBfTxNCKVfm4BNIQQJ3mXOVItuuthILZoLXv063v16nUkwAbZ35IhCHtDISPaaqyN3BvkduXr8A8JIKnicQ\");\n            yield return (Hash: 0x5665847680d15edcUL, Seed: 0x00000000000018ecL, Ascii: \"Tq05bClJTAUlpR1BybMz0tR8O8Qba1tK5riABfzBzw3jYJUrngZD5n0cOWax4pNn6aBFAnfATk2N20lOlJ6Pl1wnbV2LPcCG0fliz44\");\n            yield return (Hash: 0xc32ea538ed53f799UL, Seed: 0x0000000000002702L, Ascii: \"RDtQGbzGx5lMpq5BRzZS3LRw6SyG94SVcWAiAHcP8zxwKAmI7AL4styZHcFDV8wEBVbWj5i74QFitVpmXJ6qMwtpZ6X91zz6Sg7zYv4\");\n            yield return (Hash: 0xdd71ddce940ac878UL, Seed: 0x430c6bfa730ca3acL, Ascii: \"wcmuStaaAqHZT55kNk0cPMn6Ss4bfZqrNljRvHTWLdJdPpnJVp3NvumEQnyDjUk7w4XDMWZnijh7eSDRQvXBkKCb1OjmJhqJzIuzWLQ\");\n            yield return (Hash: 0x198281582b5924a1UL, Seed: 0x0000000000000000L, Ascii: \"4NV18d9gEA2fWXahWTEpIHIm2yvtgzALIxerEHBdgdw0OqLFTmh8OCws89kcUhqn76dgvTNKKO3Vez3GMjy5wfvXsR6sMbv1mQoPAv1w\");\n            yield return (Hash: 0x38fa79cc2d2472bbUL, Seed: 0x0000000000000000L, Ascii: \"NA1JBZi1MP272ObONjM8pPiSEgpjV1CKdr2cQctD2KMCKH7BwhJPubNEfOnI4UZ5gRSywtYE7VIcz35Q6ptCEHzieGQguFxtYTRM5HwH\");\n            yield return (Hash: 0x80cb8013c3ec5cceUL, Seed: 0x000000000000012dL, Ascii: \"lah5ogTyrmN1wV3Sk2RCYngrQ0eaHQHij9G7yaLSkF4ccmvBqlEPAyGJUZfnb47Ur1qKLhCnpsX7beYb9VtDTrjUmRaUWVtpEBLoOHs1\");\n            yield return (Hash: 0xc24dfddeb995cf67UL, Seed: 0x000000000000021eL, Ascii: \"c7jOJNcVq66FO6Zsa3lijt1DzXFlH9Vq6IImFxw9fILZRhoyUt4baGcO6BwB1HoPBgimCNB4mcUzTdB8IzmUPCnlds03TsT0NUx2SeMf\");\n            yield return (Hash: 0x21134d044a9b37b3UL, Seed: 0x125e614646dae5a6L, Ascii: \"VUqqX9d4m02E3ZrqFVjjYEYUQWTb5nyICzCBehfzYujhDz8enZhbuqOl6aEf6LLlmqVKT7oDLi7rgQX4ov5LMEmROFNkOTUICQ437uzUk\");\n            yield return (Hash: 0x97171ee302edc140UL, Seed: 0x0000000000001183L, Ascii: \"wEy7HTHaOEMIqhXWHC06r3D7GbWfEDtLspXQXf24nzuLegqU7fbLogdbtMwwnO9oMpVMLM2gAN0MrwNs5jNzTI9C5gEghpDXjgvb1SnB7\");\n            yield return (Hash: 0xc802b73a20aaf6dfUL, Seed: 0x0000000000000a65L, Ascii: \"BTgr0thLDUNJWUHBpLNclyIGUK3wFqtAjV5qRIA2Tis26GOpS9daJCSAmSAnNtINFXPqQyXud7Yvk0oyZMaFvLWI1h8i7FT7sHq74jLho\");\n            yield return (Hash: 0xd19df667dd4576b1UL, Seed: 0x0000000000000000L, Ascii: \"6MUY5w78z1s4HJSrSHxYbsssWba85V4dHlw4m6BIovgyRF1kcPcAcrptVplsZ1QxTsWqJcTaJluJuT10ErL3LWVbRq7E0kSiSkXuxU7yy\");\n            yield return (Hash: 0x0820f2bd728d2e64UL, Seed: 0x0000000000001764L, Ascii: \"mrcfUdgjly8Q3Hozf82396puLhdh6rPb9YR7YYehjKgzzlaacbUkCNPEl9SZJ4nyhM1F3EqkQgrFspmF1olnGhYqErbk6Td6Hjq4X7ukZP\");\n            yield return (Hash: 0x2f4edbda49e07dbeUL, Seed: 0x000000000000115dL, Ascii: \"Bem3uWWi7UrkICxMyg5QjHRfiEK2MEeLyhRi8BE6EtZFMYCJdCJ0ISICUKjaS5OPOifKFMVUE4eWQ7rJ44neh6oKSYJaweeaV9Xt5q91o7\");\n            yield return (Hash: 0x8e35d367ff38db36UL, Seed: 0x0c82a4507bdb4368L, Ascii: \"Ws5KhyfRqtoo1z2eNAWJlIafgLV3QD0D06MRISpT8eIUNLkzJ37ZhYbXS5LkAAWidw4cKrJFIT7vRy70ugveCvEDlBZxds31ZkgGDmyaHT\");\n            yield return (Hash: 0xbeb965119996f3bcUL, Seed: 0x0000000000001610L, Ascii: \"ttvDZ7Y7FO1cbhVVL4qAYBJ9gfvjTvTdk3e4nbLVKtfnINNRPZgcw9psemLB1mdE4M4rh3LzSfQ8atHh8Zrbymsyxn2yw5hzq7uvSmBKgN\");\n            yield return (Hash: 0x04ca424534e7a326UL, Seed: 0x000000000000186cL, Ascii: \"m1v6gn9c24FcnmfrDUirtQnKMbI3aVrGwks3P7mE6lUpYgEkRrlJde46plOPzqMC67JBfwvbGYNdtXSZdGEJ4RLUeG9YAfjbSXO1p2vqYHn\");\n            yield return (Hash: 0x268f0477f332eea3UL, Seed: 0x06432474765b54a0L, Ascii: \"Q4YVo8pphP5tR2lRq0hUuV5x3DU7uSUcdENYNYtb7rGVnqkrK5sNjbYawVWMDIDwMXslrl8UMM0WIXh1L1vO3uV12nwixlrfv3e8O8N0PxJ\");\n            yield return (Hash: 0x7758c4b2b857fd99UL, Seed: 0x0000000000001648L, Ascii: \"ynkXthgDExjk58lj18xS52kRMXRza6m2Ef3fI2yWa1Zsttg5jPVVrbdwO2L3JM04fGX4rBkjPnhlYiTBTMLTLk1XSgrBicNa45yPTijloTU\");\n            yield return (Hash: 0xe213a8cf7c8ada2eUL, Seed: 0x000000000000088aL, Ascii: \"Mbm2N6Ql3AcvccjzCM5JJcqPiqbJwBAJbfLpdmUtvY6GFoHGhlOoY6DABNDWmB2c8bsEIKdDlqyknbrLzqJny0MksQMv1N7tGqZrrfKx7bE\");\n            yield return (Hash: 0x2f4b4fad3c139743UL, Seed: 0x0000000000000000L, Ascii: \"ilbYweKSYLsZjZ396Qms3bqxt3uPshmTRvvHmGF4Bw2pAFbtoErKRdZTGUGh0ZNi5X0MsU8zGBVUo6JvsYMx5hnFfurjcobbaXjAgI0hk4gW\");\n            yield return (Hash: 0x695961eb1362986cUL, Seed: 0x0000000000000537L, Ascii: \"S6X5lplz4f0v4fyu9ZfZzWhDknI945mHyW4yI7lSwJRjdc5drcIqHSKQutfVpVAEBJ83uAl9X8JELAQBstSOXkYTg0nB215XYZeGv9LYmYRu\");\n            yield return (Hash: 0xbe2cfbd93fdae242UL, Seed: 0x0000000000001514L, Ascii: \"DZVFRcVzfvRveuyKN4KwzoEflsy0ejkjY1VeMsnd54920VkRdnP8sLeue0LxNPRjOqeCPdperH6wCfQiuEGXsZK1nCdc4eB193GwL40FrUUr\");\n            yield return (Hash: 0xeedc1c01479a9084UL, Seed: 0x2aa91d47fa101199L, Ascii: \"545eAVBh4b7h8aehQQEg1dLzfuxwMUWHyaIWVGcIu5BAvfPq7SKZDTvcZwuI6TyJCXQDw6U5Rj6DSHD0UOdEKfsQdnFfu4biL2sJF9PLboRZ\");\n            yield return (Hash: 0x26936c891adfb591UL, Seed: 0x0000000000001cb4L, Ascii: \"7g7zhlNtdOEzZU1fed9IlHXbHhucy1rr2SCXnDs4tqAJK8x4aOVICZnFGRkICrQp7AFVY2LnYEttVsr95qnh8Z7fzpUlvEkLOPpPXLx4y7fih\");\n            yield return (Hash: 0x8ad761040068411fUL, Seed: 0x0000000000001a3dL, Ascii: \"dxcMi9u4rCVHP33GxxszNRHc3ZrHRHfAdHCuLlNkrwNqcAHY571SEeNtywxxMLz5RRt0UDWQcUBoOoHDgHFTt60B372nKOIYgwk8lVETPJ5Nd\");\n            yield return (Hash: 0xab6667dfb4090e8aUL, Seed: 0x0000000000000901L, Ascii: \"aajuMfDbNWoyon6w0jFUp5tBkzzxJolEMVPcQLGL61OjH5IVlxLcC9c9FCXS4B8GUIRFlB0WCgHZ7frwBKSAiruI4mi2VBhmSu2KC4paVBSPj\");\n            yield return (Hash: 0xc9cb7ea74e72235aUL, Seed: 0x27a315498513d45dL, Ascii: \"HG0QpHMCdIRTDLZ9ZWWyCrbpRNPibPTr0I0Tsg9ghDLIp5thiynBVmdxOrf27XA3n6YWHWEXNgarBNXJKethif5911W8ltsfDPoHTku3soCHz\");\n            yield return (Hash: 0x6447b5df3e24c18bUL, Seed: 0x0000000000000966L, Ascii: \"7JWbki9hlTEOHarwjE9nxy9f4XEp2rdxNnm2LannA48ZYsvuc2ROx9cEMJXSmVfgiUDWCYkdRKb0G4Jati75y5u4xs9J9Mtl9c7bzFvwNm4YrF\");\n            yield return (Hash: 0x976051f0c760a3e8UL, Seed: 0x00000000000009d5L, Ascii: \"l8hv8CxLrilgAOYRQoWzTeyA7AcDE3rp8rbW00GwdrTgBHA0xr1gGdvtQhfWEvkdHrJunoHhQzl2mjTwOZWqCiQyaJqLoCFOnDIJk2ZYmOVLKt\");\n            yield return (Hash: 0xc2e0940485878d77UL, Seed: 0x4a7ce3b9fd7be6f9L, Ascii: \"jRMZhON2Jod0b5Eate6ICumrjHrrveYzKyqjlodKS8cGP4y8x7YXs688roH6JcmsCZBT6tDmteF6kCaQTqGgF7cb1O9XpknH1kqa7jV6TaHYav\");\n            yield return (Hash: 0xe88e34640f6b5cabUL, Seed: 0x0000000000000211L, Ascii: \"SemvpZAtfvyZ6eMvyWnLy7mRF77zttNn0rd1jv3lo9dEHcaCNdZsKMs2p70EtPokO0GR8gESY2wCUAiJuumvaObDz3XXABc3UKVMjHVxBA97GJ\");\n            yield return (Hash: 0x0f1df503bffdb3c4UL, Seed: 0x00000000000025aaL, Ascii: \"Zg5R4Ht8dmz3Tc5WHr1Rk2ObqEmfxFyfRW88nuLstcddmAzqMbswIDUWQkP6Fiwhp5LHE7y2q73ibaZgyILICNu00a6UARbEJjws3MtYjPGO4o1\");\n            yield return (Hash: 0x1b0c297bcfc9285bUL, Seed: 0x0000000000001c8aL, Ascii: \"uxS3iI0HXjLRuGbFQQrouJfQ9g0POnrQdxeO0Fo5Os9vpsMbrbFuuOS051HilwLGi5bIxGIvdO5qcV1omPywnSMgz1FCFhnQGcWov98gVkoWYDz\");\n            yield return (Hash: 0x67a34a335a2c54afUL, Seed: 0x00000000000017ddL, Ascii: \"5ELV3bT55nI5e39OaEHYw4tukRZRQg5wKhvGvJAV4r2GOFKpyg13UmrFVzBEfapjOsUeiY4jNFhlU8a4kKhHoxqPwl5OfyaUsxLYNPBXvewFZzD\");\n            yield return (Hash: 0xdbeeebd50869cb06UL, Seed: 0x28575846a38e23a0L, Ascii: \"TmnJlRfYqwg7y8zX4aRywJF4lhL6zdVJBUWbAXwZXhEzTgkHfd8eOehqKZ7sbwpzGIBjaAcRRGPOzXTlsudNUhFKQiPEbEy31oEjtPDkaAp4DNU\");\n            yield return (Hash: 0x2182b49e4cc4acdeUL, Seed: 0x0000000000000000L, Ascii: \"y7mSkgmgATyI6RrBQiwinhZOGEyNq4gDPtMIfauXlKv7nOgdkXo8nygfTbkiedQzxC5rYO7Q224tQdX3pHIOYa1uhjAIEfIAKu2AFIMO0zJObPZn\");\n            yield return (Hash: 0x56fc18243147280bUL, Seed: 0x0000000000001733L, Ascii: \"kvpSpqD7jHbHTlP9jZ73lSxfaFPUR06eWj9YuKOEuURLkqOEzlKRtNtlehWOqHBRvN5Ja8Ndrx65sBoHqiB0vP8vw3W9hM9FiKsRXSyVziJdMtf1\");\n            yield return (Hash: 0x8734cae7e1cfb3f9UL, Seed: 0x000000000000117cL, Ascii: \"ACvVLJN4YvbvrWlIBkloqpy0sEgxiXWyO4bkk2DdWG1sZ5fQZurYRjEIPHCRwNkMZSBoPzdSoFqyS3nMDAb5roZhCIA4LHNk4NqpywMI3eaBrqc3\");\n            yield return (Hash: 0xebafbd7a454adbcaUL, Seed: 0x00000000000004fdL, Ascii: \"JcvgEjRAnVnbr3vargAeaaBNli2QIDEWyo2jqLhB8c8vzALUYqqnkJh7dmW5fky6x8NL6hUFtAJ7kxVc8wOtlOjpZWqM8z3OWD35xmih3RW9e3PW\");\n            yield return (Hash: 0x0a5c30fd19ef1600UL, Seed: 0x0000000000000000L, Ascii: \"1osqpwzvEYMXBhwDCKUPlSjMVRW2qy8AKv6Hp9PugG0cLhwUztcjrEb506Bm6UPmS8i4icbB8xhu92MT9hff9xuLKKZg2qkEgDWm5PILwVpT9E8KJ\");\n            yield return (Hash: 0x532a97fb1bbf9811UL, Seed: 0x0000000000001457L, Ascii: \"sbkapE0QobFzNZ0QWsj1cMmPoGT7QGOUzoMDpgmwLkF9MsfnPT8GStThbxRaHsDr64pQ7vfdpDzylFP604F1aH6S2CGT51FdUKrdJ3BLMsd7B1eoJ\");\n            yield return (Hash: 0xa246174133a90683UL, Seed: 0x1f9194b29973d7c9L, Ascii: \"hf3UyHA316qMnV3ZWvZYKjmdaCgv8mNkqICISTU5S9AnuN8r68HrMrrY8nUSQ631LdpF1mfxP88I4uienZJNhaOOzfB5s20JexuxlRyLu6pUDqHRi\");\n            yield return (Hash: 0xe473bb0b18dad561UL, Seed: 0x0000000000000000L, Ascii: \"Mb1fTHyhvQNuCur14DwDIPky7QP9kdi9AUEcqJTeGbShRh1Qf2AB36QPbQe17mKzmfeNun1qisQzu2Y8YI4dlw44TFh0otAltgRHe6EKemPhRxUk5\");\n            yield return (Hash: 0x15fabb2a978ce118UL, Seed: 0x00000000000013bcL, Ascii: \"suvm9A69ZT4fDwAv8bb5qSoRq4wdLW0RQLgM6wNjzqSl3eeaIcPfk2jQy5wsyub23Vvqxp30cSxrzV1jECsTBYt9HGr7CQSssF4WtAJR1TzxsTZVBo\");\n            yield return (Hash: 0x479c639a1553c6aeUL, Seed: 0x0000000000002688L, Ascii: \"LTioJY66DooZXeELJKOZIOM94DnJS3xNqNT28mm6QofQTPIal2TtE188cOD5MxeUaMPxhnmb0MNfqybyp81ighJzODQzwH6LFlky3dObQ6ooeX6WQW\");\n            yield return (Hash: 0x6ca0f26ae8c1d331UL, Seed: 0x7ddd0fea86fc4155L, Ascii: \"PiRkx5zRiTzKmFEnS5CdpKiVR8BR7MC8SLdsJoUztXAprDJ9WSJ8i7SdEq0W6vZarlUWGux0b7eM7V7ioMGDxIDUkyYQLgJIdB2Biv9rXjbP9OT32s\");\n            yield return (Hash: 0xe0e79bac6592c4abUL, Seed: 0x0000000000000000L, Ascii: \"ez4oz0YxL2Jkn22gSC8bOB3pwGxJyTZ87OGkKQ30OgnGRIWHCFiujT7iDHczTW17niBoOg1vMMYjJWvPABRNKAE0M45PbLX2cqwmdSd4vjRKM78icV\");\n            yield return (Hash: 0x070315afe44b9339UL, Seed: 0x150ecd8202ec6f94L, Ascii: \"CdCswqltKhXEh2cz1bslQvLDyBwBg30jJf2PXuYMHrm0ttCaBhuG91QSq2pZDNMZYycOACbaBdaqm40WBoJqxKFoWGfaIkxlcY9gngw0HVjSMHLujt1\");\n            yield return (Hash: 0x656d3c3cd61dce52UL, Seed: 0x0000000000000570L, Ascii: \"J0iF4oPqTEEeQ5jwZxbBzeZtcCezbXoWuLOMdYpwA6lF3pQ4BGoKJ0aHSnwCxuWneUZFXmtM4qzCSzg4F8Cz8zncHfX8fcV36MrhxIayngvR0LzlWBH\");\n            yield return (Hash: 0x9a69e00c1c7e12e2UL, Seed: 0x0000000000000000L, Ascii: \"0Q4RacmwfaS9Z7YoJZvdV5NDXk1jWA0Dh8yj2cRQhAXYTx6MVrV65doHvtcJJ7zYqHnIXLmi3WhyrMPHpVwZyTPdtqAjw4yZ5ZDcTAxqVI0CewVB3F4\");\n            yield return (Hash: 0xc71cd837dbc94afcUL, Seed: 0x00000000000001edL, Ascii: \"JLMeBXM88Aoo6xrvTosLJdBkU6YYzKoNsopKfAdTxGq1EauEoOxSWQiJLNIvlFGgHmWaFaPNFjmLbq4OrKbD6lpk7mfTEcDVbNvji4yCzWDlkVQX0d4\");\n            yield return (Hash: 0x089fd886d3de3b94UL, Seed: 0x16571a16bbbcecdbL, Ascii: \"uKn1dndpEJ3N2bkSfnioYt447xio5E85vu2Oyx7rPqFPq6IGfu3ldNjppkfdSjaUXkAAcEYAxDNevOl6OOZoAyizIG6DPTZuAmq9kNf8m9bzxjlfDtX1\");\n            yield return (Hash: 0x5c3022fac6b1723fUL, Seed: 0x000000000000084aL, Ascii: \"lJzhKyv3xdb65vVwrdbpoS81txrDUsNRoNH5t4CgvjSLXvsrWu4iUW1LYJLZT4KldWJ34cIswprinL0ngFrcRkI3Sf1gkPSbIA1FVtctnOsPZS1y74Ov\");\n            yield return (Hash: 0xc73232c19baa0505UL, Seed: 0x51629b40fb407cdfL, Ascii: \"ZJ1nQjq9SRgzB9MRmv8D2iUazO7MYBoTqppTPl0zQLVyi24brxU1BVDrqGtQbgbOXrGNugUbqngR79vUjLnN51j9rSHWbTQt96K7cMiaRbJXzhCk3SSF\");\n            yield return (Hash: 0xf215115b86a2819cUL, Seed: 0x0000000000000000L, Ascii: \"eggHdD0JKgUjFttO86f8m4VUzNbRchbFvC5egeOyjZPtKCIjTEYiLurYBzhMs4lbDsdUolcKKmPhZ6QNb1yDgnJKzMvU7d7oPH1MK49uWnXrLap1y2De\");\n            yield return (Hash: 0x2169ed2234514636UL, Seed: 0x00000000000012e3L, Ascii: \"T08gMFR4dwi6dLgRYjNwJeXKCsMEy3MfEb5dtoKV7y2q1ABDOI9kEojlQZZ4pmD08k84F3tjZdVwEnzTdqdsddnrJWYhg80HeVCL7Xddr9J7DFyf5jX83\");\n            yield return (Hash: 0x5b845cd3e5abdea8UL, Seed: 0x0000000000001bedL, Ascii: \"gxVJPhh7jsSGrEmXquVDpC8Fyl0vZv2OLeEgiN19qmbVtnobg4ZzHLRxqcvAWF0CjvMD70MzVFI49CiXDLQ5N0lpENAA1G6ZU3tr13N7GeUCh9mDKBRuV\");\n            yield return (Hash: 0x746a054a23fa7727UL, Seed: 0x0000000000000000L, Ascii: \"j88XCe0gssrKv89sNDavDX3o8lo6PA9wi6PTYVm7wQLT5HUtVVf9rvx995f7BYPzuAwf1Vz9w8NvWTpqVWxRe8ODOTgPGc6Rm1qyHgJZ47nUfSSTeIceK\");\n            yield return (Hash: 0xc6aad5033c672074UL, Seed: 0x1deb3f9bc2d7fab5L, Ascii: \"dxT7avcylPgJJDwzume0GTP5OemkAhvVdMCryi5GOjimReS4wZfx3JjoJKhUPapov8DlmP3bRXoLdRfCvGnZk8AOwWtXcBOihM6FELk3PwQshwTnOjsoH\");\n            yield return (Hash: 0x20574bc491f9e1baUL, Seed: 0x0000000000000000L, Ascii: \"mw5M8OrwUXWPR8jYBNcyQKd74sB5OmpPdIfvG0zwbxRtJxk7Zp7mOrxI6u7Wi6H4augaat3De9MsxwEvbCXJb6OKjAalJaxh9xGgsbkf7hxRqXuWpVQJQ5\");\n            yield return (Hash: 0x7001a8ba4d87db44UL, Seed: 0x0000000000002378L, Ascii: \"D3DALUgqg5sSHA7y38PHxoPYC7ZAGba87jdK165Sf3LKhk6BdKMSBRFMIbMJ39qjDTyemqfXB4ngJ0TqvJFiWmnwHrsZaUebNgTA7Ie3kXWhQEZkyYxNAX\");\n            yield return (Hash: 0x900091edf042be43UL, Seed: 0x0000000000002426L, Ascii: \"BW3FTDpTd0ti3BlqKR9JTywoyzEaDtZ4SpUflwMoYyPNb6NNdkWjhh478Mz5zhEQColgpTfct6YwltR5aXbOkVH0WQL6JEV20eqF28QTibW4W5YaOidIdU\");\n            yield return (Hash: 0xdd6515369691aa63UL, Seed: 0x00000000000022bdL, Ascii: \"R95ufGUuwozutwJyHugFA1LD6LRebVMEYTRBCJX7F66FALs65ZctZkztFtuWHv6ZJK5F8GeAr83PJA9VH99WIDGxzpnJnrbRX6ac5BQBU5traRMmFnNmI5\");\n            yield return (Hash: 0x06253f841c936c22UL, Seed: 0x0000000000001b08L, Ascii: \"fa9PFmPkwourA0w8kgqtYOC4pzLZpmRZupeJQ3zxpqizARB9zDTxyIcaKJhzdEYDzR9D2f6sHDevG5RwSOuiw3bRRsHztjIvfBtentMUXB0FnvNr7cPfFUL\");\n            yield return (Hash: 0x4353e7506cb4fab9UL, Seed: 0x0000000000002578L, Ascii: \"nWjpSNomqnBRgLxX1XIEZOokQljYqGg47rasLRu6ik4HUDK2J33u68joIae5EKevMOWFpyEFLz0xwwWfHRk5zZOEFIhtvbRXCKVv6J1ySihD6VURmhEITAu\");\n            yield return (Hash: 0xadbb7aff6ce1b556UL, Seed: 0x0000000000000000L, Ascii: \"fEkGIcqyImaJ6a5XkoHR7hNfFBMQqwUiqDc2qVenrbXBRzDR6JlEXvHVrUQlpoUgLigNv20E5JB036PTL7P5cvke3cfffpfyRRpOZCmID4ah4wXgjqJZxDL\");\n            yield return (Hash: 0xec5d9884752bb987UL, Seed: 0x0000000000000000L, Ascii: \"h0dmpmYdBfkDgzSMVwwgbFHztjHm3LAtmzplqJBWiyIEmvAQmDp3yOWe4r0yk3La9oQQObEurfUwjHD17jBhFh9wYdgk0K4FSzVztfUA59vPvkYMMCedcxj\");\n            yield return (Hash: 0x1eb0fa46371b9e7aUL, Seed: 0x6ef0b80e82afb6e6L, Ascii: \"DYZbrjzRA49CJxbgbtMGholC08uAZwMx80APLGsHyAeWg4we170Y9bbvQ9ZJaOyoHMZ8Cm9npmac2moX7477HmhbSFJ9SGwrZwzM8XNFri7pW32jeiC7r0QE\");\n            yield return (Hash: 0x5049994dd302ba9dUL, Seed: 0x22b9503c0be28addL, Ascii: \"a7WZkZdJNAo8YoZSEPykILtVSKnmofkQDPKbmn3z7KV3WCRnBLY1nMzIUcmYhc9y694NwkqEfcB6gYgxWSmIVhcnb6ajl3xuWaSi4a5NTTfVXb1MJ2ZNTZOX\");\n            yield return (Hash: 0x944be9d4a6bba0ecUL, Seed: 0x25d77c238fae0965L, Ascii: \"ZVMmHy9A0KeocuovOZk1Tcdra0LYFTahBKJp1ZqBKz4S5ud0bp5SfWiFSFjU49wMYNxklCwpsqN404V3qQIhoxwPcAzk8p9Pc5LS976t0t0OaIFyVeMMD23K\");\n            yield return (Hash: 0xb9695ac6326a8ad9UL, Seed: 0x0000000000000000L, Ascii: \"Yb5xDwVr49RumOz0TTNCo9UI4g9beuUiNAXdOgtnt2Ac4e0uSPeLDb0jDz0E7shdlBaNXYQqxhk8mXuDCp2TFdFu9sAidqgx3fzFg0lV6XTxiw7quTxq4YqQ\");\n            yield return (Hash: 0x039f6923e00d8ea0UL, Seed: 0x0000000000000000L, Ascii: \"2dM2EworvyZsPrddBQeV1Fy4nglGaNmb3AMx5XXdtB7JKMvWJ5FkmQK9TX5nZSsaOJ4ejodmbcXS3ouItsJyEgJDCVFye1Hsbmc9PlIvDvMMIUtM2K6tOY8Bb\");\n            yield return (Hash: 0x313a951ea288cd74UL, Seed: 0x0000000000002500L, Ascii: \"SDHTckez9eTizt2778eK2avXdb8ZPXTB2DUd5TxKqmjMTIGtGI7BF2p0JlnIWYsqzd3xn8JhpmnT2oWxWy3U2bw8NbE4aHp3vBPGaaUm2xpV6yaVsTTxuKfmk\");\n            yield return (Hash: 0x940d618d2de4b77aUL, Seed: 0x0000000000001d58L, Ascii: \"efKBPphMEfx7NKuSPiEvxsNMBR4k9ehqo2YR8HgCAK1ZMAacELKQnjr4zniqLfauvLkV3M4eYK0hWd6ITDIxCjbOkTpvNz9f4L4tjzNCP5oW8hjrZwA9PtLFk\");\n            yield return (Hash: 0xc0a675e47892aae1UL, Seed: 0x0000000000000000L, Ascii: \"LB1wzaDyYNckrwL8ZqlTzqvwYKpK1L2Su5GwqGTyE895mzsFsPmetCadr9gXd3I7eZNzqR25oMnERLrMjSTmKYxRcLDLlFwSUeE3nN1Mxh6jOSdHlpASZKhDK\");\n            yield return (Hash: 0x3b021c66d1cef83cUL, Seed: 0x0000000000000000L, Ascii: \"to0CMhNGgBNfmXsMx0db0UgVSfhwPn8kCuHbC05UOU9Pir7fwTkNS2D0WUBkk8TtlnRd4kPQa5HbAtE3sSeBYv6gOZnCfBSmzQBe84nYQLz0npj8C8P87CFnvi\");\n            yield return (Hash: 0x4d206fb9c95585feUL, Seed: 0x00000000000008d2L, Ascii: \"Syjto1ID4pcwx4rmLfn0nL8tFwb5rRudN4fG6PsCLp7viesuyYUFXdtC9M3QXPHz2vLhm3OboqIczqjl77PxRrc36whJ5xOvi3pepo3yZwGgjhGmlqdtBm43vv\");\n            yield return (Hash: 0xaf66d3c74e3ced25UL, Seed: 0x0000000000000220L, Ascii: \"6q6JUmGZeVs2S88i0qKiyOOqEEIm5bAJbVshthBolDkLtalZVll1O5ZT2iogZoCZkjJm5pEGaL2OCqP3hTXNznY7d1YW4jPAR6A5R50JnqPQC6it7yDl0B7rxg\");\n            yield return (Hash: 0xf114025e07dc50f8UL, Seed: 0x0000000000000000L, Ascii: \"eZH1fd8pO6EDmo0o1Bmuwt22D1fZvYqLhx7PztSU5IE8HWDK7tBAijYG1gBt07Uk3AJ71WkUEkormEdLK02RsY7MYNAeM3xJatJcohbylxgaT2hGKJ4Qw16Kux\");\n            yield return (Hash: 0x16d0fc484a5c1535UL, Seed: 0x119cc06277f49604L, Ascii: \"4bUBTIsAjWzJoPYajd4sb71W9lF2zlcR1pNclTQJ9QGUQUcvLan3btn4FYEbpIJJ9tUdGC5ieQyzsuVMu51Ic76bdpkBSzPsJGPFlRUACXs6Ej3McXc7k7aJZv8\");\n            yield return (Hash: 0x7d63a2fb19195e0cUL, Seed: 0x0000000000001df1L, Ascii: \"n2vm68ZfMpgFzBAwg5IJdnWppUe8y1rjtQ9j5QPAhAhqg0JviKLmq89E8GzYL7Sa23lwPgGXLfC21obN8cSKoobNMEfXlFKsxvrmfazgAKio47bLpjLp9KugkD8\");\n            yield return (Hash: 0xb852fc7deb1c54d6UL, Seed: 0x00000000000000feL, Ascii: \"BPPIpwzff9njaLQhRKebBeLCJ6O3kpXA7K72KBYDERPNrhDpDXxk1a1O9f74cjxoEftOh98wFT750ZOhhBq1zlRUUDKHYofmUWzAXlpUaHLNbHo2EnQvW5xOhz0\");\n            yield return (Hash: 0xce474266f5ef119eUL, Seed: 0x0000000000001befL, Ascii: \"9PSFC6Dtq23t1AXLeyaTEXkBbXRT8haIPej07DlsEFFisvp6Bkx9lK0nNeWGF56y8Zl9XmTIyF1hOQ2wFBAW4hEvL9bjGLbznPxmxVxi5AGOK4DwB4oCpYgnXY9\");\n            yield return (Hash: 0x2684d72747653e0fUL, Seed: 0x000000000000195bL, Ascii: \"11rvPCNSxDfVupdWAD4cGbgX5aTY4vtgtY0pgZAoKDL4GNXtidM2QOIfRSQbGriGyYyce6HEb0kqrXU3CAjBKlkz995WXc3iCidZQGDCGtJMvlxpaCYYOao106UU\");\n            yield return (Hash: 0x53bc12d6425296cdUL, Seed: 0x0000000000000000L, Ascii: \"kh5Yj9RxyD2LupLfmbE2ohuldqEEqIZaQ1brSKZcDPuh7OFGA6rOVS78CwPyPKh1EB2U0JZpkiqXXRoZQX1y6nGQZBgXj6FlF7cSJEE58TuRv47ECFvlKwioRN2N\");\n            yield return (Hash: 0xa346225053b32166UL, Seed: 0x0000000000000c7aL, Ascii: \"sy8HXdhWMyH6zELpNiBlFOVKcoisLkAwK3Vs2wMsvIihYwKCdrgP1SLYQ9VcTr9qjPdJllZ7KwDG7AzW1i6d4eUHlNhNHaCTqD4DqzMCnL4g4ObPAEFNMu5hES2F\");\n            yield return (Hash: 0xed5cd1edd318fbfaUL, Seed: 0x6e791466d1b71ecfL, Ascii: \"GVbT6QpqMbG6CD5PkyXhhgb2pj38HYJ3leVQhwRkuGuBjtGpBxKmLTfDCUZ4UcUPvR8pGW5ARTcYVWKqklFQ5R0pK0gDsLCurNBeeH8DPJmpK1XwZwRbL075ICfP\");\n            yield return (Hash: 0x118e487babcd3c43UL, Seed: 0x0000000000002009L, Ascii: \"ID04vto7CdUYgg14K0WbVzHmCas3lw1adGRN4UWp6llYwReFUI0xjOyOU4Nuf5r3iGuOWcmj0R8njVApDh0Xyn0s9af7yWRwBP06UsJOAFpSIaXjuGt9axkZX5ZFt\");\n            yield return (Hash: 0x4ad8032784ffc76bUL, Seed: 0x00000000000016adL, Ascii: \"yicaI21xPFetRXBMXg048VnQ2B4ojMHQka58NDzE4PTKkmaOf0D2yGOb5kxbSLgqD7FBJCNPhXaUn04kcZOpJjgWLKhKkE93SeOgMq08038CrWlOAXCOBGbam69SF\");\n            yield return (Hash: 0xc064076bb8f8a040UL, Seed: 0x000000000000110dL, Ascii: \"aN36fVjiCSVWe4rhyn40Yn9uHRo6sfVNJCKz6vDLX41mdZg4H0LbCerAxI189qQGElgXzLEFO1uaUFT7OIhxmPO8v8XiH3eSk0nCHrzVHuBOwr4dNje4Zvd8IAPLv\");\n            yield return (Hash: 0xddd54ec70c170e9eUL, Seed: 0x00000000000011f1L, Ascii: \"WSObRIFudcaaiIma8jovld92hz8yf1isyIefqjV1DPWsdb2Mb0sbyBCXIciTdRMbMXdO6CTF7jjPhZ83qqLRngpWv5l2Yqm1Owy3EqVFgktelIxnDnoTVho9NGOD1\");\n            yield return (Hash: 0x02b411cd8cba3576UL, Seed: 0x000000000000213bL, Ascii: \"jDPUahItRlZneDoujRspI55yhCATOZbRMzp0sZwmMshcE84vugA4inws20JIeWSZSYcPqGNvwGqa6Ygzv6sZYS6eMEOwtLKuz93nb48uBhay2aWtMPdNuRxmzZaUBu\");\n            yield return (Hash: 0x3e8265b2a8811811UL, Seed: 0x0000000000000000L, Ascii: \"kuVv7vsS9fsPOCZgTVeeYMJAumM3XuGdLwd13XhqOgNqGeLpcdgugmwtNyijl41CtQROLCx8to8nzvocNUeATjUfu3puYiZxyHmSsupADY8iQbMtpKUCAL5dm88WML\");\n            yield return (Hash: 0x5e366ac827714c6bUL, Seed: 0x7541e104150588ddL, Ascii: \"7mJOM91tJRrFgnTzxpXD3A1fRWj9unBPhs60v2F6FqWB57sUWFJc7N6UG0WKnVVfVuWVD3L28GwguQMi1Fvw1GtoZToXiTsvpcnRqFeTVNp5eSrYHMHHBiF54qoCD6\");\n            yield return (Hash: 0xcf4558b5b9858a68UL, Seed: 0x0000000000001f1bL, Ascii: \"yYEfhCPqNBZFil1tkG12vU3882dn9YL8HiAlvwmM80K6OVUWveM9MNBM0Nkgp3RfsXSR6Tz9V6vCnXwjrabwJ6xGPJTqz2ApkoJWN6cs1jKp4y2m0RoR15LsSLupUp\");\n            yield return (Hash: 0x1c42e0158e79ecb7UL, Seed: 0x0000000000001fbcL, Ascii: \"jbLVx0sDosYXshOWv1Qh0mQTfxenkKM0puoQSTg0Y0ur3UzB846mgGj6dqIG5pgMCs30I1VYYDTBMfuBQ9JejRkvcKQ33lDDtOQDQRJjNm6GcnFhXAhoCK4PVAdIWy4\");\n            yield return (Hash: 0x5c288ccb7aa33f7dUL, Seed: 0x282bbf957aa4124bL, Ascii: \"Iii5uebDxGwxHV6VURGxShQkPPcBfZgJTT1L2hQuoGyNfhmSm8oVPKce9APyZdnRuDpcjfmhyIgbCxEbxgxyl6HH2BXdGxTzJaCGsJGeiBquN6aahfkaE5xItLcMLds\");\n            yield return (Hash: 0xaea9827ac3258ad4UL, Seed: 0x0000000000001da5L, Ascii: \"1J8qWDXA1bTBa0zp81ZCm0gAG4OvOGKlK3sHCmDCBNJvE45oYhnw9uVI54Kqz5OazJIHpqSvMQ3UnQccSyjszKe9olSUukOEEzS6NOHQreuuDseYzQApdf2rkV2M0LZ\");\n            yield return (Hash: 0xddc8f4ef4e76abb2UL, Seed: 0x4e0078473dd91e60L, Ascii: \"vJ75E3w5rzh5rpH7GP83uzRRIkx0mFuBOUjDnQfsXcjHIc4FVId4CjFRBXMtNDW3K6iNwgM9kWapyxMQj5WXfOk9zcxpANSdizfvliKn9J9c4L1jdiFL5pZeNkmHkXp\");\n            yield return (Hash: 0x194fc2536870f29dUL, Seed: 0x00000000000024dfL, Ascii: \"60vnJXQlyQfa1Ab3P5PHfLbq3uN7ZJ3lN7Wr1jEFweUHKIBbQbvmfoRtxFlEpkJF3BSX05Mcw0s4acFNBeiScjKyd91eICkXmCbqN0jME8gyu73qBUN5lvP3mLMDY7W2\");\n            yield return (Hash: 0x43ff546888da9cb1UL, Seed: 0x414a0e4285faeb0bL, Ascii: \"0oXm4Ua8BSFugTc0jjJP7qqgKqqmAM5pjKx0fH1lsN5JOoUWwlSkpjiXDpWUWcakDbLN5HnomU7pfKLfGu4jVZCOdLs8IhkCm6KtidMd6VpvE3rveNgput5Wl15SnJxG\");\n            yield return (Hash: 0x934cb865922a035cUL, Seed: 0x000000000000258dL, Ascii: \"rDbjGANGnoqP1OyE1jS2Nh9u2jCe3I2aylK9AxrwWrX9eWeZktCCM1zHEWZyy3nkayGTMlZYrPUz3BV8aXmzH08XVJq9CONAa3gGInx8ul2oukX7gMVzn6HIktSVlrnf\");\n            yield return (Hash: 0xcc9b79209b2d8a92UL, Seed: 0x0000000000000719L, Ascii: \"Vb9DqE75q7FoDNwXC5z7JXv8MClHWVlP46ZM2DEpcnESepjjCoPc3A0SB3sdD5Qf5WFVZZD5eMK3d72wIatzLikDYdAkjGB2TBYELWnh9sbn1Ei9neg1wTkMj3CGM1a7\");\n            yield return (Hash: 0xe822ad7ac402f592UL, Seed: 0x0000000000001b1dL, Ascii: \"uqMPHc9Ks7bAPG6zdpkbSjcqkVXzOGBSyBXTvbzQlpdQ6Zv362rdkRlzBIbV7nPyLOGutx6Q4YD2wksGcsC6GapRBMT5QOQq3Vt6NkobpxENMG3anX1cChirvogNtnej8\");\n            yield return (Hash: 0x66cc88026dacc728UL, Seed: 0x54cca3d4fa3790bcL, Ascii: \"9MR7gE7doHNszhTm9YvMpUSOYiQL98mr6xXzYLVVDxzFT0jG5Xpy0n52wk62MwX6uIOY7NzoZzJrQeoyUPOX0qrfYSCiSgDmgs62yJkZLPKYHW671T9JHEzKtyZ08l9Ev3\");\n            yield return (Hash: 0xfd29abbe7517e39aUL, Seed: 0x0000000000000000L, Ascii: \"U4MVPYsUfMzMZLh1554Kp8ro4m0CYRTG581ZSciQVu4pkps8pL3mrGW11rBxqWq1QAG2IjmYMpj3jYhIbFFNT8Ni0rIgGBtk8R6cS35Dy4NIlzPZZ3VeSNka3YbQH2JsQI\");\n            yield return (Hash: 0x4faff7a0824403bcUL, Seed: 0x0000000000000000L, Ascii: \"9nN4HswXHi16IpInViwg08zARLQWPteDT7PGZ8rEm7jAxT6m1tjIfbOQWy3hBtg6QXGFpj0qKjUvdEmeGgN12hrI5eZMxQTZsbTIPpo1iNxkawtpeQFj8y7gfSgz1vZPPwP\");\n            yield return (Hash: 0x8c80de8f83b49475UL, Seed: 0x00000000000003eeL, Ascii: \"OG3H6jQJUMEKuS6ScLLdUEKaOl7CAKC7wRrzyvFQJPl5kSTYtFzycrybLpLwRoQ3LSPEHWQtvnVA8vDoSaAc7qEo4CO4e1FvQ3gmAQps2FtPq8GG9q95S30uCHJwVuUSaiW\");\n            yield return (Hash: 0xb3bccbbb76cca1c6UL, Seed: 0x0000000000000000L, Ascii: \"gPdhSSq4nip27S7b4skjCs3Rvu7oKnzUY5IIpMEDYomFC7QhpRlRqBEJcllvmhtsSBZHe9T7VktR4zRpilfa9DSj4EiyDrBpEX2eYqAAuzvgh9XAZ1S8L09Ua6YyddvEocO\");\n            yield return (Hash: 0xe75ecdac1ebfb1f9UL, Seed: 0x00000000000020daL, Ascii: \"jmiaRf4pl6y5mvJCawW9V8coo1w5P47Z7kLL6SqTnnX87gEAZA6V4lBmVyMxZmGHI19aFVCOXTvimQjpgyMZ0sKriuhdbO0IwR7pjln2RfZwOExrNAzcCiEHnEPKzMt7yQ2\");\n            yield return (Hash: 0x230053106e20bcdeUL, Seed: 0x00000000000011fcL, Ascii: \"3NRVB5oUvOnIHozic5qU9QUQn9tGPz3F3A7ziKLusgsABEx3Q0UbnUjoiSURpumSCdjksxSE2Xbu4v5LRLsimqYSivFcmgia9j006UtTeANVrqZHo0PvwhI7wHfCZUM3fasY\");\n            yield return (Hash: 0x58249eb0c54fefecUL, Seed: 0x0000000000000000L, Ascii: \"16U0mZVdknAxLjDYnszfD6Wl5VJaS1hq3e3riTqyHibOSueGwXi4Chv3cdlyeUOUjpHTjRrSa7akVQM7VzQ6I8waMVpt4ndYDyiwx9Wqivsec3qQak9h8EawBbKVpA1LIYvk\");\n            yield return (Hash: 0xda3ea0cbe6c1c178UL, Seed: 0x1f8d4a4ce16cd022L, Ascii: \"WfPOMwQe8Yc0pW4Lzvijp4M6ySmHzteHVAgeTq01IMD8kyEZQPLq9tEmuiHM6WHDSf8ML9IVorqTQgFhAaiUXal72dEREUa1WWeusot7i3OMr3NOnyXc4itXjGC3Rbrtlzie\");\n            yield return (Hash: 0xff66b2d6a253944cUL, Seed: 0x0000000000000000L, Ascii: \"pkEpdDVhUfUMS3ASIvA5FAgWcJaf7hn2j5lNpjwJKRDSTSkKK2g80S7TbtqYgcdK9FNcCCaSI5uAT2JIDyIx3S1X4DgcEg7A9FO3zVrLwrh8hqQrS1xB7yIIqelfKBSTNg6a\");\n            yield return (Hash: 0x1e850a9309f1a52cUL, Seed: 0x0000000000000c61L, Ascii: \"8qgkEfNDcw0Fe4YA4JxGVZetLthMJ3OpR2xIZITaPR4F0nZW1xLvEGu4Ast6RMP8d9NY17Y85sqIuLI7QPSx7mj8ZwvJDcTMVlhuja6sJFwY4lwYMkrdiUyrzCt8ABJNohxWO\");\n            yield return (Hash: 0x6f677f24fa799336UL, Seed: 0x0000000000001769L, Ascii: \"F5cSZPLTlGxNoHDCfRYxxHfRjZobExObDlBdY6XgfUlQn41Ep9I6469ErOlgDAOxLknh7SbJeHWzMWRlNjdDQABmquDPPvunf3bmiTXwBojvDQheknbkqTJq5enJ5MDwkUdhs\");\n            yield return (Hash: 0x97685500530ef660UL, Seed: 0x000000000000135fL, Ascii: \"H1V6q9I6hIdiK5yGBsBSGLkKMGpcvTOUeKj1W0qHLgG8liwikP0EPL4R83BM199VTrIafmXA28fDpQQnMlQyMGEpDHXChYkAXjEKiz5xiRHAJoELpjOMA0VSqUZ4LyzSx3DWM\");\n            yield return (Hash: 0xf27d88b6780748ecUL, Seed: 0x000000000000103eL, Ascii: \"M0Vir8hbKd9ycWn7Ex9YTPSdN2jUxe8Od7R5FzVv1BCTIw5kM3lTkrE91oPc8DHQ2ze7Rdv1r2PGJaV9gqvcCSfDwA5vbEciCLEOqwFkClzNHKUtzDxlFHPjjqpkX7j8Gd9g3\");\n            yield return (Hash: 0x22405845ffbf3445UL, Seed: 0x00000000000022f4L, Ascii: \"UyI3ZMRVJ6IdKKyaO0hTImJM80Z3w66JktmiQ4YOAxEaSzoRibkmoZHAX2LyupgOWmoTol8ZXffaghlN1D967JKQlnZW1KzxzrbXBW13b6LiBQbCtC45hHBzhBHNJH96egKqH6\");\n            yield return (Hash: 0x6757efbdf5998abaUL, Seed: 0x0000000000001a3eL, Ascii: \"B0yiozgg7CMWHU3rQc8u87BRSB77mmFfo5dRJfnPLU1hCdrZtfFptYIlBv5mcDJRXfJ7YxnpSq6reI6oWnJoSi8kHIFOyiqePaS9auXA2KkD5XZMHVRae72F0fPdIXRAh6qmAc\");\n            yield return (Hash: 0xbba337148f53a438UL, Seed: 0x0000000000002551L, Ascii: \"rXNLAbMWlaSEJtHZg7KcdKwVhN0tirSYXfSH6LtsZ8X2aBKHLC5KkJCQuTDKJIym3AW4Fy0LqUVbyoPo0EF2xfh8pVwG4h0bSgKCfAIduI8A9D45Fm8WMuV5wd8uR4DomM1Tvf\");\n            yield return (Hash: 0xe3ed43e158c8cfd7UL, Seed: 0x0000000000000000L, Ascii: \"O9SUvMx6NYYU1i9iKK3dVYwU4mOB6tsBAOzlBgv1nObsPf91OVQoYHXLiZTIYELA8uJKhbgcKKGJ7OWqJ5Pf43dkpTQZoi1QpC7OAfGtFuqeiHT87LKnsv6w4YzI8aj0a7pDZ9\");\n            yield return (Hash: 0x2e0f4567991ad4f8UL, Seed: 0x0000000000000000L, Ascii: \"k9qB2FUXd3TaZuIivj58Wshydm0OfxdJZu6llqoWjEu6et1ObBscfKjQ1axmf69Yu9Xn3n1D5L8fNCuMBWWijGRIk0qLKgnJ0r5MCRIlmPm6nXSYh4ucLASRjENHZwqyWW5K2cI\");\n            yield return (Hash: 0x93bf789de9bbae68UL, Seed: 0x00000000000000b2L, Ascii: \"Hoi7QDtELUdDFqVnamEQAh3BFz37L2U96Yc9bVQMjHtzpGRiqCS8P4vM5UyCQYPDgaR6xcLfHzpEDwx2NLmEuVqTBXyBRfn2rRPoViuh0yanJpbbugRhXsTkdfUBV7WrVkodMc9\");\n            yield return (Hash: 0xb8197fda5febb203UL, Seed: 0x0000000000000ad0L, Ascii: \"HYpEYSzz4djNcmGn816C9VFfbbb5IWjxRxtp1oBSgRymSEOosG2d8UbqsNakdoBuNecS5TXW9XjebX8h0gXNhEmhakMttmLerjQog2Yhf8uPYUqhb5YRnN57pNW3voiA3Gl8hGy\");\n            yield return (Hash: 0xff09b44d4f2ac75cUL, Seed: 0x0000000000001cafL, Ascii: \"J0O182AfCRPaOO51XlQaRktTQvkFW8ASaYAmqIuz7tjQ1ViWtk1NAuUQwTL0k51Ph9YmTj7nF6MPoBnryzfTUN9OCbcYCKUm98cBvjhJXZOPTJt4h3fCkSJ1EClyMAwVyQRRoZY\");\n            yield return (Hash: 0x3ae5d2dc4e5a938eUL, Seed: 0x0000000000000bbeL, Ascii: \"OdsE4rVr8LKy8AXhYgzQYwIU7F70FGaFY3SZwNYnkgQW2iW9d220JUIiYTfkG3MWdzfBsdTAggmH8yZwAyKaF3Zl5gLHm8ajax9s0twPFEcHgrGpTQmtqdXtetop1vEE1ysDxm9x\");\n            yield return (Hash: 0x783d8cfb736d8f64UL, Seed: 0x0000000000000000L, Ascii: \"83rTxhOPcDzcCyO5EoZkbc0NErhb4mWZ1NC98aK1AbC5bisvsmDfQQAWAmHCkb76jwFRTKuorGmugdrUyO9VMLMpIn6XY2V9Rr7VY3kShTTd2QpUgJxcigy3AAZ6uaXt2cNT1gcH\");\n            yield return (Hash: 0xb7c67c715c66e415UL, Seed: 0x0000000000000000L, Ascii: \"0bvwRn5eaAx7Yd4fv9ZAw1IuwIpO9eQescxy3S784602dan9jmjKfqRwTiYF6vhkGjN3w0JPlxlyiyrY4julxexONinlGVLqsH92m5e3wxXEPMjmlozY5Ru7ecuZn1TWTBgipcGm\");\n            yield return (Hash: 0xfae06beb0933ee42UL, Seed: 0x0000000000000000L, Ascii: \"Zj8ZXsJcjfcOKSvGAu53hSYTLXBxgAft3WIWmhYGti15rzRDaXmWYIwsgZxTdGQX4nktfzfP02kb6s0FxnAJCWN9pLRwZicDjHhrur3trefUjRROE3HQ5tI6ALMXiz5PHXjjC3W8\");\n            yield return (Hash: 0x5c6816040ce09bb3UL, Seed: 0x0000000000002089L, Ascii: \"nqlcFmZYVA2UnbzyUj25rR20uy9XRUYMIn25uF8ld2HkKHrzTZpHwVuLcieb8bTsIRMBTyZ0D7uDLf1JCde2GN2QAcX7aKMMyPakmaRKnRGMzVVEvwc2edrvLmty79vGMu2jAZFtE\");\n            yield return (Hash: 0x90d185c99ceaec17UL, Seed: 0x0000000000002118L, Ascii: \"50eWLaSIzVFSAE1y2jxPu4pXhbUn5fbrZ2ISzjeWXClpH7pYI3fbYbZ2fWLkKt4LbAUtQ91o0B3oJGAQdIXlvcB0zao8KNRcThuSfT135gRNdukfDjmpINltxRSafuoxDRHIgKfS5\");\n            yield return (Hash: 0xb75b787b0828666bUL, Seed: 0x0000000000001fd2L, Ascii: \"XAdZWNfdjveSGCbiQoUzRIVRpTRw38a4si2uK1ujrUi8x9XOLgn0EIMDdTTnPYGyT6YCID6jjIiuaj1ljvEG1POgWmcTXpISyIU7fv5deBztXiicZDbL61NcH6ktStaLByZI9MDCW\");\n            yield return (Hash: 0xf534d76a19240f9bUL, Seed: 0x0000000000000000L, Ascii: \"QHuDIZ23SZ00UrLu1Augid9QqPRPW3YF2yNX2Jb1bWwmRJnaGnD8W36z2g2u7EeU0oynrKLT1S6zAL1v9MgqbdfDOdPJpABxGz5UIXkf5YJCbMLD8u7ifiFipSTmkw2cqhBnBcbSP\");\n            yield return (Hash: 0x8d8817b3704e9810UL, Seed: 0x000000000000065aL, Ascii: \"vTJfi86OzxCEBZIgdnuoNwRsN5myyrktrH6CmxCNnqidWYYqIqOTrWPT8A8vXkqExoex7mJu7xfvG8FIHLVExk8pmqsD9CWx7jOvQm9OS3wsoIAeOyRrQ3zeRBKKLbXwgw5Sv6O8EK\");\n            yield return (Hash: 0xa960192dacf06dd5UL, Seed: 0x00000000000025c9L, Ascii: \"aeR4Ikfbab1jcP3xOZKbQncSKqTteyRRI47ndwQ2lAVlKXe6T9qrjQMTOMNHl5Z2TpVexHZfxk3TGOmK6c08EmCk2KhJ7Hbk6MR4pzvfGh0jba7cKKQ4FjzFKUgoGkTLEIUCpjRRDZ\");\n            yield return (Hash: 0xc5217d1597dc3935UL, Seed: 0x1b913e9ede6d5cc2L, Ascii: \"7Y8uKD0vmUdO5BNaHvDCBZfJv47KNbDIRWnmPgGYUh50RzTkEqoe1eBr9vauaV16bvZcusbjs5ruqQ5xQDNIEU1UG4Nu2BTA2e9D8TxrtXH6zjDxiRTtY6K2bHhWG0xKA634jTqxvr\");\n            yield return (Hash: 0xffbc2f29019360b4UL, Seed: 0x0000000000002128L, Ascii: \"FS4Q7RAFeTyOz5nyYF9WRtUsrhKcslqBwdSIowySyxNxIeJRd2PIiDKGF2MUGOvoHx4FpA44kcxRJeVzfjUOjKDR8OiUjGZlVpFBYrCB6OTDPnuGhFkba0innKsQF5ZgjEvlX49EJI\");\n            yield return (Hash: 0x5374de0d540ded85UL, Seed: 0x57fb342f893572acL, Ascii: \"LABT9OF4MVWIPO2nxE6RYLjq5svbYkH9KLUDI8kpKb6CItxG73SCMAPRSk64Geyc8tHDMjwkWkyNiT8idQ82r8nL7It228YlhePGw8jkuxChsnNFmsDGDgy7xAjMgO04XrEhPBjpAdy\");\n            yield return (Hash: 0x95b461c4a3090d64UL, Seed: 0x0000000000000236L, Ascii: \"oYxflnPgurDiUW6nnQnZGDzw3CC3WUNWlhLbHgpZJm76oTBJlqTUrcMomp5MAfjTaUTlREu8DUL2wjtl4gp0ZlZ0sRHEEAqFTgZOyKe90kZ1NIIzCRQO0QTaTMNaP7bipyIA7Yz8cv1\");\n            yield return (Hash: 0xadd4602b3cf2442aUL, Seed: 0x5aeb29b2d48b91eaL, Ascii: \"i08q4MC0QpQ92tpeqTUgtf0V4NMrgf6Ui6XryC2zNrNSuQN6edxj9d74OnnwiZO5cZCLwAKKz3Mupafzka1DxhoCD5huf1OV63JlJogojViYyXKo0CPPKbjGCOw84rHRaG4x77QNHOU\");\n            yield return (Hash: 0xcb8085a0caa23cffUL, Seed: 0x0000000000001bd1L, Ascii: \"0c8W21X9nZ6HEZBDWIPFCvaCKLR0ExjIsMprL61MqO4GLJ4DSxcA5IhNKRgIHS33BCVWMISftY9fImhGe6wduMTEKXSHITqMx94CKxuFDm8psPe2qdA317K52dMZYPQcGWIMI9ZQur2\");\n            yield return (Hash: 0x282b8e5ae8a71370UL, Seed: 0x000000000000219eL, Ascii: \"RQncXAONa98LllMBK9qAt9ms19zNIVMrJrVcuOhcokwFmyMF0geyJeUZkVMmhbzbzujQPC4kNcwN1Vdt70KzagMvhIT7wSOHBMu1NUGIaBZXqxyE0EDaocrK44y2uOxkHz3bbFbFWyLy\");\n            yield return (Hash: 0x4f071e66c1f36511UL, Seed: 0x76c7dd87ed6bae92L, Ascii: \"koRmL1gHtX7WUX86WV2fnTtWrlLUw2KrMkTcsCtpiacCPsSqnPMlP8e3IB6LZf2AGSRYJ30GrfwdM03KPCnsDwGxd6xkIGAeiQhbQl3zqk1NhebSmfAdBi67SVOyWBD1HknGEd80zPtN\");\n            yield return (Hash: 0xb3b161b08af5e61fUL, Seed: 0x0000000000000000L, Ascii: \"6U3RW7QvEd28xpKj5AXhaxt9SzNlaAfen6667b9wnCig729J3UnOKoYaSRi2f14aXDEQpYTgdsXE7zBm0yKb0QfpbSX0n1TLlFFnTU32ebIUmdWFQDX9i8k8r3PMBY4SXsmByI5xnP2Q\");\n            yield return (Hash: 0xede55e4601310dc6UL, Seed: 0x1b03d5aeaa9f87dfL, Ascii: \"cJz36xeOEDL4lWkNyVDoVB3xg8W4rbZ6pgnDpecDuUQhsy0GwIufGOz2g5QkMhoMyv4wjkSOI1h6TmnD6840w54weVTGJJAto3j4lY2KcyNiftl5NKVVh3bpLeHUlTSTs0vUYELw0t1a\");\n            yield return (Hash: 0x647c88fb4c0629f3UL, Seed: 0x0000000000001122L, Ascii: \"LRr0gGIKPbSYSzJ6dkhAawEUcaexhjB3mRmOdqleUevzPNqBJaaXnhh0D9tnvwaKYLnbK7IYfElrPVlvIbbZK5yPtHfMxkmis1yfBmiu7xml6sNmZt5CisV1RjEl9gjj1Vx9zhsh66pNT\");\n            yield return (Hash: 0x8b4e610e47622cbbUL, Seed: 0x000000000000266bL, Ascii: \"INqvwfmkN70mrx1CLzDvgyLMaIDeqAt3rKqLp9j0dKfPfyUenN0fHVC7axbd85i9CRcuN81ENMlTlA4pdM1Z0EJBEi11drzCAr1Qaw2CMQhvJCmft35NVMoBfn6dBnx9RZP2zqdW1ZK8r\");\n            yield return (Hash: 0xb164055cee652a92UL, Seed: 0x0000000000001827L, Ascii: \"ueBA0AtMdwP2kkOh9BHBYJnFQ8UjWieCTRMmkRbNVM0Cs8wpAWEKF8U5w35K09tyHkvH8SAAYiOJbJxDbf6mKWmT34WWpon65Ps0wSj0fc3hb7ArItHHh0yEV0orcwXTvCCSBgIUf9WPF\");\n            yield return (Hash: 0xf2d81cfb40f7f773UL, Seed: 0x0000000000001e98L, Ascii: \"XrQz5QVeOXyGV4REu5ZBI1qeHiYFoZYnzaL9c9HBlXiMSJISAc0Ix0X6K2AdfbvaeHlI79HBT4OGDtSG3gUntptaPELq3rhiQeIPQKZnHlDVtQMTdMqEwv190P5NvbTnq9MiNd4V2OtkE\");\n            yield return (Hash: 0x39a37edae06f068eUL, Seed: 0x0f8be7479eb05133L, Ascii: \"YCeS8ejYuPJYOsEsvse6xfCKgZ4rDBIfCsEuThLeS1vRxNabzC5WGEMrWt96EYwGvWtStxbEcqeuzDjco3iieSt23euOIHodAkLeH6fYaEdJ9wg1c3kaxjBy76xcUUvUgQdNeyIgixjJBb\");\n            yield return (Hash: 0x77ffb0a94d462148UL, Seed: 0x0000000000000000L, Ascii: \"NZRIvp7eLAe9SoC5Furbk3IWXNR4GrOA8smVblKjNBj62ArLuReMOOiXQkRn964AnCNcYAJl2eKXuVCmYchYUN31we4dCcTqNXSZr6Yq4hCgKY4Uj8WeboayZ95mwAaChaLFlAlLP38DvH\");\n            yield return (Hash: 0x9a9e4dd739fd02c0UL, Seed: 0x0000000000000000L, Ascii: \"bnbwbxBNUrVu2O9WdVObgmXRNk91ddPOcrfjgUpP2Qhg8ug3W63Kd0Gs0nc30h4kcjI8wtRYhlmsDKLdLRrCHtPnrlNOttBIcL3tls5kzgoHriyk1TyIcb6Z3z9OdNokTghPnqp5bTfigN\");\n            yield return (Hash: 0xe2db931cf7fdf620UL, Seed: 0x0000000000000d05L, Ascii: \"tzlNV7L4NVKgZpn6e6Aq8BqTNug8x1ryUYqTG3TadfPFmYboOPqgUIY0NJNMgqdxRUaUe2U2kaVHMuddKztIeX2gU7qEeb9XRFxeHZAVaIZ6lYLUXv1gzYDmw9trFYenp5EnyOzvutTdYN\");\n            yield return (Hash: 0x3b355b9952341b71UL, Seed: 0x00000000000014d3L, Ascii: \"ZGwLelMo5hB8lZAJEImVcUlqaSuWYvHq1XBIAagwJ2Mq0hM5bbj7r9yyDj8m1dRQeGch2Sv7gZNWKghhbOLckJ07kEF2YPR8gwp3PgNXE0dNMUEiin7725FcnSTY2bOuRO3arZTjwLjwsaG\");\n            yield return (Hash: 0x80bf6bbe377a6f36UL, Seed: 0x0000000000001cd8L, Ascii: \"2vECEMJDes34YpXzV1BUUYtVPPcd92N7tg88CUw1oMj5W4eiZIQ6cXi1tQos5T1kLpH2oixJSeSqLu5h8LxganABgUzFPYOjIWL9uOEuDfUMsgktgQ4bU0cHw2nC8hFlCZDxqtnnhTrQjVR\");\n            yield return (Hash: 0xd11b1f2de80c2e48UL, Seed: 0x7661f00871943a00L, Ascii: \"4kNidsgh1ULYzj0rbKMjQMCimtXWVjt18nxVpMP4F9KxA59c3nniCIXKbCvq5HXeqxE59L9W8uHEBBhHX1ahTR3p9LEnCXtPM4m8WWNW542LJTQFCtyZ5IR1kqB75Wdehw3ZYdYTci9AUvz\");\n            yield return (Hash: 0xede3cee50b2fa435UL, Seed: 0x0000000000000000L, Ascii: \"xSnYEnPY0DFcZXjabmJZZv11XR63GM6Ukf9aPmjQxRwmlOED837tCB521Tv6zNowcu7aRCx3u6FkE0tHF5jbHIzUD6cJTMwKLnhjSQ89qwNLmNQUdCd3BMnmShmoQ14dj7Xxo8nE3pvQQMV\");\n            yield return (Hash: 0x36feae0ba73193edUL, Seed: 0x0000000000001608L, Ascii: \"16TEUrYwuNZN7nXydHKcqgL7J8NXZCHc5AHRNtTYEB0wXHtkOWORDf0TRUuOSqj9orOgHyr7VETWFWcy11fChAROkyXXpYe7RkBbhERdMBmdaSMRSLpvZ4HkiX3d1F2iwGTBKipzpy5J4qmB\");\n            yield return (Hash: 0x65730275bc9d4215UL, Seed: 0x0000000000001b7aL, Ascii: \"nGVDgcQ6ZW8W2bokBryEg8Z3m7grx6B6s7iSXcnHNuEpp3fd9vKnt697JFlrV5JFLc8cZ83bSJWm4Xn4T1OfEzKl6cXg43qFJgYY410R7yxKX5r8XClgz3ZyyzrSqxiVjk12sZA85vFXm5EE\");\n            yield return (Hash: 0xbe60e242356af54dUL, Seed: 0x0000000000001471L, Ascii: \"uW1clwZEqFxakgn0ExK0TYbfjv4FCVpWP65T2wy0eA7iS50iztHqIYuTOsoPpcYIVunRjBOcMG3OfFY94uWDqHxwGwzssHzCO61MtCLBvTxIZ8J410bL1YgRNoLgZKEdIC93Hb6YvTSP3Adj\");\n            yield return (Hash: 0xee54284aef8ffe0eUL, Seed: 0x0000000000001550L, Ascii: \"QBkETJmofm4YRD3TQddoKvpyjzm3LMjsCkOoIBlbr6yzDBe0xT8PE2Hx4cHPub6P3O4oAv5sqGH79yHxJPyugMpmczKCKtFR4nbBWklfgQzZDoNv2i6816YDIAjKWjjpKtAMCrKTVmw0xkFO\");\n            yield return (Hash: 0x42619dde2ea3d269UL, Seed: 0x0000000000000000L, Ascii: \"h7vxY18IBFufeMfQEF0uvNH441g0xOK3jfM7J6R3pTgiYmzyX8rp6LGUvUMCNZzi6AefpdtWcHn1SX7E036pJZFRSemmpaBhUoQbBm5hA8g0DEx8NFcPNJ1ur5AaywSC0DTTteFXG6tBmkzmw\");\n            yield return (Hash: 0x741be231109da99dUL, Seed: 0x0000000000001455L, Ascii: \"XM5roMXpfUT6yezGaKFFvx2CWI28KXu0jfWo3VKvIoB62dd9cOMt7DHs5xSxWjwYjkqKBnOZMExbv28liPpEQ8stFg2cMy3o0fQIFnt8poRKfmvCrREGuq71m63FTa2rQmGJUyTK1UAuUlTEe\");\n            yield return (Hash: 0xbb35c094a4cf5a55UL, Seed: 0x000000000000248dL, Ascii: \"MkD2kzabFivfDIm1DUFFVje69UYx4KP7zb4gM9dDlT4vTDX9Boo7YloTU2Lm402XU84QenglLDDyCF00z0D27lteqzYRmXkH1CbmdFRoAamtW4wILybXYQeYGGKXivPFpzkfPsWhzz9j4wnhP\");\n            yield return (Hash: 0xf0790ae00793a69bUL, Seed: 0x0000000000000000L, Ascii: \"lZh19faRQKjevEwNpVH02ADNfnLL6hceJP5yPxo5Bkd8irhjrRa227eaMlfrqwsAF1GsmH9tSDQJRGi7CGA0icgHUlcogKoYHIiglBHwLFNY74bbY8anenvnp88VfZsORihIwh3Ip8lhfLssf\");\n            yield return (Hash: 0x4652e52817c878caUL, Seed: 0x5053e8563b8e105bL, Ascii: \"mji9X45Kg2ieBWzBIJgKlAVI5xu3jNoLaFju9cRpNZs59VUvR3bxxBbb6AUMUFgDm6uXJY07m76VMUhGjuNQfJL1Rek2WarSzKIf8ZXnKVOHAoEgoOV04W6rBBsRoKCaMaXyUy2HAF078IYhWz\");\n            yield return (Hash: 0x678ba742d1429411UL, Seed: 0x0000000000001c68L, Ascii: \"QhdEgUvMnNhbiiKccrmrE11Xrrp2HiPhTIKyFWJb51zUEWc7Hwszj3KH7tbvuVcaPsrfogRgsXeO3GlBkZ6iXqRccHPVdSZcKZWHjS2nrgwbzZXKuxvb3st2xZuRctBTbKeRWlmyApmwyhZNXE\");\n            yield return (Hash: 0xccaf7b0c73ffecebUL, Seed: 0x0000000000000000L, Ascii: \"C6NSXfV5l88vvycmtINmb3FQ9DqTA7stdWvF1ZGmZzn8IOT9PkLRYwu29xBGz3u64DtOqhcWs29TWacrLo3htPrg9GobyClvNHHEq0o0OAmihp8K45cJb3tdeiXTZIY1Czrcpj0VABvZn6mkGO\");\n            yield return (Hash: 0xf63e999a1a8e1a6fUL, Seed: 0x0000000000001718L, Ascii: \"kbeaxNxCAOMaJZG4ndPplTGKwdw2UIukSbkSuWxFyFnVp5rfUw7RMAfIjgsE1lFaigGI3ALU5gyTXEMo0xlzFz74GZ7PzraAIyEHpW4yMeltmndUlnj21LBiXRWTCkriVH2uNupXBS2XC43OmR\");\n            yield return (Hash: 0x3cac3383548cccdcUL, Seed: 0x00000000000002aaL, Ascii: \"lRDPYl0Iv939jZw9iglpNKD9uNKxoK26xOG3XmFMAOPKSl6a2ZHc4NCFVHP4jCxwVXskI3buxPZr3yFXt8oqCaA7gZxKCgREcIDoUJEMiIq50OQoIfCr3okNQPDM7zzg5cqZRQhn520ghcYTiAk\");\n            yield return (Hash: 0x81327d8c8d6d9180UL, Seed: 0x6cafbbc0d4d9d448L, Ascii: \"2SE1OL9I2HXxFeZ9cwpG1bvHORfMYzlHqH4O2DMqPiDBQNssznaruH0lD5ggyyixdtdr0LIUyOdywEFJbtsdpRZloOJHNyGvRZ13AKfbnp1d0cI4OBDSEtljyVPKwYff7bT1UMD5Qb7GSCHD8yy\");\n            yield return (Hash: 0xb6a86158a730a0ecUL, Seed: 0x0000000000001d92L, Ascii: \"VrmLgJssGQMypADPBHCcZzfAf02WEAVfmDdX3ROFbBxUKu57jQEaPDv6yF1yuZrUM1GmrwWj7jpZfF5xPbVBD8G6HBKjhXj7lZuzEfn1HTFzWvvhRCm4lsO16zhYIYt2kdDguWTBUTxz8jE5ciW\");\n            yield return (Hash: 0xfaa8955b60ce58d3UL, Seed: 0x0000000000000483L, Ascii: \"YqLOaCkvunkE6MNqJpIbwvfcQhkUGG6JEewerE7rHH6797Ln4KzEelspi45h4SmHAjdNDNcM3Cvm0F6AbNhnhqtBFdFaby7GEPeeQaWMqAQ8Q0ig1BN1juCwfflybwbLaA8Jokd9ZXVwA2W3SKw\");\n            yield return (Hash: 0x3c62bda192d33aefUL, Seed: 0x000000000000015dL, Ascii: \"wdwPvtZuwFk2xZz5ILImhDQoCQzoWDgkUnWLJiqAg2UHh171FoHHRZHVuFPAAUBeBC7g0rTzFtEbvPjmAuph55JHMPJ66PzXSg6oKj1GE6l2sM4v41TV1S17c3rOr36P0VXDpzJrDqNjYefaDcrD\");\n            yield return (Hash: 0x6a844164a076f1f9UL, Seed: 0x0000000000000000L, Ascii: \"Ca21pwuAz4ChrAWVQCQaGiGufxKTd2Juom4dcuPa7vML1kzz87lAQ4Sr4Pspv09YfvAyPzKltoBE2VxxvkkDgrRQxJ9NhGoZbFj9yVyMvpMSsqgGHVCsUuWhROOQJt6Lw9PcL45lHWCcheDrQejt\");\n            yield return (Hash: 0xb0fffd1f732ee3ccUL, Seed: 0x000000000000150bL, Ascii: \"KnSIM1z4E2EkYDzGqSxyMxy8kkxwQbdCYOloyzm2pKQ7wjDs6znbxIbeXx5T5jFaPv6D0rwbywt7RBaAd094bSl82if1n3bea8tTzKaWHrHyztPRvdIOyjYmJUwLXEAFTnsIfU4w7tkD6wP7hrgP\");\n            yield return (Hash: 0xfe4e30c7cbd58fdcUL, Seed: 0x00000000000003d6L, Ascii: \"YlEO2h05Ro9uZTDjpeVVHBcBYTyrarAQyNaUboQ2F48CmEFhcd78JPfhMD8IPgSDBR6gZzwTnd0AEIpWOhFyHxQTWT95EtRbky7XPXq74npH9zDWUO5Oa5wwOZXLRNTNwDuZARcmmf1kJEgNTnpH\");\n            yield return (Hash: 0x19fd8ee13d25243cUL, Seed: 0x0000000000000ffbL, Ascii: \"RiWtMv91x0z3MJi9YfUq8rJcpeBCwIMyaCMGjuaunyQRUMg7f2ySvTu8wIpg50dpyUWCBskBErrOSFveIvWoVfV1085dXHrG7nUEwl8IrMKendmmfz1yhJ6akVYk5cFoQam96fzyvsQD8BB6GimHE\");\n            yield return (Hash: 0x53fbefe463bc20d7UL, Seed: 0x00000000000011f1L, Ascii: \"mnv36rJDzm1Zochb46MhGXcLeDZbKSZ5WK1jSa8i4IluVBGOgfAJHSF2AS7YHZANxDCLJVVloSLxeVL0PGrrwQxmdIXNYbTuRT2xUmAg74oJh832LD6D6IfO3J5DEsmDc1B99aIGMpgatVj6z8hIW\");\n            yield return (Hash: 0xb0d71db1db164306UL, Seed: 0x0000000000001a75L, Ascii: \"31nAhSK6lKwLUMflSqSxLBWCfoRlfKPDWo9XTOOFnwdFoPPsrkYXXFpE5toYNUzmEFZ0xC5KeYBIa9xeVJ8w0nGi6ISL8PDhl8mBeaaHn68WvOr5SsdMP5l5IDmaxsftmmBs37NtG0fHuh6ICifl5\");\n            yield return (Hash: 0xfac54ef497946b16UL, Seed: 0x0000000000000d44L, Ascii: \"ANpgMiMNheGfrkOHwYj27tY1XBzItUDmuyCRjfuazR702hViGWK89PD0QxDdWJDxgvY2UY9IjluyUiHpMBoycE0d4nS88MUwF2vov0gjvJ4LJ1cUfCYvptYhPQHVyfpRxXZ24yJNnbjmbrb3EMFXa\");\n            yield return (Hash: 0x5f7c6a0c978c2cc5UL, Seed: 0x00000000000017caL, Ascii: \"P86XZCtYQO4z23K3Os2V1deOCsWdEEJI2APQ83oDSn51Na4hioDJzhkVK51cIPJC71l0tTcWx9uZmdOzOCni8x79irZUZXaJokHlEf2rloZ0TehEIH7wObIuH09lIkQocRRBJR5M6PSYVAoU7MiFPQ\");\n            yield return (Hash: 0x885c3a5db33828ddUL, Seed: 0x0000000000000000L, Ascii: \"506lXaeVt1PN957la0rgUiKtGxB4Ki2hqgTK832nY1vtUkXcdwQVvWIaDrn28WvMUAR8AoZcxIxcYsNfT1iXgNohzJbDSSnkNTCj6rAgsZOWxpsPJiUlbEJNZi5gsZBGt5UMb3XuHAXf6cKIhk2izS\");\n            yield return (Hash: 0xc6c2bf26888cfb9eUL, Seed: 0x74422383d0621306L, Ascii: \"5RR4CrqvBsonK7drBXlhL1VUQxm6cX4UKtYg8zZOW9pRFaJCM2BjEBAjN5NGBNUq3UVyHF5XQOtU88ZkpMwoAkrekG4UlpOdm4DmB6P1UVpSCuAcAJNO3HSkYyG4jMnxLrWZsoN54ZSm3ZC7Fd7b9q\");\n            yield return (Hash: 0xf9159dd87beb4982UL, Seed: 0x00000000000020d3L, Ascii: \"Zca6ISTkVdarTdiYoiCtulPQhB4szxFmw7GGTptQqyCEdDxaCdTTwHoHRncshyTHadwJC5Xpnmx6HHVedezqatsCtOGGq0rvk4umVLdvqgNcJsjx2EVbK9xIWgWIoxIYFqh4HbROxI958uXMBP4KEw\");\n            yield return (Hash: 0x71a6714374c91803UL, Seed: 0x00000000000025a8L, Ascii: \"7CwoN6n1mk3yjMN70v2BIbDP0DxSxSrmEkAh26csqE5MIdD0bDQ8CHVF1t8MlQENE9Usv77bCm23GGSJO1zwWBwMfw77H9jONyFhh9IxyTkiFDiPyJZHPAFAI7Khh5BWeS69XSROUDkCYEr2w3wMD7J\");\n            yield return (Hash: 0xc0322a4517bd885bUL, Seed: 0x0000000000001e3fL, Ascii: \"mWYT7sChygmozGjDYHiRHOKCIZ5MpMOINswQw5rMn7aNT927s43Fu1VbDFCI65WuzfJFQdH5T3B5V5azx7iewhxIEAyxQ8LMkyIfwgrGaN968Eo3lQ85LWk3dP5vcYsD6e6WuCpxVQ9ehN1oNyGBUFh\");\n            yield return (Hash: 0xcd5b158cf57a21edUL, Seed: 0x1eadf009cbf8ac7dL, Ascii: \"FVIs5vdoGlQH8mO7gwIr6dzuitt7tCLlto3j9ISwyo2ccMZVwfFgpmI52ZSzMHxd1jk9gUu0ap2qRVMQoY8EQan7tTGO0UJeYChSsgLmsA6N19adBoUG0Jl2aLuAUpJOxkUwWtnqBweYzskBihqeeeK\");\n            yield return (Hash: 0xfec8c5bb7a86869eUL, Seed: 0x0000000000000286L, Ascii: \"9r7sdylVeJ6UPrid18hQRVGKD9aHkJg0MgrpFQBiJL1LyS7GKbg53W3dpFpZX4VKDtqVU22QdAtuhkBRG0ARJ2CvJcvhG85kiS3xRiOjtRr1LyBAhmP0Sc7qDxZGVRz4c8xX2Uxqk6lKugvHSDqm1rD\");\n            yield return (Hash: 0x42c0aeda421f54a9UL, Seed: 0x000000000000248aL, Ascii: \"f1CzSvUf7nMOhfG0aLlFfETuxIA8g2DHzWv48KA1gg9up1gdB4IpWMwOBlon2i0iAma3p9t4otplwQqGkcdwLKI1CBu0PZhNDihtsBTnvsIXM3CnA8XGZ352FYJ4aMyRVMFFse5fAOXwM1Zw6u7yhyKE\");\n            yield return (Hash: 0x7575d317e9fe51a6UL, Seed: 0x0000000000000065L, Ascii: \"zZKL0OlySsRishB74cl4RGBN2d9OWsFhWNZWdeFUisBNX2UwuLWHR784AKOeIDSxMkvN5AthRuxjClrO76vQl8OBozvGWUMKeSqlLNR9vywn8orNrBp354Edxc9ByHPT2toJUniK6ZJBy0MibcxrQ7CG\");\n            yield return (Hash: 0xaac55f372efc702aUL, Seed: 0x0000000000000000L, Ascii: \"0cMGeRh3IXvLixGzdMVb9xBGjA6kEu4IamxKrYBh4e66zsoCJKZqorkk70vMXiiU8HDAZ3L0hQafI8AXRGUt52gIFbx52etqU36ye7ZZA05WwURAxSfohBVJR4CyHgAwtvZPnAIQTYqUVabcuvpVMNlO\");\n            yield return (Hash: 0xfdfbea9aa2861367UL, Seed: 0x575d01e52051c5cdL, Ascii: \"RASyAErgK2cfd8LnRO5t0PyCVNbsfcru6yQkeyNQ3MWQ3T48eMowT4HFcE2ZppMsBXZm1e29iIsPpIzcOM9ZWEf5GVOlO5Xjyb1yuzHVtgPXEKbAvJJGjeuKpNtIriONajKOn1TdWUnT2jcoQpexBmUD\");\n            yield return (Hash: 0x42e23c02616745c4UL, Seed: 0x00000000000023a3L, Ascii: \"63iWiybDwerjql22wHy5iLaIkJA6yU4pbimzlndJqI3pHt1RoVud6cmtgxc1V2Lzg77Ij2ozFJ4OewXmcLus9dVxiD1nn8iHtl73mce7FD6rzJhZAm7LYfqn3W6u3dwnZl1JYHSeHtwrhZBRLhVbDYp7O\");\n            yield return (Hash: 0x658338c1e0b044caUL, Seed: 0x0000000000000014L, Ascii: \"ACkIGaxRIZMiLn6IKDnj2TQKLxoO9FFCkpwHqiBjTEP5HlIzbJxfwfU2iRFT83QNJg7JsrFNb6euxR3Q3AhRgNLblJD7A74H7Dr31dqs0FujW8l9WcizDpfUVpS9A8lsll1uZqZmk83kpxOmt0UyDlnu1\");\n            yield return (Hash: 0xbe2c7e6207c2ec42UL, Seed: 0x0000000000001dc5L, Ascii: \"pDWf5Nm5aVeWCKqWj0ZzCuCG41CG3uMD4K7HbVfsyRHBb8PPxlUaZZafBNw5PzReVrZInVGGz7J1B0gHcXBgWi67bFD8JKjGRGUhHrEs1GP18TmFxQYnsugA71HtbNZMTkrQmKEmOEcDUbQVsQOivL5T8\");\n            yield return (Hash: 0xf689ed08aa0c5123UL, Seed: 0x00000000000002d3L, Ascii: \"hQ5invCoIPWENdwevPniAqnrcOX59VfELHjdysQntRUyXVEcPrb0jhprmY1MiAbfsYrqsAkjqR3allmcIuRwzub6yBu3H5IFl9Y31ZbbPZ2QLKRlXFurlrRaHjNtiOjNT0YqW6JLixmNBFMw6xAfdPArk\");\n            yield return (Hash: 0x36744e2d0baedaecUL, Seed: 0x000000000000155dL, Ascii: \"Y4JbTln4lJObiJ7EQRU2CPLoLhwGf2Lk6jJnoUhQrS6nEcn5EbEJiHmaXI3aXr9Bm2STZlA1uaV4AMXeCvtdbHKePn0lPjgII0WX6fOnpYpOGjXjPSt6ad14XlSFI4YwmqLsA9lrYJa5R0bkkAi62E8rMn\");\n            yield return (Hash: 0x78b3d4065d5eeedcUL, Seed: 0x0000000000001102L, Ascii: \"VrD0o8djpXMDKYuKitrNnCC83Q5ijSNlCAuyIql4CHAuBxC8LklWurywYciPmaarWef5zacECokLWd02dKXG2jHRwHFzEkkgjky94CZHJsEUAoIRTvbXSMPZA2880UbkIbQ2Sm5zrXQsoMoGwrQZaKxugm\");\n            yield return (Hash: 0xa0d2af6cef2e71adUL, Seed: 0x384c038aecc68846L, Ascii: \"xMEm4HPPaNLsqoqtloLN8ygMjf5O9hbLEVuSG6X61BzNShJWDtRxzRXZ5sKhxASjBmweXMrkoG9s7ri3Lv9CRZ0H74L4HNR8GPQQlX8sqXy1TBAaeRUXkZadZtNwyjXNULCuAsLgfCDjndDr8sGVtL1OBJ\");\n            yield return (Hash: 0xf35e4935eb9a8244UL, Seed: 0x0000000000001c35L, Ascii: \"eHjiuI0JzxZSiHdZetVhEqyWE2AoxnU9W2aUNEehVlwoTlW8ca9Z9IRWc17NE3DEvBormfTJOjwUKXdv6OI1u1nspYUHJ8qY9zJVgFSVf6nQl09sG2TOVHrgspV0WFTgzOGfsvhJoHsRYRgh96BuS1hY0S\");\n            yield return (Hash: 0x2ad0b2a2424dc608UL, Seed: 0x0000000000000000L, Ascii: \"yfPiKy0htYoBIT0XWK9OCGJFZ89aknaEG2iTdxMCUl4MBt8u4zTucKtg55gUVGSpqT7Ui8oayu0qJLyeu6YeT9GjEKz7ymcl1nI1jR204GL0Vgi7TAxCraZDGzu9KQE80S1Yzxb1dY07MyZhUL7oyWoXnm4\");\n            yield return (Hash: 0x7b7de330f64bb9acUL, Seed: 0x00000000000015eeL, Ascii: \"Hb1ulxeUfjEalMMwNcgWGvRKc8U47rPPUOc8dgfbfIEpFOV3NX6IEPGhnzNK6jOiDlssWFdeaL9vLOCWloY0Hx1MPUzNpPx1N7p5Y1d6CtrK97ciOXarxEJz5aFU5v1KqCfC4JdJiomACEOp2MCsnmJz1xg\");\n            yield return (Hash: 0x957d096734b7e937UL, Seed: 0x0000000000000cf1L, Ascii: \"m6FxWVVTtTVJgteLjAr1UnxEQoTJiVg8ULaj2L7O91gfbBe5olfO2xwDsLcTpidQmhMyGCtOBr1hVO3Ugnl678jn89UdDu7B06yBTg93y08gD6P671JBkRqgQV3vNN5o76DaandiNfg8QJrwkmidGHHYhaA\");\n            yield return (Hash: 0xf4716f8b4c68b1d4UL, Seed: 0x000000000000095cL, Ascii: \"wzLjHXCGSajJWmj95VcIHoLZ9lP4xydL1tJsTsM7hNhD8vTFwvzteCmxBd9QTHul40VzyucnIlZpt7IXE5mbuRNTD8xqdg76uXGzPYCBx8H1Apydw9zOHpRJRhIz89HEsP74ePBYAaETTxwgNLlKApt3zOe\");\n            yield return (Hash: 0x3dca7d1c5404cce0UL, Seed: 0x0000000000000c55L, Ascii: \"u1urrFActQ6OHUkGPZkVZBOKcJGu7WAGe0VU8x61gM4HqUI6Cbdq3WKewjzneNl3zvxZ9qylzwZ6iyaz9DjmfsPBB9VJfKC0XOBFGRHsEghTwFwmdeXs2O78quvRFP0vEXD9rzctYXYPzqvMcNQBs29tWMsA\");\n            yield return (Hash: 0x5763830da07fef17UL, Seed: 0x000000000000241fL, Ascii: \"MB19edtYkCHPdZKlQpdLnzpRI0G73IN2djAIZPAnQEgoyQYNaTLJiG3XuoW5Br6nE3TcfzZsOfwIf4iOu5rzts0UjmOQXM2NTOQAfXqsAW6hHzS94BgHfjyOlOjrjR5qGorJxx3eNY24hgKNVH686b6rb6Sa\");\n            yield return (Hash: 0x75365e3921368b84UL, Seed: 0x0000000000002499L, Ascii: \"MfKVGmZXEkUCm5FWOBPCmQnjgqK40oZsjdZjUfiyVlT51MDRNN1M8Igm46TLUmehoj8FvjMwQBZMZ2f307c4VHq9XJSHrlzleZ2pu2WXkQxlVM8bYKSgX0c0dITSgilVBWYb05uzKdxDXdt05SdI6GoEaFR5\");\n            yield return (Hash: 0xccfaa33fa0308c6bUL, Seed: 0x0000000000000da6L, Ascii: \"ydXxM6vIjrISOJL7dQVQUvuIfjOdyiptXUuWcHgFIQwyhmUGeEdVEIdICVUSzuRlMwatIE9scF85DNJZjksaYGblCeaawoBgDylTFIdlipgQ10BGxVbrpbRGAE2vshvgbLRmyteU7yt0CKOkZDIxdW3QF39G\");\n            yield return (Hash: 0x13eb5557dd798044UL, Seed: 0x50cc1ea8563a34c9L, Ascii: \"Tubapz3FQuUbljkXjfqs94japLyuOfNYxMXcwosPdRM8udnzFzivbsa9ovq35KJ7Kqc1fTN83wajhIG01T3JLfGl2hV2R4eoWzgJvTdqzDs6Co9PVHRqPIIycaEUwA7SrxiVvcoHXJm5KITZI3QznRShpZqOL\");\n            yield return (Hash: 0x59dd4b4ef303a058UL, Seed: 0x25ce729810d4079bL, Ascii: \"Vs2XzwmoUIY89K94OPUdTm8JiYJ8QMyf9DseOZDlP4M5nnJEBIzpHyToV5wY3NwOjfscaPTB2mhVgIHvs0O1WtELXX2KyLyP8u0ynBdPWKCQzwl6GAkC1yfx1BYRMr82X9rLDYW4nfObG4XKAhIEZd3MCzEua\");\n            yield return (Hash: 0xb8d171bb19196210UL, Seed: 0x1e01bf58a2995f69L, Ascii: \"3Qw7U87hMFvrz9vXTV3cq6wulh5uZgo0XzyZLMgLNpNeYBeKCXi3GpVuTjSiiXm9hiL7YJ5ZK93V3SsrWhK3CrIXBhm7m69kGBwgxY7aF9idxWcPiCwJru66lI11Ep1gUGdUmyyCqmurzqpv1uE4ZbXITcvRt\");\n            yield return (Hash: 0xed51eae73d2149b0UL, Seed: 0x0000000000001b7aL, Ascii: \"teilLoRmzlGc5Ebm3B3ArhH6f1sZ2qAyVXyiurRzZ2Sy9yoBrN8SktjjlU2TWHr5NUPC9zz1zX0FW8sk6xobnfSdsdet0JgidHflK4IeQLhWeGJTg04jEei5YiFt6abmfyGvIddICdNtDtN93IZBKou35UYxN\");\n            yield return (Hash: 0x1728faf6ca5e2a7bUL, Seed: 0x23fd58b8d01cf794L, Ascii: \"HMAPg9YS9ggf6OGW8eQzUFvysR7jmGcwAjMltQ8mXMiN0nrCtKqhRaQQyc8WiBZpgLtTsgvBaKfPglRA2HPLNzu28Q6xNG2UEvhdS1qJRYBglRDBItcN1pwjIyCeewM00wTToh03nXXP9xUS2Odv1S4CAzxeKG\");\n            yield return (Hash: 0x5d8bc07581b88812UL, Seed: 0x00000000000007a7L, Ascii: \"rEcZMF0bj2imyLVxiuOUlM6pMlC6gwo5fWlYNx1UjDb8RyGf2JUrYbvDz9SpUzeJ0EE7e83PSVVtUKPE6wioBQ3DiH3b9nRXD37LstFYriMdcT5omHHZxZvR08yqitrpRIJtTVFFTUAIgoRZxpgJGW8ssAkmY9\");\n            yield return (Hash: 0xa117c21c65665f75UL, Seed: 0x0000000000000607L, Ascii: \"VUAU8d9A9JaJxsMHWm9DSsa3fU0LX1HVe0pGTZoVGcQMrtikk4fAJPUi1Zl9U6Vy5lkkwY94EdxY31VPcKfm94kviQ9a3uelIligqUQ9KtachOw6wm1sCTnJ3dDmZGzbUafyFOe2TgIQf2iORP8BzOPwt4pn87\");\n            yield return (Hash: 0xe5c5b5c506000103UL, Seed: 0x3c2902e3451cc760L, Ascii: \"KjchkxMHEzdw2pPGSaSMmmnTtUJmzf0XkICXwpEaC0W8Jsfm0At8azF9hdcoZnYSGD0DXASpWQvLCBQH9bJP17gRsJvH56shCfgTzp7ns9NYYEao2tJj0zIjbQMmMTo5cNEtfQl6xGZENSWwqfXUn6WLd1NM7P\");\n            yield return (Hash: 0x357585d2312cf1e4UL, Seed: 0x0000000000000000L, Ascii: \"IiBxrgW2w6mBZzsR6GeF9sB3l7I34uKW95L9NvrwMl85aUozrXwYXHxb6UE6EjasVcMOOFxSkH2gUxWeWb5Frf5HmadebjNQmbe76g8NGqnGpNEOhmwwbH9areTGnF1dzck6cZRbuwAOdBndLxzp8CXqwQtXpmM\");\n            yield return (Hash: 0x6991a8f8be9dfd56UL, Seed: 0x0000000000000000L, Ascii: \"1NceKUaAZTYZ0iecBTH3JkOcsfT71BIsuY0AuyMA2fxlaoe8e26upSR9vGKl97oBMgZKPw5lTPSb5UCemUoGNYqHSVNUmqsRrNezeFXS5L8mnAhfgYa2i1VCoYnRP1wtwYFHdJ7wqZNNmHkxUmqGMuQdJu71axT\");\n            yield return (Hash: 0xc28ed98f57eb5c8cUL, Seed: 0x6777505caa5b9166L, Ascii: \"lIrKpXvXKWI16oZEvS9Fs7BWiwjrFVDdEW4zVb9gt1WiIodsSfXtqu20Z2WlCdQEsEMKi6aL4IhOtG3u603nRTb86R77S1eiAaOjDTdAxVmCeTzQLGz1LnMtNmyC6n82mOt0dD5qsA76opQZmA1VjnYB4TGuIbu\");\n            yield return (Hash: 0xea02d5acd4277c92UL, Seed: 0x00000000000018acL, Ascii: \"QtxcQDjjVqymMG4ESynWyEtG5J48iGfFg8DYczpwOo6MoeEYwqTtAVOpdCLFhJkiAnaAxvGy3YOJxnoMrk9ubOSWeWAKx0OmuQMtQBuJAtZyWuIYfngKLAfWVcfbbKfz2HJFNbbJILQhjVwvkI05Fr7xnfPMB5e\");\n            yield return (Hash: 0x2e98bd05bc36804dUL, Seed: 0x1c8c8928397043ebL, Ascii: \"Y7fXUKQipnEtMzOFxH3rZojzw9HUw0pko7wNGm8IqYruxttgBScSAgj6uN9x40EYFq0DNdetX4eqplZRFaayvPlR70XlvX55JQu2ClGpveMdHbh3LDJInlIJbvGzc50jluJ6xWnPThMRK70ifM69obKUh8QEuLMX\");\n            yield return (Hash: 0x4ff365959c1f5b72UL, Seed: 0x0000000000000000L, Ascii: \"HzVRodZLoIsR7yjNoOvev7Hx23M4zXYylsuJMgxVPZ2kDdCsyG7JopItDEqZJk1TVHX71xDAvogeOO6fhC9TTZWYm2KtMZCKlYqdDKNvkzXDcHpJcOsDSHxMbkb8BMBZSEzp3PSpk5lbjhsthpKwqCTHyenbTOMB\");\n            yield return (Hash: 0x857b8517c0958f4dUL, Seed: 0x3760d5c09f8db647L, Ascii: \"ZfRUlMvz6ihV0GtOaUEC6pVp6a6OA59nNTBlt9CtrZ6RKz8317XC0AKWm5PnxVidImQeeX0pRDkuFXmfi5U256QffEbmJdw2NvYvyOQYZmGDWp6UlbwgRVRp2srwEl5dWpuUfMVeyNBMJW1hV4nAgxpAOHYtxTp7\");\n            yield return (Hash: 0xdad0eb15f9f78d54UL, Seed: 0x0000000000000000L, Ascii: \"ao4zfgApzSbgG4Ftq9wf5QgDZirSVqA1PPK546x3LOgNG2JQHhjT65oby3dgQ1Byaqo87dAHtvhbSoMJKJ6gXpEG1ZaGMtDU11jw28rbqkNkPRGhFFA65ZEcTPtiKAHggYfJjxEPQ66UqJrLlYa3GW459GVPeoFo\");\n            yield return (Hash: 0x4e3cc55cc22b85c3UL, Seed: 0x79e642717fbf5a27L, Ascii: \"8soJhddrb3vn3BzioBaOmKi0Fo0mbjpFyrpcc5mJ0VnCWjS0YyBOswiRTMoVQYxoNdN2k2wzkJX23QwpXACid2h86nv27YnPS1L5rpIhFqdTROgS5r6mNFRTxbQFAvbqu00nCzxKgw5GJu4qvB7ipXbnpWjWu9SWB\");\n            yield return (Hash: 0x6d3c7a3243b5ee78UL, Seed: 0x0000000000000000L, Ascii: \"uCTbnQFcR82L2E59yMlIT8LsKURuLM0RZUlCODP8ArNwhlkRAetszECVonCjW1QSVB4xYvzusAb164DU66ElcODEaV15ufuztpD6tT82Sj9R6tcdLYOBC6aNMvnimakXTYkNvi091QRpPST1jOoNlJWWOUtYYE0lp\");\n            yield return (Hash: 0x88b3c3e69fac5507UL, Seed: 0x000000000000047bL, Ascii: \"MvbXwjtP6WnGNEVx4iJ61MGaEwTZIAfCBwHX9WKOXCl1UAP0h84AhcG9iz6WZOme36zlkXdrJkDa1UQNZmcg0JrX9oNXPLha84UD4o8TNCSkbEitP3L70Aasn1Jjyw5UbFvcSNHMNBhEgBBF7b3olBorHCCSzYaGX\");\n            yield return (Hash: 0xfa1f52a262e9da4cUL, Seed: 0x00000000000021b6L, Ascii: \"HjFuXIJSeEXBU445lsex6x1BJeMOmD0OlaqLRwQIJSnBbwfAUv3muHK5t5kH9Dr1oDbSzs4zJ84D5UDoFvKBwMUJWZc5jGTE5gtpTznhVoTRXIKtAzIzysg8pA2aTvUeoYTTo0DNUHwYddlvMriG3HPEOuwPZDs9W\");\n            yield return (Hash: 0x3ec4aacf029396e0UL, Seed: 0x0000000000000000L, Ascii: \"0gABXgE7m768NXW5kMNQ8ouE7LuSq4ncHhBP2jblEAqHn2rFhuLSNoD4LXmhvfYlDpEueh9IIps1UXmwEEUfoRCZLXwMwJd86nyFcA2finm7MsVOKCbAnGnsHh0aXcgcB9bJ7UZc6xlrSAbyzESkeyQOY4mWKyJhyf\");\n            yield return (Hash: 0x5fb2f926876d91c0UL, Seed: 0x00000000000026e2L, Ascii: \"m46SbDPvUCuopzRosoOzoh1svBy4yg7SU4XYnJOmD9bLDdTFx6Tfkf7BHOmaJcx445mUtBHw1NpuyMYCUfp8kD3CUDpN3oDGmzpnvS1ei2r78tQn2rPSu70n75s4wXQukEvbtkQVE3zbSCl0h1h0vmjy4vGqz1T9sZ\");\n            yield return (Hash: 0x9e5532342ae49a98UL, Seed: 0x0000000000002674L, Ascii: \"Otm5vGmVV6jF8TLUAHeHnxtSvH667GG88QdLrHzvJFdsmhiAZotqgmidTP3skJIf7YgM904PRVEGntlT0F0vAP5883qPKINAB1lj5NDGYTlU8UTkjM1eDziygtyKTaoftVW0JXVvZOldbL9K9f1p95YyzGxHxdeQER\");\n            yield return (Hash: 0xefef8daff017c1cdUL, Seed: 0x0000000000000000L, Ascii: \"4oiCjBB9RQvl2aEzhG6Mq2J5kxxzj0xuJQfd4OXoOkOPT3Wfbg1E4Dvi3ch5VN8Zni4udCQlQqEOvhORazvnulCyZme9t5OoAIVxB48wWdJWhZuHOsPsziX1Hi5DMRCnyuphm8IHtUP6eE9XUoaPn7DCiEujVnusWJ\");\n            yield return (Hash: 0x28977f7c0ddb32a6UL, Seed: 0x0000000000000000L, Ascii: \"ay05ztOO6vxffFs5jon3nuCYOE5RrLdooRRDibetaLfWwMYgkSuj4wZLQeLSFDIy9UdhSLRjGN6AkSxUuDxNaZmvXboqH6ox7WOM0SvRur6fsVaHgkZ2yM4X9ybQRSQK43kWEsIwOJn81YXgMLrA2G0Jl1BWtbSDTsq\");\n            yield return (Hash: 0x81353337d0c23b2eUL, Seed: 0x0000000000000fc6L, Ascii: \"0TC1betJD5n0UTWOYp9KG3stDTCK4IRpCzPPdLjIQlmgweMdDtRQDJq6RwTVHZEMVOxmaEttgkuxKI0LyA9VM1CBIeZuVK6w1wAai6LGTIh5S2qcYiZkFRKrurNLie89NfRM1gGuiz5SWpkMih3sWhOL51fKRxSK9aB\");\n            yield return (Hash: 0xc091e14905806220UL, Seed: 0x0000000000000fb9L, Ascii: \"7tBqI0zFhDi2TI7n2fVF6t7tfaisgpZNTEzJK8XBO6TDX2oGNERANFK5EzzA2npjI63vefCaDtNBHPQJVUhenNWwjMJ8rVdeerM7PlZyJqTBnXIEnFpfSnWCg55PsDXsQo4tX8LgxM1HYiwhab8FB5o9tdCpwWjsGa7\");\n            yield return (Hash: 0xddad847a4ba1db8dUL, Seed: 0x000000000000019bL, Ascii: \"ogI7UGx94eVJAUXcfXLLAip89FeiJNgZhSLyctvpO0WAPpVbLqmB8aY2pbdMrDIaJJGQ63OCp5vj53b5AhuU9qeun2C43v5F0fBFaeuCs9g5e7X5w3PC50IHNm3dt0NDZNiesyt8YtrYhFuVyW3Gwiyn9lQnkQOFRJG\");\n            yield return (Hash: 0x3e66fed17f48f182UL, Seed: 0x0000000000000000L, Ascii: \"d3OblcFTEllzMGUk7FKNQM4yuV9i9PzQQtPs3G9bxbseeHRfnywdCkvv3btlshYExqVG3fFh39Wqqp0re0umNfJhdQDn3aKix002yzbWaqsBifnYMbSoPg6GyzOIRpSE9Ev7qtB8AtOPi3Ehvcs0t17rLS1oEPXEfjwJ\");\n            yield return (Hash: 0x7132fd637350951bUL, Seed: 0x0000000000000595L, Ascii: \"39a2kzihtWSooZlSR0E6zMij0MRIGFOoP1AVVPtxT7l28cUUStWSYzkmtAj7fdHaoYkF6IamxRE9d9RJ66bgcvxE7PtwXYEwE90aQ4Dzg7OeBX7EdUw4jWNtPpi0aLRQDzGqLk0sCrqDxDAfyu7rJufUSHxB6dEa0Fwj\");\n            yield return (Hash: 0x9aaf355775ab0a7dUL, Seed: 0x000000000000144bL, Ascii: \"nqNm2Z9wJ53A0uCS5at6v1SLNTQKxldOhyLTaAAsqwuUCxqz5AwEr94jklUcI5ewVWc048aDkoaumWZVkq4PDQWn3uuBb77tJ6QrOHsT1lTu7XPrxuDnumG6Io2qyJkVKoQ3pfNLPs59fTbCLyCsXkoBt7XUPtTbs31S\");\n            yield return (Hash: 0xfd9b30aab2e39e29UL, Seed: 0x0000000000001b64L, Ascii: \"VFFUtoHwiGTiDo5Ce8wpCGFcpwREf6m9CfWejh9KcqlekxNxhlsShqOfY79Y6rbBdhYKIf6lQKO7lkwFlvSGWQV2tCZH9sUz6NVVcuogH1RtzmNfnGILLHpwFU3NAI1eAOhmXqPoMVvWbTzQ5vgIEKZ4Vhk5kDL9FO6M\");\n            yield return (Hash: 0x22e21a5836ff7d30UL, Seed: 0x0000000000000ec4L, Ascii: \"EYWylwmIZryh8ywRf9p7fGwyl6auKZm2B5DUfvG9Tp58RmcISiDmaGhQFbPVp2sAe4xQQi7eixU4m73nB6iKhJCQJjtoNssxWwoWCQpA0r0K1L37pGyMf6toUC31c50oyVwJfppdO0g4vBAECaBoHAMVoqA5xtnLlYrFJ\");\n            yield return (Hash: 0x79ecee65abfc89d2UL, Seed: 0x5f0f8f008cb448ccL, Ascii: \"TSGEoEUeacXsHOsAUHFL5Ya5zEVOnMgtYZyBYOI8d5euiYw7PavCK7xAIhGJ1EaMtNrKQLzaZS2y4jyfvGXWedGHClfC04zhGPRbsvVKIa7aXGMFaIq3Stzj65D3brutKMvcQZYOIK90LXL47LyLUIZN3DHSrzOOgmm4P\");\n            yield return (Hash: 0xaa004366564d7b94UL, Seed: 0x20f0f02e5f401aebL, Ascii: \"JxyYsERzBkehNnCb8CrNUJ8vomqJQ3AvKUW9xczR6nZBCRQ70OoLMFag4sd9uUO2iaMfpej7iP1X72WtH8htlavohdGxefkScgi2iZVRD1S5s6E5JP0XaIFJ2whK28hrumfLRbwQBh2eCgK4OGNM2Vm866u7m5N7IsBQn\");\n            yield return (Hash: 0xf18d357fc6b3d1ebUL, Seed: 0x0000000000001295L, Ascii: \"mGHQ0u4zgPiTK747dKXZmbfNi9ysFykGTrJmSRpCE4s7gow05r971UvrqDWNGPKjjZZcJg0ZvvhV0lslVsZ6a3yw3AXHS06Wp2QSpQuskJrMLiAnzu6LgKGKMc21D8O7hnr4820P506ZiGzVfeO0CeB4toFYNd7PVB96l\");\n            yield return (Hash: 0x4f7964452dccb474UL, Seed: 0x00000000000008cfL, Ascii: \"B2ODuv3lFxt3qofD7lNmxvzpINollwlEZodmWjMPYHn29b2RsUCMGjMkYcxJKUpF4LNC14283aowzsqa2VrtUuQUyQFCIC5qcUcj0ABEDnhzUkk5rHnLVs17rhUeaCQfijc9ubvFzT6dVPasAYFu1ERHMiXctm21kwKuaC\");\n            yield return (Hash: 0x856edde88a5ec715UL, Seed: 0x0000000000001246L, Ascii: \"bKUMbezUjDvlxfV2DrfYQZrIef9tk9zupc8xyyq9LK0zQ0U1BgM7s6JAafSQXmK9lVYLLckbaULYxmhnaVjvwLStHZrld0g5W5UDgIygHvoBeXB6OYsuUbfjmP4LrHzFr28kBmqzmfhYJSv3PnBArSleZxfLoSU0lfh8Fl\");\n            yield return (Hash: 0xab9fe09855ef1c04UL, Seed: 0x1b007726071e7058L, Ascii: \"4KW4aAYsR6GkllK4WGt6RkzTPVw6arqy6tVMmra4diCo7iIoCxwAICkGpMITGYt5NXWYxNGwekswGjPU2oNA38EiWGWohCCR0NJMX3NAzbn85kq3G1ntdVWpV2CxK0QVbkCRsVymxKuD58qPblbD5NMq1tGZWPTY8PNlw4\");\n            yield return (Hash: 0xf04b7b549ba07472UL, Seed: 0x0000000000000a11L, Ascii: \"uFwcXzidGnJX0g1fRClmTSHrfpB2p7ZriGoq9a5GkMiqmdihUfOg3cC5WbYVWnWSU2szmeeolCLnT62oWrNNeIyQE3xAebkWRjQ0wJMvFNCZtkhDcZxX5nHT0pkMDk2W7xmT8MgN4bYO0Ze3ToN7oONG4JVPAYODqS3HTu\");\n            yield return (Hash: 0x58cbdba3472c069bUL, Seed: 0x0000000000001c19L, Ascii: \"FAuCN3mA3XboKGeskyl2jzyDFlcRwrtSUuih2vLkE5nELy3xGKB4bSnzhkyHMBCjvfpyqsqohAr5HmwdEacCZ5TWa0aym063UJpDnFN9EUErtqFARiq1Bgv6BxBaQiIDB0InavI1cKbznOUddVxS6uPXPt1RM3Ae2eqWwZP\");\n            yield return (Hash: 0x7341786a33b3d91eUL, Seed: 0x0000000000000ea8L, Ascii: \"DmmRYqWD0NqRtiUbaLLodxyDMcmFavA6AYfaN75Xu4WbVALfC0pGrM82bX8zG63Jbd4Jf08qTi1EyVohXkiqCcavOE0i1txTl2fpIOtYuIXL9sc2eonjbuLjoxG8Y6BQWEaqP0h4AZFcFYD7edvqZpek4s7JI5gUpRgQmzF\");\n            yield return (Hash: 0xa97e79c65ec907c1UL, Seed: 0x0000000000001e25L, Ascii: \"oLpP6h4aqJFX2oEbIMGtrKEHJu9K1mZsv5C1COJdEsHraUyHBKJJjWaaSaqy5YErcJFosnEBvOL9fi196BhwNzPm7tc88Dv2ZuARvIffOZkuzB640TND6To0lUmar92iTs0tHshgbzscV4qSkKoAWwuieAonG8CUOVaYvqv\");\n            yield return (Hash: 0xeb39b2c494cf5e59UL, Seed: 0x0000000000001eefL, Ascii: \"EiFDWQoocRk2oLlnRbTa90CrcSPfE9pHuMEuzw1V6PNk2TEmW596EgXfyAbramxQxDQ6nfLnJi7SK1CXNySz5sXKcSOLWI6bNIbbIO146PIDDKQUeP3UE7jOU9oWiLkd3t8OASON1HmDOMVIFJFDJKQW1eeFeKc8F14buT6\");\n            yield return (Hash: 0x37b1e7c9c97eb677UL, Seed: 0x0000000000001686L, Ascii: \"G46BeGhk3L6lIhNk20fRI6NHp8t5Y53kfn7UV0F1ZIkjKpsXsGtKw57alhPdT7nTC4QrH2Y9byKZUckDWYO5fdcMhmNlbwjblpXwLsNlqEG1wH9s8wOrdgGZliuLcoqQHXN8aSRNg0v8WHr2IRjyjwKQx392I1Qg36m3tDGW\");\n            yield return (Hash: 0x6d87ee053123d89dUL, Seed: 0x7ee96f72c661a920L, Ascii: \"lXCf0G9tGPCiFzFhhJPNwavhc81yh3imEgZwfBTzdWqD1Ehg0mSFGDZKa7onMP9QPaEkdv5xkX4Ozc2H9v6RQjVdzq7s9KeM9BuPqllVAvZl0RUs5jq1omWntpf7QG5dBz8GD8eoVMX0RfG0f1FJ2bc3z6WWtCSNGLsoXkG1\");\n            yield return (Hash: 0xb3d7e4f91939fa6eUL, Seed: 0x0000000000000000L, Ascii: \"DV3Mg3Jhs0IdFiNXmyHyV8WG0bRMEJrzNMgQuUlrEozWsJY4FwzYoiro2xv1Cuv3VhlkLfj2Zzjw4ssWF0jpnEp60iUXF6L7JxXE8Q5ZmcuoxbeIaqiJMUFu1HYjHnwtQY1YA9JmEbAUtbQyjRwr6U2n0So95SY0dhzcnWAg\");\n            yield return (Hash: 0xf52bb5bd9fc5956dUL, Seed: 0x0000000000000000L, Ascii: \"UFYQ6EksaCxSOFR9IBWTaqOlTPWBamLYhNOJ2bSRjTrYwNJqbgqYdPF2VnzyyKDd7hmJP3JSaCtDscRlCIUTVImZvPeLKwYzaMjiWAoaAKf5U47OrSWfCvlCWWaMtkTBRjlVguOEPiw0piqbp4v1BnPkO53qofFOSyFS9hU2\");\n            yield return (Hash: 0x4190eebf6eb65028UL, Seed: 0x0000000000000736L, Ascii: \"Ycfm5RRicse1McJ3pUaQasVQCBPB4fMn4UFJnkZGy2Jz3qU3rmTWldgtsQqqNlNewIBsXBWbCKVw6rnCxsOTkUwpSt94mRQBUzgng9c8K0txX7sDUkQfQ2obbhyCeMChfhDyv9iYb32hfLDc2qTwiyjAqe7mIBa2YBac5YLMa\");\n            yield return (Hash: 0x65f30d08b22a012bUL, Seed: 0x0000000000000000L, Ascii: \"TGrNfG6t279sfcTxZwhV8q4w5qWLjC4fCHAxc2BybPffMlwUA6SbAhiYRnJ1FSX2Ve9ycbDKM8ndkJf1G4BWfxispDLNAFDqeZnG8GyfelRK0njYMQgqCcYlIeYXhkLw2TNR3HiR0vKNDeo0PjHFTB2aCHEPG5ZZ3yoGwYaGX\");\n            yield return (Hash: 0xb0e6863075f4b03aUL, Seed: 0x0000000000001099L, Ascii: \"byYoDNAqkwTTjOJzPNGT1QjYBHXqSGpMBXFika3fsMjPm4WIUSBX8RzfAYsntzlZv22amjp8LpyQmHwK5YceDrZe2D8ZNLplxeQ1cAOQRwNJG7wIVZDS6OBWJakx9dwXdTLtIul8jicOX6YwCkgneMI8qG9AeqB7oPPSSRbAJ\");\n            yield return (Hash: 0xf0add7461bcceb7aUL, Seed: 0x0000000000000000L, Ascii: \"eFvEvT511W4r8irHUFyq5xVn0CqRS6w3UaLXKTXjTfRDrOtidaDnlJ7n5BxsBPqs8wJYqsy2xKs0c2xpcOMQuY2eM7XKbeXlwCnKbfGMsjOoBx702j5CISzowT8lA9hVLHTOLT5ptWOprU2Cazt7SlhXvQpjCutzWxQNbwm4f\");\n            yield return (Hash: 0x36ca983f42f69a0cUL, Seed: 0x0000000000000000L, Ascii: \"69t4PnV9HZjqxyd614OpQ4UUVFaLwLZjHwswUVhd9w5WRpOOkgLHwinBSOTBdBGdzVcD5LlQ8rfEfG0PUPY8OpcXvxLFSp5y690sQPgisz3dsZQkPGwTfRWXniGtLugTEV9DvBqe26JsflgQ3WrAgL61pesPLqUjGQOjTZ1SOs\");\n            yield return (Hash: 0x522dca075c269911UL, Seed: 0x5b6591895d28d90dL, Ascii: \"7LoO3KeIOyuTzZUVLLhkpHHDk73ESMrTtrgAvb8u43USMk6oWdez3ltcbz5dufMfnBRJG1oTNFArxx2YJqO3i8UVdkAA6Xar24iigoQIN4wYHZGJ1HKJJkcVunTR0rQrcwaKTxxgDqo0wd4YdAxx85mNT59P3uRpGpHIhYBFzo\");\n            yield return (Hash: 0xc795d6b7546dacf0UL, Seed: 0x0000000000000f3dL, Ascii: \"yphlsnEFmkZwrMKri2QCAhHbNnMViBQuLV06ja42hK7D68O8Y9TkFO5mwYVZVAqnbEw5i3D1XNcmsyfyk5CmKQHq74h6YSN8291cBDvQ8lCdUeVRPxE8Jqds47truLtYK2xPMuYoY2I0aQcRNdWR5JIdtQe7KSBEzyR3qgVmYc\");\n            yield return (Hash: 0xf10dc3d150a874d9UL, Seed: 0x0000000000000a6bL, Ascii: \"RNjhtZxCyOOjXrJABHwbEp3oXQIfeYijz2H6a965ITyBXArhkw49dtRSmpdakArrBtgMLRpzG7FPn8aKdCTh6bbxcMTUYfUH8HVAAtedFqyX7jJ9jyI4FrkPOKSiEjXpL06mlyJFGZV4wXNMlygi579Dl6EF9I1cItF5Y4zrhx\");\n            yield return (Hash: 0x2d75cddb344b694bUL, Seed: 0x4bbf94d0e3316a9eL, Ascii: \"Ve5FS4djrjD7bhCuXFhvQceTEKnr1ILCeEyfEmznIfIfDLxNBB5teSTP7EIQM9AxNe9GqivC7aU0e84LHgJcbURShbVfJ74rs1VbkLB1jKFqkq2dGmNyKJJMBTd7NhSoe8Xxo0a7zV7173HbVSotvDmcZkroJQWFLXidem3vpNn\");\n            yield return (Hash: 0x6e67c029a56900ddUL, Seed: 0x00000000000008a1L, Ascii: \"SxYJKtcy22X2DlPHAXXvX8H8dwsHH2s2BDp0KMWaF6gBut1nEArXUoHGKOq9aMhBHYr7zjWJ0ANdPVFsZQBVsxuJ39K6rQGrI2NJNwikoCL0cLSa8rLGSyu735qpa42kgaigj6RmDgnc47p7HfHPyvudYV18oqK8cDiBdEJ160B\");\n            yield return (Hash: 0xb2fa4054a4b468b9UL, Seed: 0x00000000000016caL, Ascii: \"t7J7gMiUNjRyVclvZ4jDA5GLmxDLHR0Nz3JaLBoNq6mWPYUp5QNCEMOZ4qDnjHT9Mo2RgdKtGGeT8axHb0lrM5WhQX31Lzh5nITkU1WUpKhKXAnVvXvpPC5FjRexZRwgjAkE1lgNlMZBA3MNr3sagaJLrZQoREGAJq8EVYcWror\");\n            yield return (Hash: 0xf8683f75cbd46eceUL, Seed: 0x0000000000001d40L, Ascii: \"f9Sl7veXY1JwUr5KTQaQauyOVxeD6iuWp7KzhBsUI07Qp69jUqlpqPG1propVwt9pAcghPpr3vOkuHPWdtCcpsQ17YTC1MrZqv1vUs21zHHono4ITzSP4vCXzguU2SiMd3zltIi1O4MOb9nEyduJGDzy0aIJA6V6moDBYykyxft\");\n            yield return (Hash: 0x717008abe4b0bf95UL, Seed: 0x0000000000002639L, Ascii: \"DPFLTNJwyO15kY2flHP2CJjYhGs7cCxhIdiXdOvScO4JY1HAyqyjrzN1W4AKXCkVTQnNoD8p3QvisKTeK1jFRPMrplnoxyDti2f9vFLkIadn43txwZtwudaqzixWHdj26LHvQKYdHo67lEaxWOqxV5R6nXYChKDZm382oeW4Avbx\");\n            yield return (Hash: 0x88624998ffafaec5UL, Seed: 0x0000000000000b97L, Ascii: \"li8b9ODwJRG7oQ2xanuTE1TdLAGxVNqexRDdsN5yvD5vwcgkF09F8Z3e4jQZcPKsQ7Rse1k14tm91z34vTxBHbBhhht2s9UuYr0RgmZP1t14hCtxxHGbfn7iXTxxce1RDMzyOBjV8TD1L2uiev7XK4QfigJZ8ZbJ6ZkBjea3r7zN\");\n            yield return (Hash: 0xa8ebacf86d4efd20UL, Seed: 0x41e37724bae99a43L, Ascii: \"QXIZfwWkXQkRwZOCC1Rn52AN29lLufsyDdtWMgkN37yUHN8QSTgU23DMke9zphultPnjiXSmuZG4FxAMNkm2Cxvbw2KBUq4lQl2WtW4FY8f2MLu1XYcdwTYRFBDt8EVZRI5OngKLTHB6koRF2NZ1l609ESGyR5WN2lDzlz4heq5U\");\n            yield return (Hash: 0xfb5bf37c47cc2415UL, Seed: 0x0000000000000000L, Ascii: \"JN0f75tX7QOtnnD5Uewz0xVY5l9pnTuNBCXQjd62JKAkbqYOGLOKN4qM482gC6TmNyWbjNlVndw4hopzHGJB2thEoNO1d43R5bSDc77jvXeZ8zPp5mfbIAAoTnsFbCFjDVfVtCYHHMz49JE8IWThoguCwoSQDQxLc8e7QRl3hEAh\");\n            yield return (Hash: 0x15ac367cc39f8d7eUL, Seed: 0x00000000000006a7L, Ascii: \"Si5ePHomZqzQcU8dkfDQsnLpQA4Ys0eUuJQnLnAGU533xVzVwr3i4OR7ajLCR7DOX2Xn91pUCZgQ5yyJ8nfDU6YRBnaSywnkDdrpYp619DpZCBLlzqyCnaCCVPMVOthcXm5o4goGS3yaGxJfRYCnMoy8whFGgM4OREQFbFFF9frAK\");\n            yield return (Hash: 0x486f6211841bb665UL, Seed: 0x0000000000000000L, Ascii: \"qgVnQMzRNPkx4wFffJKN5iSPLgOQwRl9Qxo4oa5Ayi2KaMIB0K03LtzfNYBkKLbj1AbJkTHVlnvtvlNReKJCMmwn3NXSEwp54qNO2lwWQO64u27Moqg0vq5gS5DXfIS9FTOYkWVka6jNfn846s6yQa3iE5sBSeazk4domSEjjw7iF\");\n            yield return (Hash: 0xcc3cfcf1263409bcUL, Seed: 0x00000000000008fbL, Ascii: \"yCh3xyhOIarvSlLsPB54PQ4EoqkQH69UQrhwgUDD8IV6HrCxu5EQMMiWYpeSfnXhtNCGzU5xbsSrK3LxYq7AkZqycazjplStIbeD8IUuaY70dRLh9RGToYfHEJpVKiBRN3Ei4uIksoYq3eM66pZyUag908THDQsFsJrrmqqChdorH\");\n            yield return (Hash: 0xfba75e796a53b26dUL, Seed: 0x7f55f3730aa104d1L, Ascii: \"OpIHHgp1poW3DqK0flDsZbExyh8odgUdC5KGUIHPZbRp8gxKauoOcdrfuWrwHIz4K4q2QVHIXqCjP5jbCM237CJDSmEXBQm5Xe0fsTgzE7XlPRdeS3QSdrkWEE38FFiTsSlqlQbzCTzI8nREphY9dxViO63kxDkWOKZ1NIeKuUrFC\");\n            yield return (Hash: 0x3c673eb521026781UL, Seed: 0x00000000000022c9L, Ascii: \"zaA4n2ZzbeHZICkmWLOUqOo6DSpcGaknEnZmULFYD5clAyrvkEkpbktQiYjjs6CgYnd1q5tn5kgAlRKg5IB7jhcD2uEJRNT5AMXvon83GrX64c9cxRsIPNgBODuzvdsFBJOPikJ2IaQgH2O6eoO7mLQw41pQFbVSWvJUnwsWoco1dQ\");\n            yield return (Hash: 0x603db37eab4c07d9UL, Seed: 0x6adc8b669bd6311bL, Ascii: \"TBrNqFvW930t1B0Cf7nNX2jvcnnTyuLYHhinwCkeKplwLBZlVtiA3PAqHPtcX5KBT9yvhJtoBMHw0dYhSsSNx8LKHFqe1RrSfjMmp6BLUYrOtbykkf5Zf5dKo8Cw2BY87RoTC04RRsDEMB5s0f2Idyc63aP8wDJ5BqisAH1GSSSG86\");\n            yield return (Hash: 0x9e123782edec08d7UL, Seed: 0x00000000000017d2L, Ascii: \"TQuxURhF6DjeDoo9sGcQt9pTeyy3O709uT8FBfjZZTBiuXl8KPSnJzK0aKWFgHCwu7PMGCkZQw7bWfV5MUGdywz0WUE0twTBeKcmGoCe5XR18R0X1w0XbkC9sFKGZIaTKwbXqeFB46Xrb5CiZnZ9hGVBJKqac8dWO8yVgNzWvsZzWL\");\n            yield return (Hash: 0xff6844373b05a80aUL, Seed: 0x0000000000002194L, Ascii: \"ZbzTdTGpIRbfH14hhoaoq8swak0oK0wYRImyQ06Gospcns9avJo7aAxY1xHo1gMrKW6f9ZXqqrkaNB4xx3CZP5egAyN1NNwLz7BLdBlWrpxJWRg7IqSdqsGAVWKt5iNmyTaN8Fhw6yUpxVqruGJyCHQ5zkM8rW6xFSr4gXDIrNzmWC\");\n            yield return (Hash: 0x3bc425099ec0b3d5UL, Seed: 0x0000000000000000L, Ascii: \"a3zegmCznlfo8ePYK3gLwiSR0viat3PIjkjl7oyt5xQ3QJE4MYrqAW5AJwwCJpNWIO6WpYZsA5EchW8qD0iVec5hRv8NEKDTPopzR8ttgGXtjcO2MFwrR413qxfK3NxxWtdJ5cfJBCzAuSxrdQNYBLfLMy0HaAQ11855fhSvKJ7kQ2z\");\n            yield return (Hash: 0x6645ec87aaec7b51UL, Seed: 0x0000000000000000L, Ascii: \"h8cEn1EWrsatjwjYT9bwKJz6Axxs7pQ6f1lvydrOqtkP0UHjyxR1INj5Z3HV089qdMQNxlrKwnGhrlq4I4iKxlTJIvVFM8HzgEaqoh8QQqDABobpN9lbfQsjlbJNM3gH4FSUDrLfNcr6cSAIjqlYEdv1Md0YaDlqsul53iXwpVPgC0c\");\n            yield return (Hash: 0xa93a2819b4fefdc7UL, Seed: 0x0000000000002589L, Ascii: \"viOHAyJJSBIki64hUgbwyguF2MhMloJgbw7dAy5pijA3zbJObpRolOrFr7aG4Mx3vXGfr97eHvN5EOaYS85daM70YM7vm0SDijlYdr3C95kfSavEnx5TZlpQuMfwxX7MxfbWUZkxTeJfQVpQos6wBHNIG1kv2f1yIB6gTdZC9CP6Qql\");\n            yield return (Hash: 0xeb66f9cfbef6e71aUL, Seed: 0x0000000000002343L, Ascii: \"RN2Ed0iusynRxoH9LTGfbhEB0VE1aE6grVGPqCatvVazhxoTzz4XH6Tfun9YEVLoHnEYGN5ofv7F303wGv06LvwnZQ1HiukdekVchbdcNSeVN3tplqxZERR7HBqJPzOdBkrXcjlrtWKQkEgKRliMpcFxgEj16EDV7Cu8PIvAch3c4oh\");\n            yield return (Hash: 0x628e2ac8cffa3025UL, Seed: 0x0000000000000887L, Ascii: \"C6d4lvLwj6L4OtadVcgzbHHXeZnXHHTNwJnlz2ORtfiSiZ5jAKDC5BnOyGuGjMc7wX3JY7TJh00PeCEVoxHn0yF1Nn68OdHnWhjzVoyjOjuG0tFm7Yk9sQbXkPqbCa47fkxQbjXna2qenclMYTSfng0yauu2xMxnQY3qcKbrpSrdED65\");\n            yield return (Hash: 0x955ed174883a1043UL, Seed: 0x00000000000017a3L, Ascii: \"dZhFolrz3cgY7Bcq6joKumrEi9JNFY70F2CFIMe2SxObMQYGf52odirMHQcfPCiV60WnFOWJmJBd3rPXdDrcoBdwObFRvCudXHaAWcujfw8c15DGZHlWLk1nZUGIIDR6XYnhgrJ3WETHGQ4877JEWt5I0qVenQyQezpDz09mX6CK2zhx\");\n            yield return (Hash: 0xb1446dc79bba3433UL, Seed: 0x000000000000230bL, Ascii: \"dLsYLvmOQYnDDlxDUXalLzd1hFQggKxJBB1jtWnePp2t4GQUK8AvuEtXsih6rvdB4r85lthPIhkcDVcGmFrKLMuYfzm3N8eCSfab9WD1MztTJkUxckYzMSuynESDlLUVWbxlgeHSevClVjKvqpsHCa007dEsuSiIvswFmnH8a0mQUpRh\");\n            yield return (Hash: 0xdc92c519ff918590UL, Seed: 0x0000000000000000L, Ascii: \"J57JXjaL5JLObJQ3oUgLErePCRDzNmtkBDUmVsU1pwTtydAIDL1pGiAbRqimx2z3aUDtLp01F9NJgpBnTDtvNTSW7UGxL0qe3UhUiKbaAvEbUTWlPvTippmQBnf7yfnGCQCYXIRi3DyCXgvYWwqFR9eqB0ZTXg6WL371956TmsfNHgQQ\");\n            yield return (Hash: 0x27912ec03fc5b479UL, Seed: 0x0000000000001dccL, Ascii: \"Lq8p2D0n05LdsOWZSC1ZW525PgNUp5nPtzmH2alnzXQg5TZRnrP0aZacyeybvi2KHpPB84lCFZ8CBlk5hvrIbuWo5ji1cwON7QL3AQ3vqVCUbmvnmiO3ylX14r3huWVEtVxFRYVNBjNpv4icH8VoYzfHkmQ2qbamgTz0lmM93qbgIPLnJ\");\n            yield return (Hash: 0x6511ebbaf4eedef6UL, Seed: 0x0000000000000000L, Ascii: \"VkpCNWkIT5EJxuRljD0VJvqY5oN82jUPkHdXlBkSmHYDCuCuBxCdbZKS4pw93Pd2EohxIGFO06p4BBCsIceenb6IWVVdIiKZ8ikKjpm1gjr9RijjMxzvgvnW75l8VxNt1jAJ1Exyb58zNPP2nwz9rLqlSjEOaCItOQx2rQrnqXC2Lh3dz\");\n            yield return (Hash: 0xb275f2c4494d93c8UL, Seed: 0x1c30f1d9689a88cdL, Ascii: \"HW9zQM7NDJfQSwMCXH53n1SFltoHkx39AdTkKuwTPg8V2MIQcy6SKYtqYNFjiCQW1iDSTQxYLcPmZRarmj4aj4n2psQW2oiKX2Vhlc5KgEdApEXsc5qqYxcDqUzv8nHNDexnAmagY2Cgi5IHC3APhDwT6oEpBslz2gBBUyTfF3iz0g3pD\");\n            yield return (Hash: 0xf58fdadf300c4fcfUL, Seed: 0x0000000000000000L, Ascii: \"f0TDQc3ksKMeoz0XKg7ubWELhCTzvrtP8GwCVSJT7lSTo7ucoFlblH79GnkNvOv6gsFxCWWlKjKPFjo5wmOe27DMu9kZ9VXwnTbnGDriFtaH6S7BOR83KHvXm9Y3whL1GEWHQs6sY7XBDmCDwEjtXQmBfx4K22i9YdlU1B64e17JXP1Sd\");\n            yield return (Hash: 0x2d63af624e8e6361UL, Seed: 0x0000000000000bd7L, Ascii: \"NWqOsKqA2yneMRscJuSwCDRnCcJ8BRZdH5r0bKcFOJ85TB2Wsfx7p7ZIgjyApCuzWbpbqKDYEdwXeMC1n52dQkYehWUhFhi3oVQ6SCilf70cGE5zgktSFkuNbw1gUmXDRiGaXPBnxUZZPwapo05i0onEdQ3XxFV8cGBA0ScipSIujBfgve\");\n            yield return (Hash: 0x5d1dc6bb86ad8f58UL, Seed: 0x00000000000020afL, Ascii: \"eJmud8YcT1ocwrNQ2md1y8jenLAi7CXqWmp0yuPSZtTyHBEu9qMlIDiv64Df98NtF8jWJdNnM7FlYxc8HiLLm51Y9kEpsH6a79ARqNRa9EIR506YqLxQLWz7ai9pOD82iUrXQ3BAMluQk2KkhB7hYeOJ6ZjeWuLeiOndP0kKgJTRvx1U5x\");\n            yield return (Hash: 0xafbe2d86821ec7ccUL, Seed: 0x0000000000002306L, Ascii: \"18fhz9SuiXQoq8efCDhF9ey8dDrXUuripB3dgCC7aRA9JlmLfcpHcqqwFLXoqapfF2IWOPqvISuIfBU6imlz4eIGtdY2TIiX5B3XLX1LuDKhfrescbh8wZWYZyAgMqCq39gIhKLeDOp3FUwtpJ15bgyCcYfXCjZswksZbP82XKMi99Zz39\");\n            yield return (Hash: 0xfafb9586f24f7421UL, Seed: 0x0000000000000059L, Ascii: \"RSlDwXPk7QRaouwN3ZpDby96hMHm8Pdrchzs8N37NjQa2fhE23jUVBBMRauHxUV9XsHXQRNi4WYqCJqGOsGB3ebRIUKtfRmRCLdte5nYozGvhDB0itCZrLl2KW9YjbYQSylHawBo54P91CJJIyCfZBHtM31GvP4Kf54N9TmfJeHvolInO0\");\n            yield return (Hash: 0x2a963c59c697ac1fUL, Seed: 0x0000000000001648L, Ascii: \"MtdxsWT3aivOWEiFfI3rZeYfyhGraz5WRKGMUMFSew31QObTxntiBuaR5B1lCqHWmyrrMc9rjrKD9BmZ9kkMdrO2veSduNPiJ1E3k79doASJhCN6D4W41aHRUk1tk5d0WRtczms1b4xTQpXklrrPKyuOnD2w4jrIPdQdqhbOYIV9as53Ix6\");\n            yield return (Hash: 0x75bce5359df38bd9UL, Seed: 0x0000000000000000L, Ascii: \"dZvz5IhrziZVFIqSsMPsTYqm2yZXVlK16KRz9HOnoIVTXndJ9wXy8snmPBlmE4UVKMl43htrrMXmGHnn2uF5TbdXSyMDe4eM1I7nP73FZVj3qcTwyMm1E6Eqgrv6ueXkSDypLaJoO4c91lBehmBBQBfMMbzK12IhAe0oBFfYJNR89WrE2T2\");\n            yield return (Hash: 0xb05dac9cc35ef7d0UL, Seed: 0x00000000000011c7L, Ascii: \"3pZGgG0wdGRvQKX4q8EyvTnxuNREvdVOd19Oh04AW4cnzcp2rmM1848odP0Hz3MqXI7ZAoEfNv2Dzj4DTSHY8nCF91SZ5zGeWvJtaDcz3IPGAQ08NBb9QT7xXVC65Edx6g6wF93LSKJRemBCmcm4mKdPcV312XXuZeEoORzXUENzizlXQHQ\");\n            yield return (Hash: 0xf55b83f4bfbffc09UL, Seed: 0x0000000000002462L, Ascii: \"7960wj69aXsHI0qmPHgQzqQ5ZW8M9AcuYsUmmNX46uzwCvOx9Uu9KzpFUjhlDu2mwdbvdHfKMnx1td7hAKmLgMKYQ6kvYSevcSWfhNJZAUSVAe1ZzaEzgELBY9hAp4eLv3My39GdzsQPb9F3r0JvVL3B1hvgAGu0QEI8acrOlfcu5KQeFCA\");\n            yield return (Hash: 0x3087a5ed4f5ac346UL, Seed: 0x00000000000016d5L, Ascii: \"yW2PrCj4oEhwXiS3a3Ap1rsrOqXMwMFSngA5zZvYNHvjEQh1LP6XMFOuAUbUtDLRovZ3TCAtbAo49Bypi1VoKj63sVCe2EIgVb0YKWQs0L8tqRPbwRfrjdbqBqT74SipSqlUFGAD4KL4C9uKXCl7dWIvz8oyAUrmhBpat9teMSiRM80gWL8L\");\n            yield return (Hash: 0x58e65a8690cbbae3UL, Seed: 0x0000000000000000L, Ascii: \"tKkewASucUiCiFRIrqgHXnih6szxGRKOEe7jgyaepXGV38nRzcyXuvomMBRWW5XcIijG2I9J0VxJsida1PyIJK0evR3PZp8EQpMDmn7PmwFB6JzTRzRurD7YeIXcZFBfryGdpY0sLZQYn6MMbceeRqsxw17mYcs4t1V4wYsnu16iWpKX9olC\");\n            yield return (Hash: 0xa33bc25ae3289bc1UL, Seed: 0x4e1c2997f7786979L, Ascii: \"tx2gAcVeuWYTQnLACJk8GUGaeedDIblXsXQD8ITi9ZmyNNe383ByCRAeytfKe1SYWi1rXT6Y5tcJIqeab3H7NOnZnw3XhItAdbfKpBy2ENJiVyPtSMs1cLlaN2JqmRrdrThygetWxYeVdFxJmawobIdyzvtjnuykne6Pc4cEqthI6kmRe6LN\");\n            yield return (Hash: 0xf7f53040d14a4cfdUL, Seed: 0x0000000000000177L, Ascii: \"Pn1S7LvUboNX29kV6hDbNUY2mRLNUJwGqsTomTlo60bvXQEq7pJwdGNlJ5KTLV9RVD7NFegUF982RmmJxXIIQimj4fgvvUYq5jtAkT9OltBJvinqNuYneYRAWLSqh8Xoa9j4z3qiYXhegEJxuaoQ85ePlXcgDyljaPAWaFUZI1b2JCyYtzVp\");\n            yield return (Hash: 0x41684896669cb7f1UL, Seed: 0x0000000000002484L, Ascii: \"flBRRzYt1hrYXdrwGBey2oQuqX0Xe4FeGE0MUhMHnv48P0Tjkm7M9P8xWEp9Mnb4XTnyW7rtNZiodPyCmgS1QGEFeOFluj5m0Qu6YqZ8QEGmTln7Bck7AGhN0KQLwo4ZKTDEOz8GHJK46MEhoV1h47VRhnqwrp08v03FWLQgUub82bR9y2vwm\");\n            yield return (Hash: 0x7d9843d48915fc54UL, Seed: 0x3aeda318187a8ceaL, Ascii: \"xakiyYp1uPRDpENkGatZqaaVSCqSglYxE3EW75mb6ocRpXxyYtsE96glnTti6Ax34ocuI5kSKu1SUwXYNJeiXVcOR4c1ditIgbJOTWcdSjVVszT1SXkz7h0mX3zbwHkta81pf0yI1iqF0qVy7nbgcI23bOWymEFXFEwVWzqrsh3q0ZyxM0F0m\");\n            yield return (Hash: 0xa133fe696c47a119UL, Seed: 0x0000000000000b95L, Ascii: \"MAP4ZluXtkCysWGhXgNp8g5XJdAoZgQd69WwQ5kiKcNTJXDAau8YfoAh0wQp3Pt8xRTIwgqpXLibJPkPVWJrJ3a0iVFco3A1cMd9AUZeDlIngYbKUhVkDJ8ySPGymOowWR1bF1G3lJtckamNEcnflIfVUaofCBTJ1juuJgwHqOlYJsgaF9LS8\");\n            yield return (Hash: 0xffa492e9b3fd677cUL, Seed: 0x00000000000023caL, Ascii: \"pdI32M9n3BMoIz8POWSaaXprQtrNMbGttrQs1jJhm0dTx6MLRV58Y5Saa1FWxbHcWHlkymDo9VNVUI1KXqmlpZGPEvDcf16uxTkawDZvO8xAXvBaDyHqGNqldJQhsLtz2rRlm4N41SUhKB9Hl6oQjbfmRlRxXc4n4mO7qUdQfsjCjS4h8r4Nl\");\n            yield return (Hash: 0x0d2cfee73bba5b44UL, Seed: 0x000000000000096dL, Ascii: \"v2yB464jsFYA57ehyggHcHUIDgnlyy2iBToexISkax6CTrlf8haI8QqjZG1YL0hBWOc1JOAahb3IX7Jj8uSAFqKOCOwshDyuih5jisPPzNScDo1NP98EHsujAo5c7EUyDCucvDfyatwjMTDRy1z6NnpdrYKocXpOQfuLRM1RYg9QY2Xo5e6ahq\");\n            yield return (Hash: 0x6eaa72ca62e5ce52UL, Seed: 0x0000000000001cebL, Ascii: \"d6Z1rQHNfl4razuB91Z7dMCCqIbPUemIl1uCFwp1dkZddKBQ30fhbD2OCRby3hrUTkrG7rGqhOZ35qE0WltDskgeGPZZdkcGMISX41JwjxDXg00a6kDvKupwyQzK868kESLJ8SElB7G3XAu6fNbvwdTFhL43T872PKF7Y6wnkK1dq6fcGuIRNz\");\n            yield return (Hash: 0xa7820938f2d423baUL, Seed: 0x144723cfee66f76bL, Ascii: \"zTUm7XCHKUGnExdeHD4d3n00gJo1dDsJV880dRneEw12DxJQwbkf1kfge90GblTqRwyDEdEqL3ygOc77onaKIux5mSz5DI5O3Lc6r7ynQzOyJ4iBfZUu2IdBT89hdeo2FECqlN4qikHysfz66Cw8umK0xJ7AwJWZGgmt0KsSdm4KSgXDmQumj5\");\n            yield return (Hash: 0xfec2c55ffeedc484UL, Seed: 0x000000000000030aL, Ascii: \"a551YE3acidpdsBEAbKSVafw9T5oA2FlaXpDOjBILDTLOJsgqCqR396yARyFkvQWU90eu9lM2Ts14MBuD3ZG0gNHe2txRmCejSR7FPvcYQiqsoCSWE1XYEZqnM7MpNENmCyULgc9jahlaRZcHi6cjivtHBKMgK7GdjKEnhn0oGNG2aJF1Jlm2A\");\n            yield return (Hash: 0x4b5ca143ae84563eUL, Seed: 0x0000000000000000L, Ascii: \"N8zaWjtUPYwptlEtQHKytOaUXDLtti1azxEysaZMzVzXiF29t2gNjwM3DEHyBpRsO5tttioaLgXoLNYBGtmMyrobhVLpzSLlS6HlC44PpvCwimAiyduddCVUUq9giXLMLGNBtmRg5lxhrBfhLyyVTX3uE3u10gfNGnvixQ4sNwzXQVfBW982Fib\");\n            yield return (Hash: 0x9a403a5278b9ede5UL, Seed: 0x0000000000000d47L, Ascii: \"ca0CQsE9xvx5zoHANK3MHhVfwxuu07LZHeEuXwosS1y0ugSBa6pR8ac8SlnS5LB9wFCIUSiDiThnigKVi9UqSoXgFmJ5YN9l6NPJSfB10dCzz6Qxc5uJXhA7H3xqMVE548HLwaen8YQubkRCpVdHgnSPMHKssKchUZxUOlHHgGRbBaLoGIArnce\");\n            yield return (Hash: 0xd58e4b4ee02c3e0dUL, Seed: 0x5568b6f89bac7088L, Ascii: \"QixL5o3UG6iQCF2PplvydxVCtIjonJiKHCdZaEUD1RGjN1gqR4uGMwcB0MZP91IyEhUyu1Rx6DJmRyHGLdFZjLkXMtYAQdfms9G4wvO0QPzAYJbsz3Y5ap8ciOi6LX4aOJWAvf5ziD0uJ1TQWAqupVSpJmu2hsrT193iOYmTbXc1Lfgci75Ai8E\");\n            yield return (Hash: 0xff563f92d385e8a3UL, Seed: 0x0000000000000000L, Ascii: \"mnriVJXia45AHhEjsZeismFaGZnDH46U4Ipl07CN39zUsfwNguHdfumNQczQOjbCZjx5EzUGix1989IKEiIIbs19krp5JJRiVBsp6j2r7bwJwaPANOllxQGhzFs18scV8QoVDbG4amGu9LoKKJ5a059GcP3QrahRBfEH0LRLOa99ctrOkojZu3t\");\n            yield return (Hash: 0x0f5c233973b5b574UL, Seed: 0x65ad2bc75727a669L, Ascii: \"BLwpEgFYeGxJJb1qrdp975NnOy6AWRMj7LA842tJFqWLUUGaa3PsDCa9zOOIIgIiTNTYRJCvBTtPeoXOiTqvKsLs2n3XfNMTLjrBACeUO4J5LbrKToq5URAR9l6DRvsaIlYANAXAEbj4R4FaOFarRUuNt2n0svPqSMZWCQgSRtKmuTSWE4BRTKdg\");\n            yield return (Hash: 0x648a34338cf909f6UL, Seed: 0x0000000000000000L, Ascii: \"ZCMAzC4R4SolVuavlBOqxhSjlr4sRN8x5EWoKzxvN3H3jNjJ1Ckz0NrAdV9bp3tNxN9kwssCM56oEG1KHCTgJ1t0Z10Qes09k1JuO24swHp7Y1IySnK7SqjI0ZwETMCiQFL4qtsXt62ecCRzem3l5HiwXtfkYeBYu793tdJlcRy5V1PRSGkB843g\");\n            yield return (Hash: 0xa835667cc5855661UL, Seed: 0x0000000000002279L, Ascii: \"cHahV0PeKgS4onXHTJYVusiYLXtbgXBHgW36ziefpkCzVBnrhM7N75u7azuu2wIWqkVAoOD0LHhN8MWeFVQsg9ErppcUE22HaCHyXwJ3PKwKf6DylWXe3QXzWMmGMcNe935CA0vBoQvEDA9EawTdxa03SgwUApCF3KcVmYTCA3rfKgkKlyp42Nz7\");\n            yield return (Hash: 0xfae537462b479731UL, Seed: 0x0000000000000db3L, Ascii: \"21ZCWnU0rbsDyYJIgw7qcYmRCOGF6cT6Ovq4irqpQpU0ATCqh9NvrrW8izTwx1zemE9PS1dxROTOXDLkrSyGBaZDijLUKHjnpLzd5zacpW0H6TaT3HL1pLm5K3obvwavi9V14AOvQGQl0DpgHUHpd5RFFDiGsSM2urjP2yHZrChkjwuKh6cME6Ik\");\n            yield return (Hash: 0x1e8c6978dc6e3678UL, Seed: 0x0000000000002345L, Ascii: \"z1ioVlUCa5wzoh01a4WOUhY9uj4fNcA2T1HiowIKE5eKPqaJfFB4NSlH0HiWpObtpV55ESYNeVD5gLSp3TOYgRl7VylkpJDUPjniPLSlfHJHVbHN9SIzEPqXn915PIFzrn0LoyMOfWyduJH1vVG4jHgNFKDRNbzIiaznFYUDfGAjmdqusykzTlupo\");\n            yield return (Hash: 0x4bd266ed0155ae0cUL, Seed: 0x50d6ef30cff0396fL, Ascii: \"LHditi1jQVTporJKnT90iwBECIdcVV8SCfYL4SwEWYBQygOC523O4beSJERUb4FIszAvarFvFWUUW1ADGk6qiTKk8WJ6QVynphASLoBRP0Ns6KzNJGKBRYkm4MgFnD7klrBvmrMVrwndYNHcoiDiccHFX0tgX2v6dmYfdYmIA8JrpxxCS0F5rywav\");\n            yield return (Hash: 0x6aa60c80336323d7UL, Seed: 0x0000000000000967L, Ascii: \"aG7JhuytrqbKSBeGsw1M2HFyqPldvTVLlhKrLFZre5arHSuTe7lAdoQkSRGn6Cs2pZXhm4VItNqsjvBEyPatyoIFzxNWwxkuJerDGDDqdQe4ZaA3CtxkwvYeyM1rvP3sNiLbzngb7kbSfaYNUcfrZQSNDn6NOsjL9JQAt5bFYHpdyQmVzIBVicDTe\");\n            yield return (Hash: 0xc7ea29632e8148e3UL, Seed: 0x000000000000127dL, Ascii: \"O2FnWmdorQDXrcKFqb4LoICVEjePiqRfSoJj6g7bpQ7L8dIpKjAU1XYA5JYL7pSj04V1L4UZq8SNS51ngDYq8PE5zbMDflca7AIxsU6dVK7i0CusqTWOPU73I2XwjttAyhgO4eHLyIYkkd6rKMdYYAdKObsuLBOs3zDWkSXzEoUTjrcmAOnoSyAFT\");\n            yield return (Hash: 0x5a4f7550a94399e4UL, Seed: 0x1f5466a634b2344fL, Ascii: \"7UKc1xLfwgsT6EIWH7d9nJ71CZKIlK8f14bJrGtZw4kSj3sBbOi7Et14bEOSyJv7iEOEpUdZr80FOZaZLe21rLXCpEz3eJKhcv2GAc5LLCoHGLvhKT02BoUJYIsTZGy8pasoGSVZ3y5nkO7q43nlU1QyuyI9Tlbp6qxdqEp10ZBXExjttA2ms8EHdh\");\n            yield return (Hash: 0x889cfeec46026d29UL, Seed: 0x5333704f0de8d057L, Ascii: \"KmEMSK9wnBzxZZuLqHt3Rp7Ca8run5dGywtmJ82nnLwpgjF7ef82O7aiOuNtkOmIEPZVO2xGbZxWw6oLbarM6QuPLQxozommRgwfI9ANID1KlxyQfeIQCTZ6FxpjsysZhB06pTk8Ia7aSSq2y3E3z0fU7SRBZKdfbeNoG7V9TOEvgLaDvKMAjtkXS9\");\n            yield return (Hash: 0xc4ee5654736bb04cUL, Seed: 0x0000000000000d61L, Ascii: \"0sWIE1CjQRzucXici9FVQj1X5v15FH5TqDWr2mU9yBjiLg4wX1RzSREVeapJcqd3HOHXyc5WDbNawA8E5f1CNKobgNDvzudSN3B0DU8ThHCNpqeWJji8ZYOMomTzHfvJl7EfhauJEA2AbS6I2YrlLaJRnFsp1FxWZDP90wv35GjDSQgGfPQrXBDsPg\");\n            yield return (Hash: 0xee3eace35dee0768UL, Seed: 0x0000000000000000L, Ascii: \"j4DP169lyPbb2ngAcgQ8zhCwwZvp8rZpR04glQVUuv149TPFjbM3OFI4AaR9tZ6ywHjI1dj3DJA2cosLJCSdeaPf61tFrjqL1IpA1fmyfZtzUjOC34DZ1hGCKwra4pcwNKzwFtgtvMQBfkoHVCeoO3q43BPFJLxRET8vz1cHQFXVdEHGLTxgSCfO6c\");\n            yield return (Hash: 0x26d14d85de2f43feUL, Seed: 0x0000000000000000L, Ascii: \"QXvSj1TRkxyJ2oNPhfDScOxR1yysCzWx2xcZClxeQDXB6S76pQgMJ6frZW5WKRPoAfCrZ9qpycaWvRzxo56jBoaTaFcSMvAibeHRoQcSmKLMAX9cC8lY0T4gFjNkO2bqiRy5cUrbS1ksHotXiBQEuT7ukaj3z7qfTa49SfjY5M19c0HobFUAXl9LHZ8\");\n            yield return (Hash: 0x83bdd7d0f3f97f0eUL, Seed: 0x000000000000063dL, Ascii: \"WDiVQUckZZ9EdzM1Rr7X8Vy3lmiVQJjyHfXjptvM0ND8qvMrZU0mCCTs8JKCsxsRI0vJahOSxvJA2nmo1lBgv1WxMFdomur6rNmhnJT9BBoGNwvjkNWB1RaUW48pf8bjWHxQ5dSQCBurFIM0xSbzAMpD6fbldCHfs3rPCcM0Q5p5Tpg5qvMVMBq8YAS\");\n            yield return (Hash: 0xc65a1b603a520ff4UL, Seed: 0x0f5a789a30d0d57fL, Ascii: \"ERqJy7lwgnX8MtZwlGqJDKcBH0oD0qen7ZhM7IqzYTKBZJeHervu5svOIBYpX5QL6yGED1clTZZea20MH1Vqa7TxlBNHqvVQgogH4xPGK3cZVlqs0707DtyX3d90t7X70ZFQ0YrAsjTgFCtwUiqiWBHW6jtOFjX5guRs2AQoKPDQRvQprHJqTbaJpL5\");\n            yield return (Hash: 0xfb455041082c38b1UL, Seed: 0x0000000000000b78L, Ascii: \"8qwcfLY0YL8Rhev6F4Yh2UFvKUYFwRNolzqxZWEYKysMwH0SMQs0Q6L3zfvuyfYVf1zTtxmgtc4VaU9w9RBJkbapICbz7Su0IbJrlZj7g5QnJsfX1FlcD3DXJSwFcrbmzUQx5fTqRUingqagLNu74Hk3LdhonukC8qUf2KXxNKlGNHUcta6bD6PmuCD\");\n            yield return (Hash: 0x2dec325d348b6ec1UL, Seed: 0x0000000000000000L, Ascii: \"XYn3EnzSkomK6EzY1PaQaoWertGvTTEnrS92QSFEf7Yl0JHfQHdH0aDodYrK7NhJPXKJmC0nJIWucSR3z5O1rtPfZ3YKjcemEShMTZLY5Vo5QUGVfz3qJLR8OJEbFuiUF7lebMcA6n8vTrkxNnAWFq3LeCuW33cS6hgoen4mUsS3aNVNwjWZYPKcuIxU\");\n            yield return (Hash: 0x40f26a114c6c59e5UL, Seed: 0x0000000000001c87L, Ascii: \"psJi17TqMilZ9KIO1XVZap6eFczLL4WtHJiixM5ylMcrKiS2uWrZTnmsxTVAzzKEWN411xYRCtr7ZGIw35Mi7KBTH3TBULI5QCWYxucww28EZyUIC017YdDY1vZPt5H5je8qUux23YTXglhSqFdfDEyfDiN29q2LZFr8j7ro6rCW6k3qpqrzBzysE5iq\");\n            yield return (Hash: 0x9dad1abd29096756UL, Seed: 0x000000000000023dL, Ascii: \"3EiVYxYs1VPn5fzkC3gpXJfakAtoeKnmmIoE4MOVVUf1ZiaRhd26wB7kec6I4vMtacA94aVdoY9QUEs3xdSVXXABd3IjjCjWLk6OEugYzM66ZJxKIdrKHbZ9znh3tWErWhlGxGVTE3Yi32j8Rud6JGf6WFgi2EZGsaw9MdeGqoNZk69GNaiPXocfNiLD\");\n            yield return (Hash: 0xf3a59d050e8eb128UL, Seed: 0x0000000000000000L, Ascii: \"46FpeGnsUKlV4iqKU14iUoDneTxp9ZhoQCscrpXrDYyntdHUDNtIQWYodm9PqZFwm3Dznz97I7inlhxPFa9m9Jq6ee29IvxaRbOo0UwQ8KE9T1AQTVFttkhkn2pZ1l6TKPsPo6wtCL9m2jyEvIY2HcBDQaxKSesVbCTd5Ufy0xaUm6o9Q06ogzJkziAf\");\n            yield return (Hash: 0x5cf7f902cb0a10c9UL, Seed: 0x0000000000000000L, Ascii: \"JmNWKJBt4LH3rbfFyVyaPkNuwwwjTS2RQ62nwGQBwF41isH9GTTF8Wrwd6Y2gZbI5ybqIMxOFWnDWN3jmTIyjjTKxDteIRjP9iRtbFtQWNB9ptt7OzDnxVajIHrJI5Qqes4kMzc9FkUeVJ52iTHbaoczMksYsYCKPCGIXQN3zKtMRUhggHLP1wFVyAROF\");\n            yield return (Hash: 0x7208ddf450256f2eUL, Seed: 0x0000000000000000L, Ascii: \"W6trZ2sxJE5sR575xVY5Gr1RXdXkShRgfa3xyqt670Zy7OnWKXwmipmRqY5AujAYBJy2YpPy8GbqwB7EbyqAawtLFF9L8aQr4vAkQf1oyVhWkeJ2PExP3X6yAgPL6SrJVSaveoUJ9rWgSKrnQgvw8i8TaTd7c5WotRzZi5fUHvWyu2AHUkopnN25wDZPr\");\n            yield return (Hash: 0xd4e78327e9abb16fUL, Seed: 0x00000000000003d2L, Ascii: \"OoCx5frXeT5abvARZQF8DbdwrN3yZJlmd2l7HqH176vO2TzOeRnYnhsMygvpcp6LSJlY2XCTSp06uK4q6GLRnmpeRs5Wllft5WUMLqsXuT5hRrRGOzGQvM4iH5coaYMFn8YwvtB9sD6p9oMwOKaSVoVLHPLeUFLr65A9QXtF8Y1clukhKWepfc4EhTnbl\");\n            yield return (Hash: 0xfb6fb8cb3c1b80e1UL, Seed: 0x0000000000000a72L, Ascii: \"PBCC5mjFekV8Hndfcv6jgSDcrJuLDQhIg9R4XISyapqDdSmk21al9rtQZkDztkbKNi7LqQ8aDRJnnKTfia5J713I7znjER5h536BmTdIHqUblGISBJgNgN7cURT23SfrJ4jbfoYgGWzm1zLqUWMuyMRDsAgfnNNrQIYG3TTQxtZ7g0BejJPKgo7CVXwsQ\");\n            yield return (Hash: 0x390d615dfe094a54UL, Seed: 0x75db5b20f097c469L, Ascii: \"rvjxm10eoISk1JvBdZ0FtVfX3DZq0WIisqXILTnPOevfy9yxV6MRKg4DjaeT51OwU96vVMWD7lNDysWuJpnxO2hJrorItYjToF79P1eLRgOqApetmpDNxj7Dwuj2wjErduxt2AYZfduLB6LLFEjnvuegUPDnSR2QauVB79fTDvftTWzz73dIF29UO7F0U3\");\n            yield return (Hash: 0x62702c228fcc946fUL, Seed: 0x00000000000006a1L, Ascii: \"ql0avRT5wcDNIGMPGoFvAnVnAFgvm1dwRmk18ZzQVYRvuldA9NoqF7umL1UOJrx2xOts7Xc7dmuWnKCOkH7YhnpWhGwY2IVwh4T0IWRnkZfF1kJXwtleX6pgErY2vfux7kdmYrx7LNjH0sJ0JFtlrXUq5KHdVWpOKFD5oMY0PDMtaEfgXF79bQtYSDyYzZ\");\n            yield return (Hash: 0xe360d7b016ce16beUL, Seed: 0x0000000000000000L, Ascii: \"U3YUfYEra0YIs8gt5qsUVsSRx2swlTua0XpIgRwxlHFm2J8Dei6xEFxPA4BUkCSBvvQveo6wvtREcBRuHSeOmxgWecXsMQVzJXwdFiiYP5qWKIlNmNZGjvAvqPBFNzkfZmhR0BWMpwPMY7nB5RVKFyhAWHOeryTtdJkCrKxT8Z9y9Anhg139jjNeFl06cU\");\n            yield return (Hash: 0xfa442996835d08c0UL, Seed: 0x7f92fda1109c7005L, Ascii: \"UpkixotoQNGcONcTFsbtb4mcFM2w7hrashYpRpUc5F9uKI5h16RlvkqICfgyUEVwjvFfN8hFD6YRtV32c2KdLYWTX5di9tjhkWIBipThPPMmoSejZIWjE3Z1tjcgbbZb0pZFv020phWTeXxw3wlQpZWA8gFRckBL6tVY6oWtbV6gUGY7nJF69XXRbTCr1R\");\n            yield return (Hash: 0x4241342cbf956021UL, Seed: 0x0000000000001263L, Ascii: \"km4CV6neshlr0GzepVNIEnWXRi8hYyhmHiS3fJzHh4YbpdZAasUCg7cFr3mPMuQPqDDUYhZeqZhj0985eQQyE29kEUGSUqnxKUwVb4AGUIhIjRTGvocnEEF46MfmSh4vrmLz4aFn8toOYlpY4fZPAMziZOXEcSe1qXOUxypG4dkQFnxXU931Mf8qZzQZCD8\");\n            yield return (Hash: 0x70bd28e3cdfc115dUL, Seed: 0x00000000000024d2L, Ascii: \"iOPgLWdCy1lrEuxUcHiPPSIubuiBiihc22LKoOqH1nzCbjFnm5TUKqArnMgnvmdSHde04Fx6dgf1bZSD0fML5mJnNSahGcxQiD6ow9KayC7W2z7Pz7vmDhKxJ4OVMq13fkvXcEDAj1MBuVQIZ0dmUsirUdomFQnOZkpD5XTJ2Usz0Dzc4vDsksgBF2osLn8\");\n            yield return (Hash: 0xd862750004a5d287UL, Seed: 0x4fb24495dffafc30L, Ascii: \"Vleawe0EnlMWaznjUaZDoOjvEzt1iaWrmD33usV3KWps7BeoysYXDbl80iA2ZzjRMnjuN6YU8nSPRpSdJtdFwNSNiO7NguPGzGaGXbskQ6cduOS1LESdr1hEhQEuSMEmrhYkc8kETwwUn2fiHYA6yGxz86w9VRxMa2Z2zVtjrbT0Hx3kL4a32fXrao8C9Zl\");\n            yield return (Hash: 0xf50b1108af921ad9UL, Seed: 0x0000000000000000L, Ascii: \"1uRmqXqP3y7BezETYuqIb4eRq44oUDrQMiCzYu8Tl2eR3UcN04BRUljItKwjBSNV6ZKrwVTSqvHAjnUP4MSAMz2Rj6kuxj0NrXhsWonPPPeBgtgbyv7Efb4Y32nHHBwJv3eeHs51sEOpiqF2TJXRCsvzJ5lfqt7jicS3GEZ9PddVFSWohyvZITlL32y10J2\");\n            yield return (Hash: 0x23e0e7887c53dda8UL, Seed: 0x0000000000000a75L, Ascii: \"T0NKoiP1ejhTNTIjwlRjfhf8aRDsM8eOGcomBjvwm6NkdiS4Ap2okyONWEtU6ZB9btDnRChjgLLDikHqKdtDUCv7kkfATbaWxKsP9PXc2wQemb7azIxNqUtczT1BxMiOETCEz6AZ5YXmd8JRvvC8Ww3MUzfKK5jmFBeT8vCYBEVarhfHpK7PDZRn4u1brrlY\");\n            yield return (Hash: 0x599784e58b23e552UL, Seed: 0x0000000000000974L, Ascii: \"e2exMRoBFO0WrmVhccHLXi5eucVyumPed5UUYOsYSzk3tstsPBEkmQt7q893koyF96vJuXJ5VjXhnE9kSPLvqJag15ORzCPdi6eJtshBQRauvsnIkxssAOoMN6rvR26UAOfj4srMrvsLpKa4qNGGR7MP6IrVs45FznrCys1XuxCgKFrGP0i6CPK1AoTVI5xs\");\n            yield return (Hash: 0xbaf799fe804fa9bfUL, Seed: 0x0000000000002073L, Ascii: \"TSQqxL0dGMSGwcQhYaaoKOSeUZnATbGTJPrUhaa2MDMR1CWS0NFf0apxUP3YNPQwQXdtlaUmgMpIxEYuHWY2ZstR8CjtysIQbZKclsaTJC2ehp9MClfkRQTR0yGt8DwfFgicUMoNjF8bgfp9KuE5iBNBjpvVyyPw2Pnx98pWJCog3JyUCegTVSxO8cPoswgI\");\n            yield return (Hash: 0xfd963126b5473e1fUL, Seed: 0x00000000000004f6L, Ascii: \"iXTGoPucJks6tsvfmjnpmkzfnTkycGlJwcsQVqWsp5ReZEceZcXrHNVfUvn4uK5jm5i0pLwkgHjraNM02wlGZ5AwhXLSXhea32lcUL0G9ArAyF1VEysZZkiquHDeEjxr00yKHHFyjrMrZrt5xQS03Pq1WR8R5Tp49CLNa7AcOuR8wnIItmeMZI4kPwdQCEUH\");\n            yield return (Hash: 0x3dc3434998973a06UL, Seed: 0x0000000000000270L, Ascii: \"wJTg47sVQ9N39ZF5ibtniA8XB0rbEZTPoIsFfdKEVEeGaDAG8abDD5Fa8Sjv93Jk1iNNKjg02Rkv0Vre4KTMS0usJa5fH4kJVHxPbJt7wyzMtEZBSnHJlxcE3tm2rZfD1Fqtcs4JbOFry391CL6Y4SZkqM6AJXYliPzxRfnZXMACCLCtrdnxLqUqGXeMPvXTx\");\n            yield return (Hash: 0x8f38075c4cf24661UL, Seed: 0x000000000000124dL, Ascii: \"0BOwda1cclUajOSEMC2bGST5vm9ZtCE9ee32HgqtfIP6uA6rcS1P7aKFQRed2437Dlnpj87gY8xrDgraOmjf2ruJ6sQVo9XlbKRjmkvkg7RsoSIwelsoEBIXZ6MiadbyW65ynEf2m3vwD42DptkKBYBLqoTgAAyE8Egd3BspMQEh9OpYlpNnYZiDPJvZo8e3q\");\n            yield return (Hash: 0xb1b9adf6596eeba3UL, Seed: 0x32563880bd11daecL, Ascii: \"Mq86Fm66UGSkmfDadjSS3UQSbQxqR5Hn4AFy3wthh3PB9q0m4xyF9Ob1844LSQulwt43Yn2QTFsmSElfyPA0FO26NnSEhBQ6giIEsmCRTiRoav6gP4jNwK0UOr3zWlgprKpeDIzBDuavaEzLC8UImmoQd60CyOymdyQn1NEqnJypOC1HEVKENXIz8mrU514ON\");\n            yield return (Hash: 0xdce7e73ae05c6ae0UL, Seed: 0x0000000000001de2L, Ascii: \"50aHDDC2wpcxTjo82ukkjaWAak0xsVlYqeWABZwHSXB6EjsvTWPqxMUDLDk6IenJR1uErGD5CmFj0KkT1c4MWDoQjx3M2ooMmSe8Bg6iM0cO1EWxkFZZWvcmXh3w0dOJ411oZ5IHBx91mcmSomWr3OssJkqc0FkcJF2u3CM3ll4jMILl6Rj8FVqg6bNgSp1jB\");\n            yield return (Hash: 0x150aa0915ed33048UL, Seed: 0x0000000000000000L, Ascii: \"FTwBoP8usBBvjMziZZrDaZfnouXR6nenK0TgWmKfsPybU7Nz2wVwp2srQMoEUNsAI0OnmHl4oTj3LOrRXQlirr0ALGTROHyUizVVAKGJsKN4TBpAyZGrRbqF2pDrG9rLbqOWVfjwTRvZns6swXKyEtcQWW0jq19j4oHhf8Wr7jh4ixAsMgCVvmqhJiuoTlKJI7\");\n            yield return (Hash: 0x590983366a6bbb13UL, Seed: 0x0000000000001686L, Ascii: \"ZXLkd1gbDppBcMhsne20O40Y2xygpbv94455Jx84KmQhvRtJzG9DC6nW65C12uCTX6K7J8PDmRhNruHDy9mwV9EI5eTgLFvMTApz3UXaFGWqAHQzsul1TdyCSGvkKoZ8mX3P78Cs2IthvaubYsq2Oyt8oBgEVR3UxwbXGic4qfnMVLtHygRIhvn2AkkXkh0QSv\");\n            yield return (Hash: 0x6bd51c4cba5ddf28UL, Seed: 0x2bc608cf2207aee5L, Ascii: \"0jU730nzyIsZYmFFEKW7LqzjhNFOINPtcIrGKxIRn14R7DE6D0gV3Ujw5Tn3CHLpwlEucGcAH3DKhZOexmadErC4T3Ma1QC5TgvZ3qcwcpiuBgXbU6ifMdkTpgx618rHvyKkJG1n74HRwKcIJWgN7j7xrCPjOCBU9s40H8Xk2i4YnS6kR1wOiRaMeBame3evyo\");\n            yield return (Hash: 0xd534b3a70e707d82UL, Seed: 0x00000000000009cfL, Ascii: \"VlZBGeqf7vixsvJNQBhm6bYGwri41Zvpc4xzrWX51JjtrYRfOzxXMNDB4ZnyW807FNTmQodYQpULseqOopIMisipjHszqUoVWOTh1J2rBgTe3NiFGNC5mvLPqDrB4el08a88298Weg1LQZH4ZpCTgwgzS6VU0K45b0XSZwIusVykz2du8yW3NELg33X1mbWoNU\");\n            yield return (Hash: 0x3b4b3e4279abfe0cUL, Seed: 0x00000000000013b2L, Ascii: \"kfOh6LpJy1c0R9OfjpumomrPdrEQWkY4fEFsiCAqQpU88sCKRDHsRcCdXB6kZRnpL907YTb0Yb9JPPpDUlXsxWKQkntkjFOKURvxVWdPHNfV7hWG5OtmwfvKVJH6sQsbtlfRC7jGH7JqDUF7twv6rNcYH8xA9St74f4rINqRR3LzlyJ7dFqUwQNPAKK71vNgI4h\");\n            yield return (Hash: 0x852537fa13c714b4UL, Seed: 0x059e6144ab7385c7L, Ascii: \"E8LvErh2dHlbiDcIzaz4bTJBcPPnI4jREgmFX6i83SGvXG4ezYf1b19LWXqbDD6Drg6aUCIoLSh70F2wcNsbcviDrQr9DzazOLYYQNWBHWtrWji59OgLXu1dlJFQIdX9ZjQIKOskeexktDSixJ6fdfWZ1IH0cYbg4baMDzX8GmTPnBuIoxnj0X9JiWDCuyNjBPX\");\n            yield return (Hash: 0xa5f01fcde34f4341UL, Seed: 0x00000000000022ffL, Ascii: \"iTWosRgGzLwZXX7UUrqI7OLPrcNVZGDvf9f2u0TmkLLnRUvK1GdVoQrykfcUC0wraOEu3F5yDB6AEYSpsmek9kiPeLxkajuPkvIASVvF0VJj9PLhXwS6eGsvrrEDItewb4HxEKtQurBtqpIagjWkKSb3VfiEoW1EzHp46cNkcL7Exd4YG3N8Plixy0N4tHh8nrH\");\n            yield return (Hash: 0xe9b896f32b758350UL, Seed: 0x0000000000000000L, Ascii: \"zTPaxuYpXy0RMWlEPzUHHSud1xUz4zXnHIsxvn4u07SXkkVW6e4VkZV3u7KsNQaI7y7jYeoAXquNBzMrTfLfPEWoijoPGaMiPJ1127GwFT4yuadB9ehG9PXeFpq8js5eJCgMGKPJWoYT1xR5PAI9YyXNZX6PBPNJCJFV0uQnEoIWo1ZZIfoX6rl0XrkLUfyZiD0\");\n            yield return (Hash: 0x6332fa265049bc8aUL, Seed: 0x0000000000001677L, Ascii: \"okeRXrWl7WKE0rpSq2LjGbWDJjsNgHKRlF1a4DQ8M3gyhPQ9k7qsOhHcYXhHBHJxoa2WruDDtO2L9iONUpmW1jqARn8S1DTbk7TMM9YWtyeIgirAEKVyeQ4Ibd7FHKVls3AOtUYoH7aGrDFkLgPdjdtrjvVDBTODFI0vM9RUOYlAtuHUXredKtLaMlnRZYsLfj6n\");\n            yield return (Hash: 0x873296682d960cfaUL, Seed: 0x0000000000000000L, Ascii: \"mVQPVPD2S9zDg6im0K04xSDtxJXYSn0WBtOjAp3ZmosraMtSQ3EfOURnByQDAtCrUE0UZqbIFOORusqZmU00GP3VLD11JQ17GG9JwRd4Zr2rQiwmJF0nCyexH0vhUAAo3x99951cn9tpFM2tkZBnjSKalgh6gGPZNtrWFmMYZo37ClUPXgskdDGzilIwpUInzg5x\");\n            yield return (Hash: 0xc2fa02b722f1a519UL, Seed: 0x0000000000001187L, Ascii: \"SNsrE3l1LFCloXtSEZT3wmG8OmSxi8CLJG0Oyjxl7H5VkAMpgnfb0D5oXRq5eo0kIYTsgwVcyw3gx3GJZxWJ1UWZXGoc5tAGlURMqomHO0YqmIlWStQfa7oUi3qvcdGBAXwnRXkEvliAbx0X25fpTVhgEUJMSrR9PREGH0wJW1aThY0AUsEY4JRAcGMe5EVB5eo6\");\n            yield return (Hash: 0xfd6766148b161ac6UL, Seed: 0x0000000000002448L, Ascii: \"4gzo7Lxz1oPfOsfDiomHKGFIb5avvfVOQXtSN1KcefGd4QmabYXPDBN9Iq08jEIK52ZYHRIB35zrmhNMB7rVdqdH1uYdq8mQeFITakHEQQfUktQb51YLAFgoEWn47GKMLXHctmlNfCCmXHXCiMca1WHJrenVRnqF8Htyglc7pqK77wXLwKPcmOU2nK1C2vJlg3RZ\");\n            yield return (Hash: 0x3d4e740f4bfa44d2UL, Seed: 0x0000000000000000L, Ascii: \"gxD8dp9Es2jaH9Fp7sDhFo9O9dutlkzzf5lbY0DEeHANikDwZCuV57OAPebSXMfDg40gZCcAyWfj2J6zKb9kLyke0hAPK0CGGhSocwqQFOA2K7MZCFk9ljI2y7r0FdLsu7xcWy8S6lCAvNtxv0M6ftPQWDFQyRwehmpJUBwewOuFZ7VZbaGidfPt7j8AxSozVrocU\");\n            yield return (Hash: 0x9eb7c7e89ebbbf85UL, Seed: 0x6bce3584ea311313L, Ascii: \"xGVxFjsFy5GNRyTALes79BwSPskiYumMr1oNJ06heHqpdGUJHjqfuMp9HR4bXcnDTN5p1tdnLN6b7Wkoz87B2qrgN697oPS34WKkcACWbwHo7uawfjJagfG3GPrBbRCJJhOuRrw2288s0DSXZQVpTCjhAygQE3pdHOv08rvUnorPJgmChV4EOWbu5TYiBC4tDTjKV\");\n            yield return (Hash: 0xcf3341652bcfa624UL, Seed: 0x0000000000001c2fL, Ascii: \"EINQYV7PKpQRCBjwXJINeSzcigzh8DGR09DeVLvpmqp0sbcuPeQEjCugarM9tNOPb8kSSfrTe36xHrz2i4qL5ePIx6a4Aypzi4aMs1x5E32MKIyQtsrMLPWhy9hIvvYIB8xQYBEBDQFvzIKTJ1eoIR25cn0u6bzH3O4IPqGzecHbRm3mxIrCWq7CWgVLI3AHheMHU\");\n            yield return (Hash: 0xfcc052815443cb84UL, Seed: 0x0000000000000da1L, Ascii: \"st05R0wLsgNC1YYfCRgGe3r2HnQutl3h9R1Yxqdr2yDFcNZZYFOScEmrgjbnD63nMwrebYsunf2graifBydzdXW8boxF31oVA9gGkwNxPWRmzf3RdH3MFFt9DNK94uyF2cH0CEVA3hG8J4yhJLoz1BQHgHEK4p0sCkMeRK23XAp3xVSMnpaL0OCyZ8nGLYAUjVjhM\");\n            yield return (Hash: 0x3aca7dadd273488aUL, Seed: 0x00000000000001f1L, Ascii: \"eNVVlGptzIUZLWdU2T8l8zVxwo4NZGGMYVPQjHfHB1tD4CPxPuXvnBF5AVngIZRSiK4ZZXMbgBgsCIteJzkMlMUVz05ZsIRSpIQK5eFwLsDOGLfiaTb8Bf9tsvg5EijRqMSJUeJAwJ3JGIHRbvnWoVLv4kLvUwsjIXcEOGxSEUaUjO6g1JZhlj4nn1IbSniaeTrWuf\");\n            yield return (Hash: 0x51b172c909dbdb8cUL, Seed: 0x0000000000001047L, Ascii: \"0kv3KDl6zCMnofBv1kDEtL3Qo6F4pF3ojNuoUQDlTtbnz5AiF857PKJg1zwomMw6uNKJLDMYODmJ0s3x3KEmy9ueM99Wpmn9kVtniusi1caGOYAA8cOrpNtmlzZXR1R7RkS9bbj9zgWQVjoaUW3LGuOPOrHk7X06fev7ftKFJTUCYlBoCI7EehaSozTHM17c7M0DAs\");\n            yield return (Hash: 0x988e2f94ba1d1393UL, Seed: 0x0000000000000000L, Ascii: \"A4rHJS19TNCabgywUE0pljIza5JFJ9UOpYXI8g4x6AcgXFaTETYhF5dkO3lHBM9twkRhTeNVtgq64mrZqXXKZcE9JGgnIbp97BObIy6TfwqaHZGuKPYHMbxVd1SQaGrbPydcDqiYOuH0NBMCWf6tltxR587HPqX3hjNxbjVJM23dqA9OHygWm0X3PZ9mTcIHaCR5J3\");\n            yield return (Hash: 0xed5393917da3c405UL, Seed: 0x6eaac083a09881cdL, Ascii: \"9y3Te5AvOOJ76IxcjcZyCqWacELsegeusXL8p4JmCoiDk4x2afdSOFWLMcVYNT0MqtbewJmkuNYHVzDwd6unfbrtuXZ7YXrWrMteD2btijMlpKKy6DN3rOYsz5gEF652OiHAK2clHqegYzvWllL92h3AV68t3Ots7RIwxZpuwils66gpISYWGeZwzyUVe136OLZbBf\");\n            yield return (Hash: 0x61e047d2fb9fc28bUL, Seed: 0x39b2708786296a3dL, Ascii: \"77GKm15HN9YcPLaFCjgHNheN29NmvQdYGgwhrbMcjECG7bBMSvlf330O5maD00Necro281700cNgSb02HqAFTAqqgStbtcdgbiAiTgoEpTK7VixXjRxnUfGRV0nubNgamyP1gVxGLcXbLQJxm88Qlh5jYYuofHg59VOesQenJPBZtXSlPsTfsQP8GR54AWzhhndfUR1\");\n            yield return (Hash: 0xa6b4faa7f7eb9911UL, Seed: 0x0000000000001c20L, Ascii: \"prtgeiSM0Rr09rr90Q4i6lTfBQgI9pEB69QysRc4tkJVu83b7bNZKvLaWZxSZ5PngjF29h296rfKs7qzVNHXYjGvASFXmPRpB90DQdcXNFbUB3OEnvklMXyVLXizbjGlOSTRzqESiLYrOwwVWDurIedIRp3rBKYaecBrNAIzWlXv5sUPPTQDcM3fVuHIHmb5Eo6fVfh\");\n            yield return (Hash: 0xd4d346c345f71003UL, Seed: 0x0000000000000000L, Ascii: \"QFFMSp1luSh32MHpoTC24NHOfCyIGiBdyoHY9njPElMQnDXsNIfgtnVs1TjiSDn0MIi0d25cuVjdwEcYI4ZoTECHazYQcSkvzxn79LjuK21Urha09w0N2lCyv8pf6XpJBRBEyKQS0v5nSIQ48fVTaa32AlWGZRiTi8FbO5jYz4l4QVoXlXN4qzROPsjOQTg9o4LGsXH\");\n            yield return (Hash: 0xfebe5025185880ceUL, Seed: 0x0000000000000000L, Ascii: \"ic5H6y6VLOh3d8LxbBkaCsBnnK9DRm6BoqMJ2ty8pzdTq2S7vY7SIgTR7illK6360xrqSQrlh9asCEFlLm8cUUDVkPVSgjaZbtamCC2Bxcz4QghRYQlQUHjN5sOjLqN1LgLZLQFKszjHjQTJdj4NUr09tbW0zLA2rn4soutXq6tAix7JozDpLH7yXShybA4PiSRWDbs\");\n            yield return (Hash: 0x78e77cc9eda19846UL, Seed: 0x0000000000000000L, Ascii: \"n1bjmOYe7NMcghKYScBlGRVTtLTlEIODjxY9CULIHdnDRSTNxmfquaHDy9jpss9VKp5bDpxLPg28uUzs0ZdckeSNIfprYlQMGrUdgqDgRWLJjML01wIWkAa0ei7ngTCfpFWBX1WZIvpmgLzybv7ieU7uOzSeDFGAM1c1uP1sEkSvKPHDSUDa6qx7q9bdrDtqmg1TsE8b\");\n            yield return (Hash: 0xd4476b279cf3878cUL, Seed: 0x0000000000000000L, Ascii: \"ERu1x9IgVGUehmOv54iL0asx725pWMTcWZ1a7BykhIVyvkT6TvujesPBT7G9uqbxr0vPVIZKhQk3eoCWkN5jNaHorvyBzGu9TGGDIPLCNfICmvUoZQ3tCDtuU7a8uR77X0xPaJghT49EibKDv83ITUue1SXYKTOkyMcH5K9eEOy1q1zGwu1e7rl0DQaml7qMcRX584zx\");\n            yield return (Hash: 0xefdfd1a555c7a686UL, Seed: 0x00000000000010ffL, Ascii: \"XEOAfSCaBmxlGweXaEyY108UlYD2t8KbkJ2F6KtevwvZ6YuDq1WwmdsRodUygwFsPsJdNCzZXTznSFONEX2BAqxWSJCdAc1vRfu4ANZZB3gfXH87MqJCrY8A7945ikpWH0GqCXojfhX9QMhQz1JPOGyE1MP3cwCh5opqMc6t5vP2DUTjXmjXCWyiL2PS41S1Q9zI29Gz\");\n            yield return (Hash: 0x43ab99af7c224be3UL, Seed: 0x0000000000001f51L, Ascii: \"jdSPmVTMfYXDW1L1IkvTlrfNHQdV00qpWXy2yMr7Ivzqm2MmUiqTO5euIDTZ5k9VcaDccgnGKDwtCzpBr8INY1a501XfYXFqiK2fHoKWMplgHpEt2EefKvhyqOXL4JYslL9X8qCIhQ3dDPM8In6xHN2VNqPOs1CSb2fgoziJaXTQDFHSMIrZ4JQAIMG65FStArWr9pEQA\");\n            yield return (Hash: 0x7a4ea0459b291937UL, Seed: 0x0000000000001497L, Ascii: \"BMLA6WSGL5XzfLmZLxIhOVXEFbbnkzF6gdgBkYI2DDOSVrl03TfCLPKINF1G21TBUcWtSd21llrsskrvmxW4R3uX8nd45IebrxeiwEFRgnTg4iMNDibzHnUKqoitQTXPX9wHfVVLF3az5zHKPOY8Uoe2vdvLtAdKmXI6bfQNjFj5s4MO3QPOGBh6JpHvgWVEaeh7vd2Pi\");\n            yield return (Hash: 0xb11b396e8f6c6043UL, Seed: 0x00000000000006f8L, Ascii: \"D3BRDro1Gex78qmI3VE9RPAlgYIISaOXtIADxQ3T4K69WkIvXs3ohlE70uQ1Hyg3Pwf2c5tUCdy6ERnwtdQyZEBwLCoDhdTJ4guMEQxjlskIBRqiHPjijCH0pOnZcdkMMoHqeCLakLu4LZTvODHQmy9e2MD0gkpaf215cDvaL5kHTzPFK57yu489jjJmBYXcqjZ7DruRk\");\n            yield return (Hash: 0x243a37a1acab15d3UL, Seed: 0x0000000000001bfdL, Ascii: \"quTQG0dSEVNxGVWXbiSO1E4liYRLRJFVHEWjeXheBmgMTNqeUT4jRpb5KjsOB79xgHxWAAY7Aae8lzcBwvDP7WOtrhFAyMX7sfjqRcqWLALY25Qplxjla7H4XcC2byr5IzvEebp9g5pZcRRWAWWruRq60dIy5d5GArn3iuJ59KB2I4gnXGamTVObJfp9o9BJkT3sQcyxPa\");\n            yield return (Hash: 0x3871ab91c1678cffUL, Seed: 0x0000000000000020L, Ascii: \"44pAhedm716O8ozBEHOPHNzDvNXZg7bV27TZ2GwIAAm1qO8cSB2yY3ickIycyWxuJSjQb7561pLhMXnxyLvGQhtdSyaCoqld9e1xN88mMPpBTnk155HMcBiBiQxsWKDNLBfiZgv4xlvWYJIaqSfARp2ldGdR6k74GHqbwwUPz0jgbzNEk5oixnWmrC82SKxIm1kKp7MAJM\");\n            yield return (Hash: 0x89c97c70ee0fe849UL, Seed: 0x000000000000006bL, Ascii: \"Dam42yTDJxhGrApDgPFKv3n88kjSe9fKNB2M8MDOVQ2qFK4PM2wxwO1Eaa4ccnsdokM8Crx0u6pF4HdUt0bNld3eNZ3mIxw2JoeMFPM7xzUBVeKX8s5Dy4hYbUsqggVUn8geKzEHLnB0lxAkJH50lkjWnSluE5yYfZy0aJsV9BQdy0MpXON8lm5FFI3QDPYUjiSfpHzH2D\");\n            yield return (Hash: 0xe00170ae224c1b2fUL, Seed: 0x6dc8185ac1bfab6bL, Ascii: \"XMiqWzsuc4z7YaloyqlKs8vUVGd63MRjice3xtKUElzpdai4dtxqw2ji2vKYtR9qXYTGF5yATxO3C0ZJ67LXbuvgiR82hLgM3Fed2u4ak57qzPbIaZYRGP2zcJ6gzgCjSn9jEFlW0jdCXlhi8fxUAYbfIVZM489lRfYE40s6WDj0bN8UOrKQROzgmp1sjwqIbh0tdFgmJ2\");\n            yield return (Hash: 0x47c7369af44b518bUL, Seed: 0x0000000000001febL, Ascii: \"qwHb3J6hfCjldQULb2ziSsUpSBN5byCXfHa1Gj2OVQSw3qjnD24bTXYgJFbGEpPMXqrjguJ859Wi4DHQHxNROKFrq4tHbutxdKcgjIEwrPmhSSyNkJ61wTrjC3EFzM6aLdpnHkiOwy1kziYvQu0P9gKfnFw7d0iKxREUDZX2rKppgzQIvX2dAbtV0zgFIJtqBxxiV3nCUDW\");\n            yield return (Hash: 0x5a60447a5611c8d6UL, Seed: 0x0000000000000000L, Ascii: \"RtaMs90IiMkoFim8fC9ffiV9Wxq6kdyBztVIAZwg5Yo7SAaqvAeUNnV12gGDJ7FDpP2PnCuqP4mSnKdlDAonWCnWEtek3tvXpvcZvsOLdD15Q4UNXkcc0u2XZMVIukxWn6XXAGpfAW50iUxkRpxqzmQkdO67NN6JDRDLsDNmhnqB22dzfS60qEj2h4q46E9xitSLUvNP9yF\");\n            yield return (Hash: 0xa44abdf12c61046aUL, Seed: 0x00000000000020edL, Ascii: \"g7swABpjAHpeWeXxNzgoctMEw5GRPQV9NscbfeS93kOS2Puld6Ao9ZtOTHxiZJJK5UHxcxCMccpusRDjkOgkW8KggS0BA3dzN6TZyRoiGffvHLOUuArfNXapI5XWvxGfslvbtkbwNQSAd1w6luvIpBBV10Le9dKU32UfO0kaEsuCIHSnZBD113IC1Bu2P99wbnv4tNzmodR\");\n            yield return (Hash: 0x035ce77203c7d3a4UL, Seed: 0x0000000000002162L, Ascii: \"l3oVf4xHK4lGNoBzZY4r8Az54QI4TE1SRkWGBpTwcBQvZTxDikyKjk5DUjIdypZdQim114pyZoIgfogQfPSKjUtp5JRfh43YgMAK1SHydH9dqWe46t5htTcFdpB8rw4aXxMntkLXfj56KbTfy2ZwlVvFAIq3A0FGQHuxhbuM35JUOXjzBLdU9hzq5v6VReuw9NjxyDVoS0Ti\");\n            yield return (Hash: 0x2c2e539bdd6cad0aUL, Seed: 0x0000000000000ff6L, Ascii: \"BseKYldGrJmCBb9BIoiyKirniQwAk3arxPhWgiv7DZSA3RQLZsZGtRIbPn0w8Ql6Tph4kXbux4y8HWUTkQF6mbYMUDpZOIfg1KIbdg5xBkZ7LRAgIGJ0qa83A1Dc6qI9I5Xo56JiqIiB86hnla0M44FJICRxIhIQnKL3iQpF86WrsYphZ7zIOEocnrRr4YlHzY3kf2WQmK6O\");\n            yield return (Hash: 0xa02116e1c6ca8023UL, Seed: 0x0000000000000000L, Ascii: \"kE4ylCzKHAkVdJjliNIUitJhfmiGZkKwZS5yH32uUGbzSIMQnq8sy5ZgPGeYkR75RZkXoc3z2r7gfQe45eQLpq3ZhTDTQvjKnNYG6aLmLMp4VknmdFdrPVi1xz2QmHuSlX9ix5AdDr2D2SGxde61EJgLD6PZI45PxA2oiGyVTO2MNnCt6e1gLmd0O1HPeKTCr5eS7ZFKAW4W\");\n            yield return (Hash: 0xf1660fef6a38a007UL, Seed: 0x0000000000000000L, Ascii: \"6y5XD36CB0vckoWi5CI30UrvnzasdfUlE6cL2GnIZMktF2LOcZY1xLcwYh4owhjefTq6vhzMcVhnaBoUOla0rF0f69g9gkOdDM75tSaEuEVDH3QrdO4RKKJPOomEGKg6KJbr96T0TRn7Kv9T4GR9rhooOVcrUY4qb2q4ivf6iDFqjRHCPonujUrin6Z3njm4rBeTtYxcvcAE\");\n            yield return (Hash: 0x282bea28a5a68593UL, Seed: 0x5ec61bc65ad53a22L, Ascii: \"3uySfjNQ0zfwIUgov465LnZFIORkQKzY35QZq3KvBZtARcW2WcUCiqgnfFW6Oy7DpvdGOv7eyQgIUWO2zwGyuN40wJE8FfyawCNJQOb0gFfY3YxWESPm0ySzcfBLqtGbQF4xYh3iuiDtadAgJhQYVDSxeBNPBXeuElbH3uz70YVP221D8Yh5dfdLQzINOKMZWUKaHxsxCutbb\");\n            yield return (Hash: 0x477f4691b888b47eUL, Seed: 0x0000000000000000L, Ascii: \"qg5wjwRmiVRejyh71UouGPimOCCXJULeY24IamrLLSdzBnehynHY9SOMW1ME2Otvfi4Zg98XjpNeTvXRy6qGImq02Fgsx1TBnA94EhidIx1edpu01NOSJ1MtqqnaNeNapoLkcqsYWKaso36ExpO8dZ3McTfMEOaYJFeg03fx0GBvMc56kAO3uRDXsXQvy4xgzs81HQxVXoWDu\");\n            yield return (Hash: 0xbedfb6370f201d62UL, Seed: 0x000000000000266aL, Ascii: \"UOmbwzUUvwpnkCO5iSCT619bxqlBAaoK4zp57bEEiWz2jzVT6tgw5CFF9k8GeJjLiVaeW4EVckbjQ8CAChDBST9jdf9rYHfZdZuVqK8LKBgn3FoazV0mPK33ktH2FLDR5ySe0cNYZZBeb8c0WptKwUzcpZ2g16oa4D05tH8pdmAOaSOFEOZeFHCS6d4wsnl7tj6m95GJP6g8i\");\n            yield return (Hash: 0x098ba30db76d5334UL, Seed: 0x0000000000000174L, Ascii: \"8c94zFZDCvTGUQ5TzF9N5cuFHcvgnbGvqEF4cEIH7iThoTf6UFWkKZCRkW7Z5QanapN2v5WOK55wq8UDvvhIQMZJaEit3LftlHkS5kiDrctm5a9iADx5H0N907urfepAcqQTvAMMijIMoAICao6gmm1r6FbiLANoV9KlHGfjsTAXZKz1SEqGq3LXHzgJwM7y7LSOBHN3Irr2LK\");\n            yield return (Hash: 0x4c38c6b411e1caddUL, Seed: 0x0000000000002707L, Ascii: \"mX1PRUJrik1WmNpZI6Jtxmv9uGNI3sZtblIy5nk889Pi4Z4QVQBgy0zLoywAelB0AUAXgqKrGNlmuakSLGbYyvE1PpZFARPEmugjI2hCShCLKtAZrmpwfISacGQ5NY9UoW0YUXKzknxjwhIwrDtGMsaStLEpMjDUngoKCectL1rJWKMlxXZd4s0jfRQEFuClCALF7beEqJBHd4\");\n            yield return (Hash: 0xb326dd3642f36affUL, Seed: 0x2e52512cc58aa935L, Ascii: \"4ztdsJPql9TZC7rzDG91MxZjNO8ypBpxScJtI9c7NPkwNVK5idy4FWneFiKUl0kFcPl01oMV1lRU1ix1fUxPqfsIdGyWNROz0antbMTftAzRXc62KYUjGQ5vIVcKY96J9XIuMO9ObRku8xalFx5MW6PRjet7JqjsRyLDFDva6Gyfr5rxIczIwQtbqJ78rqbCvWaJVTvTmPudph\");\n            yield return (Hash: 0xedf26767871cca94UL, Seed: 0x0000000000002591L, Ascii: \"D0oqONFjsOhHnY2DTEA2ybfWknu3lb7mbrOqtkITu7BAw95U9lGAcRInCSrbDL0TPwwkMsgQnPd50LronyOjZ1ShT1CKx7MnYmFxFg3cajqwJQ33AIiT5ZmlQJBXhi16UCORA94bRzDWdiupox665G9CWRBKAJZNbfgdjVI5tEm54hBuwLM6QUXIz7FabRGAUJFaqu3tSA3O4W\");\n            yield return (Hash: 0x064723c85fce01b1UL, Seed: 0x0000000000000368L, Ascii: \"03cTK7C1gkwEQVwXlWcXh0ESkvbCrckJ7E6WoYuEDGCShmZ2xRCmlx2iQ48WcLseyvnP9wDbckI1O5VH5NIHT28ArVU7oby6xijPbXweKup3dpxUoI9LnXkr4TQaFLrWPXwuGgZDevkgtkBapBVYxuMlAnqf5tNb6U9RyXo1VFqAtMugNbUSxpGIzbJ2NQRO1k6ZpWsf6elRxMr\");\n            yield return (Hash: 0x6553e22da519bdbdUL, Seed: 0x000000000000080dL, Ascii: \"iPH0IO7cO678mdTWSaBwwVgJv3ttUh6aKXLsHdIAyjAw8smIujFRccrU1Es3uheBpwsjOAkwPUpJLkHpT1ffuAbURkMpCv3NmYkvQRw77EpHjp099t0iq8O6CBUF6yigFigCRV0gITw23SZOtfOPJuC2f9nPH19hvE8eeBy84nFHQkGhB6rSKnqivvszMFSO6qd4qRSibU3jS94\");\n            yield return (Hash: 0x87ba0afa11e6eb08UL, Seed: 0x0000000000000112L, Ascii: \"hW16QQ7Pv5H9UZK6FbXlLgBkAIBqO8YxOqamPOPBQ9SErhI9keLHzhRMVeL2kRpWTO2Jp7bKDZPgbZ60VImXtyplriAdLiLFTIyMWYDv3TTI0Zhr3bFsqrOoTqoiIdp1TdaeChOkb6fhjgeJmOnEQVxFHQVQE2Q7fRXucnTPIWRAs8L4PIQL6m5DlDtXKzv4zs0P7n4knxLj7pi\");\n            yield return (Hash: 0x1468a1aed10dfefcUL, Seed: 0x00000000000019a7L, Ascii: \"IXfuXoGOjZYCriurKgpliUAfWM0obqz7Z7WT1Iedk93lZhNtoyjbY9gij743SAAK4q9Cvr7pAsndmTQVwZip1aUc81kZ4ZKFNU8EURL46wAdlTgD97ZEEmYwKuRDzNGOctDGYwLovP3YE4Uaj6Xj24egfhyhr9dSoWYOxyq9Xex2TLDeiuzkb2T7fxgwCQPcvHPUuTG1khSobRtI\");\n            yield return (Hash: 0x5d7174c0ed2cfc7dUL, Seed: 0x0000000000000adfL, Ascii: \"n5jaccam8c7bd2y6zvSxJCEcLJxeQ7gRVcOsTtU5TMHTEINp2DayB2imv8ubvJLOjQ9XHej1haK5KXqoZysIsrGz0aYYTIU9ObfOgkzpED6kLPwI1PyjpMKCcOCD6TLHDZQsxs4e0ii2YQaNmRJpT7tZ7thOwdRv3KEk8SU52eAGGXyPc6IdC6OBhM6lfjRFxpUhuD0LNMjZztoP\");\n            yield return (Hash: 0xc7c1ce5692e46609UL, Seed: 0x0000000000000000L, Ascii: \"0B1Ow3HA7F7eGGzheBNspjxVM9vMWCdlU3WLZlePxFSsGP8X7vwDv6RaFxQXqdxsu1P6LpblAM6e0NAnYQKEa4Aao0HI2EpnXhj2rk61XKXBBnMg4fSC9uTedcfw8rOk9Rryy7mnEdp0Vb05Uj5cGVEtLVJtWsWriK4uYUmnjCxdb3EqYYMEiAebJf3Z5OevqvPThgbgLnYRDiXp\");\n            yield return (Hash: 0xe3724d9eff634603UL, Seed: 0x00000000000020c4L, Ascii: \"Y3qZo3vgY78iDqSAKtuYPdV5PSv83nq9ZbDgEmq1DXv4T88joZP7k1Cx717NvuHTaQmQcJKM9S7G2EMoFtTRCJMEahuNF3DAvZ64LJhupjwmLo3wy1DluDKZUPglYtNVA5qhjwkmE7ZTr7qWqjpXxeLRvcJMHUCtXblGhf55beQa4MDGiEztUmxmCMahOBHIBzzRPD2DuGlU8bk1\");\n            yield return (Hash: 0x2c68a5bb2ed7067aUL, Seed: 0x30b52b853f3c90a8L, Ascii: \"POkjcvdYJtZG5hdudDILMGlYffvT7puFwieMGzzFSo1cCmnFTQCxfZFKH5TEKdl003mluc7zjytqOD9VQtp0T1oa7wZKxdsJylmBmYlGTRUT3ltQNy65lyoFsHG2ElZe2ryiC8Og7SHdc7pgtL5PnrI6vgofq6WubtpCowKw640dbenk54ZXJxYmOKOS7NHMHUqXrlM8tguWNqwew\");\n            yield return (Hash: 0x7ee9b58c5dbc8f64UL, Seed: 0x0000000000000728L, Ascii: \"HdUWxTmWLMYxDvlS3g6lvPs6zdL6Z7759ymLuPG08UbKXWDfsvMuTVEprrR7HbCas48BmoQpgWtLEabIcApEE1c2pWmtuqanbA93PDjOW86R11YcCobMNJBrWHJqNpZjH0LlvIhS0C92t0D8Ej5uyJN7JHgzwwyTNLQncnGUkSMIBNTQ3YzCtBSPhKoHSfUBKEzk2fzy68pZGSi4X\");\n            yield return (Hash: 0xbc216bbd1600c972UL, Seed: 0x0000000000001c2aL, Ascii: \"dAN1SdBmr2gMNyALQrdDXfQ55t6DvouZbZu9cFXibXwHweIdgdFifK6CjnNnlvzlFCnNQDjSR56Qvj7f3QQbBMdaLN2hAh4SayCDBLlfFjU97lzoIHem1n2cOU627S3KMhFKDz7QnicmqKgEeYKAWCMZLh1i18jQDk9SvY9wz85clcFrwBJvULVEJYCIZQKy6qurTDitVFFnnzIvh\");\n            yield return (Hash: 0x0fd930b138297004UL, Seed: 0x0000000000000389L, Ascii: \"s4vBkb0vmkbjzA1CIzLGyOtb8Ers2LzuSbXvmPNjNulNzPG2OaGfU67UnMq3i1ubVydnzBdit01OxJ1JJTcxPjvxhkkCdRGIwxE9AvXzcrtPHwnJvCtwnJeJvO24yY6DnUCZ6P4in7fjyvZLEjJbf4lxSOzazHOxDKHKZitF2yQKFWAYc7mc6wov7DnwVYuhudXbdLsOWOIw1btvtj\");\n            yield return (Hash: 0x32e2b25c14c66c59UL, Seed: 0x000000000000196aL, Ascii: \"c4jJohV3gr10UmzwfQhRtE8dIdtPx9SGpNE1aSq0ZCQLDQzkUQAefMagUxE7uOdNIr6IWA9aXjapnUgDjWagND4CNHYgkk8FPYgSIiU239nI7qO4CkrxrffMJUVAh1EsS51pm6lmeAPixzx6ROCX6JUebS5SOQynqDvFxTh4ZALMiBZadkgC2achNnbA7KEnel85MGrsCYD8996Jul\");\n            yield return (Hash: 0x58c49065edfb40c0UL, Seed: 0x0000000000000acfL, Ascii: \"Cljyh41sippSYGQXUXTCELfcslOnjQgtAbhdENTD9h81WKugXpFsQVom21pW58m3SImLqlmKlR20RtvA6sSiPg2Ids0VkSzrHsiv5d6E4XtwQO2RMiJdbrjMShNAiEv12f7pWh1UZwZr0qOqoFsWvpuTLNiziwUXXJIyy2EYprN7E65MVXoXPmrrd9RwdfR7G7SDyis9XJDavdIQip\");\n            yield return (Hash: 0x71c1c6f8cb34356cUL, Seed: 0x0000000000000000L, Ascii: \"OJFu10AE0lILXYVyS0SnWq8bomiymsqnFXR9RBK2vfdQHBtxI4jzL2dQjEyP8Kow9Bm8shOTckKeisDHBPkF9bOa3WDKz5I2szl20rD77vmFepzzVCfnAuCMGxRXRHoWUmRCjDYN6b9HsRAs9xNPLeichB0rnSQ5mQWObL0j1Wz6eCnXHVfPNWw7jd4kFjSpCgoI7qT7DLQz75HjzV\");\n            yield return (Hash: 0x6e5dcc4f3974adbbUL, Seed: 0x0000000000002386L, Ascii: \"l9JXwaCxFbWwpmYCQHjcNUarJSQknk5wuWJrhnG2yqJOwbxG19Ut90ivq6paYtcaUC4BQ4NaeG98g8ixNTlqTuN6v7x1cG7FTf91lctBOqWkUdQKi7x0h4iKFTK0uqrYOAGV98g0mPQZlMPnYMWYqwlO2fIMfC9BDmRId2xpOH2td0ydnOFbw7QU7Ee99C5gZdW5zgRgZ1CAsuE8OQ2\");\n            yield return (Hash: 0xa445fd3d1e2bd025UL, Seed: 0x0000000000000f22L, Ascii: \"hFHhF4ptvamaEUcRYAVs7TkHdDkCYKyLzzQQdwwyHuiBmzaTw2yatG4OivT5zoBUozXNwizWKMybP7GciEQ70EikxxaZxLDEzL1dA54ncIhyROBQp9DXGCNds7ajaLZ5IjE3QGWlkqivvo8aOW3EBojz205favpRd8J5kihp16jsAY7FVOFpPm7m23hXchZTHyE2vxtQz1PWrbAhCPx\");\n            yield return (Hash: 0xd7b0016e6b7e5aabUL, Seed: 0x0000000000001cdeL, Ascii: \"THBuisT25JtpMf9WHebygRp7y3glzDksekJZTodZdrE0AlyjmKWigQRZXy0ysS2hzuXvAMecSQR758gncHc8uknFWyCBcKj9YVhPobrSrgmxeRkPPwDYFD2Jq15UKdKX0D3Vt50QJYPdTYyKAeNdBB9QHHh7zd0gno2BSNgY4Pph62SY3wtrURyTDWG1IrYd1C1LbVK42GppAUP2vBC\");\n            yield return (Hash: 0x05e02548118c0ee5UL, Seed: 0x0000000000000000L, Ascii: \"7aBu9nr9J4LDM72H7w6971aIssorqHAUeKcc5y1GwosXqTsCNnYAnm4rooC8takVhZPSQvJWMF8asKhjEz1tULAsMmrdnUGmKmOBWknWrbpVlWhAsuxPFmoi3YO3zWPxTkFhUYzTN2uPto7LbfHFpxrH6acx9NIvC7BqzMzWoEpxyw1LkZF1UwMqYANJbeTsQh3MBQVRjbys2JJP6Vhu\");\n            yield return (Hash: 0x4590988ca1c581c0UL, Seed: 0x00000000000007e1L, Ascii: \"5KBL51l4hNuRo0ySKbXnecgOY2O6cf8ncMfEN3rfEjsNOUpJ9NIP26L9x1ci97r8StvvGQeIXDSHvQGVJH6JMCCPdKDpcfKbupt8PbqacoiPLK0vo8wFOyqVz7E2N4sr4DoNVbtqXVjgeDHiF5F2qwsHI7qsUTNQjeEwqZtSJ5de2XnjJNcKl3f3uWac6XgyrsZjNInpn6xzK0Ph2slI\");\n            yield return (Hash: 0xa7294091ba6559faUL, Seed: 0x0000000000001f1cL, Ascii: \"Vpk9ceAicxUFUIS1highaulRcOoXA9XNESNyzocWCRjpVYFhp2BDj1dt3CKPziHJ9LiPl4pSr7DtKSROKJkoOFD2Bi1Ig5pjUqCOR0NUalZoVjytBukvD2l4v1366bPbo2CIPZ8E2tSB6AgSJY1nGvqHFojrHZJFQe9QQNjlvKyjmTzgSr39t7dcQn47AH4FgWtjIeQdsvKqafqFN470\");\n            yield return (Hash: 0xe10b340ee3402775UL, Seed: 0x0000000000001485L, Ascii: \"WsozAtXaFmiAIlDmKBH6QnjJqPQ3Y1yQCYOgWGf7mKA2U3LE45DGb0O1YDk6mSRP3doCSjqCRGPIjtarjFp9CMRnkmGPD2ezubhN1JXXbImNCuOYwWmxgiXPqm2ueVgPrN6WmRQFDKAzp4y5qnkFgtavCTWYjNS1VQI7o5X95rVm4ZhyNNZIpqki5wgcYBRCMQ0tJDx8hnxBEtUyWaVl\");\n            yield return (Hash: 0x4e01e9ae79cfda12UL, Seed: 0x000000000000010eL, Ascii: \"aVKyR92AaCBW0Lk0WjMia61RVhrECMDfG5luUnLSiyLoPEoockTbFllYK7LnEvEBWqjTNBLOAk16OdmzmKhZCEivvPI1RZQejG54M5kys6mR4ZZ3uBnAgscmFd0k8YTmmneyaNUSdvsLKGuZI46gqLnkn5CKIMQORwvmBseoQ1uzfTjzXGohAkepgzsWrv8CHeImc7052iYWnZ8NalBW6\");\n            yield return (Hash: 0x96ca2f337093050dUL, Seed: 0x0000000000000000L, Ascii: \"leqYs9WeGmmwoxgeZUplpxGTrNqHomntsxO4zdDuwSacUUi2d06ybw3xJZTxH2QEn6lagba0Dr0qQ0AulJOHUigJxGT2kxjWiRZuqVUrIJ76DpuYVORujv5pwsr072YHhXrX70V29wZVHfeZYf5Bz4AyzY64bixdXoAfJ9HMceEzvHxQNcFJsj4xLVOvzR2HIlYII7BBQyG0ik788LwUT\");\n            yield return (Hash: 0xb89d8f2e6ffdc87eUL, Seed: 0x000000000000097fL, Ascii: \"d70Snry8sIxRblM5EjJNu7QPmYLNq3GV6UGHlKpIQNBi1vvbuFDJYj9uIkmCyuAG6ZTh6eXfMZnR6BfClgq5z0i0hXipMnHW95Fn6zs1mCPVao4egkbkruY93D6OgkAeA67BL2R5s92HMmm0lOs0idIeGoD8RRR7ImbD16QTOYPLaPeghCAH6AjS99bJoIH0SPuGXZZNqrv8B55StJghF\");\n            yield return (Hash: 0x0e5a220fe2d24fc4UL, Seed: 0x00000000000023a9L, Ascii: \"gfOM0utqVsQRzcQ2aIyaXVtHFq7LG3fkEPedKgZEwIovPUEyZCbfyRuWAZPZ1Jo7g0IGkeslhR3XT0GyBFQL6X3YcCcad7fwTePhFSm6KVxDEiLpHh1dA9UWQ9x2xJh9Ky3F6RTMxeQEh9zM5GaHjK7vmqjvk3oE0CwUNXGXd3CxeYd6ULFlYRiS9QbHfGiBxWbvSRj2ymtHIxS8886lwJ\");\n            yield return (Hash: 0x3f4183941bfd06bbUL, Seed: 0x0000000000000000L, Ascii: \"lcBa3QpwhYbZq4HRypc8k5ULkpzue48yKXd6NzBSYTnWrakJGMW8GJEjbOFtqkp9IWKLBieoXgLwibggsY9E4J8OJVGdKS9BlpzxNPHWRwcGLP3B7UK2VOR3uvtCnW7YZSk6gqhJuNOy6zlurxRDt927OMzoWwGC7cyh0WlmCQpn0meRxe7Vha6ocNeA8yHlXPqgd6omqaph25XU9hKrn9\");\n            yield return (Hash: 0x6207911eaedae1f1UL, Seed: 0x0000000000002255L, Ascii: \"IjKVZoeHMlj9TRfbtrnSlFOiQvxLC8uz0gSpycAxRbywjWo97Xgzq1WGB6Ktn2B4zf4iBZEbo7FGVLRAhATBolA5nRqqgQEqycVY2yBmAdKQ7qkSQ0JRhsnBhYcNPZBb7nhtVPPubxKRyRPSAg2GDGgweoxFhRF0WImnAyxne0OvHhj3EBpwcVUZ4P7wu9wEQhW7VJugFmhA4iVeMAOUh3\");\n            yield return (Hash: 0xdecb23a233179ca8UL, Seed: 0x0000000000002468L, Ascii: \"z4eqekhdv34U2YYfDBGkSR85HW6IprKH1Lky7LKuGwGVARNNUDCVZ6kXXUagNdmRS2a4clYUs7GVHJ7wQ3dbNkyl4H0tq6TqCkDVSu5pLBbUhwrdx3xPfNfPMWv82bH0vPZNzYPt2Fei8C7OU3KbUm5KHOn9EfcaWgTbpqLsa5JgQm9o2sVilrPKNIhbK8KGy8hsiSgurUfmS0DHgBpv9D\");\n            yield return (Hash: 0x34704364be064650UL, Seed: 0x0000000000001e3bL, Ascii: \"rtCUv9vqzMDXQMtMTQcCAynQMczuLHldkkc6R9O06nIGIiI4q3ehCmHLHv9hNRbH02bo3TlzI5G8VUaW4PYzHqLj2dn7KuPF6PlRh0rSWEXfhHbjaWtMrJc7jPeGFTCl0kGIqADkw6Dw7LZ1vznTTITBX4yeIbS5NVqA3TnnlpRmeKR8JGxZpqzjOtR5ZdNESzlqZBiYmRqpCPykkjX0tBe\");\n            yield return (Hash: 0x7d85c2737fe0536fUL, Seed: 0x00000000000009d7L, Ascii: \"L6fREVHqM4d8B9Wy76v7yGbjCzpfhXvh2tNiwmMNFjKwr8rBPpwg74JrghKyBI7dr3SlCs5sH1NhePoZJEd0hkmcEfB8f20k9WWYmNpCtqUCWkOrWPywUT9KASvYUhGIYfJr39d3tuipvRt7cjbOdl1P37xKHrmWissbXfNsiGSEaUhRr1KjBP5PcUMLSY6VSZXrSQE65qwLOT4XLXCgWdz\");\n            yield return (Hash: 0xc153b40aad630a08UL, Seed: 0x0000000000000000L, Ascii: \"MWxfcALWJHfUT1laJANXHfshrogEiBVSsr1Mt73oaxVXdtBOZvw3lm9TqDgPn8U6sIro5oJiYDPaObAXJzZ6U1aqmM96jT6XuarIg24ME3iQJWofn1Unv3I59iquisA3958OuWYbXQldCbMQkt2pJShpS3eY1p5GTObknktBzgucOJJg2Wa1Mx1zUiC519aTgRm03s98RiWb759DApHlUtj\");\n            yield return (Hash: 0x021a54aed692de80UL, Seed: 0x00000000000013e6L, Ascii: \"v43KCmTFfV4m8izbNRwsKKvSCvb7eo0QyEZHDMN24W1bsocSGHegt5HmnqjtB0UebT2xvFkp7VFgCUkMT2797wwIpK3ovYXDtBfSTDNLjyRBkKDf8F1OmfPsrxU3bfuMLNvn67pFn81iY1aPh3LWM9DEwte7UpiTyu9cjZg3lWPkIdgijUfjSAaFw2wvpxolxp9XP3RgbaM3g6xSm5XoHGRP\");\n            yield return (Hash: 0x36eafdcfe4d098cdUL, Seed: 0x0000000000000520L, Ascii: \"Cv4acz39tU14kWL7FXMG6l3LdCdhZiNMsNctdM9O20zcWaYqZZbO3byAQA3LORByXU5K0HKsfpHwUVZ2FqdpaZNph9qbBjDtMt4oTztSAMO2XkUUBga3iwwrCsBDxRWWjfiRZSAwQ9UMtucNoPguHagnjgtLDExdjRnbbTqVxmlVJRs7QTCiv36YUGvJpPcMf0GH3WTM3950ACaasdI5lKSe\");\n            yield return (Hash: 0x94b0b095e4057075UL, Seed: 0x0000000000000542L, Ascii: \"2MVJdGUpZDznM8g2TVKVDhJCMQxwR2DVRNHP73F7w5WEHtcxxtMTZxAVdnGtEiXv3tg3fs3nqcuqvmIUQcgqb719xFxznuZXeSF66kfnpPuC7NELb3eOdcbDvgIscxslXN4kEEYnXAPcfBw5lMms8fEbGwD7YqAZCYyv7wYvom5h1duRsBPCMULDoVeqUTVOyo7jdq2TQqO5ZjIVcrZ6vfS4\");\n            yield return (Hash: 0xabfbd8d5bb603233UL, Seed: 0x00000000000015ddL, Ascii: \"eaKj2Wxvp03jvf8wxE4StW9KSzC7PWN9O9FqwHv7agGho9p91Nzkx84NNiskHnFzaAwOed93zlLH9aRSuO2MnggSm3EliYmRgYK795xdeb9FrtIRYqBBZSU23J9IhOMHIy3hitU4EvxrieJEuqp6xozpCxmTivsHwMva6K71wewc9HdSYiDoq4xv2x4JJeCyRNlRYAYyP0mqm1CTHKrgKqcV\");\n            yield return (Hash: 0x8556365b2d798865UL, Seed: 0x0000000000000e15L, Ascii: \"NZTFL4A3q60uKDcIdOkRSV8HZkziOyUuPBrfooNFrV2MA6JscKmA2MBGUsz275Gl8BbTVmrbnnK2fM0zpCXqxZSDXKDvOW0erPGjkUuW6ZWQLZAXSuSPlq3yDRJzPgTIB4VnTCQQyl13wQJ5DfnYdf4ScYXjxJup3BFhbEt0Hnq5v0X6kKbmPSkzuNenzlNBKfTu8hb7rncjDS6tgefyS3mOv\");\n            yield return (Hash: 0xa5adca1b1c5f448eUL, Seed: 0x0000000000000991L, Ascii: \"HqKZwK91tBYpPOl8o342vzvpM05Sgw5bGQDSR0jZMWuEGp2bzjN00wjn9fsF474WwXKtySnONtiqTKCn0tAVK6iXMfnPSeYNugcmVGelM6pymFoJPQxvZsrJjG0oAFQzwh5L8XZiD8UC4FndZuYpPOrffG43WebqwnEmFlJ1zZyN4sBSBflBDeCufIV3lcWDBUJD3ILsaepi4MUaV1zOmAHy6\");\n            yield return (Hash: 0xe2b52189178b4a42UL, Seed: 0x000000000000140eL, Ascii: \"1pTZnHAKgnUPv6pYmmhRFuyy2fXjAndgADY4ehcYAcHrkmKH1UVQObV0vFx33NdIbA9D2hP2FBXNJHzrfwXDOEHc6CLETKUxRxqZc3N0RhBWjibXXiChsLZ3XmTAQF0Q1Rz9YJXgiXHwgzNO5cWtvmNB5eq3xNbN6n9F3IarH7bwxnioCBj5uNQMahPgLu03TA6t6e00sSlFQEwgFwMNLPWWt\");\n            yield return (Hash: 0x1c0f5ee8c64b5af1UL, Seed: 0x00000000000021c5L, Ascii: \"4DC3Y6FtuATiCbFMTkXH4zWjn4tf8dahGDINMHJk8cw6E23iCe5WrocnMeEi0ka0YZt3LrNGUvWTaAMk6RoFtkspNRedvRHZuxCH48By38b94fTpMun56GBQg7OJiA39e7LY1prxJdzCb8vDTgzn3rPI0OUM3NNJ56A2WbXaQNkzgkEJuUodlCFxUniOmvuZBOWAY8N7MMqTnPUgR2O6qiQQnb\");\n            yield return (Hash: 0x5a79f56ccc6c81dbUL, Seed: 0x0000000000000000L, Ascii: \"UoQAMlKisK1Dd2QUq8O6rbseXSJAehbR0pRyo5wnH1sSMtmFOAgMH4dome2gORSovkCiifjYbVymxmK7pqedP5AzH5gYK8gAQPATdP7wEXt4EYn4X6RpJBkzvAVXaRLTTgBClXsW6VtqUtHQJUADgd0V267esMM1HbqoaISEsahDb3dbYyV59FpmCbClJc2GzK7DcMpj4Y3uF4cQU0I0nqBEQm\");\n            yield return (Hash: 0x9a8b27a712725babUL, Seed: 0x000000000000143fL, Ascii: \"627hgrPLCV1AHFX07JV3BY9dpY4q1gSUKGAau8oqxi4vDsUigISmsL0jm4arxli9YdJCN37sjExSRuLIJ7HpKI5JACKCi2Q7dYgP4BwvpwEQDmvF2t6mPT79S6FVmeHt6827kFh3vkVD4SmbviFIfhHb97p6JbuLNb2ilCrNDuuoCadTFkp1Rx882SKaVrzAPma5Lgir5ccGVWw7dqBwnzO4Y4\");\n            yield return (Hash: 0xce6f926b2964d0c1UL, Seed: 0x479cc0ad776c4358L, Ascii: \"roOfMBk01by3B3I87XgQBfha9NDfpLe4QDYiB8pupi9Kv6AqIC8FYpVmhcLWWMTliUsE5ZWhQ5BRN79vqEHlJUwC1hD3A1CBgxbUctJmposwuZ6gJiwaN8HOxOzYzHvd73fUgdnvxcT4PIRT9N15qrkvfBN1LegelSQOZkPdI0QAux8rj0FZ9yh4vqb1e0ulO7FqFLFFiwkhawEZK8kidyGETK\");\n            yield return (Hash: 0x2b3685370f802952UL, Seed: 0x5836ea31e9bc3892L, Ascii: \"bRhk9VWj3SVYdenBUrI9wPN67VTIhO8ZOtut63LlNhY9xw5igHP4HnCdFimHkhhbEmxwpLJKCygXyT22y3afMymVyXm1Wc5akyK9sHW3DAOLY3oVCi3YGkkNEJHDBLOXoYCPlLOG00VOk4ue92dAs6DfZpqtblUTlJlF7CL2GNFg0SCzS3LFbuZz90jz55AuTTdY1dLJOWwrqm4U3zwQerBSJ92\");\n            yield return (Hash: 0x658cc2053ea2c9fcUL, Seed: 0x0000000000000728L, Ascii: \"ZO5IkvVUUjpHBSm1D5xsnZ1IA8uCxaxr7j1CLxBbs65qCt2SxtJxwVzzDMKvKgxJgEKF4IsHD5jAkGqlBPweJ9tWX08KnlLPn6KSvtYmcWGWeY5fsmTsozhyRWLEH0pxVUWFqlgDhPt6B6zJ3lYZDKNUIdJgetOs51Z1Zbcz7n6wQGrym4MdovHNs7AZTxMoNDORopMbJz9ZeoOGMUE1X0ZlP3V\");\n            yield return (Hash: 0xc91f57d2583d999fUL, Seed: 0x0000000000001bbbL, Ascii: \"lExmEnuj4PbJuial7hsE3h15damh0vWA0nKDm6YzGX5vtZjpefvYA5fJciZ1wRlAOTxXNORsvoNfAvHFmGMevPGJY8OHLbNCN2hQFgGj8C8iYT3feJpAmJdiGMGzrQBps3CDCYK7Y2mjnSxmloPKarj7qWGWw9DsE3ObNqSQ2fOksIkMD5xOKF2WtoVvVCrVdszkEsmfyzxCh62yvAoiDjq7meH\");\n            yield return (Hash: 0x04ff6921cf041a20UL, Seed: 0x0000000000000c19L, Ascii: \"0XUrhozMrVQwExvzSvjTfSuPEqIwrxvmAO8TTcpaON3Yl1Ru21M8u6sFyBtyf6wCOuQQvic4b1kQjBlGuuJpaFM5Cnejw5viTM2VdFQNJIrup72Xb2CkvPk7R2CpOGc0SLdeLjtRjHV4LqskpX4ge3w27Q8rtX6k2MN3703vaOXe2axJXD7HW1btH3q9CuROgdfuU1iLW1crT1GpbLRsvosS0y8x\");\n            yield return (Hash: 0x5eb31d07c3c15d20UL, Seed: 0x0000000000000000L, Ascii: \"iK5YjBQqLtYY57nUaCwhUYOMgg2sZHjCn9Bbx1U5xIleBfIwxfHS4DC8VCXUgvuhIs2Fx0sJq7YZXC3NwNC6cBRX0tKTPP9RJeIhg77yPXETHOogEf78ZQTBisbfRwtBbM9KI3ibTyeTkjRP5aJ1GV3g1c5jVez1jQcZ87Gws5cLO1zrEacglwdmDU22MVAPNGC8BHyZseVj6pfWkUS3kEJ2Fd1I\");\n            yield return (Hash: 0x99051eb1bb49adbbUL, Seed: 0x0000000000001bf2L, Ascii: \"nD7cdBdnA0smbnr9ACDFAA1be4tpxONfBuNVsVTwYnzPhfCdpzibBjLHtHFfthHMiiRnaGusXRHOGn5OLff8Mr8Xkt29s2CezETI6Cqns7mVKopNdBSICuifMVFrzzQqaMyrYch28i5jNmfmKeX28yhAafViX1dYshTws0lpCbHR7EvpDJ2PH0NOsMFAODKDaofZ6Pbiv3pwejsfDW2DtwEIdIJ9\");\n            yield return (Hash: 0xd5139e04100ad440UL, Seed: 0x0000000000000b51L, Ascii: \"u7VtIagZe18tpDCAKDmCpW5WC4vqvVGH3goGq3qc0yGp4w9uYysET9XpF6MmNdSEfu4b6A1n36OupgQNTOtOVvihJHsMIjbpiEQoOFhvWA0fh1IG2XGudHHzSbcCB8NU6iJYrED0C8RgOwgkJ9ofgHwhZlk9sarsNkAoINnnFogd6DyYarOt3O6Q6TaY1nWQhnxNhOJjdZCAA4X2nx0CYGaqyGI8\");\n            yield return (Hash: 0x4b063e2b937f880aUL, Seed: 0x0000000000002319L, Ascii: \"pcW30Qxc5kKUnQnSKaiJ4BDaPbwUv6SIQg6XOzlw4mfglLy9m6MX5wQBoAXmz9363YKLM1MdaRCDDWOlCGO2sQbBUK6sZmWb8o3RJsNMRGEaTYrKDbgiwAecsrsCgeS3SupxFHeEGLgnMDPHEPm921IFpQY1JNNW1glWtmghuXoyMzWikot2m1ujaQ2yJA4D0TwBj95b16pgvrHugdS62DM9GL46X\");\n            yield return (Hash: 0x908f697416a8c1b7UL, Seed: 0x0000000000000000L, Ascii: \"F03wfhRNki4vgSPfDdFSZeNy8oyUMQwioqrRv3xsJk8Y4SqqLhE1YI2enghydmhIWttp4uLPwvq17OYcXcHMuBDyCwHaIpJLuSlSLP09nZOTWhJls3YJPP4kRyvTWONsEy6AaHIlNUIVH2mLSk5uPmJHK5js9V6OGxGG6XFMThIA4uSQyQSNXLeFuXvQ0QuQ5GWcxh21zQMu6UPEhOA0nDWRxa3QK\");\n            yield return (Hash: 0xd7335467efc526f9UL, Seed: 0x0000000000000fc4L, Ascii: \"BTxzhZqt5gg2Edi11DsiA7woNQXjS9FMm0Snii2pWcGUmVKHoHtu7YMJVjs5g20rhG5m5956dMOyqhSL1IKhdeogZWwASviEatgfrbC1xoqTzOUmKoYQY7etIvDS5jq6BV0DGICCHvAXexxtf9n6jv2IMOnVXopDgXaRGTVmr0TRVeeCLsCE0lU0IGPuXQsG701jUMoiaRkdIEak05Qk2Lh0o2VJC\");\n            yield return (Hash: 0x10070d5c754bb6a0UL, Seed: 0x00000000000018cbL, Ascii: \"oRYALytkrlDyGh86DFGGYPTJGNsSyhBn4fjkl60WSUebIptUTqbqXeCxX2tyRPHRtClA0gCqq8ufa8yqcFRjBqnGJ1hEm99xidjKlyQI9Efx6lW29IE3SaP6PlYuM4IlvtZnsXldLo42jbrvKR9OcGYjlQk2rsJHDgvQLz8Cvx3Ei8q8ISDUiFYlpA8sjh93JD6WCel57jNiXB14RtRtgDN8c2W4ua\");\n            yield return (Hash: 0x33ff3684c2c9661dUL, Seed: 0x0000000000000000L, Ascii: \"S9cbotxZR4B15Hjl2hKUdzIJkakuWMyGbFHGqgIB9PR8xocs1BRzi7MQ44lmFdmQDAmCgOqLWFR9LlGbaN0OQQGgBa6lEnmoqBukT7sIkoCJjHUi2HgfLRiKfeWD8sEE2a5RTVKvbNDmiuUgkUsxwuh6QiOjc0Pc2Du8euDHDzS8krhxePFW5ReIWtxlxxdqfbV0tANKpifFJXb5gZ6k26qkTDJv9X\");\n            yield return (Hash: 0x8d3e3a28bb63a501UL, Seed: 0x5329a3b70d0f4a59L, Ascii: \"9TK6ReBZeZ1K6IO9C4EYZuemID5jadSyEGvmxZZEWp7d6kWLCQIeieGMFRGUloj4Uont0qznglqe41GO3hh3U96nzYdpWFdiuehvL7q45L62sj3IYoQWCZk5SBNyVkmCGyJzRILWUzUiWJJVlK0ppbrcUVLUV4Jepw9ejLKucNU3P7hifLxvoNOYaXftmEKZH6KISwD3WdxKIE9OSWrcZp3fzatrU9\");\n            yield return (Hash: 0xf2eaa5caa98a831aUL, Seed: 0x0000000000000b0eL, Ascii: \"jufg2umT1RqPEeANom8xVhHAC5L42tMYhCpNXve8wUDhfrhWN4H422MskP6tBY2EmEqePlccygB9ZQVTpHQqiP9Ka5mQYyAGx77GUs2NMnU0euVywIO5CBx9ei6de9oCeDMZc7k3wXvSx64x5eZJGUDITcyTTlyDLR0Nw1YRxzxdRdKCzM02wsfJ62SlnYbTk8MPKpOnox0Yf1LyHGIdInWUVj3fyb\");\n            yield return (Hash: 0x660cd203182f08c1UL, Seed: 0x00000000000006acL, Ascii: \"GV1MgnpqvoSDspt8vNJkG6EhDYNzvaAO7tOH0PZvGGoXtmMjW7bi9bjis2s4rWHtfX2bza2xfKKI6LFpkjQLQK4uiVzUZrW0qChLjsmpWIZRdGVIGCtG6ioxs0WR6EPDYFrTNoj7o1VKJEmW8VV6BG2hcO0mwrIUnTCd39CfBPKIkTm60R5uiYU9XUhsf9spgu6w4wH1eHFzoVGsxkapM8xmcqWEDHU\");\n            yield return (Hash: 0x840878cfca73a99fUL, Seed: 0x000000000000266eL, Ascii: \"WGhakvdr5URzegxBalPiDzXEY1viANvoS4m0bZGAtcpjafxDA2fcud3OPkRiq2otDcndRgBMA5vKwxuaUdwIcy0SwhnQPvonKbIiH6ihAE0PDNP5wnNVoGwPhLxuC5M7rRqnm7jqnIevjTR5ZCc0NDMfeZWoEl94XZcixZurJgI8Gtq2ILUdqgrwL2iuoa4aPwh0YnZpkotBse8mUERANTf2EJfZrIZ\");\n            yield return (Hash: 0xc19a10d548af45c3UL, Seed: 0x0000000000000530L, Ascii: \"U3jiPo6HiD1tYHnCbrkOo0rZismuXvf2r2hKvELc7llbPvCJKDR7ekfiXWzImRBuViE97og5YCPzAXNEq7Ib81PaCxmN4vm6iBZkghhPUvjfcU2f0xUlkzu9G2UkhT99QOO2rFyCnN1qwuY8utUmmKrJf2W7FCdBm17b8yG9jegKTpKLbobuKWwLcmkotRcguOOv8qq4nNaE4EMMtMPssm5YzHXflJB\");\n            yield return (Hash: 0x0fc9a215639e2042UL, Seed: 0x000000000000134bL, Ascii: \"hrrLz2buLvxWkERcKPsq7YpYcyRzmV8GHdXV2ujmzVtrt4epM0wZclAhkSzP2yA2qokCFjp9FDJnwk3ev0K5qWwsMkulMNCs23x8KSChg73HeC9kjPDfvkFG98rF9lS9jPaTQp9t2ALqVV6AIFS4gHEroFKXVaHtgacNOpOYwaORIces1ENbq2AeYcIcmomXs3XyPGqaHmxizYRjchXEpHWvK5qv2l21\");\n            yield return (Hash: 0x378f69eb9bc14376UL, Seed: 0x00000000000012d6L, Ascii: \"33wNhFAj3b00HKKB93gYphsoEczhprR73uEMR4fR8rdMe9t11pI4Xjm1XK8YHWJoPtIDhwWhJThCvahs2gYEyAg3w8hFAwD49Din0hcv7D59FzlvMhLzeGwaicTUYXitXx2R6T160RkmDrVeNEFa4mSiWU5kPbYUO07l7nJbaduDA9Dg7YDIUZUmOjY36v7dnO8LRuHWVMxdiILVGMH7TqN732NuGBQv\");\n            yield return (Hash: 0x9f94ad9c15d831c6UL, Seed: 0x0000000000000000L, Ascii: \"HOQiALDlp6Q6srIQ8q02p9sZtYbDmMErff2Y7hw4gBBvWwcvEwkIY6UQeaGsRvG12x4S0PL6Q3xJmYiddO1SNcsDAhAz32wXQxBvisdQWkL8ifYJSL2gTqawFbWz5X8UqzSXb4zLEThzVT3iURoaebCdXC57jO2Vuy9FAZmc41I9l2YjMels27noGfwOsicYpKdkxR848Dys54b21T1evrtLHQF2pp5R\");\n            yield return (Hash: 0xc521e08f9c85336aUL, Seed: 0x68cad26577bb3e37L, Ascii: \"qXz5F7z9e2ctXtxxVFhUkJ2mgXPcQ3NXnkRxatRX6THQZTE7sdORZDZF3MQYYKc5XlQTVi0BeEeopicACLB0KokWNEF6F5AFzpB0rLLaDrCo4f2zssslxq7rTvkvE8VWcD0uBLppope0HmdjgXQCorCpihOeZNgEiMtwtjRABeVq71d040ZRcnsmtxDCMeK8w3GiTInjF7AHXjb9oAxoymrbpPP89hGd\");\n            yield return (Hash: 0x296b9d55540ae039UL, Seed: 0x0000000000000000L, Ascii: \"wDoaPoLLrmMPQVHhPuKys5igkxzDoVPKfdC5jAbIN2lzEFDTLdmKdXcvFHi3xKWsG2VUbFDV8G8K3l6GDKNGTpaH3pXOaXVFUp0eMtunD152PWSI0lDCAbo8sg9CMDdkjVOd90krfDXuK0QsZTRp5q3viK2XIcOcQazhlvgPpzR7EkZZt8ANXkECIICpaXE8AnLD3Du9GBNSaQq5u1ZBBqisCNz36cswY\");\n            yield return (Hash: 0x5d596bfeecaa50aaUL, Seed: 0x0000000000001a6fL, Ascii: \"0cowtHJveA5UlcfWWMaT0BlBwa6jb1zLYEtDo7tpwtuFQ0o5HHKepNwQbWKKnaf2Pm9tFUBXA5Z1JKDMew6IkLiESY1HFCbvnyeicMF5htD5azvoPZzM49yfn8gxtxdZ196R3z8Sf3fOi0o1OMWbxRSEzkfA7Co73Mh1YdbKW2LWzrligAGxhkKb4PlLi3NMWjZSKQShgLIf6EWd2usvqYAV9sy2tzSxU\");\n            yield return (Hash: 0xb7ba26ae242adfbaUL, Seed: 0x0000000000000d2eL, Ascii: \"gGr2S5o2nUvizSEiswmATeFJhu7Eq48wyK2H2fScS76BeL9Bxy803jsJaiLCoQn7WtZaURcgLRwh3lREBvFaqHkjG9xc70QDx5IJ4kgn9iKOwlEJzqAgke2Z4QHfwbG3i6058MjKDnVT7adVWRxapgq0HvgnxxvQC0IUW5QRa1jnF6NNfaaq5mXIwS4c6NPzy9ao3LVScS2nzXBknCwoyHRsUFTJFxRgA\");\n            yield return (Hash: 0x0b551d70df994f2dUL, Seed: 0x0000000000000000L, Ascii: \"Mg2Aa578qi3oKeFQ0XdDZV1Cyef1uIn25WwxmN0F9XaPms6fRuOZJ9YAitOMw0eBpbEBtNeYeCB98kWYHlvLVSJUc8vY6c1DxlEF5i4Os6GsXj1W6MBWP1W0zsxSewIWw4OhQEXOW6Yc1p0ox5euNviAtnhGeKSJRO5qBGDiBfYK0ZEQwu4tTFf6QRHEzz5UbzMjWTHTVjP5LrXGQ89WbquVcGv1akXFla\");\n            yield return (Hash: 0x5c4a5f56d91cdfdaUL, Seed: 0x00000000000019e9L, Ascii: \"90dXdie6aN17ABy652EGCdRAgJ3GyK87YkkL56gs8ts582dCH44SDG1zAQbL1B0Aygbg6PIehPzo7ftrIVaAyVPXqmy0FqzcGooZ4RcVgxgUApEzQbYwv6mfG0Z5DjX2uMalHMQAum3khSwxmxy5NrjnasUOaWp3Pgvtsdnk96za6ZhTiElU8ukznJRidGnLWQwuk0fFF3vr0JyVentetezX2kCTGgnkVK\");\n            yield return (Hash: 0x967ca04fd0d8bc7eUL, Seed: 0x000000000000103dL, Ascii: \"KoLiG5gWNCyjrekQ5dPdUm66ofTKFKMh2hxGQf3Jb4OBHZ8Jqyz3IU7lBKrFpzokB5kkQb4tCs1NeLvJGZCgWXU0iPlRVv3NOlLLbyfcWyG4HBcMGyNaYZjoOfLUwjsF5gV6ltLrEEr9ZhDN7UQbvRKUCwL7MKgqSug1D4DetkXVfXsiYFoCXQoxCswyqns3pnIqSn4rrnHreSRF76fjikfA1uSIWN0bz2\");\n            yield return (Hash: 0xe179c0af16acf331UL, Seed: 0x000000000000066fL, Ascii: \"oysBKVVZRJbhE5n0hyTfIO1IN1ssqnLBrfWge4bT8JhW9oxpl63nCtzliNCPe4OWwFlBo8B3bjbgW1PrNprj2J4FvRCTTmsyIRNqReKJZNs4bbzIXLpgExQNmQfVk8ohGkuFxUpEuBw70M5faz7XWHPNo2xWg4GNWaVndgG0d4Z3sE4c9Mx3jdgXHR2MoL05GvFInzQkgXFHekvYc5Iletzi3VEYJHn3ZN\");\n            yield return (Hash: 0x1fa2267f5239017aUL, Seed: 0x0000000000001b12L, Ascii: \"iqArWz0yyJSkrpEuRw827vrJUn8bdV63OFFF08kPfy0L0BXNtXU0X5KMbLmQR4SLh5nBETIsk0KNdV6MJl4tL6CJJuSr0MayRY9Aoe7VO7Lp8Aj7SDemgZ6CmqS9aUWy1UlKWIt2nNFYp1Hec3QiMLu1aXsDJfLhrLUxZXUcmPy11RPAP9z3whKL0FtLXrA0QZ6GgdgfYPEv0uzbzzlpYqj4kmSSCz1SLa6\");\n            yield return (Hash: 0x750565e577a2d58fUL, Seed: 0x0000000000000248L, Ascii: \"bQG0CwxjjRELQAdre7vEAPYgs0ZvlU9fgqLDOArJB4A9HNYmSMY4bbH8EiguwX31seg7sRxBnfHHk1jrfuL4IAwlOKhYpWX2eMKmJDrAOPSLpT3oev2c7WYB1lrL1XH9o2D2yZPOnYWW0RzmCMMnB0yUUuNWEgPFENSwotfD90kZtC3sGPPHAKikVHiZO11W6J2z3W7P8YmdQp6MENhsVjXsdHrzlAoklM3\");\n            yield return (Hash: 0xbdce706c2e8f8adeUL, Seed: 0x0000000000000000L, Ascii: \"0nZfUPdj3ewov9qOUFEai4Rz8U8KL5MfpqnxHnBG7eKYVLpYuCqlFBQ51pZ60QSg6w5AQsLxqThQWq8yF7GjG4eoJfEf7cFycOx72vLSc8lOPcufrmbeHpE5Bl8tvGVxWIuCXhVVmkqUpKhTQu0roVylcMK4V1jUBmGjAdyRnSedPxAzwT6F5tk1U0OZGxmgvZVpH0vP8KcXWTCSHSaOTA2mZnvvFVeVYuL\");\n            yield return (Hash: 0x0a984c675e2137e9UL, Seed: 0x0000000000000ad8L, Ascii: \"ZVIRu9Rob0qOuJSdtT6diIt8vfTaV20KZTNxiLiYdKfnvEVsYS3f5hMqYpWxz13FsksZgvg2z1YM4GmjRkzRXrUZFKvCf0R5JFqBflGQ0K7oriGjCZYgoSxhJSld3ke8APgGVcBnPBGghYoKPBBoF7mp7Z8HCciEj9V4fYUPpgc9mjAaaXChW0QeZFbHdAMdAlhFdQjQGTWgoW0EFJ7w41aGD6QTyUvmjv1I\");\n            yield return (Hash: 0x5565987299559a97UL, Seed: 0x000000000000107fL, Ascii: \"geRSNrQuZqWr5zPtwTnv8aNuLuJnDufynqqQmFH67hy7hTn0zyeX0VZrisMHm9gMkW5smugA0hjHtaSbriDB4G20IKrYyezXVN7pL0Zd3VNAPrU7t7SNJ5Jg9jlDRS69F5WLEEanb1AMXQZyuUla81lFSm5Bgugudly9JbF82NwpbZW8ZsN611xGzBVfHUqCXBH6VQh5yCr6GrQ5kWUmGTVYn76veuMpR4OO\");\n            yield return (Hash: 0xbc7aa525702dbc9cUL, Seed: 0x000000000000075aL, Ascii: \"QmY5yiBfM5iKcOcKBh1FhXXZcnHMXfHWWUQHJo97trTjWEqgHjr8Y1QYR3u6gaZKydIPUXXlGybBNnML7ia5FHB0E53K1VriIrGr0usuZyrP3d1zHkKKPCEdKxhWxs1bhzgwbUYdsKzUPiMVyVNlHKIYtQMF1ufn0EY9yt7crX70FRjafZ9xBI1PR0NEuHLv8khRtAMaimR5Sxb0xKZLASuc51jF31rmOYNW\");\n            yield return (Hash: 0xd3b6e5eb0c791705UL, Seed: 0x0000000000000120L, Ascii: \"ENUbVCQu3gZc63rKyJ9rF5h0pmk0K5fzfNCobpUnZCrSRwBhAGFUCPAEepGxVILklkEjyxSmla89sveifPgoqaSGDn94g0L4qgGbKfSQhE7qKncbGgaM9m5cSdxumPRkDrcBA7wJ41CoynKaYDP2f9Qdfbc6rtzPG17vPtKWeyRl3lnnzlMKF7B2jU9cAzDMTeZrdLA38LZPqFHazN0xsAI6QU79ty1cAR4B\");\n            yield return (Hash: 0x3a761a90487ff11eUL, Seed: 0x00000000000015b3L, Ascii: \"32fNLnH4iMH1yWxQjJ2HPAn0rGSYzU4hZlKsCsVZKYyFbQd5uM4exCun2TW3IkNPUHyQP3msMXPFegpssk2tBFbitkOaTEX6jKiDfHCjJ1BCbJOR8eetVs3VpNnf2kFzTPdNvZRpIXD1BnCUqwgi2IMEYLoLUwKibUY11cL7fLEeKKFwrot9x3DnUOvL69Mr3Ubmb4EkKtRUB4J08Y9VynHCQ6F1tFxJqhQnb\");\n            yield return (Hash: 0x7cbcdc9399d9d7f4UL, Seed: 0x0000000000000496L, Ascii: \"D3ItgWHDnRAYV18wCoBGjf3Ay7ensCZODX45bdKZ24lBI5F9JrEJoVTY8bk7J5izL4zrG1QjwJBnisdNVrAT5Q0SlHGROnGNMChG4lhbyCOwGDRKb4LarSDlRSI0vmTkGdCQ0oma6ijguL2g3QGGYPiMbom7Qb3MQbGo3u4GkTqnNWiPZKfxj7CV6BedzRA9WEfaTBkvSo3FNnc4Bo0ubeZabTfcesiO2zJ6G\");\n            yield return (Hash: 0xb6737ffbb963d36bUL, Seed: 0x0000000000000000L, Ascii: \"fBecYKgD7Wzw6TVIsxoegWUON8UlPGtDbx8evocil8TUN8JenRPZK07JStDLbp2eAhJfds0knxc1JdEYlhNM696ol0mKyeAimErejkrrJehHzqANEIt5LIvHXw8oC68SGBEGLcaRhstoDmdh5D4ulam0rUc0Z9KiesBCu0neindQwOLRA0Ej0vfeYBdhyNEiki6FYzCRaLWsrpPEOZALpZZmz5Y2is4ChSBTr\");\n            yield return (Hash: 0x052bf6ee984a3ecdUL, Seed: 0x0000000000000000L, Ascii: \"6h5WS7LLG1EOdfPLy5v5cgJvKHlmi7yZqzTGZeDECOpm7X1Ofy96jzIGPBbQqzl5qFE8JO4tNKrv9OFoJGBN6xWvVyHvPKq8lHCFkAFTKWcNM0KaUTrDmGp3fHyR9moZ0Jj050nBMfGr82jIMNlT3RFHjbhQ4Rmf4HG2ZW7cPKJvNDfGeJSIooX82A6L3fEdm219N4KYzbIHC7nZRzJjPtx4DJeLwGvpipwOWm\");\n            yield return (Hash: 0x0ebdb69be7969798UL, Seed: 0x0000000000002702L, Ascii: \"O21hsDzuNkt0terpCdAFFQJITRnVZInheD46IZZCMrsJrLnA9j9LWC0rBlWfApMWjHyFn3xlWLkUTQjaSAY1Fkk5Z3FXP6qJLNjR1IsPoZF5H67KK8w0Bp40rSkguilH3AYp9YpV3TI3GRlk0CaQAUc2dj8avN7a2bgB0OXh0T35oEnk2BO8ydKR5Qu9DJfPZsuF5lQUsdzyk8NTJECabDtb0ikuPhW1ZnzQmd\");\n            yield return (Hash: 0x8ad48e559811ac53UL, Seed: 0x000000000000196fL, Ascii: \"4NUz3yRrnE44DpvKA43wNKC00KkXFLxPwlhqz3Sn946nwjqKc3N1Z8Gl2qqV5EtBvZ6LCrty17v1Kn5aCI8j154J753wRiREtyGfAeYNHE2ulSBKKiLUpvtHJzQIhEjPwpz1rtP4rZi6H7yoz1mfG6dGqV6BhszaAYywJUwXrqhAoKWT5vOaxa9fvIeuKt3IGWdAd0b2XAEtljeVv1qXIPrYkRiFpWtstdCYU1\");\n            yield return (Hash: 0xe43a5a2abd0b3641UL, Seed: 0x0000000000000112L, Ascii: \"7oZ5NgmZh9J557vhCTsDJtgce835yhalytjn3NPcWpfg9EEKrzhXQhU6A91m2D5pPlLL0hr60wORRLrjpsZTFIEReKrqJ3RTpk7jTB8M1nBZy0LvFF6j8pILYS6IvpgtxSMn6yzySWv7u3oYYNUiCiq29wKNYDR29R46AwkAg4fLBkuriCYhbBkDbwQ4r1Xtrcx5fseAM9GhO7HrUsBhsGj10JAlew9vRXpphP\");\n            yield return (Hash: 0x49ddee61412673a4UL, Seed: 0x0000000000001fd9L, Ascii: \"isND9RcrdR1ITMnEIUV5wTjQ4lbFdThVBcxEvC4zp78k5JHPjPFwIfyQeNYU0oF9lZ9lZyDGU59C19YUA8PAsfiTIivWB9qvyntquc3GoPiNQzAxNaqUw7gRIINzQK3YNXmwzoBVNZW562u7DQk6h0KjaRZIQyEdJPUgvCsGTSNFAPTdgc4ChuO4YJihrdY9qrQkIAcJiU4OnaFFSDIsQ34abJ0kYy5LrHqk5HZ\");\n            yield return (Hash: 0xad4f3ec0133de564UL, Seed: 0x000000000000174eL, Ascii: \"j5hGuIZzpHZXY8V2jANqt5KqQVe5fjiOI5GLkM5PNpxeUvYnZDUdf8OPaYKWxsrs8Z01Zham5ChDz8sCutlDqCU0Vru567AMpwbSbnbiNGS0UuZ4AWNrXtwp7bShtQEjMuJlxYv3gy6V5B09OAhx0eyNKgxdMMX4FMEvsCWVg7Q56XTHOVHsRlbptSakG243LwopneNyNd9QOcszLOzp9lxg1AFJOgPoozvNOYR\");\n            yield return (Hash: 0xc80b1532c3cc610bUL, Seed: 0x0000000000000000L, Ascii: \"vyeHqoDe8ia5SXHl1CRqcr9cn52bCCM2jN0h0d8WXC62Y2hbhk25ig3UVynISL8H62zHnTtvl6MjhgIwBROKT1AUVlUq0UNLYHmgpgZ4AR2DnhWwscyJiUCJlG5gE8su4FsaFQteM5DW3qlyPQ9u7xvOaJk9YNaoR7IIvMbbGeqqvltPE408wCJQSZQ4ay5KQV0tOmylxj8jznPgSSy7xPf0M0wM9H91m8fUAnI\");\n            yield return (Hash: 0x29d81c972505cf59UL, Seed: 0x0000000000000390L, Ascii: \"7AKcE2gF94Hq9ygXiit8Y2wwWDQsygmCh3nPWwTDlexJyM6geusUORNjCGoqagQsDI1kSrY0pV2ftX86dTdRHjTNOcqXcHq4yUwlLvVYfJcVG7J8WttHQe8igkwO497yiGSHKkrpqLR94iteEs7ANQMRfM9SxRB0vxlTEPEocnFh0YROxPPBZ0KdT6eXtdxnbUBt76wG7W8A4kiul6Nidx6hvoAfEs4ff8hrOUPB\");\n            yield return (Hash: 0x55d3d475b3cac570UL, Seed: 0x000000000000072eL, Ascii: \"myXEIWnV1uW5B2AyOD6E6hs9YJnfHkQIwBnNM26Jd7AQVqWu1QEzJbJ2x2ZiUjaPS74RFwBpi15wsl9I1MkGUJj1xJJjIpmsMIQOGb9diyvvTRo8RmhYn280Uhu2gEWVtb4ZbD1Fz7QkdeRptgBISxS1XrI60tuDWxvBLssPNxKcneLVWw2Oop6M9Lcb13XLw5g1tiLNQR8gmmesML3L9YXLrjRAyHA2JQ4QF84e\");\n            yield return (Hash: 0x89015902300e253dUL, Seed: 0x0000000000000000L, Ascii: \"7AnVvxpxeUBaAeyTIk02DR7KLyfM03bxx1ENtgncWrLyLkiYbvOb9REGHXlc88iQ4v95JdLYVL6DLcnVqn6TsMM3HW4mmIfeDdHQNJTPXKiiRBt1hxx3N0T38sytGxwgjjNRHMeSt3sdEfkFm2ZGUg7UJCrsPtXC5zogxEH2M1NUeHNM3l2xFbEWG8Oy31f8FiMqKHHbnprqgk6B4ScNVu52D1A4ByWBJTnQOb4Z\");\n            yield return (Hash: 0xe181395edd31de4fUL, Seed: 0x00000000000019d9L, Ascii: \"xlbYnRAxf1QoDVc3WawSh7UOF98XvXnMUpW2UBedxdXMoOxwyN8ya5zAPXEsRi3YXmu22XqCIgaUe2WfpDBwNJf9ZOLfp67GY5Y9SzwZowZTjeiHz3OSop2nDNZ2TVybzLA9A904j5FVF3rPXZMAqRkrrh648gB88y0NH19Unzze5ogiXOjvGHHW51UAiCzUvx3TqZer53wCbtjVdxikS71q1s4QrYR7anJhmoPu\");\n            yield return (Hash: 0x289ee67915395edbUL, Seed: 0x00000000000014deL, Ascii: \"9ZZ0jTByvCFhgV4REwj0BX99tRoHRe4GwvI8qkZ6W9au2OPhP4anea7LuFOELlE01MC2ZALviOpZg27Y6jJnneLSVPGjgswjWkqxQZPIykGeuXZPYwetdEX4hqzVobvYw47NiGsqpCVaru552qOOQR2Uvs4Vls7DNyZVLo85bgmvjowJKRejb6Ju3IGl0kBAU2JRJ8ViVkuDxUpP5JIBrzSzmAUz5pqjSCD8dIUXo\");\n            yield return (Hash: 0x88a9edc968187b1eUL, Seed: 0x00000000000008e3L, Ascii: \"rUkprWbCHMids1dz2b17N3tHHvMd4B7QjuzzOnnuui52tXq8Zp2cWfRbuRp8eZexIDSIZOnpnJgvrt84ebnQKYbvG8omiLiGopIVnQDNRpd5Sa8vtqK9hlE4U31pEFrJOReK8qEY78XpDrbZMp2EvmKLqDtaTM3uJkULmPkYjXC2HgRfWtBrM5jbCpK8Cevt8rJKb3W4VcUxYpu5hhEGc4Zp5tr1vwm36axDHKefR\");\n            yield return (Hash: 0xe49d7ba800c7fa3dUL, Seed: 0x0000000000000000L, Ascii: \"vVshxkFpwcssocHgztFkbNSbxwCqBOKVuDQV2zmvnKHTCcgrwgiGcRqJu1F1RwVLcFzqSOs6RFsEeyPnMdxtOoexeu879rPBczE2sMbw7hSLj54YPsUUDRBbpkrEZ3CufODNiwMX5oxpqFDT959Nbb9odz3NrRkvEuiylVb4G6KkCH2Go4aPoPpgqd6cG9Waw89w7LtqcZf6kzIXn11WG4pBNAHWU1Oqrfex6kviZ\");\n            yield return (Hash: 0x105a35bd3d346e1bUL, Seed: 0x00000000000011d3L, Ascii: \"C4tWTBxJfptCCTMchfrhMAs9rjMpFuOZvkmIxHG23FLHrg1rkY8jwEnOqrK7EWxDUHWnjZcfr7tnNwUq9Jaf3A1qqYAihQYQGyZlLkzLaOuiU1j438TlTnLlp6t3vYPeHIcZwgRIc7eyIp73gQaoBgAeHbTEuONTKJ0iUTQQuiTvMN82T7SpIwjGMFKPcCKQqWtPilyM5N5VfreyLFW6DibHnx8snGKldAmVTDVzEp\");\n            yield return (Hash: 0x7921c1ee16c04eccUL, Seed: 0x0000000000002121L, Ascii: \"88zsKqhN7uandbNaTDhAKTnA5SajgVnACX2p3Vu2IekQIA2miHwCfmmjCjyy8lDq4qIC80exb0q6zbLaOMTzYGNqo5AvtEafsPmS8Ge9YDIq6hHwUS11pwjdf147SBFbdLuzBEZ7HW1doMgFsSPn4v4dANqVRZOxxrSbUUkPVhJpBbiI4QQLw0CtjAQFJHKWMiRWKKpnnmHxtXc1cbLZgJfbexucbUHUmZ6IgPbsnL\");\n            yield return (Hash: 0xc065c760ab99d9c6UL, Seed: 0x0000000000001a91L, Ascii: \"46oflCJXgfz8y1xwJy564zxDu29wdODudwT4lHMUCPExhMtoyLIupLwpw7J8dxRwrzsf0dLG12D3Rh7J3kpenSXQLLsAC4UKvuC3P9NAoIjRNFlXOmjYblIzIviA03qpzmIWvl4qJkzJsVbjFUCEWVKOtL5SlMXNc40tw4M76LbCn4oV2qpbN68wBLX4JBoV86x2VQcuiP3kC55gTtRdU9ekfdbCpaaZtgspSegSSl\");\n            yield return (Hash: 0xe2e82f61777372e1UL, Seed: 0x0000000000000000L, Ascii: \"8gvtplYsrLdFspMwUKfZeIJTtb5WXL4STd47kufbMfMWyb8B1PqhlWGnbhOYObNOhdpWaMggYiuBL6tjH2qabB52NbVwm0TJJ4zDUqVPVw1NFmsFftl1DJpnh9wFB1107wtPWdWSRlbf12eLabbGV8APtmRrVHT3DZADyW3h6z4S6YRoIeaU209Y9MA5YWpX5VpTyJ4BaEXPpATE4EX43gswKBUTfpMbis2tUQB2Gz\");\n            yield return (Hash: 0x14441122493ecf09UL, Seed: 0x0000000000000000L, Ascii: \"cNYvYuZsq06i7H7WLyfFupM0LMSPAl0YG9GIQlb2j1MpUEOHTJMNhSixgozom286SIRoWESHtQpqmpxQqL3M5gnNpbLetqfKr5XTrS0kZ85t4dnxHzRhnQ227DuqoTUlwPbHlsC68fSOUgR72IUSPH4tVAza8LKjYXDR32AyU6xosyqJjUOiGWTfCZvBoOgOxQtLKWcu0zbiGo9wuB5fuKQQhm9mHPQ1qUPr97UTvGC\");\n            yield return (Hash: 0x6d2604e1db824db4UL, Seed: 0x39f52b1b0c535141L, Ascii: \"Fg5rgyd7wAL8cmS5FUJ9DopvpyB0hbrMEq8KCrbVYWoZ5oGCc5zAZ01ICohJ7xxE39O9RIZU5IHns7A9WaoLatO1M8am7ymYr8yy6YslbcpdR1T7xMhN7uRHbF0TjTvtRGPzLv5vd4nRA6XrCXPAj4ctcXE7l7GpY3sfOK5m7ZpfYsL0NA917z1zR3Ljfx3qspHMnAP7LSCyw4Eb8EOBwdZ1fN9bRL8NOBkerIC7mha\");\n            yield return (Hash: 0xa696df4de3201cbcUL, Seed: 0x0000000000001163L, Ascii: \"0gY41Jalya9vYJjOXT5D0Cv1RCFCUzdzKYlttwov2v4ZJ5Q0qfKAvuQNYeTtsOKqMpbgStqsEiCaSTyPZ5rveLC8vxnHiiALJEFKwEyatTXJPs0onHxUFWCGN8cKIEE180cHtTlBQjDPmNGhH41lfK9smaVf4AKYWMRpNpI5KF5GNlkHIqDvh15GUdcb7oSdRr8Y4uvyCYDIIlNjA2hLmPmL2WPyIiVxzZLS2hF2F5g\");\n            yield return (Hash: 0x2cad261c64c0741fUL, Seed: 0x000000000000083cL, Ascii: \"lcweVocSaVB1nJiuE6h4ebmEKbN5OqNy6krCy1t9u0sYEVoP4pWOQis7qUf0BZYispUnrt09uVOPDmGFTIBNmF3lwWFhro0nRfuuhenbwibHy0KNy5LFMksHnC6r6wCf5JjfILEsZA6kIAjqxpUcs2i7tQyQM9wLWbVDwVNjxy03NlRrSKmjObfuYlxGlaCWARB41OmDS5kMJG4oyNmqMbAT1usQN8g5cSxN06XuUAd0\");\n            yield return (Hash: 0x875c02334ac76fb1UL, Seed: 0x0000000000000c86L, Ascii: \"Uhwt7Dz1vwYRowKUmx3n7eURaEJyDk9OFxdSp3NzqEG1g9BpBCwrEIVg8bXz9cZfPfkigdJN5W6i0F0vXclcpBxzcBdbj5hs5sEnOkLnYGsKQkKOXpD1ktgX5h2ByhukExqP0cXWyMpJYtOPJLOBkModEGOexc2gSlzDs13cEiG1jBD3069e2Y9dUxArwDjHQTTHadymOzp3TuynpFN9hcUT7IM2lYJor9SArYgvEJoZ\");\n            yield return (Hash: 0xc42a03a10a61f10dUL, Seed: 0x0000000000001986L, Ascii: \"T1CPelBwyTr1stvMqH5JLWhpnlnA8EZVoylEZ0IfCp2brdRRul0m5V79DjDVMO0iz33FHQ3zeIFf1GZzbSbW1W2dWgXgh6d9joqLWx0Al3DHhosynGNgzgvnOnIydpS3Jr6M3bmErEtKGCzldILfBwAmJEI3nBpFZGfYH8lWGq2uoBqJpNFqdY8EeC5YUI1CV9N2wQd9V8fo6FLUJ58jcUDTxFUly0TjoYoY9zjc5RrM\");\n            yield return (Hash: 0xfd1600415f287875UL, Seed: 0x0000000000001bc2L, Ascii: \"lbA1aER8HIbsbNTyXgYw2QdKrLJMOWv3Ns0SBIpBMCvWfsUUrFTmz3pTKQmWWbnrx2sjo3aZXAYoctJcXc5AjudoORKZefO7rTlv4PSJEoLLEtPsKDi7I3AiNjmAx5YCLaS7TWqPonVMe6ht3s1cEq91i8hsUTtbBqvHfoC6O0aZXlUYxG8QQyMhCXqlX3W1iV3HpLa8AwGHB72eVw3LQB6YECAlRz91rgUTmRgLSVyq\");\n            yield return (Hash: 0x37f0ae10e10af6fbUL, Seed: 0x5ba05907e31eb021L, Ascii: \"SuOT6LZK4c1gthmKUbRPawWdadQQ9GOR0vKQqlq6YYZTFIvdrZZyqEeeW7ZZ4WOL1sqydeehtV7AxM6uv90X0CnBwnasBFo7oYC9OT4ux9GSNmSbvhdvaBnEJQbhtsz9jfDYpKCFrnjMGTgHTRcIRf5KBEONkJCnBWFiOQOkfBh3MmNXPri6kmS1EmZRdMfPdiLXPN0fKSeEBrpLRTKfJOO1xd2I4PwJR10EeN7K3PxBs\");\n            yield return (Hash: 0x838b5a92a460b885UL, Seed: 0x00000000000008e9L, Ascii: \"0YOh4gh7ncDM7FmOF0mK53DkVfcO6LlAjbbxOAQEHHXzbwbDcc5pFiws4g0S9G2a0Y80hFjfEtryoByiebv75jVjlGQPtwZx67pefBo0AyJCZUbQb7TmBKAcOKGhgaC7pmF2dZPGzBrAiJpfMGd48B2UDTKZMNLXZZRc4rmvHCC2z6P9IZoOWymNoB3e3TK70oFRgpHiqG45aKxHatoGRq6jxYwjYMwQg7nZFRHrNGT9y\");\n            yield return (Hash: 0xc18d56e1617fc38fUL, Seed: 0x000000000000065cL, Ascii: \"wKalrN29JvUsm53gnqKjg8th3UVwiwrUNeSKwDuKpWJLUhJJi51Tm2vhU9fA5iKeyJIIGlvnPACouqplAyr91f7vD9wG8GCNtvveTkq75MfXgI68psQ8Cu8VNjsnNmctg81mrPnNUf2x9jsEWgAl7pnUMN0gEvhpSpkzHHAwLXuXKGAzFpTeiNkoToKJbXLesQq7vUieskQ9yB6uVq7nTzNyRjvwlzLkv7j8fPNQCBKEK\");\n            yield return (Hash: 0x36ec39dd70f07fc0UL, Seed: 0x0000000000001245L, Ascii: \"Rpp36ahhyCIgSWfeA7zHAAC1DzXYQZdSToI6F1WRlPDNotVy6AvrYYIu8Oki319xGhl3aSjQd5EmEUO2HgOh72Dv24wzulbiSo45qS73BxAYcZRZenk5oq0T1O4draIIGNChbyLpaVXk2oIEku7CixuAoKltwu14cfTikr3rWhNSGYgRLoS6OhRRsyqZyB8PQ6NqMc2yzidYXhlMoiyjwYY86oMSCJQPYYfJ7x2M3Tujow\");\n            yield return (Hash: 0x94e6b66333fef306UL, Seed: 0x0000000000001894L, Ascii: \"BxapM6Bj9U8ybZ7qGTDaBrVajPOUhCkFCrPyo1SjkcIJu9Nf9EbdVnwxLxqMuzfLAFI5FCmr2M6kf2lLn1QxNFWuGWI5zjCXklSWj6xUhAMSmfk92AKpTnTVgaAGvzkSQlcT7vGSpyFny8AeiNncSoc3PjuDbdqsWjLD6Sob8WCGO4faIuwohfhTec0yUALddr8oVgf2yDtIOxtsP2JyFOLLCOngEZbZqy8SL81DsXVfWa\");\n            yield return (Hash: 0xc51f2b26056c9654UL, Seed: 0x0000000000000223L, Ascii: \"ECtOyFI3zjPsJ3SjpmDSVV0oPkCmRB3CtYK1HIx7o6qDI5J7GXaZPr4YQ8UNILkLppiguZdiS0YmDTgDF8s2GUGLyYrpTfM2SOjCz4qBnnbnEbFuh7y6POH00gShC9p0FosAy7l3P8vYqCkeZQ1KjaRFGLnVw3Q0UkLeKWCbbI3fSSxU6apg2X4wSlTDPb6gzZrA5NGS3r3L68u8MhfgR1mnXVm1wOER3KOHf7iRYO0GQw\");\n            yield return (Hash: 0xfbff40a24b9785aaUL, Seed: 0x0000000000001a92L, Ascii: \"mma8l32S3LRF6fm7dYd9bhZsh9bO2FtCmBs2a8wOaNDVitVEuTiR3WTcwYMb6IvVIyb4RTT9IbW8R7rLTveJa2ZJrQfk2V5TZlsU7gULcs50QIkZst7dncj70d5HbjvNQGsW6NzrdcYmHDh2UL2C3ntic1iMv6Rnm83CfiuRkQQgUcdlMHbrXLHzn9FwBsc5j7HcCRBFfEgVAvSaLzvpVwFOUUONYNXrxQpig1ZbPbFh5Q\");\n            yield return (Hash: 0x7a71a3d15b85195dUL, Seed: 0x0000000000000000L, Ascii: \"1QzdPiIjLZsdR7JxhNnDCq79jAnpyHI4QtN03F6fMIfpkamA9dvnXsloBCAHt5SuhoLFYmEnpJa6rBA5PCemq6i4gpUdA5ROGVHlcoe7tSM94yrc4scqTZY8lXzSwF7FrfmfLVaW86qKCB82Ppj00TvStbgr3ZiWEUMdoJzNWfdUgAlUKWFwPV0g40G80aWDtbKNeB1dSO5tYOSVfNTFpIbWS44MOKKegPWQbXsqj2bqHJc\");\n            yield return (Hash: 0x9d6211eb2da1555cUL, Seed: 0x0000000000001215L, Ascii: \"UEVrGej4bdByOasGirKZMXe5lnOb1AjCjIrsS2gAw8OFOszvMM9zgFNYeiEEY99AUe46oWIMf98bsXX9UMiCLNF886dPtvzwpkz6k6DdW8UBYHLQdjKETvNZUAjw7ArGlv1uHJcPA4xZPoSCXdmDvUDqf2mZ5CUJ7cmXySCafuzUFq0eK996DoNM5L5DaTBM95QHXYaR34vsDFLE7KhfmBgoD03S9U8oizxHJkylOZavxVA\");\n            yield return (Hash: 0xe8f190ebd14b60f9UL, Seed: 0x5612008dc6ed9806L, Ascii: \"dsVmJjeoqmmID9IkVicCbJnEIZA1hxpj0wPlyCg7dCN4HFkeUmlF4n5GahSPdzKuC3VWvqUdYQcnymvqdHsvBvpgeAy6h4KUhlaQ3iM9EMKhWhH1DUzg4ZlDT9zYMBopdhgNjQsHxDbPDc5Bl3SD5wGeH3A38WyRU6x9QzeJc4fyjFD9uL8qJVbn3sSneFJQ6grobyzqLIZ4sLh6OjVcXbOWMWKzHGQ7K7HJarw787aB7hw\");\n            yield return (Hash: 0x1c741f4740b3ac4aUL, Seed: 0x00000000000016bdL, Ascii: \"FdKNc9fjo7dTluFwLxwuOTXSzmzMgj9ItywHo7T6HQ5Fg39kHSVqullshpruTdP0BrEEcx652xt5USD0wkSzC8FQFxX8OHJKgBle5w450uePgZOP4hfAvzh0sNXzMVyyW9wUL1JUsG59Y0KvahNyZxO2hXNRVslyhy1LP0BDgA7dd1KUqM4ACALQOLUHDiAHyKMfONwEgX1G0zlJU5D4vTzTvNyqYGbytrcO4znn4SntVStm\");\n            yield return (Hash: 0x445bdb3d0736b2ecUL, Seed: 0x0000000000001c75L, Ascii: \"x3TbzUpexub17sbjFpLsvGvyMLRjSF1gN0tiPUfFwyfEH1MQCKARAA4RPvI3WvbzUkfu97LNuon6kMlgdJE89UesIF8IoiADhKhovTybJsDaTK88RsV4VjYvI1a9HDP0eNTfFzCJhZ2mEKArqgXyjLIOIkQRCPI1a95p1HQxdbFlmwgubyli3WJFzdls07676LeCLKod7ZmsxqJhuRJ7khw6eWJzIpT0fLl25g0kyku8NUlj\");\n            yield return (Hash: 0x7647de563edba8a3UL, Seed: 0x0000000000000e2cL, Ascii: \"mvOuW5Er55j43BJSdhWYGEPxIBc8XLthVAFLhy60A4s3DZ98dlpnPWPA4JsDQCv7cgV8Z2Hyzaz1hErmHCWowCvxllLqdFSxQ2lQKMWaMTAAnUwcqxZdu5SzOzikRgf3X5zWUqvJPJXgsT8jsdJNJIYmaJqDVZCIpnBilqZiNoImlgM7LPMr9Wy5GLYrBdlNsHdHRbsk4k32UXUQUeiuxKlL2lZZhVZJnPA6O5xyV9iOpGfx\");\n            yield return (Hash: 0xf7ac361bc2ea11dbUL, Seed: 0x0000000000002521L, Ascii: \"KQ0ok3bAflZ1shhiIlX98i3I44BKFr4kqZmNITmCKCWnDn6sa8SEStoPYmFhAuFJJjdcgIVKa1gfUTq8GArzFpA43NaCTcXYRvH5jO5PNPXCTwGfd2J2tmtWGC0vIMR4sfCAIXrUHtEsLVEu5w0CeHRfBJZpGjSMgAD3WmIJgeTGrmnrWIJpiAgG46vKVz2tRaEmUpzbBFPiGR6JNlfNOVOo2u32NWRpYrlpQP1acQVbOE1d\");\n            yield return (Hash: 0x2f37d7c5257055c5UL, Seed: 0x000000000000021fL, Ascii: \"a2WBB5GKMkHnAySB7uXFtoT8z1GgX0MPgzX4Zu4QWjZ5sfUPXZq3UXFUbG74Fw8Jk55geWbT9PB35YSVEbtIizEgLcpOll09vmDXlLcR6MxmGl6apvXEAodsve1dgw4eq9Lsx8LLdd5kJY1HlJL7Sd4fckloMiVNR1n8UdOzUdyZa0T0iKRc9wYvpG6py0QWwevVqXlZjwEyYmSQsHoXEtwzjUaRL5Fx15E21ANuyugJVKk7S\" +\n                    \"gmi8CVrQYFQZbeF6e2POv5ZFzf1OgjLnYHp0xpfWDD8uOKH4zE882uBMshXjVSjFRY9Yv5rKdymxkR4VMTZTNPNgiuPJSKQlt0XU2NdzVdH7iTNZ3Hxt1vIyFEtqCqHjFGxXPNaPGJbioubL3hGCs5lqEOVPHHNQNxjhmzmyS3O2DsZrvXkFbD1HpLisgz6T4S3mEJ3tDhzWpAkC3UnitHpgaoJnyBa0EchtNbtekxnSBQ6yShQN3CktaPjfTfGWMmUzkYOZFoG2dYZ\");\n            yield return (Hash: 0xda2ff091f3590e72UL, Seed: 0x0000000000001865L, Ascii: \"USxLu2Huv2su0RCa7ZAFf0cMpMLk7oYmPAUhnDBXAQyRMWT8Eoryj3FWiuo6LaGF60OFmx5lUXL6jvD741QrSZ54Ik312oxZurB9bBdCwQVzfnM65KgPdW3Adl5EQCf2zY8v9KZmkSjp6hIBc0iBhJtB1Pj2keW35tvQQhTfMWhmIHM2ZpB4AwK8aPrax3EmoGvs2sjcaijbVZOBQu1SNff8QmAWK4k6FldD3a7oz0OYk1rxaT\" +\n                \"ccT2qoouqwBbgNvYXcsRlkH8s0F9FLRTAXYmYKro224xjli6ZdsoegrhrJjoPsNERGh5xm9mBGdadQRo4ZHLPoEpGWRq2u8gX9bM9jcellAeT7jJDIjXfsc9CfdPzF454x7H8D2Duh6TdRVnE56strIx1urtfbfqK4uH23JUgzsD3S9zasTsyatKv2DdbNSBs1zqBTGIDxwRyOF6Y7Z1UIjP2U7oLLzI7IwdaOzZmdnTJWTGqGO1y6xjjv7o0dzjRCtkfN0HFWF6C4AWQkj15GfEopfbw3nohIo9d9LdAZ9beW3Wt0mMTkg3Uq\" +\n                \"gtpcQad3uRQj3Qwo2hXfxSF4OI4o7CF353coopSScASXKxSgSOTKSp0txdPBHpEGjlBjfyaLWbb4KF3lfAyzcFOdHhIXw4X5OXKfP9CzvWsBX30dJYPUM0iqMo4LPKyK6SSVakfTnMhfnWCkyt0q9FI2yn0hVkTs9qQuqSkH9INxYNhnn1OTDScudPq1d01hYCry4RtaxAbGYfvyGCcaua6MyGo5NDkrr8o6mXROvpDtX5LSqRLE8ArgGDmYkWeQx6whRPK7l5JRhN9NLOpglAUmOF8mstzQEcVhV8hK9xfXs0AdQZMMUrEQXg\" +\n                \"k2Qg1x02FNqKYbScPr5HWxxUc40fUHPhdllmC0f0CnrRE0xM8x9D1bgoVLkNBYQ34hATXuRd1wwKMXoOZ5Uw6lWAnUtpVB6e8Ns9XPYrJblJ61UD5RwHGczt4uv4Gla4SQ8zLLLq5rhRB2toDA3MiZc6wK\");\n            yield return (Hash: 0x80eb9cc47d75ef79UL, Seed: 0x0000000000000000L, Ascii: \"TI6XYevJji9MGqpXH8Wa3hChji5jt91W8MyhwuKrpPUEBwp9sqWdebdVvoOEfJ2vGg1lNZIvuLwmVDKd8Vou3qGCT5VcqI8goIxXDF0jZF0XDLAQXCFikOvcx0CvZZYJjBVqiY49rbSIAqw4CdR2ex3guwaubHERWWU1WL4AwBYvqM40BZVP52jArDymVhTEg7kjsEgOPQbYxHCOiE0OVgDxvOfvLfnOvbVHAbJtACeFR7EuTQ\" +\n                \"hnYI7WrEPTjmbSLxdV62FAi1DYVdHLSmJm0gmyGTYI7oKrbv90hbIJgv4D5hUGi2S43rmLixssqtosdSUBhsH25qJvJx1FZ6rIhtYrajtDpaCNPS1pH5aAe4NtujDG9mqqmm9IFSqw19cAE6dGCTd8FgLlWCKt8Vdoqn5Wy39E15wkCzV4ZtpTd1tMfdiQtIf7LIZKOmPQUjkj62i1pLbam8EHradR8iF9ZskMU2u3W7e7e4IWdGFzubnoH266VZSTZPn9RcLhwN0yrE3AvNk9WjKW6vwRV6C0nl1n96ir7VKTD08l4Nh1RXop\" +\n                \"C2ASGF2P72byEwdue5n8KjCvkoYSJdbif9QNiLeZoGMUB64ufVknWPjMGqxBRzUXuhhoXlsh2clxhSVycHYFc2WvldpGt11R4wgobPmtcrgQG6zjvGNKzVDQDnHxGN68c7Ij7CrghizJu14vZwfElUxoaPsdU1u0Uz8Re8XSR6O4NE7Rd3uo3EOSr3CVTjXTlKYMyheNzTTA3UsywfQJhK6W6aB2QZLrpwb27FBciHiXGsTGzJya3YeG1mCTRpCTNK0RY1EqBzzU6HI2rvHQhR6GLaVMVb4GXKqfi4NaSaj7h4kuFNc2M2Mu2V\" +\n                \"rznLBmBZ53Le6YeKpET1U40DROIhFWetZjD7kswu5xduEB6CCQDhHz2ZQWzivVHu5970LFcMI5oxwdUuOoIpgBAit3QNlqaHcvRKK8dR2TNl84AkLlxFnGx6HQHA4hPsFvfPJbAoHycCL7YcJIQGgZlGKBByZdEP6ZSs0vp5MNmIjRxJU7fxuTfgGUj1uMX7AnHZOktctLuT0dqJZ4uLwX55RxnibG7N9KsBMW2ic4h9bCEUVh9NsWYK6SuWzm6q7xBL4tcLtTkdVotWlmEGfUHd5RBuUZW7HaizfB5obQMgkRt6M7U9zMhruY\" +\n                \"Y1RYsQOCHpCrefvcYrMCu2oass3T3l08fMudGelG6E0wAnDhHlBzJ9ACn0zjS6bxxV8IGPW5DtUCxfq1sTMs9T05DLAWVIP2ldLoRSaShmjZ3WP0iA97qgBVcSReu53OLYmmcnCUz5WBvmUpbLdf5mcCoshyJUprc1NXMhVJtrrt7FUMrEsXjMyusQapvduAo1eIYF7YGHVgN63lnZ7xPNaDERPHaIgtF3inQSKDLg3SF1sBR5y7FcYUS5cq1HefxvgWyx55uNCyRHIq6a5QHLLZqnuMcM0BvRrrsQchEn6uTfBvsnhycJNhKA\" +\n                \"UNbanKOKF95gNUEFIro7PHKB1sehxxAoa64oF3OctnFnSn5LintZDACNenvgwq3x2bCyE32zA7QHESF5f2TOmMzT0xKJOXShS2PcOThuFnsX5YIeS6N8BxX2C3wmld5Ka17I89K5msFZZnmhdk5y1iOyoeY3hP8bQgo5fNSaRgp6FIGpiU3z5sKTvEBJ8c6VmaS79PyDHYMHtNqv8FWRWmrY2cHlA3AFu9kyLwZpqIAWmiseRwZFRzFqF5rUtzPfwu0rxrxyJCVIbno4mrgjD5WP5CFXgAMrb9IxvvAteyEGmgs8Lvf5rLAqvy\" +\n                \"xASEA6FboVWVTPbwSCCx4SaknSMQlpIueBfbQFPQAnvZWiqFTi5A8CER6hdngTvNDXs2HjlCpJYphlkT7DRwwA6LUP2BwtKHBVAo3gR7wwexkoy0oRbA5cHwZtt1peKLp7gj2L2R3lcgtecll4lpcDo1GvBrwJAgkhDXwNZCRbVaCypqszwzET6XMv9ehWsLM5XvIaRFG6Oxmx12YzsggT22tPZP3dz6hzflpGsS7GgD\");\n            yield return (Hash: 0x58793064f61ffc57UL, Seed: 0x104dff97b01e2965L, Ascii: \"OeWmLYqrzy5uyrJpXEdAKKylrcZqYQ3vcpqZ5qMNlhCR2cSVfKIImaObd0qLjRPXXtHA3Ql0vBXbWRKXcCTxLpVAiPRx39Rgc8F6tMTBhLKh3rIq3ZU8r21tsdsnsnmHfxFgdcRTjdacf3Ml8eQIH8eelifyq3po08CvFbR1WF4DCDuRNCBd8THV6eTVMumdzRG2L9Vr2qVDsRkSzaDKAghjfLrnhxbDxtcXJKA8Lw9aIFJSNo\" +\n                \"zCtGDot21N92AXwf3kZvikQGhV5QZMDJ39WrI1SdjfCOlQZrPRjX85HM3tJIoaBwRw57w8nYCIxehAMCQ1fAWMgdb2AfLhE9soOJaiLpbf0XurnnQXqb3Uy5DVhBUFQ4MLxdwHEzhQRwcnjeOo5iDW81WPtqQCYp7OueHrRWifcINoafhfqS0A7QenNkMsKwCjsJmYRfcyqzu6P1FzBdr7QTIyINomxHE5uD6pgtGF0HoM3TnaVwsTOaEnniG7CiOsV1knedfzG65NDXYk4zauhOdr5kBORn1dkPwYXr1fZJ0FciuyauTpN7pS\" +\n                \"WmpvihiUaiuNZsprWmENYhri5NT7GlrIdlMLyM2jztAiZI0ZCGV4It1WSv691Nlfc9TPBWFxaPK9Qibx16VY7JDheIxrDxw31F3NetfAytzINetjw28OYm8iiulIAqTrhZOoebesbnT2c2BkkWgCVVJpxmtR9RGDaiMag9fzQ6QTZK3Rh8vuKdJc8Gi7Nh1sK3DAqTcTzkW5LNNrQXSyLEbkxxEEvl3lm4RSoZ3GMXfjbwkKI22PMce4YXeLP9KtKopHvbgQpJ5JLw5X5QKDyhB64f8tbbnNMDdTYPka7ywOoVEsNzYhnT9mYf\" +\n                \"wNR8sYrzqCFxWuwE8USYoXdzkvjzomC9lxLKO9N1s0cg2Dk0yUilnBHxmk49STdIaohJO3eA3Pja3Zrw0Ua2ZriE6rvIgBv2cZEb6JSalwDyYhCOSwYPN5SqQArXtG8MoQXfO0nhGzh3AMDuS4Go3BaEXHI6fcziqxna6gz3TOFO4a8XOFokCrDcPBArj6zlfAqfuAwD4wbjnmTUlTA8boOHPyZ0LFaKek5DOftarl7HO7XIzVZ23X0KgKNhxOHh3S439t6HpkUqxWb8nAf6jLSVDHKbPXVGHorGnMbSyZb49BQKGidNnHZQox\" +\n                \"T2DOmQuhOJHs31cbriBIrQKAQZaAvsVLa2vn8YbjguekDWBFqk3Q4V26Xmrm4McUUuIwHG6pCUXDyGeYANgcy6r2Ngw6DrueDQo3tTJn2xO1258T82KQbmK73LKo1ZDdCt7S6plQ1tEsJYL9bDcr0e0DhZH51NGnEZcLhnG0z83NQmfoaj7eeijY0MehsOCfWKIZu9lemMwmblrVZrTlsWA8kvHRFgLWrKGjzjVaN30dEZFpp3nN5B3WQ54oqjqCRLMDJUUBW6oTa15sBBq8zljziyJRFlNlQJyVKViGB2ZJEZC4l3Td0LLsim\" +\n                \"O2XyQKqq4rFZe7B6QVeG8xly84d3QfYatQqVqN1IkD9u2SUzfhs15Qmg9vGmtWLbbaTbjmYwTm58geEcBIQwTyUkl6HUdBGs1oaKL7kFevkXEGWjt1yOXLyUOwA0mi2XKOp3sXDZXZFeQYMC23UuA4RDvL4cyBNel9pTNOlw1UzR1kD5Mn36Mcmsm42i5lZrk1CoLpXanfS1aNuiK40ZcXyDvnszDQ3fOGCbRND8seacADmdpKFczhKe0f6dIJcMVNrWYUAuOjz29uyZfeALqc2OamzLV4LdpSbaebG4qDEcE5N4SQLRSvvdJv\" +\n                \"BkbmdllZ1IEWE64Ol8Ti22jlWTsrT6BWyXhm4D08K3v5UDVCwVbRwLLeGdBvoG31AU3KOfJWmDWthtlLdIigz1hatt0TWSB4vmfp7H6gVzFjK4e9HhofapuVpbE7duSsMcHVGZsQeS2DucQdjogVEHOFJ4XqTsIK8v4qvRyeGnQf5LHXlp49tKfffvGSRlmQaniYIjKXEVKYOs3QNwCDmRMOUb1kRngiKwnWkmz5EveBidPy67bwr05B7MQxSVsh3eXfjIrWw2AiiYC33Lthhrs07S9ALFGlfDhv3L2tejbBQ7NjBe0AT8NV4U\" +\n                \"1Q80quhJwCbybUWcLbf7GklusePDCzLURqrbn253MXP9vfgAedNniqRj4hks9XFoTd5pijUw6H1sxtYQsFXe4DcJyvRiS0tWOGxVJQrnZq6TEZPHo0Wj8xjIKtauJQihtOlU8ZRTdOdqiIcJf7f5erUBc3TDkKixLoxhh1fFYnLp9fPrc7I1ylCthBI3e3WFJGRZurCNwzBzCrhPQ0wLl7Z3fVz3cCfST4oaVsro55KRZ2RHgBx8JXMmaqLTFFp40d4JlPAE88HCzjX5TViHO1RNIVE2ajcGCVYB81pc4fgb9Dw3i8vIUpMYG0\" +\n                \"6P2UDegFKVmsOR8gcfPwQOObdHDPSjBGK8uPgUd1NhbsgSGSV9KWlXciINbE5lqY0tticBerp7oS5lSag2UrAXizgVu1GaKSm9h98k5GZubwDDQbmSQ9jNyqg9u7CF6dpUoiF5rGVqps25Tg7B6vYYkydoaynDtvFf27XGw8N9XQUr5L7jxmYi50xCdQZhjxPpE76Wm5haYbTmrcqw2rm1tSFBk8x87f3cRrFjngfTA2aMD7bOENJyfPmHeFG9CpweDZSbzCb6Xasr0sGUmtDcb2gPoOV38BBOGkudVaK0jDgUXSy9a8sLJUHS\" +\n                \"M3hRxlcAX8VKhcd827830yRK7uUj39Xwwhl7WwPcX9vyt1QH7IpcqqvSSsXuGQWheBmIRjjpViU7q5rGSJtn339cYmtwiHFOHN5m60Qx3rcu6nyAl8uTjBHcGxum4oNz7f168MPvtxvmY57WVzNkekJYMyDQIeZEvNJtyogE6V0Uq2wbJwjwwQ0lOveOj2Jm0qDltUU9yOsYzBT6Vl417IZ3ib9JfeaVep4A94PoiP5jhuKqTDSH7j87UcMBToMe3X1CB7u1XrSjdYe1YckTdVvWXAAr3JqzdxkCdLWaSTV2Dgzyna6BmPCnBv\" +\n                \"pYuWeRdmqLDlMDY3CMnJzHxu7Dte0qm5K0o0gVEkfjcgQ2MUpf1KQQCpsR6vsbFezLcJcMOH0dmFmujKY1KLbkcCY7MofrD1jafg3Tdt9JiQCi7aiutMXBpAOow9WgUXqnPIm0mE4ypiyMLiMpzjPoM9KAQoOeEIfkRRuvberQhtmFPJXD0hvQ0amYuEICOJ7P7iAt7jW14yGO7zemL2MGJlgMf0Zxzj18d4mWgaBLGXyFIBbaCpItwvL9pNQmIJugOWYvqYZ7mTROxSAfKaFvWPLOiQrp5WqzJ8g7Qyv71aNpDhFNxUnwfBWX\" +\n                \"lVNHKPSfLbTvmPhUpOrypMjE8x4Sk9V9sJpJ08DEg3nC5bLvmG0yMeoIWXQTOcQRyfCehc36HHvdoE7QYYlJ0YQrq9aDLTweLvpIpPBUOaEpWcaDmZV9xnOr4H9x12L7qevGx9KswaxATacXKvkR77FbeapXpEvvNqWEtP4zGbJ9UjbkgqM9s01SUCiiocFOkrZrvWaZrUxnhW9yenrI5P4px77cWAkqtFG1EbkcTNewS49UFnBEW3BTbgO5n9uWdfVS4L7eo8yyzdOSjWxXqXaxjHwrNEKz8TMTiwSe9a8j3Qtea0DiiYkkmh\" +\n                \"em38E73c9pBqP1Yd95pRrHKQ4tILPgT1WdwAU2EmgdBNbqC8ypDWvvYB12CZwEuckDcx1D7uT3vCkNx2LBDKNFTe2TX0XmX2ei78dAlBmNbhPEHZD4TLkwg7OlzYHvd7RxcR9bMuz7kuonBLuvzR2UqxBWwXvtlX3t6XNFqAHRkvZLry7i6xFowXTEJzYnq97RaHvtc8Cs4qznIjONLsKMvtYDek3awCQoQVBeDdHUIxGtT7gmUXHKF3B87g3ZKHHhXTY4RGLwcGsIFEOUhSPCGhyiiN3SnBaeHCkcKSVs6RWh6zzC7pclGpGe\" +\n                \"mjZ7mcYT4xZihIpdgpoGEBWcggLrWvVVm2HNszMSdxNIHremngBAl9JD7oV1d2BqZfw8sHUg2QHp3zLMdBQLtQ\");\n            yield return (Hash: 0xc05b765025561928UL, Seed: 0x0000000000000000L, Ascii: \"iyWHI6mdPnxxYq6y3OF9nYbygTqAT8PWWoFZtq7PntXBgqqwIhA6vYF4SLIQwN9to5YH2CYIXqJ6ZmTxbw1GJwnUfdOYDtUQgX3ZioRMKDlHdIwjlYPD4wEvPGu3aRl5R0sW9ppujWlpFO7I2CrNVXb4mBxCAgjbRCoONwDStGDirdQeU1Ug5KfwfWYDSUYr2rUfeBV3O4HcH36SgY7LlIqIvKBEBgBnUa9gUMeD5dAyNAlqvR\" +\n                \"XYrN4IYq0Bmi4X7F5KZIrEcA7lwnQJe1MkYMDWVbChE5XyKqgTdKZey5vURvlboJMpZ1510Ltctp83CiUezqTVwxcZpHtvA05qHaueeMCCvjOsu8qLpvN2WRG7MrRPCZ5v8JlMsqLZ8MYbQxriqUV2K8BSFpJlYZfd86wMDaxDxRzUgDTn1KeLZFbbJtcVDsr87pPxgwl92xAosI1hbfc7iaeVGSqCJjmxnAGeevjcB14u7pjNhLUTT20N973vVGxevjPY9Nr8hUrXhHNpHIavdgdtIQSbOqa9If5rRY1maIHkO7idmUO3fqiu\" +\n                \"6R5RxWTtTWs0pPwydmqEuqQzHcjvV7y8wrxjbgb5cHbqYTy549sT639zopUGjSMMwqjJzeVqME9n7XIrdQ23zlbq1LNCQ810XHJDx4FFuhpS70m1PclYztHdvOlkuHvI2JwUZgD4TnHwXj1IsGbFXW5ut4MujNZ1tha8nc5T6LmaYsu179wFCX5I1lqZqB4z2Y7nqFS0rkX4SJFBF5PQ0GLnmN3KJYztXC6KlhjFTkKW5HRJiyF9L7dbZQaSfxqVjAm6RzL142sSqlD1eKLfJcpfxTqxoLRnT2sp0adhLTO8jNHS0JPvlTxrWI\" +\n                \"G0sl7tSc5n0TfhLQJIK8NDZp7nklRVayNRvfSRc0DB0JBPrOMTxmVUkzbKgB9xIgudR17EkhJZlkEGCIxVTPs526N8ULNqv8bqm2MM7CH3eyXUujaxXBHKVbMaUDIkbNVLzDt0k3NixMuRGLDAKujqFzNyre5IyNTbMqrG2PpuozrNAJUc2b6Qzvd3vqdNoG7vL89OjF6nRJY5E5kSGzNJbJOMzshVkT2KJYtRFe9kvLsLTlaTGb0sAYqeUMYpVF1cAS89xvBnO4bAMsiYXapLxOkw6EEyhd6nJWnnVX9bKzZYcHcbJwH4lPRz\" +\n                \"FWa7VMb24lOGws9GCse0IFJ2zU2SszGEFMSjriAfcpSncVrscM5WFedYRtZNXwfGSl6xjcnq3e09ukHC2gtJ5r6l5tqNVAiZE7aolL1DaeXUsxAar9DaRErJ3IttkB2qa4pWNEnA9TKn5xMkx0UUBu7InIedxRlS2t3H6dDUxcOcdIOQ8ocWCNA1LyD84rt3PefPYcVQQuCgMSWcCxdkDr0oEAzhHo930FdF9xwEG4wKHq3h6hnBGlALvCO3Uy70KtpisTRgioIx2emw7EopNbMHKxzgzkyNewh2w9Z30Vm06joWe1qvzCm66S\" +\n                \"Frmx6nPTHb2X3NU0M7ZW9wJ60agW3fj5NcuErPV8vtZzcPMWEtE8Kj0FX2OUq741UziApFgi8SIl3uw9NzvRxMNv8LZJjmqrWRcs2scrnnxqw9wohmPLYqOAbDRYr5Vqy7LynWwJR2usdgNOGvlc4rTXDYM4TggscpaBGGYgfnBC3JT5EcNa3M13JvQ8HVXt7CSbdZBdyQbrQwblsWEXan7JMNrkl0LZgE04ItpXtBP9Motv5ZpIpKdE0UbL3jQmhksPsARPQsqQ84F63dTc5x6pSnQDlDlWH6TSshc6N8Czc4i2QpPY8HkGt5\" +\n                \"Xq0kxN0mQBy26cSmKceIKKAKh2tXYWRQS9usNZHYYn2u8wojmvcPFjE58xE43Gz9NgxiDjW5XVVvWxCsdDoGcPFh2KZtbCyosRJ7aJJr5dD2XqmhbAX6UG8QEsgcZQyTsfbzBC3zDfl5blXbyx1hhvra7MvNuK4uy4cnrj9qdL9YgQTyYZkZxQtuf6qPtwQKMbXvyBKD88Fpbzb0vXNItW1O23Y38DsPgB1L7UoNAc80EKuAJUaaj6tMVQeGgXQUQDYnTOkJXZPlrDtnrXLFUjYZdhw23ZFlTZNPkiCzQpg0ZarlBYrVELyoXs\" +\n                \"FLbBO3HV6MHAISFNDpTsjN0FrgaGabTZzRVSr4KRuvT8Q8lZ1j0xft4narUuu8i8SiJK0f9qVxcQZDuUQSB5tvZPj1J4F0L1bJ44S775tGpjx5mUgI3xKyfBBUipgwPSW3X2rcQ20uljePYE4XuzjNLRKmbA7RhD4E8v5wJqiqGDqtEXOEFJFLHD8JAbjAbysd2SSuO4aEufjfyZjLfJ47kL4XvhrCD39X8buY5poRKqWdbHP8OmPEGsjypBijSd1fhaPGegkUAt8friWlEfEHtATfIa8kkF33WrTRpcVH2P64uQtSItVxtL4m\" +\n                \"6mWeFQIhPe5h2sftSJPKRboiqOx2tkjmXFQxhccBHRkmt90Qpyj4vRR1Eh1UoMbyhhjwaC0j14307KTiz6us73rNotyDi6OjNhEPdID3ysSOJEIAAdrn8rBVGLBLKp16Cxqni49aHb9F5LlWfNjSggUt8RsqTPwSBM78xju6WVsQK8brbA1C7GtvnqYgt1zXRGAuYmHeEz6BhmYNNQVYql2vK4Z2LuYh66hjC4SWbOnk9LnohyyNyohvwF2Er61ZlqpGcsLuQGp5Xxf4JOJbQFnelM0Bk5iGeF4qbXpIN18yxWVoZXxtvehXmi\" +\n                \"QE4fgEK5L5cIjl5r5wLGc6QtI1oddpLx5Rkpm9pxYstzO50psCEEAUU7KUSKpoapi2KUXoENi1g6PvnDpv6ItiH2MlIVUm514bd6wGO9A5yXZNTjeiDzgbCRI1nuXGapZ9yekZpqONJkKJxfuun2IKPzzD850m7YI87M5PQtU8qQNxYapk5aFlfWh49vHiTQDbEjnn4HveprIfcCMainMT4T4znAtToODoH12Hmu5UydcsoKLNNJAUiUAOIUmlEjYmXEgGEMLEF6kxkoCpncxf5aYo22BImbjAy5TGIo9wEfMuDes8L5EB7Giw\" +\n                \"SjkleDErSdaakXXBOhCMT8Pb5EhQSlpSgERDUlCbV20E1GRa8xkGNWU3HiyMuXGrhBnlZGBd6t80DpOlptqhHnAYEsMPnDOSY0JrtsaS8SoaFDOjnFL3aLgKgvXnxDK7qALssTObpAz0LLrJ7UhSa7bqMJVFscMTWE5JpSUbQ343fhiKX6fAJWOBasJUOK2xKROH0MToYdYbY7W6NTeELi7S0d7tqPMAVCs4WJcKzUvK7PluHXifcxBsVLo46W0FIatYe5S1fQwUvi2Y4VwXfla84DxrwtFmknNLAq86Fxv5NqVsV1yCMduHbg\" +\n                \"tI6XoeQ8ioUIx5jLiworGEh9jlnUJgN8cBYZyVgKjBgbE72AJFgSxKlp6tgmSSTkXxjBuY2t3fFJ6Aa8DuUHMwg6ZXPcgnMSNpszvXQyfig06rbvNKm0PhwAIYRrQ9kbNVx201Z5U9jYIuI8dgAG2wOibcKTkPmcWnUB2ijcm0xE6gXHihNPHmJexO9UeTV4m3MgQsSlE54bSL4tDE06nQJ2GsZDJPFAOlHKz2NyrMLg04MNzUfj89Un09afgqOLXoAa49deoqXGgTTT6iM8Fn2TDVMCFMO1t0zhy3mMKyilDSzPdGkSfQ29Jo\" +\n                \"tOGboQ3UOUXlYpQTXyrZ36lvhSKqji3jE5TujbViQvOXsnARKvgxDLSXeSdapsx2DXm6KobxrpGKdbMzzIYtfFpxYFy6BUQrkCXDYnVp50WhVtIzJEuDiM0ZYEwRYFhPsormPVNEE90rw6nhL1cznDcKjxDdC3sxh6i4lhG7jdPMpG9RqLYdRsnseCCkJKHUdq55YMEneZpOYjfxdteK8ML8Z24RmMODn3H23ga7QtmboOPAJBG5ahMNQ6DWyGaHqMRz3IUvKfi5nU0Nfpm4j0TdZRh6a9Hu8BtySKHH5Y6NgFToSa6aeGulTI\" +\n                \"pcik0KixeJgzeVRGpQ0KLHKS5WPfbNTXIUG0iGurgWWo3OSBgPowY50M9yrndhRjjZLLVOTJRZTn8rgdKz4v4cwpkOVXr35VWwsGmFKDqa4xv7d2eIHpGPz0d7Ix3NkDe4lVM3ye8qpvzTjdiFMNgDXrEDGYXf8pGigqSxfU0V5PV68gmTl3xyWE4ulMYgmrBPmTCbp7svSLOL9VFp60AAJFzLmrjfaYJikwhh6UkxDH91cLDs9VFFWBcxs9qQSKIoM5bn99HdG4sJovNAfJQIDxaG4DjSeC9RCrtvA7VYUdhiPV4E06sWCMe1\" +\n                \"hl0pasyhCtgxUqRNA482aq1E2O6GTKrSxSh59HLcOIkKhFvEWmji8YoAQjqMm5rojIjwD2pnLIuSbwc9nOMdIHgRDQlmQhSQykduChqALN5D7lanlUnsR06IRLZrI5IqZTxERYFsnognsBauwdYjraY32mAoBe4cVZn259BDBfcQgxqAH2xoq11rd2hkbNuGozNIAuXu3DfCCEBJrQ7vdYiKKtd9yzk3mx3l3C8yPLLidJksnACUiaFWVke2rVHwULIZ2gH9IsqJIEbrjadgeC4AzC3EmsIGEDB56FOQfwiYxiZl4V7COQ2mvA\" +\n                \"2s7BW4kXeOYz4N1Tk892b9WgKEZf4ZSUIrc1luqwiMkqjHW3KjvCyPSgsPyk2E8hivCNsX11x3Igu1xJsEBFMIqngYW9Hf44RVzZ9QC737yfKhZ8NIqFjdjXkdUC9nkORpsVGEwEtHDl4kex3mQfRU8XNQj7RpHfNLGuPKryQVX3RIob18ZBxIZzJc9myKAj5q7OMyNGNzwJI51E92weX72GKzfM3mqOe0Nzx6KznLuf4s2ltjSYEWNaezKQaggz7mxchYFXUHkJvoMB482oUTXfRuiIWfCYQw9D1FCQhwI3BHVvIi4y4R55jV\" +\n                \"ThswFcY8JAJ98wRELFaqlICRC15pwfgdlDCdBDFSLpFLuNEXLIQPvncycPYzttF2wMks4YZU1oF5T210MmO7PiOarXeWoTpzFQWOfwEl390den99HoSrVy0egVTXP1jomOeBjpDeYqVyqp2LnXdc0TTvhkMJQmpTSzMSj6o1hGWoQDi4BAU5vfstgQcdgt4JvWU9wu0XtHfOtOmXRLkGIOoaR6JteOJ9EnTBt8dF6iMXFDb8V9v1Dtej07gSZA35GMesSOX6X2acTiUeS2LhGeWTGByPJwJMqe7u43noxXLZ4RFCQxv3OcOjvB\" +\n                \"rTQrt3HUITud2RefPVVVHpdXF2DN3kwBjFnonceJP6pk6MbkVv42oV0tgI9JHGWDOF5CU4mBYYZbKNv4QFgmvZYif7fAiFpuPKa8hW6jsiqVcWGRoUnJXrMYZp9zykNHGS76BcIzCgfSlF1jnZqeZcL2unmjoeyonwyic24B9n7YkSiWSEUmIgLXrqzGp82VXrcq9SRX9BAcn53U9jDQD8L9rksklY158asKiVJwGhj3EQuWpNqTipySKrr8R3xWLebpNCAnAlXckYTJqLZcrl2evBj3YmpfJWgOWkKMfGsluotOAnyLhr6psI\" +\n                \"e1PVNcYGUrilH1M6H9mF8LcWEuXvigL90roK4Kki3IDarCDSnc1mRzPf0I3v1ROuNNlgqbZNoMbL0TyMZDUq3wFzOf83emI8EHwhXagAd6LsfizcrSnVRraaOEYACDzqFBOjgtz1as0FKlaBSA67teTCKuoAp9XN4WBI0OsVPuY8NaiEkdvq3oPGahfqEHT988koGBqKJiv6GUeoTCQ3FsxOEXkVBlo46fimCNxIoqHKQKXoOoxfkJThKhGDrEK3R8iD4AyP5i3Whjakt0pmiLNTOoIrV0r7aqbvK7KA8NIZl8dXVjGQOtu1Vy\" +\n                \"oLFfZ0nnWKMthJrroPqm83XcmulLWYxcG8lVGOLoilby0sxemMRDWveRqmrWx305h4n9y7wU5fYClZNlcsAC3xPPgDj5Mvf8bDEG4EIpZkvWGyUStN9vdkshPmm4vVMS9Fj25BTvPEix6ZL7MlRXYnQCOB1knysMTJsNPp7GN1YysFIFWRNvE4csYrJGkoeBKwMZVXvhLKgl2hqPyUfRJGGxBdTyuHItBHnQ2eXUtWuCqOXNktMOPReClFrP52DQlgQG3BDVHE0BZKc7qD7XTSAdpQmqkzWfT21xfHpwcWecFHDxacJPX97ULp\" +\n                \"eVAmiP0I3Z1dcI7KqjSbr1shDzyjPspnHgulEvDDzT1a81B3JHADw4jv6rlwn2lFfy3AN2T8nZu5R4hnJcd0PjxV8ylVYStP0aEqQmR5haflXffyH2DHc3w5BjFq59jdZ0aN8D4yapVuOJUPHJIJmFvIhXiZZmoWjGFnF3dKPgUz2AZlnbTINRNbSCSUq2J9q0ZKo3IwdtqyonEH02yrFTn2WGoL1nfepY3vxdXX6FMFKaeLiFs22rXfZ6RkIv5tEZCtJTisJNT055bKWdCcLLCn9jY0s2j3YJs8dHLepjhxe7uAFMytTVq8Y0\" +\n                \"SE65nhUV832leIZR9JrMmNsmdfI59ABGEh2f6CBJ3ZJFameh0co9BzYBtEtcsajgM6PCOElRJHO9d8xmBRIlmNhBhcGC4BH2oEtFo6tbRnC3FRPsTLsv2yiDNL9UJ3S6lBJfMhkbLdUXCgBjaEXz5TkbNQDaaujQWQkHAVMHIdQ0deOtlvMsYvBCszf9181qAoTDF2ahmDQAnTarUxEn9GN3MHumhjI8Eki3h0hLZzgtoo4ovZwCCZLBeeAX8ycud9oBnn2b6f17peUNURveHuFeAuFz7ZUtXez1BcoflaqyKoq6vh6MGVxnNt\" +\n                \"hBArU4sBP352OLhXIFoEggIP2MGBGpj2LxsXSZhbHrHMRflHSAgrTDqkHKqfjRdSxdEHfXxMkdj4f0FVhZEgOf99IN00YXwXfet2gHQWHfRjsvjzkDTzLoZSy6HQPXYrKnIcgsoAtt4OGkO0LxKXoAZT8Lm9cF1eJHdsAWEMmssd73oV0WXA111iAhf2IOfQW65htyEvP2ljlN9BmA2PLXZGaq2EG0ozV6XqiZ1pgEyyQ2qxRdEoKv8VJQuoWSvK8j6at7V5RjChJVVwL96LdVgvxnSeinlRWWcf5jYljn7SvLPMV9F9fXGNhZ\" +\n                \"GvvnQVfhU0cZtny8k7a1MO3gpnke0l1w03ZPgXVOMQH7DcIIy6IJSUNN5FqcubUATqdGWneXEi3HLYlcyO4CflRtGXO4vRSiAJSBla186vSiiJTe6L5t36t0G28hIIMkURDrAFjeB2VhLqVdqsmbDBxq4xxxrAi9KatciNCExmDk9JeHSrFeyjVkbw1SSb96Z4fSxtTyhpI7IiSP5vw9xqGBLUbpfewUaIfmXrwsAoLjurbE5W159x2bkL0b6XF9K0BMLsh7FJpl8Uh84XlDxYVUGYxL1jw9Cc29WAuy5uiCF6ThNw4p0NDlMs\" +\n                \"lMMI6XJN4yz2bd7BJs4wlYFUwKqmwTVJAXoJIghgAX44ix9UxBcMjNWUqkIZa8Xaweh9pOrd7dhdWO2RMS25LD8yKSfan32deCGzcafjv6ZSy7MkiwYuviXpjlK4IJYd6wyitXts86MaP3ATXw472SHnnjLYJP9yBKuwBjdG5HfCUHGQwq5W6UQyoI7U5eszG62rJdr0YGkMuYbs0ayjWDf4gJxDz2UDwdkPH1fDOBIuQSiPcX8PRIELHfgwYseBhppC0PBDU6QAXjjxqRXz6iGHkNOOif67LS3tYOGif4jBPHEQLtbphuCCl2\" +\n                \"rXnKiRkxQb2LwEeSZVbPnzqlh5cN28bSLiFYpae03M7Cl7zC7oDz3XvthwgqfdZX224veXJzaEjsVOdXZKtNWaI8pf1J55Mq6FH5VRsHgpry86wXMVRrkty9UepTvrvkkHHprBAWuGQAanubxH2TRQrO8FukHKH0XfxxySbvN124hMBBNHysfWUyOhSoHl52AzkoARYTOkMS22MIGpLhuc8i7C2UVUraAZ5C3AhQITe2iVK6tEPHEy7tLFqHxrKpuZGKrc60pdkScSbRXsyF1kIWbc2JNDk4qv2QySbWPIIIz5aL9Pp8kT97QU\" +\n                \"iLFtdK8O2ghcHTFB8PqMKsg59Ex0Zlh2epGNCXqaqjkXjeMZxgLbqyrmfDMpNzOcgj4d66jhS0JwrFdoPAQOp1ODzJcLLP9eMhDl\");\n        }\n\n        #endregion XxHash3TestData\n\n        #region XxHash128TestData\n\n        private static IEnumerable<(ulong HashHigh, ulong HashLow, ulong Seed, string Ascii)> XxHash128TestData()\n        {\n            yield return (HashHigh: 0x99aa06d3014798d8UL, HashLow: 0x6001c324468d497fUL, Seed: 0x0000000000000000L, Ascii: \"\");\n            yield return (HashHigh: 0x4a807558806f6b31UL, HashLow: 0xeca8475b2cc08feeUL, Seed: 0x00000000000013f0L, Ascii: \"\");\n            yield return (HashHigh: 0xbecb6b41f8c7c702UL, HashLow: 0x8bcfeb4c4ff25443UL, Seed: 0x00000000000008baL, Ascii: \"\");\n            yield return (HashHigh: 0xa2a900ec02fd312fUL, HashLow: 0xa75380084c7b1df2UL, Seed: 0x0000000000001bc1L, Ascii: \"\");\n            yield return (HashHigh: 0xa26f5ff5290b016cUL, HashLow: 0x2753d05a8f320003UL, Seed: 0x0000000000000000L, Ascii: \"Z\");\n            yield return (HashHigh: 0x4623628864bd3461UL, HashLow: 0x826ed41a6e3413f3UL, Seed: 0x5a7a3a6dd84a445fL, Ascii: \"f\");\n            yield return (HashHigh: 0x764b216a6748e65bUL, HashLow: 0xb92fbf351dd100eeUL, Seed: 0x0000000000001c09L, Ascii: \"C\");\n            yield return (HashHigh: 0x506e248b0503589eUL, HashLow: 0xec9a584c5994b0fbUL, Seed: 0x761747debc4bf2fdL, Ascii: \"e\");\n            yield return (HashHigh: 0x71f1afcb4f6947d5UL, HashLow: 0x123a6f50f1ca0359UL, Seed: 0x0000000000001cf4L, Ascii: \"V4\");\n            yield return (HashHigh: 0x054d1416a8ac6149UL, HashLow: 0x30a9330b3de18584UL, Seed: 0x27f065e4850461f5L, Ascii: \"HA\");\n            yield return (HashHigh: 0x274c6130ae605b8aUL, HashLow: 0xccdf6c02b23ec3fcUL, Seed: 0x00000000000017e0L, Ascii: \"KP\");\n            yield return (HashHigh: 0x3248dd8b112b8de0UL, HashLow: 0xe90908587fefc64dUL, Seed: 0x000000000000200bL, Ascii: \"5O\");\n            yield return (HashHigh: 0xbb6d264f3da93569UL, HashLow: 0x0c3efabfc49a356eUL, Seed: 0x0000000000000840L, Ascii: \"H4p\");\n            yield return (HashHigh: 0xed353f9a3e2c25e3UL, HashLow: 0x5ab2c95dccb3f945UL, Seed: 0x00000000000009d0L, Ascii: \"9Vj\");\n            yield return (HashHigh: 0x6a500075fa490773UL, HashLow: 0x9a892645f137e437UL, Seed: 0x000000000000198cL, Ascii: \"ajB\");\n            yield return (HashHigh: 0x83b9766abe82fb07UL, HashLow: 0xf917a1f0983dac91UL, Seed: 0x6f3502011f621a64L, Ascii: \"kLi\");\n            yield return (HashHigh: 0xf29da7d603a9409fUL, HashLow: 0x90373b3f6da10e37UL, Seed: 0x0000000000000499L, Ascii: \"KdjE\");\n            yield return (HashHigh: 0xb6b99015d0e80f41UL, HashLow: 0x15ac2f7581d32767UL, Seed: 0x0000000000000000L, Ascii: \"fCiJ\");\n            yield return (HashHigh: 0x289387774d4702aeUL, HashLow: 0xa11bc364b3242dd0UL, Seed: 0x0000000000000f04L, Ascii: \"HZOD\");\n            yield return (HashHigh: 0xb26e407110fee12dUL, HashLow: 0x43701b3e9f856441UL, Seed: 0x0000000000000353L, Ascii: \"d9v6\");\n            yield return (HashHigh: 0x4da901296206362cUL, HashLow: 0x5b4171745fecbf51UL, Seed: 0x0000000000000000L, Ascii: \"Zx63J\");\n            yield return (HashHigh: 0x0cf89ac9cf9d9848UL, HashLow: 0xadda76a25f503d7dUL, Seed: 0x00000000000019fcL, Ascii: \"mosH8\");\n            yield return (HashHigh: 0x9c1809f990c624c0UL, HashLow: 0x8b38984e0b2c2f35UL, Seed: 0x0000000000000faaL, Ascii: \"QDajZ\");\n            yield return (HashHigh: 0x28cf7e977573bb64UL, HashLow: 0x01f54f45353730c9UL, Seed: 0x00000000000008baL, Ascii: \"DNHWf\");\n            yield return (HashHigh: 0xb9e61a5de2afbe81UL, HashLow: 0x753d475d0b87e693UL, Seed: 0x0000000000001062L, Ascii: \"yyaFtP\");\n            yield return (HashHigh: 0xd5911b46e493be09UL, HashLow: 0x3198541f3c02ef75UL, Seed: 0x0000000000001d89L, Ascii: \"kXzedT\");\n            yield return (HashHigh: 0xcfbfd6d5f49a2e56UL, HashLow: 0x26aa5e13f8a2a76eUL, Seed: 0x4ef78ad67d7e2c8fL, Ascii: \"E27wiW\");\n            yield return (HashHigh: 0xb9515a7b65af9257UL, HashLow: 0xbf40898c0f8a0f8cUL, Seed: 0x0000000000000007L, Ascii: \"M2sgd4\");\n            yield return (HashHigh: 0xb47c1a2be46a9038UL, HashLow: 0xcc05dcae7d590f01UL, Seed: 0x3d065f4429458c97L, Ascii: \"ZTCkePQ\");\n            yield return (HashHigh: 0xea8aca80dae26bb2UL, HashLow: 0xe254764fa5b83a1cUL, Seed: 0x0000000000000064L, Ascii: \"klpn67g\");\n            yield return (HashHigh: 0x519db5957ff6d25eUL, HashLow: 0x0b0e3e138a8cf5a4UL, Seed: 0x000000000000158cL, Ascii: \"lPOSwvf\");\n            yield return (HashHigh: 0x4dfc8bc32f60ec85UL, HashLow: 0xf2081fdcb4e7adc3UL, Seed: 0x0000000000000000L, Ascii: \"SbmPVuZ\");\n            yield return (HashHigh: 0x9ef5de9b23143fa1UL, HashLow: 0x99d532146c2c0a73UL, Seed: 0x00000000000025daL, Ascii: \"TLRDvLvS\");\n            yield return (HashHigh: 0x020829fc5ce20aabUL, HashLow: 0x5b59238c8cc116bfUL, Seed: 0x0000000000001a31L, Ascii: \"5kKXT8hE\");\n            yield return (HashHigh: 0xeb44c89e63652621UL, HashLow: 0xc84f4604987a580eUL, Seed: 0x0000000000002051L, Ascii: \"UHj4U70w\");\n            yield return (HashHigh: 0xf8413a924a279bd1UL, HashLow: 0xe1ad88ff626f786fUL, Seed: 0x000000000000095fL, Ascii: \"YYiJtbOe\");\n            yield return (HashHigh: 0xa98564b5fb852a84UL, HashLow: 0xdef8b6b70a62024cUL, Seed: 0x00000000000006d1L, Ascii: \"EGM4yxHgk\");\n            yield return (HashHigh: 0x16012a87e426b9cbUL, HashLow: 0x4082958cd43d6513UL, Seed: 0x00000000000014b2L, Ascii: \"ixKUUt5pO\");\n            yield return (HashHigh: 0x6367b1c4996543fcUL, HashLow: 0x761f04e10593209bUL, Seed: 0x00000000000022b1L, Ascii: \"s6aMbUVkK\");\n            yield return (HashHigh: 0x81b1195f861a569fUL, HashLow: 0xc4723ec01465266cUL, Seed: 0x70cb1cd220fe3a09L, Ascii: \"SsNiqNqBf\");\n            yield return (HashHigh: 0x2b8ed073c7d1a9a8UL, HashLow: 0x2a8b2106ac7829caUL, Seed: 0x00000000000011e0L, Ascii: \"Ov4zwcvLx0\");\n            yield return (HashHigh: 0x3a122b70036e904fUL, HashLow: 0x229f40d4a8e52ffdUL, Seed: 0x00000000000009e3L, Ascii: \"bM7sIUkRTp\");\n            yield return (HashHigh: 0x0b864bf7ff537160UL, HashLow: 0xc59daa13b10e606bUL, Seed: 0x0000000000002313L, Ascii: \"sitCYl1zu2\");\n            yield return (HashHigh: 0xfbcde1ed8641b470UL, HashLow: 0x75f88cb1362f1c2dUL, Seed: 0x0000000000000d3bL, Ascii: \"Ck3S0qy5xH\");\n            yield return (HashHigh: 0xa16e4736df3d24b2UL, HashLow: 0xec73bef56c57450dUL, Seed: 0x0000000000000bbcL, Ascii: \"Y4lXHPbJCix\");\n            yield return (HashHigh: 0xc696323ec62ad592UL, HashLow: 0x398891b92d8dd119UL, Seed: 0x00000000000022bcL, Ascii: \"yD0Ex2vQ9zW\");\n            yield return (HashHigh: 0x4fea8787fd490ddaUL, HashLow: 0x2c69900c70d19b04UL, Seed: 0x0000000000000000L, Ascii: \"uOnyD2tQQ7v\");\n            yield return (HashHigh: 0x9f999df17cd05310UL, HashLow: 0xe3aa72d1092ebb8fUL, Seed: 0x5539de8caf41e41aL, Ascii: \"vTU3yFsqOQ6\");\n            yield return (HashHigh: 0xd2e9f28209687ec1UL, HashLow: 0x4bce6fa0bf99412eUL, Seed: 0x00000000000013d1L, Ascii: \"Hy3emis1M7eV\");\n            yield return (HashHigh: 0x3c038688775fe64fUL, HashLow: 0x54000864b933726bUL, Seed: 0x0000000000000647L, Ascii: \"ZuXRMHrPQHtz\");\n            yield return (HashHigh: 0x575ac4345a1b6ad0UL, HashLow: 0x0f2087776d37810fUL, Seed: 0x00000000000017ebL, Ascii: \"TsKvY0FLKoQf\");\n            yield return (HashHigh: 0xb2675e6ad8339bd2UL, HashLow: 0xd69c359804383ca2UL, Seed: 0x0000000000002512L, Ascii: \"s9hk0ogUPKf1\");\n            yield return (HashHigh: 0x3c251a63e3d48d6fUL, HashLow: 0x038087b74c6e14dcUL, Seed: 0x00000000000013fbL, Ascii: \"kdFgtjHcConq5\");\n            yield return (HashHigh: 0x297175e758e86f57UL, HashLow: 0xcd7498d94a672885UL, Seed: 0x0000000000000000L, Ascii: \"PfI6lstr0ZLWG\");\n            yield return (HashHigh: 0xbb0c381e51998f64UL, HashLow: 0x57719f37134a266aUL, Seed: 0x00000000000023e6L, Ascii: \"0ryRPmjP1mSun\");\n            yield return (HashHigh: 0xc1ff2ee022be1ad2UL, HashLow: 0x2bd68a11c0606c5fUL, Seed: 0x0000000000000000L, Ascii: \"XEjB6XqOe5ymx\");\n            yield return (HashHigh: 0x05350b438700d9c8UL, HashLow: 0x461ea209cf21ebcaUL, Seed: 0x000000000000139aL, Ascii: \"64WbTFxlWe3U2k\");\n            yield return (HashHigh: 0x3eadb498d13a37d7UL, HashLow: 0x622e40b0d1df1d28UL, Seed: 0x268e74fe41033efbL, Ascii: \"He08m7cz6BVUKB\");\n            yield return (HashHigh: 0x5abdfbdcd245e260UL, HashLow: 0xa2a968262e882547UL, Seed: 0x0000000000001fb0L, Ascii: \"Ij5MBfLKVkAFYF\");\n            yield return (HashHigh: 0x10ba15135341f2efUL, HashLow: 0x38ae7fa8bdcba136UL, Seed: 0x0000000000000000L, Ascii: \"VSVb2538wGyeRM\");\n            yield return (HashHigh: 0x836653ac668d328bUL, HashLow: 0x134c845fa1140333UL, Seed: 0x0000000000000a27L, Ascii: \"hueNVzaX9p7JdKL\");\n            yield return (HashHigh: 0xc77cc4e476afa994UL, HashLow: 0x48075e4b92a682a4UL, Seed: 0x511ca41ca4193614L, Ascii: \"kpx0STYilb7EM88\");\n            yield return (HashHigh: 0xcfae3e25c13a277cUL, HashLow: 0xfa327321c32db69fUL, Seed: 0x0000000000001cf5L, Ascii: \"dvmStMmz8Uhj4G0\");\n            yield return (HashHigh: 0x66b801b19a8b3ec7UL, HashLow: 0x12935062325aa240UL, Seed: 0x0000000000002464L, Ascii: \"8csqW0j3hptGCwO\");\n            yield return (HashHigh: 0xbf9e3fce82fea007UL, HashLow: 0x51ae8dd7283b1328UL, Seed: 0x27ea2fd22273f024L, Ascii: \"fcuQxJ1a7XHWjOak\");\n            yield return (HashHigh: 0x04a18c598ec0b7e5UL, HashLow: 0x660762826fd6d2e4UL, Seed: 0x0000000000001d88L, Ascii: \"cTXadjhxzktQVtPW\");\n            yield return (HashHigh: 0xe4521ffc01debde3UL, HashLow: 0x65c22c1974720a41UL, Seed: 0x00000000000011ddL, Ascii: \"VdnhfZNlPd5zBO9G\");\n            yield return (HashHigh: 0xe70ae568494fc62cUL, HashLow: 0x2a9bbc733b7c639eUL, Seed: 0x00000000000001f1L, Ascii: \"sRcoac2Z1XKinWsY\");\n            yield return (HashHigh: 0x1f3ba7ee629b72e0UL, HashLow: 0x8e26be7440f5fc90UL, Seed: 0x00000000000019c9L, Ascii: \"4pgR1N0LgL2QpoaNc\");\n            yield return (HashHigh: 0xe414f6707f6ead9aUL, HashLow: 0xa7fcffec8f76f118UL, Seed: 0x1e18b9a7c8f02d7dL, Ascii: \"ZJaCUfU0OXHoLCEfw\");\n            yield return (HashHigh: 0x12235b54944449d9UL, HashLow: 0xbeb38a091327c173UL, Seed: 0x00000000000012abL, Ascii: \"uUFLXT60uVkCOXvPj\");\n            yield return (HashHigh: 0x2c733d5a026d4083UL, HashLow: 0x71ba1a2164870694UL, Seed: 0x0000000000000a7aL, Ascii: \"uLLdztp6cDZ1pL9BR\");\n            yield return (HashHigh: 0x5a7f341db512a31cUL, HashLow: 0x7e2e0349c0e69e6bUL, Seed: 0x0000000000001962L, Ascii: \"LuOyAcRwmGEH8z6k6m\");\n            yield return (HashHigh: 0x88312137dc4b6af8UL, HashLow: 0x6aae2cde1c9c88ceUL, Seed: 0x0000000000000000L, Ascii: \"KDuzVTjAQ4xNGS3WF6\");\n            yield return (HashHigh: 0xdb49e798a5203d13UL, HashLow: 0x8018da180b94a4efUL, Seed: 0x0000000000000ebeL, Ascii: \"A1ihuWZ2uERWycZxPa\");\n            yield return (HashHigh: 0x2b849e4e52aa0ed2UL, HashLow: 0xb95f9ca4526d0961UL, Seed: 0x00000000000009c2L, Ascii: \"3Ux0vVy8UG3pLbfakF\");\n            yield return (HashHigh: 0x0c80d091f072b327UL, HashLow: 0x71054be7717504f0UL, Seed: 0x0000000000000000L, Ascii: \"kZADmGnOFWl6Phiu8tE\");\n            yield return (HashHigh: 0x42ab70e912af4e15UL, HashLow: 0x5b08618751756b74UL, Seed: 0x16580c02347e75b6L, Ascii: \"86PTDY6UXtSuJUe22wA\");\n            yield return (HashHigh: 0xf66d33242d08959aUL, HashLow: 0x77cc4c45f50ce208UL, Seed: 0x00000000000007eeL, Ascii: \"PVFVy0kMDJgMo593sxl\");\n            yield return (HashHigh: 0x073c5989bf4fa6c0UL, HashLow: 0x526253288d710d17UL, Seed: 0x0000000000001571L, Ascii: \"aerl20lkguiB4Gf3T9R\");\n            yield return (HashHigh: 0x8f60190e04b20030UL, HashLow: 0x850448a147507baeUL, Seed: 0x55babd76a130f515L, Ascii: \"aGfZbBNKvUGfWCu34gub\");\n            yield return (HashHigh: 0xbb99ac16f4945cb4UL, HashLow: 0x918a3f7892a28c6aUL, Seed: 0x0000000000000000L, Ascii: \"VMkxhcMDr321w7YjThXV\");\n            yield return (HashHigh: 0xfff510bc9bf53685UL, HashLow: 0xc6f6c1b456e9bf6fUL, Seed: 0x0000000000000ddaL, Ascii: \"DmBC0bnc4kQOA6YCsPpe\");\n            yield return (HashHigh: 0x3a57a810cd4c8ae3UL, HashLow: 0x392cd4dadf5651b7UL, Seed: 0x000000000000074dL, Ascii: \"RBwHqQrG3cyoDw0eLlT3\");\n            yield return (HashHigh: 0x79bb83de1c692143UL, HashLow: 0x9bef365c4c43131fUL, Seed: 0x0000000000000d19L, Ascii: \"HpsRBCVOx5SkugteBIbaQ\");\n            yield return (HashHigh: 0x66097c1fc468d198UL, HashLow: 0x6f79ea3f021705c9UL, Seed: 0x0000000000002214L, Ascii: \"G9YRrhLX02ReHdMSPJhsn\");\n            yield return (HashHigh: 0x167dd8c10ad24ca7UL, HashLow: 0x24d10d5a8a573a31UL, Seed: 0x0000000000000000L, Ascii: \"x35LiatiPGJa74outlVGU\");\n            yield return (HashHigh: 0x5687c9578a8af662UL, HashLow: 0xb459433f882b2f5eUL, Seed: 0x000000000000188eL, Ascii: \"AsHWiTENK1HPZr0XPVA9m\");\n            yield return (HashHigh: 0xe5cc06711fd7125dUL, HashLow: 0x2793a1bc5ad230dcUL, Seed: 0x000000000000245bL, Ascii: \"ocWWrY4XvGhWB3fRZfuOHP\");\n            yield return (HashHigh: 0x01f71c3cd79a9cdbUL, HashLow: 0x47dfbc53c890099dUL, Seed: 0x0000000000000000L, Ascii: \"Fjc59qu4SZWLuTuklHLxk1\");\n            yield return (HashHigh: 0x9f4d0609fbcadf0aUL, HashLow: 0xc679f70fe1241040UL, Seed: 0x00000000000018b1L, Ascii: \"oqcVab4jAR21vhNpsbp2AT\");\n            yield return (HashHigh: 0xa9d517e93349e24fUL, HashLow: 0x1a17d204aaa740afUL, Seed: 0x0000000000000000L, Ascii: \"ymXSTaCeolI6VjlQgh6cMl\");\n            yield return (HashHigh: 0x33f2f3847bbbeaedUL, HashLow: 0x1eaa1999af974e6bUL, Seed: 0x000000000000070cL, Ascii: \"ug3aKCkY08yMF2Iz86ig55v\");\n            yield return (HashHigh: 0x5a50005621f22559UL, HashLow: 0x4b791432d34e3cd5UL, Seed: 0x0000000000002535L, Ascii: \"rDC2FcItWoHusdg0fedMIB3\");\n            yield return (HashHigh: 0x6627e0bcd66c1cf0UL, HashLow: 0x782a793594e27209UL, Seed: 0x0000000000000000L, Ascii: \"9vM6157UG2KPMPYg8bicb1e\");\n            yield return (HashHigh: 0x908e625821fb265dUL, HashLow: 0x23ecfb0247a16efaUL, Seed: 0x00000000000015b3L, Ascii: \"Z8LQMWuVPsXAB6IuP15y25c\");\n            yield return (HashHigh: 0xde9e607a15cf780aUL, HashLow: 0x06e5f9c3a56d5be5UL, Seed: 0x000000000000252fL, Ascii: \"C7tG9KNrvX7GP5Fb4AONOkLt\");\n            yield return (HashHigh: 0xbb1380c08962f0a1UL, HashLow: 0x582eff56047085eeUL, Seed: 0x0000000000001587L, Ascii: \"YOI0xGx2Ge1jdh6k6KsXCFXI\");\n            yield return (HashHigh: 0x087174e73e004842UL, HashLow: 0x8d1c18e99aa89f10UL, Seed: 0x0000000000000000L, Ascii: \"7iOlOMeM6UmJnavHzgMSUdZ9\");\n            yield return (HashHigh: 0xfca964a9d8ed87ccUL, HashLow: 0x7337acc5722afdb1UL, Seed: 0x0000000000000000L, Ascii: \"CbxYsDsDPFbc4H0qmKCvXr3m\");\n            yield return (HashHigh: 0x9a5a732bd08658ffUL, HashLow: 0x9e79227c2ec02ff5UL, Seed: 0x0000000000000000L, Ascii: \"kcvageMDWBf8N6f4QRjW8492m\");\n            yield return (HashHigh: 0xba2f21b61db2be15UL, HashLow: 0x67ab5a1dbd487895UL, Seed: 0x000000000000107bL, Ascii: \"3hatHgqJ43eeWMVabG3ZmGH2E\");\n            yield return (HashHigh: 0xa7585cc024226753UL, HashLow: 0x86fae8edb7c5382aUL, Seed: 0x00000000000014f9L, Ascii: \"GZZO2HsROBhSwPibHjl3C9K9r\");\n            yield return (HashHigh: 0x3523734739f92d53UL, HashLow: 0x1aec2232165bba8eUL, Seed: 0x00000000000003d8L, Ascii: \"sy5RrooAbS2a4spp3UT3g3B8s\");\n            yield return (HashHigh: 0xcf3696dec9e686f5UL, HashLow: 0xed4b05ab45d1e5c5UL, Seed: 0x0000000000000cc8L, Ascii: \"GjnKAVokRisPBwjCceOHrVnR9M\");\n            yield return (HashHigh: 0x5bc593b542c1b4b0UL, HashLow: 0xaa8508826938e7c0UL, Seed: 0x011a75bcd188cfd0L, Ascii: \"5qzewuqd4RMJJVBTbd7z4vEv5Q\");\n            yield return (HashHigh: 0xce1541a5cb7b5058UL, HashLow: 0xe0ba8df2e74fb66dUL, Seed: 0x0000000000002085L, Ascii: \"cDjSOSHGn8nM839nFvNqPc0oLw\");\n            yield return (HashHigh: 0x49dd6f8d88d5e61eUL, HashLow: 0x33d8f061f420b1e2UL, Seed: 0x00000000000025e7L, Ascii: \"zZWOvuCOQ7S78PmteXs9orf1sW\");\n            yield return (HashHigh: 0xa4c278de9a8a2135UL, HashLow: 0x828c7677d5f2345dUL, Seed: 0x0000000000001df7L, Ascii: \"Equb0NmabCbKGaEmh6dE8gjfL1E\");\n            yield return (HashHigh: 0x8984aa4098b7f9ffUL, HashLow: 0xdb3cc2ff3f14c5b8UL, Seed: 0x00000000000012b5L, Ascii: \"X7vd0dgpT9eRzMHx3LDgjvEQwE4\");\n            yield return (HashHigh: 0xf9f2a7cc3f59980dUL, HashLow: 0xd9e5bdb4c7c83da8UL, Seed: 0x0000000000002370L, Ascii: \"H8QsGBXFPf89x5Q47qSBj4AhT3u\");\n            yield return (HashHigh: 0x227255a30d2571b8UL, HashLow: 0xaab49a97ad9bd967UL, Seed: 0x0000000000000000L, Ascii: \"8TRix56rWbRPISXdMbdtjKAeZRZ\");\n            yield return (HashHigh: 0x4031fb88da3925e4UL, HashLow: 0x9c74e64f3b042834UL, Seed: 0x3f54eddf60ada18bL, Ascii: \"icq9LPMDvmULotIweEESeEDVi0HN\");\n            yield return (HashHigh: 0x423152c3b7ad40c6UL, HashLow: 0xd698982f494d629bUL, Seed: 0x0000000000000000L, Ascii: \"i6PCFvzKoWZ2qkeiCTA2r8rywUkZ\");\n            yield return (HashHigh: 0xfb87e9a91563cfbbUL, HashLow: 0x4156aac971d6b931UL, Seed: 0x0000000000000a63L, Ascii: \"b7zmpPTGOXWgpxCGNrLdGrjgpUkp\");\n            yield return (HashHigh: 0xfab2cb544fd820a2UL, HashLow: 0xc18dea55ed24bd6bUL, Seed: 0x0000000000000f88L, Ascii: \"7ER0gY3jYRTc7UuQX0jy4ILm0QxP\");\n            yield return (HashHigh: 0x2d1e39d5eaab2af0UL, HashLow: 0x2a70f2eeac683d0bUL, Seed: 0x000000000000064dL, Ascii: \"srmanGgb2muidgoV99SSZDXii7Gf2\");\n            yield return (HashHigh: 0xf2406cceeaf789b1UL, HashLow: 0x7f357e0d4b0dbd94UL, Seed: 0x0000000000000000L, Ascii: \"SkZnT9dHnEaafaU0YQIBnB735xYcl\");\n            yield return (HashHigh: 0xcab951ee4bbebc43UL, HashLow: 0x06925aaa2a673fb8UL, Seed: 0x000000000000162aL, Ascii: \"dl5ZP6cffXfE3l0PAWd51TBvSsG9S\");\n            yield return (HashHigh: 0x610ba5617e546152UL, HashLow: 0xacea3ce6524e43d4UL, Seed: 0x0000000000000f18L, Ascii: \"CSQBwJqxtVJeMOv5mqzH6g7ZGnPyh\");\n            yield return (HashHigh: 0x7f0e0f3aa7cf82f2UL, HashLow: 0xc493df64be1cb131UL, Seed: 0x000000000000222cL, Ascii: \"tTGa8TJUETEztj5zsfDWU2BwGmB6Ky\");\n            yield return (HashHigh: 0xdc64bf2a49682c98UL, HashLow: 0x0a5862b8f34eb2f0UL, Seed: 0x00000000000000d1L, Ascii: \"ZakSEMaZxYJnhoj40dgW0Od1dBrpBd\");\n            yield return (HashHigh: 0xef37b48c0dcf30faUL, HashLow: 0xf86a3d7c9c12f0e9UL, Seed: 0x0000000000000000L, Ascii: \"b7k1mN7utrKrm0UCDOArIhg6D1xEg9\");\n            yield return (HashHigh: 0x1e1346e62386e738UL, HashLow: 0x526793e7355d4fbeUL, Seed: 0x2ed1256a014f6d46L, Ascii: \"ECJ4VLtsuggTR4wcLJjTm8x6DXFhTB\");\n            yield return (HashHigh: 0x9a79d2b1024b18e7UL, HashLow: 0x355787a651015181UL, Seed: 0x00000000000026e6L, Ascii: \"DiRtMWxnI3qkMdYanz82e6bfpp8VUTw\");\n            yield return (HashHigh: 0xe45a5e4de60a1d29UL, HashLow: 0x8016c4e1f68959adUL, Seed: 0x113a1735f166548bL, Ascii: \"4gIXXrYOrAJpQZtb2lYLqsqzrRBdRh3\");\n            yield return (HashHigh: 0xac76c0f645ac910fUL, HashLow: 0x7fe76cc004fd8c41UL, Seed: 0x0000000000001d1cL, Ascii: \"RuxoiJfBipXTwGRnMLXS9UiaQDLYy35\");\n            yield return (HashHigh: 0x7e733bd5cc4a0fa5UL, HashLow: 0xd62a4d833bf0fd9cUL, Seed: 0x0000000000000000L, Ascii: \"Z0KHCqxcHGVVuwQUDbQMSqYJcBl9y6U\");\n            yield return (HashHigh: 0x0cb534f1fbd7ccbcUL, HashLow: 0x2fcd13cb42c47ad4UL, Seed: 0x0000000000000000L, Ascii: \"Tc8otaCWJhcl5Nz5CDz7vFJX6zsYPl4I\");\n            yield return (HashHigh: 0x121b8e2a654c5f04UL, HashLow: 0xe2ee0fbe65be642dUL, Seed: 0x0000000000001162L, Ascii: \"H3tw59bhz1T1nnR3phpWiSkdwEpOuz5s\");\n            yield return (HashHigh: 0x1912c33cd6bfe613UL, HashLow: 0x7af33ab3183bfbbcUL, Seed: 0x0000000000000000L, Ascii: \"xB0c6wK9bmxwnzf2jvZNxOYJNM2fGL0r\");\n            yield return (HashHigh: 0xf5266cebff992781UL, HashLow: 0xecfb92c488654a79UL, Seed: 0x0000000000000b0eL, Ascii: \"lDzIPQrmi2UvgSSWTe0sMEXWNQX1t3ZC\");\n            yield return (HashHigh: 0xd961769319c53b55UL, HashLow: 0x4d9b9dde38966881UL, Seed: 0x23eaccb8f24a289dL, Ascii: \"6Dj7XpVnlDS3iskE2RiCX7f46L3pxayir\");\n            yield return (HashHigh: 0x877a8a6f474d64f6UL, HashLow: 0x7c91a261d7a43c89UL, Seed: 0x00000000000014a7L, Ascii: \"k2TsCmhgBSoOIYeZduUoVjR377OQE1JfY\");\n            yield return (HashHigh: 0xbfe1f40d123aa39eUL, HashLow: 0x44d8d3ff9d79a493UL, Seed: 0x00000000000024acL, Ascii: \"aOR7hd3xbGoB0FQGYZ2ufM2ueyyDV0L93\");\n            yield return (HashHigh: 0x9a40d0438baa71a7UL, HashLow: 0x515cec6af4476090UL, Seed: 0x0000000000000978L, Ascii: \"L9E196PbLYnr7TKQb44d2jPAjLDuE2xMq\");\n            yield return (HashHigh: 0xb8bbce0684d1cc58UL, HashLow: 0xb291b3d9ef093c2aUL, Seed: 0x00000000000015d7L, Ascii: \"X1a9zapq9YvpqtP0LQwkXCacvz8TTJrR5m\");\n            yield return (HashHigh: 0x33d0ba6547a5482eUL, HashLow: 0x221f75763d2d15beUL, Seed: 0x2ba124b4f3ead0deL, Ascii: \"o5t9IPouVvQ7Anqa8b96M0JKZEQer4Io87\");\n            yield return (HashHigh: 0xaa517a80cac5f907UL, HashLow: 0x6b3b06d70695bc82UL, Seed: 0x0000000000000000L, Ascii: \"vRTbTeQP2nIh2u5LeK5w4s2Pa1kjw73Vwk\");\n            yield return (HashHigh: 0x7e3ed77059aaf4c0UL, HashLow: 0x8a98b186c5058cfbUL, Seed: 0x0000000000000000L, Ascii: \"30vfO7V1QAAifNBsjia1qbCIP80KqjvqGf\");\n            yield return (HashHigh: 0xd61757ac3d54dd3eUL, HashLow: 0x997e8d274c520f5cUL, Seed: 0x3ffe7d86a697da93L, Ascii: \"FAIUOWamAotqfoHv4Ie6Iib8Z59ZSO3nmkd\");\n            yield return (HashHigh: 0x8cc320d76d51ebd1UL, HashLow: 0x34fecb5247399ab5UL, Seed: 0x00000000000014c6L, Ascii: \"XS8b1YF7ljMz6H6XcUtNA5VTQ2noYWTSHDj\");\n            yield return (HashHigh: 0x518094b708e83606UL, HashLow: 0x5cb7f6052b0fa4caUL, Seed: 0x0000000000000000L, Ascii: \"yFgI3MX0SsxIReDPO67ELAEPam8KZB38hK3\");\n            yield return (HashHigh: 0xf5b7ad6fa7886447UL, HashLow: 0x314678c9b02c29cdUL, Seed: 0x00000000000014b4L, Ascii: \"Zj6tDKmocGIFyyCmDJf2u91Sabx3pLiQ5Bi\");\n            yield return (HashHigh: 0x3ac5eab6557b9523UL, HashLow: 0xe72fd486db472f6aUL, Seed: 0x10ec20959d09dd55L, Ascii: \"xOwM20yHXHCf6d6a3KbbQfLGeSLZASkWILAs\");\n            yield return (HashHigh: 0xecb2bbe9417426baUL, HashLow: 0x642b47da0f3cf681UL, Seed: 0x0000000000000a20L, Ascii: \"TZAxr2MOi7t5U4bY7ViTVRFHW2k6GLa03a0X\");\n            yield return (HashHigh: 0xe4a443da1d1ed626UL, HashLow: 0xd8d2a812c460f7d4UL, Seed: 0x00000000000019b7L, Ascii: \"04bBCjlbOURXBpQWFXiyqnpijPdMBjSQLY9Y\");\n            yield return (HashHigh: 0xd91c67238ac19941UL, HashLow: 0xe7dd77cf692df7e8UL, Seed: 0x0000000000000418L, Ascii: \"4OQFyXv26youfQn4z9uBe4dEcqxXuvmA5FZh\");\n            yield return (HashHigh: 0xa01cd6822701e7a8UL, HashLow: 0x72e52e54d2211b39UL, Seed: 0x6aaaeac1e226ce06L, Ascii: \"eFdnTZwHdKvPkPQ8Bo5bivEk6mHC4tNjoZ7l3\");\n            yield return (HashHigh: 0x9b66a9bbc70f3a37UL, HashLow: 0x52a8bd02e075939eUL, Seed: 0x0000000000000bfbL, Ascii: \"WOnlojc8sZner4PjtLzhHkh3Y4OGqromTrsWx\");\n            yield return (HashHigh: 0xec6a24e06f704a5cUL, HashLow: 0xa96d7eb152da7d98UL, Seed: 0x0000000000000000L, Ascii: \"7W1tr4qALkdKhiOwtFHbNxWh949TA6fRPNAED\");\n            yield return (HashHigh: 0x3f775a02f5d2c4afUL, HashLow: 0x375d3111d2c3eb00UL, Seed: 0x0000000000000000L, Ascii: \"GjIC9TfpZS187U5qnS0m5BjlFYIlCb65drVYx\");\n            yield return (HashHigh: 0x4dc1db88e720147eUL, HashLow: 0x0b6992192eb825daUL, Seed: 0x0000000000002096L, Ascii: \"rq1m7dsJynO2hnuN29L032MvweATJteQzb5s9m\");\n            yield return (HashHigh: 0xdeca67855f921396UL, HashLow: 0x969eec52b1ef1e1bUL, Seed: 0x0000000000002531L, Ascii: \"pcop6coqVECPZ6Ywdfw0tf97F2gIUIQSIlYsGR\");\n            yield return (HashHigh: 0xa3d581605880a96fUL, HashLow: 0x77638040f533d88aUL, Seed: 0x0000000000002612L, Ascii: \"V0tLcpF0mLBRLatMz67ME7g2R0uZVsFUG7HWC0\");\n            yield return (HashHigh: 0xec4cb38fc38cd0b5UL, HashLow: 0x8828cd3a01cb1986UL, Seed: 0x0000000000000e20L, Ascii: \"FgTTUKngL13WKXstwuSKGAsEmrKxmRm29WD86d\");\n            yield return (HashHigh: 0xe16bebcc35d56cdeUL, HashLow: 0xd5b3e889a6197c0cUL, Seed: 0x00000000000014f9L, Ascii: \"VSnKYX4NmxyAAoVJAS5YzzqqwtJp5DjL9ogkvaY\");\n            yield return (HashHigh: 0x61d4418aa94d7a3fUL, HashLow: 0x951328529534fdd3UL, Seed: 0x0000000000000a69L, Ascii: \"dXgaJgKCJ849AED2FyHLi2Hjd4wU7n02iEk3Haf\");\n            yield return (HashHigh: 0x2c71395ddc05d36eUL, HashLow: 0xff652db2ab78cfe3UL, Seed: 0x0000000000000b25L, Ascii: \"yTQVdgm7uIuiAaz1qknDpajdBTNMXMCbNZR4MFX\");\n            yield return (HashHigh: 0x6f0e1fc7c616fad1UL, HashLow: 0x606418b9cd175bb3UL, Seed: 0x0000000000000000L, Ascii: \"CTiZlNvCQ3UGNvemq0dPvPKqyhMn316cDcPJSqG\");\n            yield return (HashHigh: 0x32ddd82fba526c4dUL, HashLow: 0xcc1e40490a434cccUL, Seed: 0x7b510ad4c9cd1f2bL, Ascii: \"vQMOlSQtz9Zs9EX3iUUVdabSsD1GVaXEf99LFt08\");\n            yield return (HashHigh: 0x539fa3326625fcebUL, HashLow: 0x94e2742d73332d39UL, Seed: 0x3c2edddf6ae3473aL, Ascii: \"VfPMDOuJiYd7K35LzrckzjaCaEhY1YqtrdModUEb\");\n            yield return (HashHigh: 0xcccb08d970a1eaedUL, HashLow: 0x0112e76dadf8b80dUL, Seed: 0x0000000000000625L, Ascii: \"bdtPfyPoSB65mUWrLWvDQ9YcPmf3aYDbTAP3qTiv\");\n            yield return (HashHigh: 0x9f5ee7a4c7ab1531UL, HashLow: 0x27727101bbbc48e1UL, Seed: 0x000000000000248eL, Ascii: \"a5zgDNpHWC0CvOccqiABGDcnyZwwRxbD2bpj90vl\");\n            yield return (HashHigh: 0x742268a669b483afUL, HashLow: 0x8d56d65f71e6822eUL, Seed: 0x000000000000183bL, Ascii: \"sACG5HtreqQdQ4H9yXLk81UfD2Av3aSTcZdqClt6R\");\n            yield return (HashHigh: 0x6bd1293a3e5eb00eUL, HashLow: 0x961e59da7c442504UL, Seed: 0x00000000000002c3L, Ascii: \"nFIS8engjL85yGKk6CHIBoi2XVSGnO0SazJEcomqb\");\n            yield return (HashHigh: 0x4ce190a899713fceUL, HashLow: 0x91294c3c430f9284UL, Seed: 0x0000000000000000L, Ascii: \"gJrLLQoUXbZrVIrC8hVi3JCvxDNnxmXJ8B0WpcbHc\");\n            yield return (HashHigh: 0x97b85c55fce463acUL, HashLow: 0x130678f34a5e4cd5UL, Seed: 0x00000000000005c1L, Ascii: \"57C715ySXk7ymep2B4o0MNRiGEsK6esgnTQhv5q4P\");\n            yield return (HashHigh: 0xab46eded3b4537e5UL, HashLow: 0xcd635684ee04782cUL, Seed: 0x0000000000000000L, Ascii: \"7zCrwP8ISCDHpoTWQLygqG6deBqXmQggsreOQWxxXw\");\n            yield return (HashHigh: 0xf8e7e1c42bf85e61UL, HashLow: 0xf70a249888b1690dUL, Seed: 0x000000000000212bL, Ascii: \"KKQzNTI5jMtHVROqR85d8I4rpldY23KcCqVYMJvFIl\");\n            yield return (HashHigh: 0x46ed3e841fd03223UL, HashLow: 0xa5dc4f9d55e1fa6aUL, Seed: 0x0000000000002281L, Ascii: \"9QvlFSi8AOwfwzdY2DVPEtKkysr2E5ec98EZ7laNm8\");\n            yield return (HashHigh: 0x336250baebfdc728UL, HashLow: 0xfb636f937fb6165aUL, Seed: 0x0000000000000dd8L, Ascii: \"tdZwMxNh2wMQDQCjrJAcUvbwnfoGGmDKgRxGu0Eanv\");\n            yield return (HashHigh: 0x6e9a9da5144647b3UL, HashLow: 0xcf5ae98818f89351UL, Seed: 0x0000000000001e5dL, Ascii: \"8eQws6NnMzpSfvW69EJnkg1gYSLKiuJrT5UVsQnrsmR\");\n            yield return (HashHigh: 0xa879e41e507eaaeeUL, HashLow: 0x0916830d8d5aacf8UL, Seed: 0x3269ffabf9fe4912L, Ascii: \"Edxrm8YOHQ69GcaJFDBDMS4t1tL1huF1C4l0YlTMa5j\");\n            yield return (HashHigh: 0x6749fa3894bf85f1UL, HashLow: 0xed2a15d9e952672aUL, Seed: 0x00000000000001b2L, Ascii: \"iIb3TJacRk5lTmjUVwb50hrGdnI9GbrJIZLDbzdxiEz\");\n            yield return (HashHigh: 0x8cd9ed14e69319afUL, HashLow: 0x8e2fe5ac67d80e5fUL, Seed: 0x45bc9445ec98a116L, Ascii: \"QNGZnwuSJxE9w5GbecA65ajidWuNQWH9i7DD14PZQmq\");\n            yield return (HashHigh: 0x869d93e8126ade07UL, HashLow: 0xcf536b58b896f4d5UL, Seed: 0x0000000000000000L, Ascii: \"TmQKZZKn5GUyOJDneWKHBkNtFHc0PfDRsUWTsdfvpnmB\");\n            yield return (HashHigh: 0x51dba0f6c5dac14aUL, HashLow: 0x6bc35abf1badf620UL, Seed: 0x2c6d4115a33ec2b1L, Ascii: \"2esyriPaAO5FmQd0K8PqkjuQLUfw0rYxn2tpfkoRW5PO\");\n            yield return (HashHigh: 0x132e11c7e9161451UL, HashLow: 0x80e869d310ec28faUL, Seed: 0x0000000000001d98L, Ascii: \"LMEKV14ZqsFpOq0izrKQphMbQ9JEmLuzLEMuJGKhUlUd\");\n            yield return (HashHigh: 0x730d360f1adfc5a4UL, HashLow: 0x3b247667b9d4e4bfUL, Seed: 0x000000000000147bL, Ascii: \"uTrlb8pId8MuDzBBHgrSYiBWto8oIRcq25j6mHHOPnk5\");\n            yield return (HashHigh: 0x933f4977597b4b77UL, HashLow: 0x0f79283b8c41f610UL, Seed: 0x7c45ea4a6dba9f4bL, Ascii: \"Zld7gfG0QSNQTJXR0ejdBjJX6CcBrMUH09fe0CdkdWt9W\");\n            yield return (HashHigh: 0x1e62f68e9302a350UL, HashLow: 0x679d411a4ec9171fUL, Seed: 0x0000000000000000L, Ascii: \"6S17ZBT7gAnKSmTHLQZhVYvz9x7qJQSFXwg2TAgLN8o5Y\");\n            yield return (HashHigh: 0x64716f84aa728f87UL, HashLow: 0x42f463bc942fc31dUL, Seed: 0x0000000000000531L, Ascii: \"zgOcPuSSNhWP4mtIsengVnbgCwP81Jn2Ywt0DvlYZGdAY\");\n            yield return (HashHigh: 0x4a889bad6e46fbcaUL, HashLow: 0x0c301c9dd6e98d6aUL, Seed: 0x00000000000025f6L, Ascii: \"Kf46oy6paO5m0BITkQBNDFj4IZB69QwyLLX9KQWj2naSZ\");\n            yield return (HashHigh: 0xac909d0552c7c2bfUL, HashLow: 0xbb9aea0aa0c8ab8cUL, Seed: 0x0000000000000000L, Ascii: \"7yUQsmy2PUSXBj7wZ6gMyYhMYyeaOX7TZA1dKfYTWZ3lkX\");\n            yield return (HashHigh: 0x3ef0a97bb650c186UL, HashLow: 0x16c50f7ef0f0ddfeUL, Seed: 0x1b789758fc51f4ffL, Ascii: \"wsXMtF0seyh9Wq3TnVSOLCfrBOZGCr0YJZd3sBxJQgCyyD\");\n            yield return (HashHigh: 0x0f5bffb27e7bc948UL, HashLow: 0x97341e438244f44cUL, Seed: 0x0000000000000c0aL, Ascii: \"0ruKjbSl8wBTihQRn41GAXbvYwGUo4OWGFLa2TwDJjCCg9\");\n            yield return (HashHigh: 0xe591b1b5214f0fe3UL, HashLow: 0xd6c610ccbde124e1UL, Seed: 0x00000000000018a9L, Ascii: \"4a32HpJhxXIvX8hUclomupa3QNdcc1pxnVowIs7zEiXj0p\");\n            yield return (HashHigh: 0xd20d8eeafc240491UL, HashLow: 0xfb966c85baa85b97UL, Seed: 0x0000000000001178L, Ascii: \"JNBl17xyqUmKZljoCxnoKP1D5voTAdLpHJtF6jZVLz68xLv\");\n            yield return (HashHigh: 0x92c1f187c2f0d135UL, HashLow: 0x9371d6345bea4a60UL, Seed: 0x0000000000000a7bL, Ascii: \"xOTg2nw9GbYX5pPg0SzxC8q6IEybp1GZmMPyLzbtL7UYZcK\");\n            yield return (HashHigh: 0x633f4e0bf5f9dfabUL, HashLow: 0x0fefea424807590cUL, Seed: 0x0000000000001894L, Ascii: \"EZRi4XK7jJTrgPKRA5SHoz0Q4sif7cQIHKFokZY8SSVEyrh\");\n            yield return (HashHigh: 0x78b2d5348c951852UL, HashLow: 0x96fea78817684324UL, Seed: 0x0000000000001c4cL, Ascii: \"7OrNWNJR2u89m4WipmIbRlyNBOh01gpw7nerBk8R9L3tCrH\");\n            yield return (HashHigh: 0x269fd5ad49f480feUL, HashLow: 0x026805e30325e5d0UL, Seed: 0x0000000000000000L, Ascii: \"Ij6Ag30H4NcF6qeJEz3Wsz5l6Dq8l4mhhKBirBq3vIaqRRQV\");\n            yield return (HashHigh: 0xda0dcd307f2bafe2UL, HashLow: 0xcb066fd7c972d632UL, Seed: 0x0000000000000000L, Ascii: \"IDOWgPqCXnvFdmWDzqacG7q4o1A27CIXzbexey5B4UgPJJBB\");\n            yield return (HashHigh: 0x94677b46ddb4de7eUL, HashLow: 0x2c2f96e9c834e10cUL, Seed: 0x00000000000003d4L, Ascii: \"2099xOkn9wkKjKY5CDlkDdHwi8D4TQJl5gS4d1hcvyR2RQtf\");\n            yield return (HashHigh: 0x7329d242fad612b0UL, HashLow: 0x5684c46fffa544fbUL, Seed: 0x0e6a5f795944f2abL, Ascii: \"oeDsxodqj2WWr7Muiq077o5VrVaP5K2adfs2u5CzVgGHi3zI\");\n            yield return (HashHigh: 0xbd7f9a46b45b8014UL, HashLow: 0x165693a465fe120fUL, Seed: 0x79ac05cd3e7e0747L, Ascii: \"CLWOfGOevFJeoegPEWvCPNhABOE0RwTyFxm3CQaFuhUFZE8Fb\");\n            yield return (HashHigh: 0x9040744287a729a4UL, HashLow: 0x9eb02e5a4caac5f4UL, Seed: 0x0000000000000000L, Ascii: \"LGcQ0YebgP5cfln0Fd758gcv71YusgWgLF5pPPRQFKjnlrmR5\");\n            yield return (HashHigh: 0xe5eb72827700928aUL, HashLow: 0x4c52d406a5286aa0UL, Seed: 0x0000000000001c8fL, Ascii: \"lzi6j73dq8g9jSQWe8JiNsQBZvg28u4eefXWB0aZAnd1sAQEX\");\n            yield return (HashHigh: 0x988c6534f53d6ae0UL, HashLow: 0x59b7e58468a47a5bUL, Seed: 0x0000000000001e43L, Ascii: \"C2g2lYC0KNSl5ogPIeHDMPPIdTfAMX83NFOLTvzNCMOcjybVU\");\n            yield return (HashHigh: 0x806dd46b9dd40e7bUL, HashLow: 0x9bb428a5c8eef65bUL, Seed: 0x000000000000202dL, Ascii: \"LfZcvbaYnMc7ilNCiIfqBMIUDq6nPZdbZADb7uLmeG4fZMgHcf\");\n            yield return (HashHigh: 0x287382e233db2218UL, HashLow: 0xebb4f3d64427bf4aUL, Seed: 0x0000000000000f7aL, Ascii: \"Ye9VF3LmVIom3at1cJeyEfEJ0FZNMMvkATqvW02AWyGSswPLDh\");\n            yield return (HashHigh: 0xa80dacc39c04fd69UL, HashLow: 0x3368ca9b9c393388UL, Seed: 0x0000000000001a4aL, Ascii: \"ZqWK3ZqTGNSC62HuKNbQnhU4iPL1AIaBsRKH46Hk2dekaEZbK9\");\n            yield return (HashHigh: 0x3baff25a5910c038UL, HashLow: 0xcafc58419a2e2e53UL, Seed: 0x0000000000000000L, Ascii: \"IzxO16cucXkJxNAdGLv1vlEbpbvLh59hxMIDOKyiRHT29qo3Jx\");\n            yield return (HashHigh: 0x17381414137cf40aUL, HashLow: 0xa94116c1bae74ddbUL, Seed: 0x0000000000000000L, Ascii: \"Ls6VWKVpKBWkLqLn2Dcz7M9X3SyAd3pIgl7l1rk1sFe0OBxz8ig\");\n            yield return (HashHigh: 0xdc3de5453fc9334dUL, HashLow: 0xf3d5b88891bc5683UL, Seed: 0x000000000000150eL, Ascii: \"a9HXkqKa63WKbhvtg0ZBs9I8sF98C7VLpajeWEZ7qfcAKn9x2u4\");\n            yield return (HashHigh: 0xec3f47984bc5b8a6UL, HashLow: 0xf251ebe79aedf8b6UL, Seed: 0x19364680b7cfae64L, Ascii: \"QxZmg62MBpJkk3hzweVPW7WuBg5O3lg5gogVKg7EvgcX5gFZg0j\");\n            yield return (HashHigh: 0x2049999f3cce6282UL, HashLow: 0xfcdff39c5893a7faUL, Seed: 0x0000000000000000L, Ascii: \"ro9oxAxTDXRNROpQfAwZ6NEptKRF1SOkiHTeUuygMCgydNyONd8\");\n            yield return (HashHigh: 0xea57ddf5667ff2d8UL, HashLow: 0xb2717aebec50b432UL, Seed: 0x0000000000000000L, Ascii: \"VgBPITWUgUJHF7eKLDrfatEay6LggqLL9PmXfmwYlBvfqU45s2QC\");\n            yield return (HashHigh: 0xda3b4982116662bfUL, HashLow: 0xe8ea13131ee22388UL, Seed: 0x0000000000000146L, Ascii: \"AcnQHNqJ9CbnxgYAeqhpNvxTSviImLq98dZtTjXg3Ull81cKBASt\");\n            yield return (HashHigh: 0xbda70a81e8a95fbeUL, HashLow: 0x7719d2e47c378934UL, Seed: 0x0000000000001941L, Ascii: \"v1pEcieRUyQnEkrkxfCEgdhMuZ5ZJTCX9pygddRcQ98Flh00YOt9\");\n            yield return (HashHigh: 0x9e44aa970765e1deUL, HashLow: 0xefa181e9e00575c9UL, Seed: 0x000000000000098cL, Ascii: \"kW8S6p5FaD0SWxtfn6rNgk6j0wVvJEt6jDz0pojRELPyrynVUyew\");\n            yield return (HashHigh: 0x9ada43e6dbede79cUL, HashLow: 0x9801b4daf9442a01UL, Seed: 0x0000000000000000L, Ascii: \"gGTtJkt3jWNXV77yMOLHgWh2wpgK8qFcMs5MX1SdN35RNt8XzC8it\");\n            yield return (HashHigh: 0xed036d96a56ae643UL, HashLow: 0xe28ce840bbd646c0UL, Seed: 0x41d3b15754067041L, Ascii: \"DiNDfLboOnvczVWhwRR7UPDsljgYz3mJazI037LfMMPVx4NUoArV5\");\n            yield return (HashHigh: 0x26929f2dd87b324dUL, HashLow: 0x9fda9b678b73b9cbUL, Seed: 0x0000000000000985L, Ascii: \"vTQ7jBRVAlRRUjQVADVtixvS5QlaqFhs6Gq7aDjmVZIpge5abpjZq\");\n            yield return (HashHigh: 0x06b4cd6c5e3fc467UL, HashLow: 0x56be575ee6fa1d85UL, Seed: 0x000000000000258bL, Ascii: \"JIgjs2RG2EA6NN56sZCE7hKybrSGCf9BgatWqRbp4XQVbtbIMKhhO\");\n            yield return (HashHigh: 0x27285dc018de9219UL, HashLow: 0x7cd194b0615ad828UL, Seed: 0x000000000000081bL, Ascii: \"ml82dtCvI9dWohM3KqakVqbrDVihy4ihUZwrf0RU8CC0qGJk2hi3Xe\");\n            yield return (HashHigh: 0x726589d84cd8842eUL, HashLow: 0x73bd723d06f4be4dUL, Seed: 0x74b9e97496068171L, Ascii: \"9Q3Bp5kfmgzShiQhH7knhi65LLdxoEy2WmOR1eI7rvsnABhbF8DbP4\");\n            yield return (HashHigh: 0x85ee3327d20389e2UL, HashLow: 0x113170bbda455d40UL, Seed: 0x00000000000013d5L, Ascii: \"0VYRaLR75oh74pxV3IlOWn2I3la5pjPqvFo1XqpSo3fiaQ66J5gXej\");\n            yield return (HashHigh: 0xa733454846dae2b2UL, HashLow: 0x23b201ad49f2f557UL, Seed: 0x0000000000002278L, Ascii: \"WEaHPT5CFIgnYDGEAbVomBtvu1LhyejKcwpzKXrPJRDWRHQ8UQrLR3\");\n            yield return (HashHigh: 0x24d6877b1b867cacUL, HashLow: 0x127970fe898e86e6UL, Seed: 0x00000000000013b5L, Ascii: \"nGS6WGHxSo8vPLfVgA4dgokSCV6ojBbUu35fpVQuGVjkHGvYd6PlZ3w\");\n            yield return (HashHigh: 0xfc997aa8ed327795UL, HashLow: 0xacfad4f08b1b8036UL, Seed: 0x0000000000000a8aL, Ascii: \"LpeQUOYVWJZ4CFpEGC9An1gSaE9j7FMjG5nhX8duWZD2hKaGrSXIg1D\");\n            yield return (HashHigh: 0x7029e9558049f8b2UL, HashLow: 0x82c69a5efc7dbc17UL, Seed: 0x0000000000000576L, Ascii: \"AMFxrECxyQHyBnIGcz1m6cqwJ9nNuF5WrJgMNF548ajy4o0OVJAJzph\");\n            yield return (HashHigh: 0xc2d6647eb7d4f584UL, HashLow: 0xa5329c92ca78503cUL, Seed: 0x0000000000001641L, Ascii: \"Z7dYLz1eVa1zrPrAL19mFtmz4EfWNxIu4omhJO0Gfg23KXYpU3IpVfw\");\n            yield return (HashHigh: 0x4fa2e792fc67b61fUL, HashLow: 0x475d6b792978de1eUL, Seed: 0x00000000000022c4L, Ascii: \"SSwQgScmLMY2diX01UVpg2v2bnAgs6ZpsWv5PbDM4IwHslW8mWgUORIW\");\n            yield return (HashHigh: 0x8e2fb6a3958fd86fUL, HashLow: 0x66dfe2895b914d3dUL, Seed: 0x00000000000010c3L, Ascii: \"2tlEXjmV8Uiuf0c0wnSb9QvQobIYsg4BhbHOYnsj7Ry7WizG4lODAa8d\");\n            yield return (HashHigh: 0x0b9b77280fcbece7UL, HashLow: 0x5f18823657b4b79cUL, Seed: 0x0000000000000edbL, Ascii: \"YQyUWpSRyow0JDpO9iE2niSNsrV4i4n9T2phg5AyGNoCufSHwIcjXPX1\");\n            yield return (HashHigh: 0x649682da2374eecdUL, HashLow: 0x6d84ada66f79bc4aUL, Seed: 0x000000000000217fL, Ascii: \"qChqIWMKTD93cd25eOcPmsXDPJN5doh1sweE2IOUeMHVtEzV2X6xAM8I\");\n            yield return (HashHigh: 0x08382b76418565c7UL, HashLow: 0xab54d56cb850d9d8UL, Seed: 0x0000000000000000L, Ascii: \"48o2hjGrFlqK9fWKtPaGO0yeS7EinKtpCrW1pJTNZP8FdyNWRtRq7hLsy\");\n            yield return (HashHigh: 0x79111349f9281f76UL, HashLow: 0x3a75797b49ee8569UL, Seed: 0x00000000000001daL, Ascii: \"UxbCoJqztrbLN4tXQMN1Ub13Pb1LtlRHZxFpJqjxIyNeL9k2zbj2XtiMe\");\n            yield return (HashHigh: 0xecabee748a68ffc1UL, HashLow: 0x59f5725026099ebfUL, Seed: 0x5e11ec7ccdae524bL, Ascii: \"zFuPfgSUIJrUVkfOItIrV9AkQrEc9lWOJREQIhSoCrilCPOlCoBbxXPr4\");\n            yield return (HashHigh: 0xf5446c5fae78142aUL, HashLow: 0x02e36e8338721944UL, Seed: 0x5519a7394afe885bL, Ascii: \"hMVfSoFYmNPvgczhngnL2nmAdLM77JnCd5OzB4ZZxLd2GKCGyDgMCGld2\");\n            yield return (HashHigh: 0x823567a88fcd8dbdUL, HashLow: 0x5c1b8f98b2621cddUL, Seed: 0x2f50b68dd1216820L, Ascii: \"bDcIN878DQrQwGWieIjIRzucEWCxdqkmNsUetKNBo3Fc2dGHvLptSMbL0A\");\n            yield return (HashHigh: 0x35b745ed78267835UL, HashLow: 0xcc343a3d6e2ba718UL, Seed: 0x3022ec39e9bbb80fL, Ascii: \"5kGjt6moDX5CGU8My6gK8e0ia212HfJlIv6tmzLu57b6LlgbsQamVrqeWK\");\n            yield return (HashHigh: 0xce44bb2f7aa4f71eUL, HashLow: 0x64b301f9e8758900UL, Seed: 0x000000000000180eL, Ascii: \"C4gSolKgHsQLi8oQ7625q0cVMNSgrhkYKJkyvKAjydg6CkKEFzxCqxjbNA\");\n            yield return (HashHigh: 0xcd093e3296c0d0fdUL, HashLow: 0x0574c56f1dff7aefUL, Seed: 0x0000000000001918L, Ascii: \"GS0YDzYitXptN53db5eprQxfCof7LvTmC8PnvMb1h1NPxjpQUUcDkR3wMr\");\n            yield return (HashHigh: 0x4084b18c7c0837f3UL, HashLow: 0x7725a01c1c0e45adUL, Seed: 0x000000000000259aL, Ascii: \"QHoMl8c7TxBkBCVhSwpMW0XlQUnetmkwEjEW1sbBMygvmWPnmkdrYp7Dx6P\");\n            yield return (HashHigh: 0xbde00740480028a4UL, HashLow: 0x020771ef2a9b702aUL, Seed: 0x0000000000000000L, Ascii: \"qpWiY8KnV7C9gd0XrPZKIJQxgsGrMeFawP6jOy6EsCr2WhnBNc33wMHjkQw\");\n            yield return (HashHigh: 0x4156b45aa62a7133UL, HashLow: 0x3f01825dac720066UL, Seed: 0x00000000000011b7L, Ascii: \"dgqIgOoGQ70Vn5DHxW5ljVjhHW5XszxVMEjlfnKUgEJkJlql3UPxX4zArkA\");\n            yield return (HashHigh: 0x0d313481af88003cUL, HashLow: 0x7e28baa49714ec8dUL, Seed: 0x0000000000000000L, Ascii: \"d3zh7ciWb42tmd8GVOFIQFlvRaJFd04AWJQgLZ8uEXYlYdxwuhyYMMDBFqZ\");\n            yield return (HashHigh: 0xe86bde316c1f97b1UL, HashLow: 0x443e6886b63a9fc8UL, Seed: 0x0000000000000000L, Ascii: \"iFcgmFMBZmi4M91evoCByqY6lZDHtG08qMLgQqOMrMjjzlzPerTY5XiE0p3C\");\n            yield return (HashHigh: 0x9b5d41d2752d8d44UL, HashLow: 0xc16cc36b39155d47UL, Seed: 0x00000000000014b5L, Ascii: \"CUnB8aP78JwmdOzqsHCOMkVXWbcrcNrGGmRaedmFnONXsBk2auUae3vxjQlB\");\n            yield return (HashHigh: 0x89507679f46f5d05UL, HashLow: 0x836a8893fa8d6624UL, Seed: 0x00000000000003b3L, Ascii: \"CgjMVFpO2wAny4P0SId20EJDrHUKPKwhXkYLf8TMSvetL75Hbd8UeSkjiRoR\");\n            yield return (HashHigh: 0x17c82c0e67d429c4UL, HashLow: 0x80ce344684af0e34UL, Seed: 0x38f31597a69f595dL, Ascii: \"NLU14nP7C72v3yTjzULrMTgNWyxwNnGc9UC9fXLOxzmjcAi67X6nzAZXxK9m\");\n            yield return (HashHigh: 0x7962006fa372ee11UL, HashLow: 0xb46b2e1d8775e0acUL, Seed: 0x14ae24b2073113f2L, Ascii: \"Vy6ZyYEuXWrz7Quv1BR2MRUCeCXiXnh3ZGuNncajoO9OInkaXHfWYGEtcxtbG\");\n            yield return (HashHigh: 0x5618c2cdaafd2c95UL, HashLow: 0xb787439e2a246d8dUL, Seed: 0x0454617a8f747ce4L, Ascii: \"G2A72g8ejMhySFBmSH0CuvAEEjXbaFKmyicWp43YVgygrbq3FpUS024Io30zR\");\n            yield return (HashHigh: 0x516baf43bd10624bUL, HashLow: 0x2a00c2900ff5297eUL, Seed: 0x000000000000140bL, Ascii: \"ETo4HYuNApzBgyaagRiEwNlXGninxHyLcsW7vu8p4HqLsHmUoZ2wxIzrXo9HN\");\n            yield return (HashHigh: 0x8cf6c862bf45b9cdUL, HashLow: 0x9da377f58d050b2eUL, Seed: 0x0000000000002233L, Ascii: \"mswFyfJ4YTrRr5DnUhl1f9o8YjRsRhYL2nEqoGQz8iDamdkU8dRj4GNrM1QqZ\");\n            yield return (HashHigh: 0x4fd59ec51c8dd737UL, HashLow: 0x1f70ecab403dcae1UL, Seed: 0x00000000000023f7L, Ascii: \"rR2Cc5Tan4C1RpIXm4Vqbk0hQ44bcJT8FaPC68YYoVZqD8AYm4FNLFmWXK4w9u\");\n            yield return (HashHigh: 0xbf1fea5ffa0f20b2UL, HashLow: 0x29f4e52d9b1ab07aUL, Seed: 0x0000000000002484L, Ascii: \"cDr9lGyW06vlulQKmPYUrm1q0XvRKBkz5LHvVfejtWjGovbtV3Ssttyop2SFRJ\");\n            yield return (HashHigh: 0x24f687059c3653adUL, HashLow: 0x9d0e1708dace29aaUL, Seed: 0x0000000000000000L, Ascii: \"aTSzxIuznzTgF8UMqJc70DDDKWguVRuXJOtdAiCBnlg38XcmrD23HEZm3yviH2\");\n            yield return (HashHigh: 0x81b0d787f89770c9UL, HashLow: 0x3e6264041a341edbUL, Seed: 0x49a9d98fa20a1fccL, Ascii: \"Af9PJlbMfGS19PiYKRS7MYyDlXB1xBdihQtv3PPPUQsDghsLrKnTIhPUuakcE8\");\n            yield return (HashHigh: 0x9451584c5739cbb5UL, HashLow: 0xfa0fb8244b0fa8ddUL, Seed: 0x0000000000000becL, Ascii: \"dChRHLmoLX3g2ZOqvhHheCcz4Pc7Qipaz9hRhIVPogE48DjMDDs5aNDdwYrf9la\");\n            yield return (HashHigh: 0xac49326ddbfc83e1UL, HashLow: 0x9b215d645d69bbafUL, Seed: 0x0000000000001cfbL, Ascii: \"E2KhIsi9hBmz20c9ljrFZrHI0FzzXbhvDJCjYOovgj9bcncjPrLCMhOzOOHUV7j\");\n            yield return (HashHigh: 0x34b01ba4e7eef64aUL, HashLow: 0x891b9bd73dab9a6cUL, Seed: 0x000000000000048bL, Ascii: \"IsI2YiVzaCDbfL33z1lO72OhvvfcCyFrLuDBZTgI64V7GFEinbuAMDA30ZFauvS\");\n            yield return (HashHigh: 0xbd742cb486e440d4UL, HashLow: 0x299f0ab4fa69a6cdUL, Seed: 0x7fac3c7a00d71af5L, Ascii: \"Ae8sZwZzuLjWxRzS8Xvw3erSRWskQCxSLZ0o5XrABGJN2e1LByA28esW9caWILS\");\n            yield return (HashHigh: 0x27c0b5d6cb685cf5UL, HashLow: 0x073ff68dcba5fc45UL, Seed: 0x0000000000000000L, Ascii: \"TvExjicqiLQwVII8NV5YKv9VKavvOsQOpsUgdDHQXBcWygTFFcfe4uhWRRxRnCNC\");\n            yield return (HashHigh: 0xad7f6da929b98115UL, HashLow: 0xf8293c6b7c36bd7aUL, Seed: 0x0000000000001897L, Ascii: \"XPqxjOibm1bP65xGaaRsetVdaPzr44WYu4pBFBNyPiD8XOfb5UDhFVEoLercZco9\");\n            yield return (HashHigh: 0x7034c2cd355498c8UL, HashLow: 0x5621c29aed575106UL, Seed: 0x0000000000000c25L, Ascii: \"i0ZFqvtSlIKdXfPuKoZTeTEb9L8WLptyzEq4FZWznuBban1DwTWhy8KFTNS287KZ\");\n            yield return (HashHigh: 0x9d45aba34f8e2a8aUL, HashLow: 0x9b64d2419d87166cUL, Seed: 0x0000000000001edeL, Ascii: \"FrSgpf1CccjeB6aIMtu0YyDhnD8YVF0Jz8zo7tDGOVzhKwEYrbEVfhYVsVAuURQr\");\n            yield return (HashHigh: 0xa0f795c89f3f412eUL, HashLow: 0xb6d8083ed313742eUL, Seed: 0x332504d827fe35ffL, Ascii: \"UV15wti7vDPvp5vdZDqLsOmiSiBymdWYH8uw5TjPqV4QpEXDy42REJAkj6PiWi8SE\");\n            yield return (HashHigh: 0xefd9696109b7996bUL, HashLow: 0x65f719cb4f91dba9UL, Seed: 0x0000000000000000L, Ascii: \"v4n0tGBDBWlHljIM0I3XM3oKIBTT8Y4kSWkT42r7PyoD5I2iSJyrUclS3n8h6Xmzg\");\n            yield return (HashHigh: 0x0a3a42cc1bec7e58UL, HashLow: 0xb2e1964a2844c57cUL, Seed: 0x0000000000001b2aL, Ascii: \"9kQUYZUF3VA20kgGgNujYD22HiU5onoxWxvQFmMlxlu0fzEv7962PSTejq8gwfvrk\");\n            yield return (HashHigh: 0x662bbebf73761f2dUL, HashLow: 0x94a6d46c5ca08393UL, Seed: 0x00000000000021dbL, Ascii: \"Felb7yzSkykG2IkOlrcubpQRnw2eoG8OVsB3cs4MKKeaQiyl5WVbLKeajEuH2R5cA\");\n            yield return (HashHigh: 0x3f946b95f9853555UL, HashLow: 0x25735971d47c1577UL, Seed: 0x2d5b9a19d86072e2L, Ascii: \"m5VOpDrDiurU62bcoqXWfzW75UUtAYcL9uh5SmOubsGBCL9lHeSAeQ7l4oh80nuHa7\");\n            yield return (HashHigh: 0x44d64d2e7fa804b4UL, HashLow: 0x813485b7da343d49UL, Seed: 0x0000000000001413L, Ascii: \"YA3eHmH7HwBnvh9kNXMlv1RZck99qhkZ6fJyUaUnehTIEd4gIWNhaUU06MrbwKt5ox\");\n            yield return (HashHigh: 0xdf4f4c1bcdb46354UL, HashLow: 0xfc022fc6626d032eUL, Seed: 0x0000000000001de9L, Ascii: \"pgOW10uGa4dqCcNvrYlYMGErIwRX2kjIQvutKi7br1O87xo2aq6Sy8Odqr9TF6mI3W\");\n            yield return (HashHigh: 0x3cd26c3b1fed9ce3UL, HashLow: 0xd4ad389bb6d92331UL, Seed: 0x0000000000002584L, Ascii: \"OKBXjBXOXm0mmdORpNwqdwY2oItFNEn0plGPXWyWRR8fzVJLvdhOBO1jQ5XeoIdCPu\");\n            yield return (HashHigh: 0x4f3244ed4204034aUL, HashLow: 0x47729c59fa4a66ebUL, Seed: 0x0000000000001676L, Ascii: \"2mueH2ma9BTIgNpadxRCb0RFafKa3j91pRC5on1RmRfjBZEpn63mQ0CLuLJwIqnZMFZ\");\n            yield return (HashHigh: 0x8d5f8ab651869182UL, HashLow: 0x3977a319c0dc0b9dUL, Seed: 0x778837d41e84868aL, Ascii: \"oFIt4hmqFm5YkhRSlf8egNhotDP3rpgIcsUK4bJjrxErvjVjFOkqZOLeBnSSEoDIi5d\");\n            yield return (HashHigh: 0xf9da99f975cddc86UL, HashLow: 0xbb4e0b2f69d57640UL, Seed: 0x57c7768f23d56971L, Ascii: \"MH8bsvNnxc9zlZbxu3xpSPvEdAH7T2XPG4X8SPbu0fHxTGozYB4OM3f4QCnMYqxPPKk\");\n            yield return (HashHigh: 0xae525a13f7807c49UL, HashLow: 0xcaa0dc2628611468UL, Seed: 0x0000000000001ed5L, Ascii: \"qoaBsrdaeTH8fkhlC7cdQip2rfta3FFf0wlzKcFT4dBDvogACjVRLx2e0vQ8X8zogB3\");\n            yield return (HashHigh: 0xe4bd50a79f26360cUL, HashLow: 0x9f542f42be05fa45UL, Seed: 0x0000000000000000L, Ascii: \"ryH9tH9CiBS8W0mFlB7lSmjxAtjZ8hVCpRr0SHzX1nqlAnD8LZqV8Jt2bGnwvr97NEdo\");\n            yield return (HashHigh: 0xd1049488ccc7d2b7UL, HashLow: 0x3be25cbae5ad35e2UL, Seed: 0x00000000000025bcL, Ascii: \"khdx087Y0Ha75yBiMVEsIpvhpyAc5kUd5yl0nK9oSbSudDzAP6aS7rwZJvdeQaKWoCkL\");\n            yield return (HashHigh: 0x7cf1b340f68dd1d1UL, HashLow: 0x73db2e7b055102b7UL, Seed: 0x0000000000000f5aL, Ascii: \"ag6kjPG4042HDDC1Y3G1HQLJkglVR7d7Fcd2lsuGieXX4jcURYltTkKybdec9GMw5PKs\");\n            yield return (HashHigh: 0x9c316045c2e43cd2UL, HashLow: 0xd669fb672162800cUL, Seed: 0x000000000000208bL, Ascii: \"8TVDv9CQaAsdESpuhUWT6fkqCBTE5y8wovp81YSEdTchBLcoA6sjVtB9BYR0WPHamt7U\");\n            yield return (HashHigh: 0xe850c19ebcc9e68fUL, HashLow: 0x5f11d5d1cfb14fc8UL, Seed: 0x0000000000000d1fL, Ascii: \"iKJJLsCO8sDlFFzEKAUATO1jWDEQgfrufqdnZU66xbma8LqFrac7kHqiayzPuP94udCv8\");\n            yield return (HashHigh: 0x19ee95b0a514461fUL, HashLow: 0xa31f6de69bad3490UL, Seed: 0x0000000000000796L, Ascii: \"ndk6VGpA9umWEGNVU3i07c5CnUCotxkuWgCECgKnpevbEZu5RCCvqOoP9S4lv5fvwhxN0\");\n            yield return (HashHigh: 0x8018e61ec6dadfe5UL, HashLow: 0x621153c6e99db83bUL, Seed: 0x4d98cad46acb947bL, Ascii: \"crOzxbA8fTVCM38ypXFpKIJieKY9IxwIToT4JhTstdb7RV2jlZXfwJu1gMYmxTjfQO3nN\");\n            yield return (HashHigh: 0x73cad6b8f8c89518UL, HashLow: 0x45b6c28274569ad8UL, Seed: 0x0000000000001f8fL, Ascii: \"JWBq1w2WqWsRY51JvcLnPI5ceeEdop3e7pxZASclMAglJh8dg9UKS6LzMB1ekr7gprpuw\");\n            yield return (HashHigh: 0x656930d6b8c344cdUL, HashLow: 0xc4bf3e12608525c8UL, Seed: 0x60e925ed68699381L, Ascii: \"spTdj3N5564MmYgvK9tKn4cZfPlp3Fjksyfy33TBH6UwwgYIc0asipqBXrjVlyP8GNibWD\");\n            yield return (HashHigh: 0x42ff86309f0aa22aUL, HashLow: 0x6655208f444d54d8UL, Seed: 0x0000000000000703L, Ascii: \"C30wXszDqwix9JqtvRST0YzM2j1W47KYRJHeIPMYbsDx32JnVHysFYui34Qaz3xHyXlQmR\");\n            yield return (HashHigh: 0x24a1cc2f43a7fca8UL, HashLow: 0xdb9c20a5917874b6UL, Seed: 0x00000000000023beL, Ascii: \"V3cBt2iuYUdhvnnTDjqRE01fAHn133BGUZVNXeP2Az5zvyLv9OCEiu5DQYWhYHaLpUNWTJ\");\n            yield return (HashHigh: 0x0c3c0d87724cf1a9UL, HashLow: 0x676fdcbd5ac41358UL, Seed: 0x0000000000001c61L, Ascii: \"xz2M3W2nRYKXusjtGRHvjmvQqPLPXXamYCn9EcOni72EpzD2yQ5qnkQ7PzwbwQCCTIFUPF\");\n            yield return (HashHigh: 0xa7308d55801e9233UL, HashLow: 0x383b7b221004bebcUL, Seed: 0x00000000000023f8L, Ascii: \"hE01bC95EVZV34bnQKpKn0Pkr3bZA5ZNZRS7qNZLi19zAS8lgBliLIlLAhEe13KmsspLeye\");\n            yield return (HashHigh: 0x013a83b0a89bf177UL, HashLow: 0x20334151664ef3d1UL, Seed: 0x000000000000257fL, Ascii: \"6e2BkJaZwEy5ufx6acaXPli5MEpECXo1aDiiOwprDIdiBU5TgiHydJ2dSmqpTXzaS3f7voM\");\n            yield return (HashHigh: 0x6be4d6318546b9aeUL, HashLow: 0x674c4bda5f8c5d9eUL, Seed: 0x3d589af0acce8d16L, Ascii: \"BVt798Xm1REq9bzq5Xgn0Hr46JkvgCbJtCPViGhz7zKVhoLofiTDVNpagnGwLDBCDLgKLH2\");\n            yield return (HashHigh: 0x2e23f53cec9463b8UL, HashLow: 0x287bdc4928e9a9d2UL, Seed: 0x0ca51c7b9a233d1eL, Ascii: \"AliAeUYgonrjyqZWlDRdNBefJW6QWqPo9rKKhPL6PMYoUfqi2vjEbejADiT4wRkbVnJjDUX\");\n            yield return (HashHigh: 0xe42813127508a603UL, HashLow: 0xb6b4aad8440979ecUL, Seed: 0x000000000000104cL, Ascii: \"L5Jx44k6L0rtSagbPrytT3X6tEmYwKF0mN8oZgTAq3RSUWzrxHHL9VMdSDLFUVmRv5KrlNfr\");\n            yield return (HashHigh: 0x5041bde61f0224d0UL, HashLow: 0x39e4a99d9e239aa7UL, Seed: 0x0000000000000000L, Ascii: \"kXdFhAz02ox0GuVeSPsaVLcKMJePZkLQXbcN3kzmFMgWA8WpLfuJDj5rS1KGmwBqyh0Inl5D\");\n            yield return (HashHigh: 0x967232e425f95f5bUL, HashLow: 0x50de1f6f2f79a6d8UL, Seed: 0x0000000000000000L, Ascii: \"ttMF9MSoQC8ubvtmrxKFbn9EPg5aYzJY6jvVjvaCgK68cmC7me1ikVRYqs4biHGwOpNKsqpn\");\n            yield return (HashHigh: 0xd3309e7856c01260UL, HashLow: 0x300de539db1fafe3UL, Seed: 0x0000000000000cffL, Ascii: \"HH7EP8PtwXPiJEcLrGXMYmyUc4ESerMA0mwIWj8esmTlUph4IIv3AHAmOcPxImannSodYltW\");\n            yield return (HashHigh: 0xf6c1e33977408eedUL, HashLow: 0xaec18cb88a016bafUL, Seed: 0x0000000000000000L, Ascii: \"GrkDeCbWqUEesxt9uf1hLN9bixDxAYsgIMc50DFyteH7INNFLP5jgAFkBgrGHIhmpVQxeY1a9\");\n            yield return (HashHigh: 0xf28771de74a9860fUL, HashLow: 0xf32a36b2f95b0797UL, Seed: 0x0000000000000000L, Ascii: \"Teff5S6uVmhge4MmwnYTRRMLgStlo2StE4v5TGXWGVz27pM36vzOqTqTObKFrY47uCHn9YAZr\");\n            yield return (HashHigh: 0x25a4204a88044e76UL, HashLow: 0x38828f77cc0d07c1UL, Seed: 0x000000000000111dL, Ascii: \"0ENitpVTcRiZ8Wf5NyvmcgMJODJq3j4HtomCzkGQAhh4HDCn6QUNSxpYOqk8g1ddyErIS4ekJ\");\n            yield return (HashHigh: 0x758303871e694df5UL, HashLow: 0x01b8ce555cb43163UL, Seed: 0x00000000000021abL, Ascii: \"Dl5V5SLtpMUiJJgdLRXWBzRWbf7FIosJ2KyFd8LAm84AfusyRbhJJhF4NKmzcJ7yTyH89GuwJ\");\n            yield return (HashHigh: 0x7527bc28c988d8c3UL, HashLow: 0xf7b55b29dd76bb17UL, Seed: 0x576729e915b125bdL, Ascii: \"AR4lc0CsPcQMjn3Rc7FQnWU2jsFwkSimhBZtYtOKSo7GPQ3T3Fl4jzIuVYTrBGT2gXIxeQudoK\");\n            yield return (HashHigh: 0x871d66b12ac6d191UL, HashLow: 0xb47fd55b85b376efUL, Seed: 0x0000000000000000L, Ascii: \"5jdoyrUYoR169zYY9rUMIKy940a5LRnhbY5s6zExO3PCmfvL2bpDPIY3LIwynXg2APdkgNSWSL\");\n            yield return (HashHigh: 0x4574e29a58b80778UL, HashLow: 0xd7d3910d6fe449a3UL, Seed: 0x00000000000002e2L, Ascii: \"knIJ4zeR6ftmVtUOoKtpCWRKmdLxJdQCAevdcw4afpzeGaM3GJ7EhPUSDW0ncbATlKSur50xmZ\");\n            yield return (HashHigh: 0x6dd65f8547aafcb5UL, HashLow: 0xb9030cc384c7282bUL, Seed: 0x0000000000001470L, Ascii: \"Y9P6C3lY0DnxGxipk30OhIE5JIzjmMHzjOe7BYdhBrRoEooQsEL5TdQpUlc2UkB2FyMzt3lERW\");\n            yield return (HashHigh: 0xa546f8fdd36970aeUL, HashLow: 0x5bd4d823e1fd1e3dUL, Seed: 0x0000000000000000L, Ascii: \"g5Bsfq3p8iytDC69UBlTn0sYVCLesPEX4Yje3nMyh46YkUkFlJlI1zh2fQwtApwjdVu0l2y569Y\");\n            yield return (HashHigh: 0x9569712dc5d29dd8UL, HashLow: 0xf7e44b3e2cd0593eUL, Seed: 0x00000000000007c9L, Ascii: \"ed8guoucGjtPkhLP5M6ukfYlfZ9nCrvKdSpJU9no7BqyYG9JbF34J7Ld4mFvvcWWMXA6R1tnEey\");\n            yield return (HashHigh: 0x254b12991530b279UL, HashLow: 0x0be484d81decdb28UL, Seed: 0x0000000000001e87L, Ascii: \"9gh52nsaHapnqgccLo9C9lukB5Uvn70il79LwLlIKDbwOmtsPePhm94wqtJ7Z534GHTEOz5mt09\");\n            yield return (HashHigh: 0x0e23ce7c96252c7bUL, HashLow: 0x15336657740ef407UL, Seed: 0x0a558d8bdefcd2f3L, Ascii: \"AIS4D1HaMvqRq6c2goG6qVXtmauWzSBHjXuURz7oUb93cYi1TRO33CgSnTQldVcyAEvXiN9hv88\");\n            yield return (HashHigh: 0xb3317c9bc31bc1a1UL, HashLow: 0x78bf6bbecc423c4bUL, Seed: 0x0000000000000d63L, Ascii: \"4gLhTmcXNAjO5hzjFaNyJwZQA0xgvgXqY4YktLe5jBqXktO4ljSRIuSInx2jiYnMvyVQQDlSCCga\");\n            yield return (HashHigh: 0xd9286e690430b950UL, HashLow: 0xf3c3887725733b6eUL, Seed: 0x0000000000000000L, Ascii: \"yICRSATk9jlBrmGQkmpVq0ZTyIFbrqBYjoLaKxEKixNAfof1wwEHTuPYnDdaQkpwiqFyGDH0QO8m\");\n            yield return (HashHigh: 0x8f211ad1709cf312UL, HashLow: 0x594a888807fac3e9UL, Seed: 0x0000000000000000L, Ascii: \"shbkpE7GQJehIvAcFb4NpuoJT7ax8nJEBaDOCa6cwp4Mi60W59t8Nfzsp16QFABa4C6KNoRl8Ufe\");\n            yield return (HashHigh: 0x141e13e1a35b49caUL, HashLow: 0x8b0bdef6a1e1033bUL, Seed: 0x0000000000001cf7L, Ascii: \"2Xuzb0FSCOTN910D26le5DFMx9qJEPqugm6TZ202MUExumgdOSvpo0d7DG0vtaZUFeRBK006io2l\");\n            yield return (HashHigh: 0xcab76de0f506675fUL, HashLow: 0x8a2720222b7ed695UL, Seed: 0x64436f175308030aL, Ascii: \"q7sxIPRAM2Og77sNTXWkQWVdHicRlPFhWfyxtVlbcj6UgWWg25EiZ2PP3qrR7SHnOqZlySIYWJo03\");\n            yield return (HashHigh: 0xa72777f0a454d754UL, HashLow: 0x346747f97b62ed93UL, Seed: 0x0000000000000e83L, Ascii: \"loMRiwlZaYhfjwHuBEPYjtNxS75MA6vLS6EGZmj0XNmMdHAHaPAq8ERDFQi9orBkT8rWBgKNsYkJj\");\n            yield return (HashHigh: 0xa5e8e05cc58b2358UL, HashLow: 0x0cf288cda39a8c4bUL, Seed: 0x00000000000019f9L, Ascii: \"4vAi26eGZ5TlYTqznrLKYcpxKJ4Y7883pgHBDOoGActgK5ZbrqppP150qbmNytnA1vqc7l8eT8oEW\");\n            yield return (HashHigh: 0x49273f45a1268f1dUL, HashLow: 0xc1b1d4204b55a88eUL, Seed: 0x0bcc809852294e09L, Ascii: \"rROwD6YwvSMx86Y5MmCqNKmUtIWMtMOXtLClOksIdal8lDboxqFWSSVKmwqdVBDoDR7elRYYM4PLD\");\n            yield return (HashHigh: 0x7fa8662e4f6198c9UL, HashLow: 0x43eb0ba00cf98712UL, Seed: 0x057a5a6ff3541340L, Ascii: \"bB3lurVvoz64fwEouyj9AsGxsnLdy1NDOAEA2n4Mj7tzENnt3WQNlfD78Vz02IhytA1bcoVn8KXQL8\");\n            yield return (HashHigh: 0x7e63ba9a9c125384UL, HashLow: 0xe14d309ecef59917UL, Seed: 0x0000000000000d6bL, Ascii: \"sfZiQdoIaLFkM1XS159ya1TGvv8SrE2ahJP1D5fxelGzvPndJC4l47HyPyZ5hOxgff2SuuqbIhdKPr\");\n            yield return (HashHigh: 0xf689d7bd37bc5e29UL, HashLow: 0xb3154d844b44a137UL, Seed: 0x0000000000000000L, Ascii: \"jxRWEK6LJazWynCNTJLyg8nWsWnB38nYXq6cvSIzOtW091yMZEfgHaz5O05oI59UL7m00Lw6FYyGZ1\");\n            yield return (HashHigh: 0xf4e6f14b2de069dcUL, HashLow: 0xaee0383aeb3224bdUL, Seed: 0x0000000000000ef9L, Ascii: \"ZaxQFYVo7FOe51lc596Dvvtll8dQuWWcPS0mfBVENDWxNHvXhMQm4vfW0sauM4uE3qdeOUiDI6Ndqd\");\n            yield return (HashHigh: 0xbf469f1cb7b83fb1UL, HashLow: 0x5df1e0887af913b1UL, Seed: 0x0965aee13d012a9cL, Ascii: \"JtXkLq3fXKJ3yzMHbr3LbgpnKSdktDHkmD2v6yljj9eT6p5gbAAFPMQKrQMaxxiSYkutYamf45cW1Ar\");\n            yield return (HashHigh: 0x62da62072023f354UL, HashLow: 0x1bde6b7c1e5a4c69UL, Seed: 0x1d7c540438c70dd9L, Ascii: \"HxYHgpI1GuU1GBvUCDV84DJXd08NA5pxEWQZbTknnZhw5pWVFLyBv8jS5UP31xUa5iwrgbTskSDcbG9\");\n            yield return (HashHigh: 0x94be9830dd69f531UL, HashLow: 0x4b5f682e5dde7d95UL, Seed: 0x0000000000000000L, Ascii: \"W2NSFrUjANeP4FVIhnoGVFe3MS48y7q61jghNQzH29cDqocuaTjAdPwgIaWjcQea7D8puxKPF2Re6ES\");\n            yield return (HashHigh: 0xdb2ebd2bd3e57e0eUL, HashLow: 0xd675575222cbbe92UL, Seed: 0x2850993126a7f996L, Ascii: \"xKnvXs7ULC5O0on8tr8Cys8FbUehnJLCiETUAFRNiXvCE9SAnl1yF1lmkgv87lMG8KDdAbyX9QimPQO\");\n            yield return (HashHigh: 0x68a08d24212e9da5UL, HashLow: 0xea5f285345171dfeUL, Seed: 0x00000000000020beL, Ascii: \"1xOzPHzGQiqo1SQqDzFB1gTdAoAo2MEmNdtYO1NeQ48mBWG6F5owFO9aLVlVLDHzcZEkpAon20g3xOF2\");\n            yield return (HashHigh: 0xd45e849f19f8a977UL, HashLow: 0xa31f3dee8d585cedUL, Seed: 0x0000000000000000L, Ascii: \"1CLclXs7CcEU5wHEhO9ENbeP6XItnXoAmc1dP1uWNiakHyAiY6FFL3z34V9iPRltZw36ACYev0eEukf5\");\n            yield return (HashHigh: 0x2c84e5615200a066UL, HashLow: 0x00b12f310021fefaUL, Seed: 0x00000000000024d5L, Ascii: \"9XiE8okSHwClRCIEt3FEOU07BDEB9CgAC8Adltc5jOGVeFnNktQu9aszHFgVGX3PZ9ILBMucYwOAxYYX\");\n            yield return (HashHigh: 0x0b7bfe53855f3276UL, HashLow: 0x53b8ca3fb45c10fbUL, Seed: 0x0000000000000573L, Ascii: \"wgMLhX7QoJbXANDELpVj95pKNQKAoYdB5cVO5Nv73p4373iciCh1fU0TacEEXyDzO1tgFUfKUKu1kgpA\");\n            yield return (HashHigh: 0x1842f25d793df9feUL, HashLow: 0x8c5ce9b1c76520adUL, Seed: 0x0000000000000000L, Ascii: \"Y2K1guD2KTnldiKASvOepwIC4pPCLKVitKGNfXv1qNsCgPoe6DoqKlFAT73NZB7BALAFv5GWbtoT2MG8h\");\n            yield return (HashHigh: 0x9186c05896383d9dUL, HashLow: 0x8a8110a59846f1a2UL, Seed: 0x0000000000001a72L, Ascii: \"IUnCEf9bGM1nbosXqMT7AKto4tW8Me4AdiSc4YuxBukkt6AyWgXAWJMnxMzX8B7rAzf7DzfsIPX8TiFGz\");\n            yield return (HashHigh: 0x1f18ff2af4e9888dUL, HashLow: 0x940766b08c4a429eUL, Seed: 0x388ec634c9324d40L, Ascii: \"kHjJnGo4IJKuiK6TvKKTm9IomXlTSKoUmXKRGjdq2Iw4y57NsORDkhGtfCylmlA6n7murXdpuZEU8YlVn\");\n            yield return (HashHigh: 0x632cccb4332c2968UL, HashLow: 0x13b22d68676766b0UL, Seed: 0x0000000000001a30L, Ascii: \"CD7bQOQNV2YZFCRsUp4ss4G0bwASuowA1gZIwx9q8k5IQ8MKQN0vQVmTJnvsYp6Gs0RSX34Mr4qbg9joj\");\n            yield return (HashHigh: 0x5af39f9bbae4f81aUL, HashLow: 0xd093e13c1536ad5fUL, Seed: 0x0000000000000e05L, Ascii: \"dtSPsb0jJzCZ1JrmsLMXJVXuyyDDTBW36P9ngdyM7VVc9ZXIBmVPyU13Cxx8uiSeMRgc2NvFuWbQf7MZ5O\");\n            yield return (HashHigh: 0xb7868d55a03242c0UL, HashLow: 0xdff91124d56f9b38UL, Seed: 0x0000000000000000L, Ascii: \"JDMrnJeFOCgc3r2GJYyDJ4UwkWeZaU68lLVpygpyYos3C5t2yBxhes7YepAURnhmf4PouTq3ghDk22J4VT\");\n            yield return (HashHigh: 0x0345f31b311c330cUL, HashLow: 0x24ccb1d3f231ad25UL, Seed: 0x00000000000014d2L, Ascii: \"RSuevETNns05LTDdUoiqtCSmB59b5mdJIhwGHYhmggWXvOHLc3s86ZpugUmMVQMJkMFdy6DrcbDTqnOBCy\");\n            yield return (HashHigh: 0x28b4d8e543d45381UL, HashLow: 0x855a48bda8c3e8efUL, Seed: 0x0000000000000667L, Ascii: \"WmfzdvD8CMaFfI8fLcEjCialZSDn7lyQNmiQleDA0fX9WLGKWeRaCXM7gFJW25L5HGupr1RxYkRcqBGnrC\");\n            yield return (HashHigh: 0x915dc0c0b6505f5dUL, HashLow: 0x104d65e5cc50cd1dUL, Seed: 0x0000000000000e8fL, Ascii: \"0vyTy1PsyfMtOSsWEORfWH2hJjF8mqhrAZKvhNTFPCEi4B6xu6ANDRnhR16eFNFA8AMkYri8PdNOeN3NNxi\");\n            yield return (HashHigh: 0x07bdfa3c3f713399UL, HashLow: 0x3493c8f42eccc150UL, Seed: 0x49379dc49721786fL, Ascii: \"DQPjKzXQJ9RHiloP3yzIo1mPn95mEf6NeNfJCghHj8NKyKS1IoBM1pexRmViojfnnmDaOtQ1UKkJ1ry0tdu\");\n            yield return (HashHigh: 0x528b8bb1c0c86654UL, HashLow: 0x8cf42bfb51c03b1bUL, Seed: 0x0000000000000000L, Ascii: \"GU8ISi5OBIWYBeK2RZnNscT6DEYN0uB11BpgKekeh56vm3ksjXA7YYE6jNiJ2jhgFHYupsUqW6GzAdPyhUv\");\n            yield return (HashHigh: 0xa0ac2c857f33c4f2UL, HashLow: 0x8126fefa77148c22UL, Seed: 0x0000000000001609L, Ascii: \"VjsOLFvsdyj2l7KrrZ9fyLsqc0f5w9ALbFPV0LYTiugCdip8R9WCs9DrpgxtgRlUvFGUnQUTx1KSySnOfbO\");\n            yield return (HashHigh: 0x96f4a37cc4f8db8bUL, HashLow: 0x91c540795d6b46adUL, Seed: 0x631139e5539f35e3L, Ascii: \"3E3UtumllL6ZlbDR30TvTbYn9SHqxRpnG7d6GyjSIcNB5PvcQaZd1IRFbSzgUom3rKQzIDqCrywuO3hLNnME\");\n            yield return (HashHigh: 0x8bcefcdb74768654UL, HashLow: 0x5dfdd795e8663503UL, Seed: 0x02ab9de80a052f42L, Ascii: \"LF1Yr3508zzhL4or5VAh0H9ztfDeHysy5gM45eOgWLDmIo5dZ4QuRWDWzx0pJos2oZUiTZQpcf8nF2MQBCOV\");\n            yield return (HashHigh: 0x17c18f254bb48173UL, HashLow: 0x00342930e641f794UL, Seed: 0x0000000000000d6eL, Ascii: \"jeS5hvqlGabtRxiAyPQhQWMmnoRzZ6QMlaMsOodS82kdmKXGm0XfyglRCLutG6ZXI7l7vqIbTdLz0nvGLMm1\");\n            yield return (HashHigh: 0x6a778219c1f41f8dUL, HashLow: 0x9a5383245ed64680UL, Seed: 0x00000000000019ffL, Ascii: \"cpUbKnjYjWCEp4VqvJ7X3cBsiPYVLKOXDc5ZHAyQWh4z48YNFYbu1YExQKDo8aR2zdaYLRvntqFko8wRCBio\");\n            yield return (HashHigh: 0x170ce8869c5182a0UL, HashLow: 0xf081c9bbf5a6730dUL, Seed: 0x0000000000001532L, Ascii: \"jrS8UsCkonNS7kj6IpzzbIIZbHpJBsREwk5IC9rNyjklOm1PCvrmTBZK9eys51G7HMZIZZBjSCcWHn6nCOkHx\");\n            yield return (HashHigh: 0x618169c97024de71UL, HashLow: 0x6c2482293bfcb890UL, Seed: 0x42375fa6978a8ce0L, Ascii: \"dd73diYCxIP1ws4uZjCgSMDSosJ94thLDPduo0jTqwdKZunPjMAupanYsSdm64zpN6NeQ1LGEKuG4wt6Y3SVU\");\n            yield return (HashHigh: 0x45cf12292709aa13UL, HashLow: 0x44cdb4cf6ffe8084UL, Seed: 0x0000000000000d6aL, Ascii: \"8qRe9e6PjnuT6dAQ8P1KdWwafr2NmdOaUqnCHrX8BoxHAPPr06gM4rSurQ4wO5btRSvdaAOkdgWSpQL3LmWwQ\");\n            yield return (HashHigh: 0xca1783152e8f9fc7UL, HashLow: 0xc465a48486685404UL, Seed: 0x0000000000000000L, Ascii: \"Ys2i2ULXx10I95yTezfu5fMxIxY2lKI23rjhPzB0tSSR1mmCVfNk0MylEWDLrLJKDm6zwoaf5dW3lWs1gvOvn\");\n            yield return (HashHigh: 0xc1b52bbda2464d3eUL, HashLow: 0x6b63bad910131834UL, Seed: 0x0000000000001467L, Ascii: \"RTsWdlmUBgkRcvDDd6NP4GyFgarm1I9nqAEyD84zhOylaT7JSxayq9eEPaDRCjXSZ4fittmekdaz2SNpMPnVOw\");\n            yield return (HashHigh: 0xa1b72125226f4fa2UL, HashLow: 0x69762c2d3aa794eeUL, Seed: 0x0000000000000967L, Ascii: \"WzUnFL0OucevcOamRIuPYS07D125Qle6Lq6xT8y0oRJj6pcZfrTde5KDSt1g7IuvAVR34wD6TRqcdsi3Ul5SUk\");\n            yield return (HashHigh: 0xb5dd5aa5cda92562UL, HashLow: 0x800ecaeecc1b7c4aUL, Seed: 0x34710ce41037c450L, Ascii: \"HOqOvCuFWK5zJrbPrTuqRmS1Gu5iJnsy10GCBEqfd21vB6yhJX4UE44UIXxHiWaTd8kVZb98TstXHPpsbY9cnI\");\n            yield return (HashHigh: 0x6dc77d1f80ed4891UL, HashLow: 0x3000caec11163ab9UL, Seed: 0x0000000000000020L, Ascii: \"pznGNp5jjnmpUPCia2hhUcCNifekLJ7j8WrBlDDMaeeWKEVAcnkezBSpeLIMu1Ug6ddZDdrKgB4vTKgATvuJr0\");\n            yield return (HashHigh: 0x7368810912e098deUL, HashLow: 0x8ae8a6dbd0d48635UL, Seed: 0x60e2dfb361ec07a6L, Ascii: \"icHYkTi8vGXsvjXjbKI00iY06R927cl8tByHNmk7oXIDCZF2Hv2qwpp0eQFP8BpXRXPKS7kZqF9LIOAUHPJarVc\");\n            yield return (HashHigh: 0x29d9973dde617bd6UL, HashLow: 0xee5e48516fd2e3acUL, Seed: 0x00000000000005ffL, Ascii: \"PV5W9JFi16GN7eVIGpPgyCjhaWBMGPmZgvdvTWJdLK6XcySgEbpvO1NMN37TaHGs4pQsZDPCIX70Iu6bo97TeTo\");\n            yield return (HashHigh: 0x3178870acc7a84a4UL, HashLow: 0xf6f5087a44b74000UL, Seed: 0x0000000000001258L, Ascii: \"oWBsc5EmYQwmbCptYMN4hmpN1pyeIhS1yL4dFajXbhfmgrxVmT3YfdCZeefAQkcxEAqxScBVDLVB3dP9xIpzg8J\");\n            yield return (HashHigh: 0xcba0807f61a1b062UL, HashLow: 0x3479ae8ab0bf3142UL, Seed: 0x30d1280a2255cff0L, Ascii: \"Fdmm0omXgPBESo0geVOZuT28dNiz0haDn2DX4NYyfTEzSu3XKmtg8Ppbwrkw2YTe6Jpc6HAb9uTiMln31GaUTzd\");\n            yield return (HashHigh: 0xa7f0ca468eec77c2UL, HashLow: 0x6859c3963f7faa42UL, Seed: 0x0000000000000ca6L, Ascii: \"msE9S2EKEiEI0Ckcv2tlMykdR2hAwu7bKOocWKj6JT1vkuHitZT6ltdUVKw6xzHrCgHDMCd7pDZlTyBddDq73OB1\");\n            yield return (HashHigh: 0x0f8e3050421a83edUL, HashLow: 0xda8b768a60f3cec3UL, Seed: 0x00000000000001e4L, Ascii: \"eN66tT6yA5bkLXKxju7LhsVsDCXh9b2nKAcxUMlLk6kOG9hgwf90jmR24jnufoW2Mhy4inON8yFz59jIWUWQiIAe\");\n            yield return (HashHigh: 0x9c3d5fec5b1f90afUL, HashLow: 0x882d1a13b178dfbfUL, Seed: 0x00000000000009c4L, Ascii: \"T9XJsRN6EtJFuhAnOfJmc4ebq50rHPxhO7BIVuqZzMmyIB5e34HAMU4gZHmKI5i3f2LXd8agHjiv9txK5EoCaCgX\");\n            yield return (HashHigh: 0xc6ac9193dd9fc316UL, HashLow: 0x76f8e20206c5da87UL, Seed: 0x5745190cbbf503feL, Ascii: \"3b6fCjZVHW3sGOBouCLm9qnQhu2mqWDXLaiWZ3AULlb38LYnnpaY3BUUcFlOz6FQtjdjIFrlH04ht8fd1WTmaM7G\");\n            yield return (HashHigh: 0xfb331eb4eb3431fdUL, HashLow: 0x31a8ef86b87b96acUL, Seed: 0x000000000000119aL, Ascii: \"1h5xhrLp5Pm4aUTB2VxKj4tt622qO9eBswifEsh6AyOhoKUokwRMjVhIuiM3kPqXElD7yh2U9XyfxbR7gqUMVgXSA\");\n            yield return (HashHigh: 0x58ddc3d41dcdba8dUL, HashLow: 0x2c6b3f4671b39106UL, Seed: 0x000000000000042bL, Ascii: \"CMMnPlYPFfpMQ2GFAxEzzBR6SYlEemynU4iiOkxcQnJ0gQOsA1HI4zOqCx0p5xdWvw6KKCT6SznlV9Rb8Pmfc3ret\");\n            yield return (HashHigh: 0xaa88d4963f375c72UL, HashLow: 0xbde3d05118bf4068UL, Seed: 0x0000000000001dd3L, Ascii: \"805Kt79f2xIrEgaoLoYb2fukowtErK9PdjHeqTZNVxPVEHod0KSJVjSzNPYKP0hJmiALt65FpIFUUBsu5XZJqzr3H\");\n            yield return (HashHigh: 0xb7a2f516497fd605UL, HashLow: 0xa60e2c642d1a667fUL, Seed: 0x0000000000001c59L, Ascii: \"hrfOJ94OlRphBxBnrfLRNW30oUiDf8S8mLJL2CLnwga3PDxaZKuTK98GwP1Rr3mRFlRj2WXR69knsqmY60CeaC3a4\");\n            yield return (HashHigh: 0x23ea4bc18ababb57UL, HashLow: 0x1112ba61cbf0cf39UL, Seed: 0x54cb3bfe8ca3fa31L, Ascii: \"mncxHLZA2MOTR3FQ2O9VAXPekOvJwy4qwis7dztqNGDz6rIhubuBrTwgD9MXwgdN9nmdAs8JvmZzMEodiaHVI4aJJx\");\n            yield return (HashHigh: 0x942f78a93d14cbf6UL, HashLow: 0xf1ba9ec5bac55538UL, Seed: 0x0000000000001494L, Ascii: \"tkUoWSt4GsMaFYvzDYB1eKymiyFlW0kYGpWCH3RR3bKhGerJ7ZD7nKeTfyonVau3Q0XDbs2YufUVDKpbyo5K4pqHar\");\n            yield return (HashHigh: 0x2e07c8bfb2268b2cUL, HashLow: 0x5cb74d98056bb95eUL, Seed: 0x00000000000012cbL, Ascii: \"QCH1shq4UBmQW8lq68B8Nk1sIBLqoRRqCpC6tSYQoxNZtvrVVyL32ziy5tFoJQYedW39KrycO8Bz7EMUoCIAvpdd9k\");\n            yield return (HashHigh: 0x920622c9f36b56bcUL, HashLow: 0x10a70e9a0620c7aeUL, Seed: 0x0000000000002142L, Ascii: \"A5PjqMnYlEFIsdQY3D6w34CLQRDC18OgGRwg1ojrsTg3S1xloYXDzoaM5qxzEU4sOSCW03BWyrLV9orKJYUowrwVWi\");\n            yield return (HashHigh: 0x9c46fae26c81b37fUL, HashLow: 0x3f6392fb175a62a7UL, Seed: 0x0000000000001da9L, Ascii: \"RJWlnW50Y596v38EioTodlxPOyjRhs4aXZfuuQnNmRkcno0j7Wlas5fCBBKHADdQ357mzP16uNcsE9ZoqVKBj55hR0f\");\n            yield return (HashHigh: 0x61e4124e57cf026fUL, HashLow: 0x5993582b1ebd25c3UL, Seed: 0x000000000000078fL, Ascii: \"sxfHb96ETfH1gsllblJmHJ419swjLnVPGNh9L8kSdNgFNeK4SObPrb1YiHiP6q2GVWuuB7tDIDTTCT8Mw4Rv0StywGH\");\n            yield return (HashHigh: 0x15524c0b37de86b5UL, HashLow: 0x78d20ab6aea27ff1UL, Seed: 0x0ca925d9e177c363L, Ascii: \"fxPzz16TkqExxzvWxgmVTppXlpxTpRnBdmGNTCmJT5Mv3JDlZGuUfhWmOmkBu7Vh2t4isZiJ48jIr556Ut2IfZDOWjm\");\n            yield return (HashHigh: 0x212b74d3e29abe3bUL, HashLow: 0x5005403a4be89f03UL, Seed: 0x0000000000001ed6L, Ascii: \"plbKTkmoJKnv4zlCt9IsROTrT4pkR0AdiU38pDjI2nlXdixf2uZW07InGOSI6E4Evn6LMqkUGuvzpeFkjIUB7OlqRdR\");\n            yield return (HashHigh: 0xb9d447379f035183UL, HashLow: 0xbfeb293d6d9145d0UL, Seed: 0x0000000000000602L, Ascii: \"bsz8XLhzwmbIaM690caHhkWWxzXs8VUinQQLhQ9JfAe3lwPttXOcqf1eSngar4T3Ut6IVMWwfW43ENQneTjuuIwOWS3p\");\n            yield return (HashHigh: 0x04550a2eb4366501UL, HashLow: 0xdf427b26fc7d2895UL, Seed: 0x0000000000000eeaL, Ascii: \"QtnJzyD0qIHgIFuhTa95GWjzsMtz8EWYsGi5Kg5uY95A2ucHKibo8kr2ymepSYC8fKt8yivOVriciCagMB8wHORKO38o\");\n            yield return (HashHigh: 0x321254913e82237fUL, HashLow: 0x3ec8caf9d47fb80dUL, Seed: 0x0000000000000387L, Ascii: \"UpXLB8btnEY2reXU3HGbjZ1viz1cyhkrVYn4BpSRwrFSesbm9uJvE3LQ3emRWt02X0eIQUAnUSA630GSrp97uWs8XIkC\");\n            yield return (HashHigh: 0x683cd987ec805005UL, HashLow: 0x5fe9b95d1ca22b8cUL, Seed: 0x0000000000000000L, Ascii: \"p2ZHDFlKSGEH1FHyi8VL71p0mX6FConLxy0Jhaiy0tj6JMIWA62SxUw3jW3uluBBUtPyiyHCV7SFjFRmgTZK93VpIeWX\");\n            yield return (HashHigh: 0x97d6a759d614ef44UL, HashLow: 0x94c798407f15ea28UL, Seed: 0x27d35b7ad1dbb2d9L, Ascii: \"v6MgHS6LMB7OgVENx4TbtYMd1kcVwyvKNAXxsv4h7Pz67utR3mGj8hgxqFlC4jzIXPDQeJVNARK05tQ2mpUEQIqTjwM8b\");\n            yield return (HashHigh: 0x6af5c270ab71723eUL, HashLow: 0x9660c9265b8bed33UL, Seed: 0x0000000000001da4L, Ascii: \"sk5J8Df1UtxtOeUYFieEwdlc19AuNdW8wFkgFFFhAYBLHRjbQXbZjRug9jpWrwCNdo3gW6LdS5mHzyDi5UD1y2qpquCdr\");\n            yield return (HashHigh: 0x19898a18acfc4a04UL, HashLow: 0xd748028a5fdcd75cUL, Seed: 0x0000000000000000L, Ascii: \"AecznQe8iEMZeWWTmpTPQSXOWJGea9f7LtndRQ4phOtCM1PbAQip1QNIGqng8YPweeZHN0JBggBNiLe1UCTsJz1XLyhLZ\");\n            yield return (HashHigh: 0x95d84222c74042f0UL, HashLow: 0x0b5558daedf73398UL, Seed: 0x0000000000001e9fL, Ascii: \"yV7nZTSS6GgjMkj1npv2Z8rtqA1tOeQw7D4xyLL2lUYppZ9j42cazdHhf0kbyhpKtwYrFQ9mMcAdFwm74S2mpJAcII7FI\");\n            yield return (HashHigh: 0xe293dad6a891a0d5UL, HashLow: 0xc05e3c361468cc24UL, Seed: 0x6f88fd13e34392a1L, Ascii: \"1Q2UdjUFr1gBxskQDm4Rla2CmaXbimwoMVnVqGP0MbpTIR5oor1dcTSlldIV5iP3PTwUoICH26X4gBnhg6I1t5fLIYvYOd\");\n            yield return (HashHigh: 0xee815ae931a1e977UL, HashLow: 0x6cf075a40ea8a205UL, Seed: 0x0000000000000000L, Ascii: \"O58pvF3a8YRtgya9zzl01iZ7QObwQNJ1Zk5FlsQmApHVXMtyugINWuw2gOzBNwMTa9CYemEDEJUqTE5bLojrHONUi6BQgr\");\n            yield return (HashHigh: 0x321a1ae5d00f84d1UL, HashLow: 0xe1f0652e45f2e07bUL, Seed: 0x0000000000001700L, Ascii: \"GhtLuZMyG1XQnAyyIa7RCqT5sMQrywQfcjehPBvYWra9XHYq2l6ARUdod0Sa8FeTLSX05eiERBM23MmVdsA2OKLScV1OBx\");\n            yield return (HashHigh: 0xee6e68e834f8ebf0UL, HashLow: 0x2e5672e0594c719dUL, Seed: 0x00000000000026acL, Ascii: \"SZSYg617FijnkY3bDV4fXvrWGk88t78nvfURjMdp8c5HCGZMB8uVXEVYXdfqcrCofd4OF7gC4Vkr9i0tW7HwaHFl3jFPsI\");\n            yield return (HashHigh: 0x2f4437e100f689f9UL, HashLow: 0xca3141196da99169UL, Seed: 0x0ca6fa8ccee7f53bL, Ascii: \"dBaNLClzLlWyHovtJt6GhPRW0xZpaTFsHIt8dBUvezPPrGkqkgoBZ3TZ1KdgMjGCD4U9fODbDcahLmSnLgg4GDRBA90vPIh\");\n            yield return (HashHigh: 0x2f2ba8c754a72445UL, HashLow: 0x7052f911f07768b3UL, Seed: 0x000000000000112eL, Ascii: \"VfqlsjAkcKGLKdn3Uaw7CqBBsM97ZbBdtmCYeqtSDKSkw5F7Jsj7Hog0zQdRslNVL5jsjEYBTSJSHdQ1D9yeenW9SfvE1KP\");\n            yield return (HashHigh: 0xe3f11d71ce227e70UL, HashLow: 0x171a7fa319f2be42UL, Seed: 0x000000000000109eL, Ascii: \"2Ek7E3bnqhTtPcWwGmqBTU2SCXsfq5FPUl5huI1S0ybZi20XzG9GLjFJNa33NV3ymgwkMVZKBur8KHbEnuaHhDfbIbarc94\");\n            yield return (HashHigh: 0xe48f2814575fa7fcUL, HashLow: 0xcf3280b3d697fc20UL, Seed: 0x0000000000000000L, Ascii: \"Az7ehWUO16NwvRHyVdIJXEliFvTFhSnh4xxU2tZzZa1c7hlFZaS0ogKlYUSbmlGV79UGZkXNaWKFnhyNhP0n36MNWLv3gWX\");\n            yield return (HashHigh: 0x2e21dda526d1d199UL, HashLow: 0xf8e2351224f8af7bUL, Seed: 0x00000000000004d5L, Ascii: \"aDsLKOX8ej6wfnhD0RZledxUxAepdUjpVTnQfWwi9fx6nOY9VzhsI33fQKusiX6FipsaiKoeAb708o8q29PgACXUnndM2BK3\");\n            yield return (HashHigh: 0xf98d1081b7e97df7UL, HashLow: 0xf05ddb7db22a8904UL, Seed: 0x0000000000000fc0L, Ascii: \"DlXZF0c4JMLqt1lfVbCwp36tpCs2Hni4DaAiuAdXjQJLT4IfijfPusvPaOZOXujM3gPNOJCfQJloybPl4lmmVVnJABVAphzR\");\n            yield return (HashHigh: 0x9092e67279a8bdfeUL, HashLow: 0x16c10849bf7f6a46UL, Seed: 0x0000000000002340L, Ascii: \"enTD8N3YsFrowNU6lIBkYvdIOJlzAm17C88wWa8NLrWeUDwF9mASo1Wc4r7lZ5x5Hk59TaAYW5xFfFoCZeP9hEk0fUbSJCXw\");\n            yield return (HashHigh: 0xeb832d4974110b07UL, HashLow: 0x9784bba63cea8468UL, Seed: 0x0000000000001d7aL, Ascii: \"byZ3cRkWHTmzZYK2uWWYNI4wiCktVbi63lZWLgNzwWpOfEORLlzG6Nyqy9Bl1G3YmgwEIMbwXFXTpZ8krRkTC8NutauCE3aP\");\n            yield return (HashHigh: 0x9c2df00e35b52375UL, HashLow: 0x3bcbeb4935e89aa2UL, Seed: 0x0000000000001c7fL, Ascii: \"YhKrs3ZYmrSa5VSRZGM4V8OYvXckAvoQNPtV07iCUJeKDmYOk1fNmkVLwSlBWrjslzkib2pRljteQWICxd4nR3iBhRu2SOHjE\");\n            yield return (HashHigh: 0xd5ccc7c2d6ba64b4UL, HashLow: 0xc946e19397872b36UL, Seed: 0x0000000000000b83L, Ascii: \"8xNVKxaxHKCpuyN99eRUFC7J0aUjryo19gTm0DTe3uClUzIAMQ5s3GRZtm0yYvLoMv24ZQDb5Eoe4BlX0vFfkFekryVZbnHhp\");\n            yield return (HashHigh: 0x1f70c855c4f02a37UL, HashLow: 0x498f1ef6aa9bc0f0UL, Seed: 0x0000000000000000L, Ascii: \"lEeV9huQLVCi6UVI2b97K1o5ELJHCm2sWBSUC8IVFGZavNez0OGxkIJblx2WowrsVJoL5xLAr8rLfOX6J8B3wSJaPzM3RsjrV\");\n            yield return (HashHigh: 0xb3617ee62879db46UL, HashLow: 0x474081d31ae10344UL, Seed: 0x00000000000009c4L, Ascii: \"DIoXdkmKdPkqgmD754zIBJhvXejvnEVzCQVg3i51ShwxkvfsWK9VIkVqIROx5wpav0PyEyWWtfQ0M7pbVsLM9cOgowZQ8BR2A\");\n            yield return (HashHigh: 0x81d34192dc4414d4UL, HashLow: 0x3d9bcb70503e3be9UL, Seed: 0x00000000000014d3L, Ascii: \"q1JfFrO90sN7C9FSs5fdL1jQqiQblGaKd6r4hc2exz9MSjBZ0AZi6tA7QK88Yp3lclgjP02GCS83QBhCfBeITWoA9bpz4tzDwV\");\n            yield return (HashHigh: 0xd4afd63e89b116aeUL, HashLow: 0xd14b88e21c4cdf11UL, Seed: 0x1b540f1754eabeb5L, Ascii: \"muZJfTugpL1NztwGkqgXUcEZmNxJOEMCB7itdUP1vKp4d29NVA1SIWZAefELEt88YRZngUBsczSgCdojJfwk5b8XSkoNortOfg\");\n            yield return (HashHigh: 0x8a44b60c93c70c67UL, HashLow: 0x3beadc8c4c651c85UL, Seed: 0x3f25c8cbbe8d8cecL, Ascii: \"dJOhJRCO3QObtEcE37h7boKXSFBuyKkEVoPsU69Yy8jOJbBD8ImjW7AqvHYUtGk4FlJlTK1h2XzRgtXpIUxMUNeH9KQCeXgGIx\");\n            yield return (HashHigh: 0x521eb041a525c965UL, HashLow: 0xf0e39452ed2b6455UL, Seed: 0x0000000000000351L, Ascii: \"RUju8gCDfD28Gh28UsjsteaYN7c7PmnabjqBLgCvM8jzMfpFMF7OakYmtMAx9VBC7Xta4iT5Gr1sn4l0mLvhL9gEe8BMSuFFL4\");\n            yield return (HashHigh: 0x5c181f3e4a8440aaUL, HashLow: 0xd301a5b5c073c673UL, Seed: 0x0000000000001448L, Ascii: \"lGWvIexcyBKiKnUMvSQzo9BceGBuAf4WmAqdgKgppmhSrvmdOdEVyxvxq7GftnfRx2HxoiPARdO3DK1bzPKMbclWs9NEM4oQB08\");\n            yield return (HashHigh: 0x87457b5242582cd4UL, HashLow: 0x6e9f8881bdd18ca5UL, Seed: 0x0000000000000399L, Ascii: \"P4cbUGRzgVYZQQVJSR9DnankJ5dWEAiQfnt8RMIfWaObfrrPTc3QU2IqL7Mp4oNtAydl0XGoFQbF2hJr3utSZclmSMieRJNGHOL\");\n            yield return (HashHigh: 0x47119211ddc09755UL, HashLow: 0x2758dfba3fca74f9UL, Seed: 0x0000000000000000L, Ascii: \"FiQri1z7OnyQOHXTum3o9AAZCz8iMWsIdADPtrIp6nHWgf0kf04CiWTdTEfhupYVt23z3UzycQzkV6rOg0uZvcK3gGA0ShYmnuR\");\n            yield return (HashHigh: 0x46e8a00faae944c0UL, HashLow: 0x695b1cb5d398ab60UL, Seed: 0x0000000000001382L, Ascii: \"1MJLEsLLvs1aM8KICum2XF7Z148NFlYwPnqmoZ8SmLyqogW9SKtgI7VdK0HSQM3bHig4K5w3NXIRCd8BQ7kbW0hWkBszY9pWca3\");\n            yield return (HashHigh: 0xc09323868727f1a3UL, HashLow: 0xa5c31c47922d486eUL, Seed: 0x0000000000000b98L, Ascii: \"KoKne76FGJfH1TokABK1wmFqwzJetkU6OO9umoiMoCBbnJywDbWEZF71TwAlVxp2HgXCIR5x7O9d5RRisvzHD4kwe9wal69kWFs4\");\n            yield return (HashHigh: 0xb11377ea2e1cf86bUL, HashLow: 0x8ac8600a6490a4bfUL, Seed: 0x5676131a5b81e39cL, Ascii: \"vMsWYScvCxCi5txDAf4i2Abg6mnQpY4SMAxJ74eIelYZlAvN2ZzinYbCsNDcBAnFcnoR8EDsxdd2dKB78pSx6QdoejvoGNxXE7sv\");\n            yield return (HashHigh: 0xf709513ff59bd6eaUL, HashLow: 0x8c34128bf6531877UL, Seed: 0x0000000000001345L, Ascii: \"xl8l6PuZIF5k8eBlRdhsvXElTOuMCRtKNSeNRdmnzYr5WSCkNsCMu31fYZkg0UImOkJmNKtaXno8rVFSpRz27aIFJbzBTJ9o7PGa\");\n            yield return (HashHigh: 0xe57cc891e1b83d08UL, HashLow: 0x061be75c4be74698UL, Seed: 0x0000000000000afaL, Ascii: \"CixcGldVkzXHsgO9NFfeEtr7uJAIyby5k2HTskxIkjbOL4mirmkUlcy5lrzRuhGJFpzEYfAutGqKGAYdnx9UkhApx5eDMzEYRG5b\");\n            yield return (HashHigh: 0x3f4e7825ae54c76dUL, HashLow: 0x249d3ca32369e8e7UL, Seed: 0x0000000000000f93L, Ascii: \"VJ2gEMmhpR0G2oN1nuX9wvYKu2e9cWenEgN3KQOk2Lp91TzB1T2gJTVgzH5HV3jR02rXLsVjHGCsPer4tzru56uUk3LVLsGWZ14gO\");\n            yield return (HashHigh: 0x13c9c11bb14919a0UL, HashLow: 0x92e08401f58b3473UL, Seed: 0x00000000000012f6L, Ascii: \"M8zzd22RD965pkcs1LVUciCYntDxLPJqlUB6S6mpCfkB2qAvrVA80oMMYHFKk8DkiKZIqJzKz48mdkZDES48Q1m3NIFRWWdqewFmL\");\n            yield return (HashHigh: 0x4f4f17302f31347dUL, HashLow: 0xab71555ecd316796UL, Seed: 0x000000000000191eL, Ascii: \"4j4ol2DDiy5k4o1zbXj2dDJwsh4d9uL3MiWkDtwiHMrM2lDoE1HuGCG5nuL90ZTzeVvD3VMAYa1qTTFBaT8ksK0aLbyJg13zhO3VN\");\n            yield return (HashHigh: 0x9814f312e4091a78UL, HashLow: 0x4802c28390d48c3fUL, Seed: 0x000000000000118cL, Ascii: \"2MCeN6Wy4zmwOjfQVMqcfO0kMtiVN3wsYBolyqurxKLHDkHkzVUfNBu7xcvxOkoIjMymYvd0O0YODxC0fB2HIqwm3JGYODHAkgkdg\");\n            yield return (HashHigh: 0xb8e217d54ceb3a0eUL, HashLow: 0xd67a7d64e145587cUL, Seed: 0x00c8c7ed5cb31073L, Ascii: \"dNpfYJyD1cl3a7bTG1S7GBtBnOFTsZgbk74LrZlcwmBP09aLuW5CeYaFHVKAAken0PyXel7YFNLPTUiz8KVgMffK2mWux6dHcqYqGh\");\n            yield return (HashHigh: 0xf68f689237610442UL, HashLow: 0x1b83ce753d0b66cfUL, Seed: 0x00000000000017c1L, Ascii: \"dv2CvYIaluVrrg2Qpa9sUipj9yD6VmOhp21RA6XDibYrrnOFvIlIeG1IbVj1I9AGMsfQQHtXxBat3RTz33akQ1WEtimP3dp2n6l58g\");\n            yield return (HashHigh: 0xabaacc0702860bf7UL, HashLow: 0x8a1b6766f5140adaUL, Seed: 0x0000000000000000L, Ascii: \"vRnEYJ42n6Lb8vaIhDfQQBgs15GstAYyqb1K1JKBPr4dfgjWxDxHgxThFgASYVtkNBaqnJRlSo8bLQHNbrPHj6sE4KcPwa9IrrSLPs\");\n            yield return (HashHigh: 0x6510e895634870eaUL, HashLow: 0xcc8cc9af1e246147UL, Seed: 0x13a1b6117c92c32aL, Ascii: \"konuMUTcPb4YcE8rPUlrBKyQs3VyhESFAKajW61QircmO1PZSylIAsN7Rydpmixc2VAhOVoRrwjJMLFN6OynVC0eJA08YcatYivyq8\");\n            yield return (HashHigh: 0x7c70072fc7af32ecUL, HashLow: 0xe1a25b6589371810UL, Seed: 0x0000000000000000L, Ascii: \"9at4zzJbKSkzZ7QzpC8XQBfTxNCKVfm4BNIQQJ3mXOVItuuthILZoLXv063v16nUkwAbZ35IhCHtDISPaaqyN3BvkduXr8A8JIKnicQ\");\n            yield return (HashHigh: 0xe8aba689e6cd28ecUL, HashLow: 0x218e40cb19957a5bUL, Seed: 0x00000000000018ecL, Ascii: \"Tq05bClJTAUlpR1BybMz0tR8O8Qba1tK5riABfzBzw3jYJUrngZD5n0cOWax4pNn6aBFAnfATk2N20lOlJ6Pl1wnbV2LPcCG0fliz44\");\n            yield return (HashHigh: 0x372ce5c8309dea41UL, HashLow: 0xde56a9c0a9efa432UL, Seed: 0x0000000000002702L, Ascii: \"RDtQGbzGx5lMpq5BRzZS3LRw6SyG94SVcWAiAHcP8zxwKAmI7AL4styZHcFDV8wEBVbWj5i74QFitVpmXJ6qMwtpZ6X91zz6Sg7zYv4\");\n            yield return (HashHigh: 0xddc317722ef9b5d0UL, HashLow: 0xf1030fba877928ecUL, Seed: 0x430c6bfa730ca3acL, Ascii: \"wcmuStaaAqHZT55kNk0cPMn6Ss4bfZqrNljRvHTWLdJdPpnJVp3NvumEQnyDjUk7w4XDMWZnijh7eSDRQvXBkKCb1OjmJhqJzIuzWLQ\");\n            yield return (HashHigh: 0x10908ac52ff79b15UL, HashLow: 0x84a7bbf319f164dcUL, Seed: 0x0000000000000000L, Ascii: \"4NV18d9gEA2fWXahWTEpIHIm2yvtgzALIxerEHBdgdw0OqLFTmh8OCws89kcUhqn76dgvTNKKO3Vez3GMjy5wfvXsR6sMbv1mQoPAv1w\");\n            yield return (HashHigh: 0x44d000dd10a3f02dUL, HashLow: 0xc1b52516ea38c03dUL, Seed: 0x0000000000000000L, Ascii: \"NA1JBZi1MP272ObONjM8pPiSEgpjV1CKdr2cQctD2KMCKH7BwhJPubNEfOnI4UZ5gRSywtYE7VIcz35Q6ptCEHzieGQguFxtYTRM5HwH\");\n            yield return (HashHigh: 0x560771a9ad57f3e1UL, HashLow: 0x1b5e7435e2199c15UL, Seed: 0x000000000000012dL, Ascii: \"lah5ogTyrmN1wV3Sk2RCYngrQ0eaHQHij9G7yaLSkF4ccmvBqlEPAyGJUZfnb47Ur1qKLhCnpsX7beYb9VtDTrjUmRaUWVtpEBLoOHs1\");\n            yield return (HashHigh: 0x70e331007fd1f062UL, HashLow: 0x6978dd32c09db54eUL, Seed: 0x000000000000021eL, Ascii: \"c7jOJNcVq66FO6Zsa3lijt1DzXFlH9Vq6IImFxw9fILZRhoyUt4baGcO6BwB1HoPBgimCNB4mcUzTdB8IzmUPCnlds03TsT0NUx2SeMf\");\n            yield return (HashHigh: 0x50bfc7008737b47cUL, HashLow: 0x76251a2d0110b303UL, Seed: 0x125e614646dae5a6L, Ascii: \"VUqqX9d4m02E3ZrqFVjjYEYUQWTb5nyICzCBehfzYujhDz8enZhbuqOl6aEf6LLlmqVKT7oDLi7rgQX4ov5LMEmROFNkOTUICQ437uzUk\");\n            yield return (HashHigh: 0xe4a707bbaeee8af1UL, HashLow: 0xace8c42503de33c5UL, Seed: 0x0000000000001183L, Ascii: \"wEy7HTHaOEMIqhXWHC06r3D7GbWfEDtLspXQXf24nzuLegqU7fbLogdbtMwwnO9oMpVMLM2gAN0MrwNs5jNzTI9C5gEghpDXjgvb1SnB7\");\n            yield return (HashHigh: 0x2d99ddbd77a97bc8UL, HashLow: 0xe57bffaf201a8d8fUL, Seed: 0x0000000000000a65L, Ascii: \"BTgr0thLDUNJWUHBpLNclyIGUK3wFqtAjV5qRIA2Tis26GOpS9daJCSAmSAnNtINFXPqQyXud7Yvk0oyZMaFvLWI1h8i7FT7sHq74jLho\");\n            yield return (HashHigh: 0x1aca5bef7e7d808cUL, HashLow: 0xc8905111d46f9407UL, Seed: 0x0000000000000000L, Ascii: \"6MUY5w78z1s4HJSrSHxYbsssWba85V4dHlw4m6BIovgyRF1kcPcAcrptVplsZ1QxTsWqJcTaJluJuT10ErL3LWVbRq7E0kSiSkXuxU7yy\");\n            yield return (HashHigh: 0x3fe97784ecd32e9aUL, HashLow: 0xaea94129a9ae369cUL, Seed: 0x0000000000001764L, Ascii: \"mrcfUdgjly8Q3Hozf82396puLhdh6rPb9YR7YYehjKgzzlaacbUkCNPEl9SZJ4nyhM1F3EqkQgrFspmF1olnGhYqErbk6Td6Hjq4X7ukZP\");\n            yield return (HashHigh: 0x17e04ad99fc6738fUL, HashLow: 0x25c7608e13e68e23UL, Seed: 0x000000000000115dL, Ascii: \"Bem3uWWi7UrkICxMyg5QjHRfiEK2MEeLyhRi8BE6EtZFMYCJdCJ0ISICUKjaS5OPOifKFMVUE4eWQ7rJ44neh6oKSYJaweeaV9Xt5q91o7\");\n            yield return (HashHigh: 0x9b302c19f131298bUL, HashLow: 0xe502d01285583be6UL, Seed: 0x0c82a4507bdb4368L, Ascii: \"Ws5KhyfRqtoo1z2eNAWJlIafgLV3QD0D06MRISpT8eIUNLkzJ37ZhYbXS5LkAAWidw4cKrJFIT7vRy70ugveCvEDlBZxds31ZkgGDmyaHT\");\n            yield return (HashHigh: 0x4c08da5b3c91ffaaUL, HashLow: 0xfc172275b297a708UL, Seed: 0x0000000000001610L, Ascii: \"ttvDZ7Y7FO1cbhVVL4qAYBJ9gfvjTvTdk3e4nbLVKtfnINNRPZgcw9psemLB1mdE4M4rh3LzSfQ8atHh8Zrbymsyxn2yw5hzq7uvSmBKgN\");\n            yield return (HashHigh: 0xb45b4b8c492e3e3cUL, HashLow: 0x64bcb441802577f2UL, Seed: 0x000000000000186cL, Ascii: \"m1v6gn9c24FcnmfrDUirtQnKMbI3aVrGwks3P7mE6lUpYgEkRrlJde46plOPzqMC67JBfwvbGYNdtXSZdGEJ4RLUeG9YAfjbSXO1p2vqYHn\");\n            yield return (HashHigh: 0x380509810789dae0UL, HashLow: 0xee75ee0cfe44e7adUL, Seed: 0x06432474765b54a0L, Ascii: \"Q4YVo8pphP5tR2lRq0hUuV5x3DU7uSUcdENYNYtb7rGVnqkrK5sNjbYawVWMDIDwMXslrl8UMM0WIXh1L1vO3uV12nwixlrfv3e8O8N0PxJ\");\n            yield return (HashHigh: 0x60d628f1ea9c3f89UL, HashLow: 0x48ccadcfca1078cfUL, Seed: 0x0000000000001648L, Ascii: \"ynkXthgDExjk58lj18xS52kRMXRza6m2Ef3fI2yWa1Zsttg5jPVVrbdwO2L3JM04fGX4rBkjPnhlYiTBTMLTLk1XSgrBicNa45yPTijloTU\");\n            yield return (HashHigh: 0x82ad4448c0e8b50eUL, HashLow: 0x501cfe3720c9bcb0UL, Seed: 0x000000000000088aL, Ascii: \"Mbm2N6Ql3AcvccjzCM5JJcqPiqbJwBAJbfLpdmUtvY6GFoHGhlOoY6DABNDWmB2c8bsEIKdDlqyknbrLzqJny0MksQMv1N7tGqZrrfKx7bE\");\n            yield return (HashHigh: 0x41340ae885ffeb94UL, HashLow: 0xb0e62ecf3fd4acdcUL, Seed: 0x0000000000000000L, Ascii: \"ilbYweKSYLsZjZ396Qms3bqxt3uPshmTRvvHmGF4Bw2pAFbtoErKRdZTGUGh0ZNi5X0MsU8zGBVUo6JvsYMx5hnFfurjcobbaXjAgI0hk4gW\");\n            yield return (HashHigh: 0x8cb6abab60599871UL, HashLow: 0x7b70dcba2913456aUL, Seed: 0x0000000000000537L, Ascii: \"S6X5lplz4f0v4fyu9ZfZzWhDknI945mHyW4yI7lSwJRjdc5drcIqHSKQutfVpVAEBJ83uAl9X8JELAQBstSOXkYTg0nB215XYZeGv9LYmYRu\");\n            yield return (HashHigh: 0x2c02be06641086dbUL, HashLow: 0xc8677db5a5d9140fUL, Seed: 0x0000000000001514L, Ascii: \"DZVFRcVzfvRveuyKN4KwzoEflsy0ejkjY1VeMsnd54920VkRdnP8sLeue0LxNPRjOqeCPdperH6wCfQiuEGXsZK1nCdc4eB193GwL40FrUUr\");\n            yield return (HashHigh: 0xc15c142ddd90905aUL, HashLow: 0xcc299831ee08ff04UL, Seed: 0x2aa91d47fa101199L, Ascii: \"545eAVBh4b7h8aehQQEg1dLzfuxwMUWHyaIWVGcIu5BAvfPq7SKZDTvcZwuI6TyJCXQDw6U5Rj6DSHD0UOdEKfsQdnFfu4biL2sJF9PLboRZ\");\n            yield return (HashHigh: 0x72d91bb5844a33e4UL, HashLow: 0xc56622f95c09c99aUL, Seed: 0x0000000000001cb4L, Ascii: \"7g7zhlNtdOEzZU1fed9IlHXbHhucy1rr2SCXnDs4tqAJK8x4aOVICZnFGRkICrQp7AFVY2LnYEttVsr95qnh8Z7fzpUlvEkLOPpPXLx4y7fih\");\n            yield return (HashHigh: 0xaad41aacd138ce6fUL, HashLow: 0xbfcf77e37bdad3e7UL, Seed: 0x0000000000001a3dL, Ascii: \"dxcMi9u4rCVHP33GxxszNRHc3ZrHRHfAdHCuLlNkrwNqcAHY571SEeNtywxxMLz5RRt0UDWQcUBoOoHDgHFTt60B372nKOIYgwk8lVETPJ5Nd\");\n            yield return (HashHigh: 0x3448cf1a86af7c03UL, HashLow: 0x119760edc0c27736UL, Seed: 0x0000000000000901L, Ascii: \"aajuMfDbNWoyon6w0jFUp5tBkzzxJolEMVPcQLGL61OjH5IVlxLcC9c9FCXS4B8GUIRFlB0WCgHZ7frwBKSAiruI4mi2VBhmSu2KC4paVBSPj\");\n            yield return (HashHigh: 0x7d905412f0c138daUL, HashLow: 0x018b66bcb9cc141dUL, Seed: 0x27a315498513d45dL, Ascii: \"HG0QpHMCdIRTDLZ9ZWWyCrbpRNPibPTr0I0Tsg9ghDLIp5thiynBVmdxOrf27XA3n6YWHWEXNgarBNXJKethif5911W8ltsfDPoHTku3soCHz\");\n            yield return (HashHigh: 0x8122292c9d03f826UL, HashLow: 0xf61f1f260bd2a6d4UL, Seed: 0x0000000000000966L, Ascii: \"7JWbki9hlTEOHarwjE9nxy9f4XEp2rdxNnm2LannA48ZYsvuc2ROx9cEMJXSmVfgiUDWCYkdRKb0G4Jati75y5u4xs9J9Mtl9c7bzFvwNm4YrF\");\n            yield return (HashHigh: 0x99b66dd905f680a3UL, HashLow: 0x1f8a9d7b956cc152UL, Seed: 0x00000000000009d5L, Ascii: \"l8hv8CxLrilgAOYRQoWzTeyA7AcDE3rp8rbW00GwdrTgBHA0xr1gGdvtQhfWEvkdHrJunoHhQzl2mjTwOZWqCiQyaJqLoCFOnDIJk2ZYmOVLKt\");\n            yield return (HashHigh: 0x6e87914ed1b4fb06UL, HashLow: 0x14b7694119ad2251UL, Seed: 0x4a7ce3b9fd7be6f9L, Ascii: \"jRMZhON2Jod0b5Eate6ICumrjHrrveYzKyqjlodKS8cGP4y8x7YXs688roH6JcmsCZBT6tDmteF6kCaQTqGgF7cb1O9XpknH1kqa7jV6TaHYav\");\n            yield return (HashHigh: 0x9a97b4553334e600UL, HashLow: 0xa76c9193c8f68244UL, Seed: 0x0000000000000211L, Ascii: \"SemvpZAtfvyZ6eMvyWnLy7mRF77zttNn0rd1jv3lo9dEHcaCNdZsKMs2p70EtPokO0GR8gESY2wCUAiJuumvaObDz3XXABc3UKVMjHVxBA97GJ\");\n            yield return (HashHigh: 0x18cc4088bf3fdbb0UL, HashLow: 0x4ca210caf0f46016UL, Seed: 0x00000000000025aaL, Ascii: \"Zg5R4Ht8dmz3Tc5WHr1Rk2ObqEmfxFyfRW88nuLstcddmAzqMbswIDUWQkP6Fiwhp5LHE7y2q73ibaZgyILICNu00a6UARbEJjws3MtYjPGO4o1\");\n            yield return (HashHigh: 0xd931bc822470a14fUL, HashLow: 0x610fbd7714f3369aUL, Seed: 0x0000000000001c8aL, Ascii: \"uxS3iI0HXjLRuGbFQQrouJfQ9g0POnrQdxeO0Fo5Os9vpsMbrbFuuOS051HilwLGi5bIxGIvdO5qcV1omPywnSMgz1FCFhnQGcWov98gVkoWYDz\");\n            yield return (HashHigh: 0x0a5f3b47812bbc8eUL, HashLow: 0x0addd83fd46fde45UL, Seed: 0x00000000000017ddL, Ascii: \"5ELV3bT55nI5e39OaEHYw4tukRZRQg5wKhvGvJAV4r2GOFKpyg13UmrFVzBEfapjOsUeiY4jNFhlU8a4kKhHoxqPwl5OfyaUsxLYNPBXvewFZzD\");\n            yield return (HashHigh: 0xcf9337d403f5e324UL, HashLow: 0x5cb562eb2f281bf8UL, Seed: 0x28575846a38e23a0L, Ascii: \"TmnJlRfYqwg7y8zX4aRywJF4lhL6zdVJBUWbAXwZXhEzTgkHfd8eOehqKZ7sbwpzGIBjaAcRRGPOzXTlsudNUhFKQiPEbEy31oEjtPDkaAp4DNU\");\n            yield return (HashHigh: 0xcb2c95779b1890e7UL, HashLow: 0xcf35783ab9a81261UL, Seed: 0x0000000000000000L, Ascii: \"y7mSkgmgATyI6RrBQiwinhZOGEyNq4gDPtMIfauXlKv7nOgdkXo8nygfTbkiedQzxC5rYO7Q224tQdX3pHIOYa1uhjAIEfIAKu2AFIMO0zJObPZn\");\n            yield return (HashHigh: 0x06301baa975486a1UL, HashLow: 0x116026a1589ab849UL, Seed: 0x0000000000001733L, Ascii: \"kvpSpqD7jHbHTlP9jZ73lSxfaFPUR06eWj9YuKOEuURLkqOEzlKRtNtlehWOqHBRvN5Ja8Ndrx65sBoHqiB0vP8vw3W9hM9FiKsRXSyVziJdMtf1\");\n            yield return (HashHigh: 0xc8f8ccbcfe60ed24UL, HashLow: 0x7d3182eae3cd1eccUL, Seed: 0x000000000000117cL, Ascii: \"ACvVLJN4YvbvrWlIBkloqpy0sEgxiXWyO4bkk2DdWG1sZ5fQZurYRjEIPHCRwNkMZSBoPzdSoFqyS3nMDAb5roZhCIA4LHNk4NqpywMI3eaBrqc3\");\n            yield return (HashHigh: 0x20ced5dffc826629UL, HashLow: 0x5907de8887e36397UL, Seed: 0x00000000000004fdL, Ascii: \"JcvgEjRAnVnbr3vargAeaaBNli2QIDEWyo2jqLhB8c8vzALUYqqnkJh7dmW5fky6x8NL6hUFtAJ7kxVc8wOtlOjpZWqM8z3OWD35xmih3RW9e3PW\");\n            yield return (HashHigh: 0x9e7a47f5585bdaafUL, HashLow: 0x6eb06ce894224820UL, Seed: 0x0000000000000000L, Ascii: \"1osqpwzvEYMXBhwDCKUPlSjMVRW2qy8AKv6Hp9PugG0cLhwUztcjrEb506Bm6UPmS8i4icbB8xhu92MT9hff9xuLKKZg2qkEgDWm5PILwVpT9E8KJ\");\n            yield return (HashHigh: 0x9c97f2a877498fafUL, HashLow: 0x191f0cd801043dd4UL, Seed: 0x0000000000001457L, Ascii: \"sbkapE0QobFzNZ0QWsj1cMmPoGT7QGOUzoMDpgmwLkF9MsfnPT8GStThbxRaHsDr64pQ7vfdpDzylFP604F1aH6S2CGT51FdUKrdJ3BLMsd7B1eoJ\");\n            yield return (HashHigh: 0x9bb011a041c5ddc6UL, HashLow: 0x81d47d82578aa8e0UL, Seed: 0x1f9194b29973d7c9L, Ascii: \"hf3UyHA316qMnV3ZWvZYKjmdaCgv8mNkqICISTU5S9AnuN8r68HrMrrY8nUSQ631LdpF1mfxP88I4uienZJNhaOOzfB5s20JexuxlRyLu6pUDqHRi\");\n            yield return (HashHigh: 0x317b7c14373d61f1UL, HashLow: 0xb54071818147144dUL, Seed: 0x0000000000000000L, Ascii: \"Mb1fTHyhvQNuCur14DwDIPky7QP9kdi9AUEcqJTeGbShRh1Qf2AB36QPbQe17mKzmfeNun1qisQzu2Y8YI4dlw44TFh0otAltgRHe6EKemPhRxUk5\");\n            yield return (HashHigh: 0x24c43b5308fb36c0UL, HashLow: 0xfa21ae3fc5a23575UL, Seed: 0x00000000000013bcL,\n                Ascii: \"suvm9A69ZT4fDwAv8bb5qSoRq4wdLW0RQLgM6wNjzqSl3eeaIcPfk2jQy5wsyub23Vvqxp30cSxrzV1jECsTBYt9HGr7CQSssF4WtAJR1TzxsTZVBo\");\n            yield return (HashHigh: 0xff8c1f3f2b523a3eUL, HashLow: 0x69bfe72c96a9974eUL, Seed: 0x0000000000002688L,\n                Ascii: \"LTioJY66DooZXeELJKOZIOM94DnJS3xNqNT28mm6QofQTPIal2TtE188cOD5MxeUaMPxhnmb0MNfqybyp81ighJzODQzwH6LFlky3dObQ6ooeX6WQW\");\n            yield return (HashHigh: 0x812d7846bd90b4e7UL, HashLow: 0xe781cd1cbe09d441UL, Seed: 0x7ddd0fea86fc4155L,\n                Ascii: \"PiRkx5zRiTzKmFEnS5CdpKiVR8BR7MC8SLdsJoUztXAprDJ9WSJ8i7SdEq0W6vZarlUWGux0b7eM7V7ioMGDxIDUkyYQLgJIdB2Biv9rXjbP9OT32s\");\n            yield return (HashHigh: 0x4223696d0e2672caUL, HashLow: 0x6e193da844cc6e52UL, Seed: 0x0000000000000000L,\n                Ascii: \"ez4oz0YxL2Jkn22gSC8bOB3pwGxJyTZ87OGkKQ30OgnGRIWHCFiujT7iDHczTW17niBoOg1vMMYjJWvPABRNKAE0M45PbLX2cqwmdSd4vjRKM78icV\");\n            yield return (HashHigh: 0xc2e65ad7ba26273fUL, HashLow: 0x02118ec48f85a577UL, Seed: 0x150ecd8202ec6f94L,\n                Ascii: \"CdCswqltKhXEh2cz1bslQvLDyBwBg30jJf2PXuYMHrm0ttCaBhuG91QSq2pZDNMZYycOACbaBdaqm40WBoJqxKFoWGfaIkxlcY9gngw0HVjSMHLujt1\");\n            yield return (HashHigh: 0x70e58b10cc2066e1UL, HashLow: 0xcda27aa66d48260dUL, Seed: 0x0000000000000570L,\n                Ascii: \"J0iF4oPqTEEeQ5jwZxbBzeZtcCezbXoWuLOMdYpwA6lF3pQ4BGoKJ0aHSnwCxuWneUZFXmtM4qzCSzg4F8Cz8zncHfX8fcV36MrhxIayngvR0LzlWBH\");\n            yield return (HashHigh: 0xab4123fd3a8d17d7UL, HashLow: 0x8c58920dd09f3a61UL, Seed: 0x0000000000000000L,\n                Ascii: \"0Q4RacmwfaS9Z7YoJZvdV5NDXk1jWA0Dh8yj2cRQhAXYTx6MVrV65doHvtcJJ7zYqHnIXLmi3WhyrMPHpVwZyTPdtqAjw4yZ5ZDcTAxqVI0CewVB3F4\");\n            yield return (HashHigh: 0x3441e60b537c2930UL, HashLow: 0xd1b4add7a0e160f0UL, Seed: 0x00000000000001edL,\n                Ascii: \"JLMeBXM88Aoo6xrvTosLJdBkU6YYzKoNsopKfAdTxGq1EauEoOxSWQiJLNIvlFGgHmWaFaPNFjmLbq4OrKbD6lpk7mfTEcDVbNvji4yCzWDlkVQX0d4\");\n            yield return (HashHigh: 0xca5df5c55e7735f8UL, HashLow: 0xcf623fbca2293251UL, Seed: 0x16571a16bbbcecdbL,\n                Ascii: \"uKn1dndpEJ3N2bkSfnioYt447xio5E85vu2Oyx7rPqFPq6IGfu3ldNjppkfdSjaUXkAAcEYAxDNevOl6OOZoAyizIG6DPTZuAmq9kNf8m9bzxjlfDtX1\");\n            yield return (HashHigh: 0xc53084a9d828a845UL, HashLow: 0xadaad5a3ab0478e4UL, Seed: 0x000000000000084aL,\n                Ascii: \"lJzhKyv3xdb65vVwrdbpoS81txrDUsNRoNH5t4CgvjSLXvsrWu4iUW1LYJLZT4KldWJ34cIswprinL0ngFrcRkI3Sf1gkPSbIA1FVtctnOsPZS1y74Ov\");\n            yield return (HashHigh: 0xce92bece84e77a8eUL, HashLow: 0xbed4b4e73a9bf60dUL, Seed: 0x51629b40fb407cdfL,\n                Ascii: \"ZJ1nQjq9SRgzB9MRmv8D2iUazO7MYBoTqppTPl0zQLVyi24brxU1BVDrqGtQbgbOXrGNugUbqngR79vUjLnN51j9rSHWbTQt96K7cMiaRbJXzhCk3SSF\");\n            yield return (HashHigh: 0x42a6585c10c26348UL, HashLow: 0x682367dfe51063b1UL, Seed: 0x0000000000000000L,\n                Ascii: \"eggHdD0JKgUjFttO86f8m4VUzNbRchbFvC5egeOyjZPtKCIjTEYiLurYBzhMs4lbDsdUolcKKmPhZ6QNb1yDgnJKzMvU7d7oPH1MK49uWnXrLap1y2De\");\n            yield return (HashHigh: 0xe1fcdace9a4f11b5UL, HashLow: 0xe0bb9fdf86f3eb3fUL, Seed: 0x00000000000012e3L,\n                Ascii: \"T08gMFR4dwi6dLgRYjNwJeXKCsMEy3MfEb5dtoKV7y2q1ABDOI9kEojlQZZ4pmD08k84F3tjZdVwEnzTdqdsddnrJWYhg80HeVCL7Xddr9J7DFyf5jX83\");\n            yield return (HashHigh: 0xd24e5c49789a3cffUL, HashLow: 0x4b315e53782a882eUL, Seed: 0x0000000000001bedL,\n                Ascii: \"gxVJPhh7jsSGrEmXquVDpC8Fyl0vZv2OLeEgiN19qmbVtnobg4ZzHLRxqcvAWF0CjvMD70MzVFI49CiXDLQ5N0lpENAA1G6ZU3tr13N7GeUCh9mDKBRuV\");\n            yield return (HashHigh: 0x794472beb410cbd0UL, HashLow: 0xd1ad2b3b4bd625e5UL, Seed: 0x0000000000000000L,\n                Ascii: \"j88XCe0gssrKv89sNDavDX3o8lo6PA9wi6PTYVm7wQLT5HUtVVf9rvx995f7BYPzuAwf1Vz9w8NvWTpqVWxRe8ODOTgPGc6Rm1qyHgJZ47nUfSSTeIceK\");\n            yield return (HashHigh: 0xf2653634dec2891fUL, HashLow: 0x04f083373aa7f7b1UL, Seed: 0x1deb3f9bc2d7fab5L,\n                Ascii: \"dxT7avcylPgJJDwzume0GTP5OemkAhvVdMCryi5GOjimReS4wZfx3JjoJKhUPapov8DlmP3bRXoLdRfCvGnZk8AOwWtXcBOihM6FELk3PwQshwTnOjsoH\");\n            yield return (HashHigh: 0xfd95b3a8d33be2c3UL, HashLow: 0x6eb4ab134f545685UL, Seed: 0x0000000000000000L,\n                Ascii: \"mw5M8OrwUXWPR8jYBNcyQKd74sB5OmpPdIfvG0zwbxRtJxk7Zp7mOrxI6u7Wi6H4augaat3De9MsxwEvbCXJb6OKjAalJaxh9xGgsbkf7hxRqXuWpVQJQ5\");\n            yield return (HashHigh: 0x60b299a950aaa60fUL, HashLow: 0x804c5b8aa25e590aUL, Seed: 0x0000000000002378L,\n                Ascii: \"D3DALUgqg5sSHA7y38PHxoPYC7ZAGba87jdK165Sf3LKhk6BdKMSBRFMIbMJ39qjDTyemqfXB4ngJ0TqvJFiWmnwHrsZaUebNgTA7Ie3kXWhQEZkyYxNAX\");\n            yield return (HashHigh: 0x7b96d76993262dadUL, HashLow: 0xb509b02cc827fb9eUL, Seed: 0x0000000000002426L,\n                Ascii: \"BW3FTDpTd0ti3BlqKR9JTywoyzEaDtZ4SpUflwMoYyPNb6NNdkWjhh478Mz5zhEQColgpTfct6YwltR5aXbOkVH0WQL6JEV20eqF28QTibW4W5YaOidIdU\");\n            yield return (HashHigh: 0xd2599f3edd089b9cUL, HashLow: 0xd8287c5751c0df66UL, Seed: 0x00000000000022bdL,\n                Ascii: \"R95ufGUuwozutwJyHugFA1LD6LRebVMEYTRBCJX7F66FALs65ZctZkztFtuWHv6ZJK5F8GeAr83PJA9VH99WIDGxzpnJnrbRX6ac5BQBU5traRMmFnNmI5\");\n            yield return (HashHigh: 0xa76d7f05174ed3bbUL, HashLow: 0xb1b82a26ab1e0d73UL, Seed: 0x0000000000001b08L,\n                Ascii: \"fa9PFmPkwourA0w8kgqtYOC4pzLZpmRZupeJQ3zxpqizARB9zDTxyIcaKJhzdEYDzR9D2f6sHDevG5RwSOuiw3bRRsHztjIvfBtentMUXB0FnvNr7cPfFUL\");\n            yield return (HashHigh: 0x6531efc97c6b2df9UL, HashLow: 0x6d902379429f32d7UL, Seed: 0x0000000000002578L,\n                Ascii: \"nWjpSNomqnBRgLxX1XIEZOokQljYqGg47rasLRu6ik4HUDK2J33u68joIae5EKevMOWFpyEFLz0xwwWfHRk5zZOEFIhtvbRXCKVv6J1ySihD6VURmhEITAu\");\n            yield return (HashHigh: 0xc3b5c0891e6fad69UL, HashLow: 0x4acad820be9232eaUL, Seed: 0x0000000000000000L,\n                Ascii: \"fEkGIcqyImaJ6a5XkoHR7hNfFBMQqwUiqDc2qVenrbXBRzDR6JlEXvHVrUQlpoUgLigNv20E5JB036PTL7P5cvke3cfffpfyRRpOZCmID4ah4wXgjqJZxDL\");\n            yield return (HashHigh: 0x923d440f71770b36UL, HashLow: 0x4275da2eafa9c67dUL, Seed: 0x0000000000000000L,\n                Ascii: \"h0dmpmYdBfkDgzSMVwwgbFHztjHm3LAtmzplqJBWiyIEmvAQmDp3yOWe4r0yk3La9oQQObEurfUwjHD17jBhFh9wYdgk0K4FSzVztfUA59vPvkYMMCedcxj\");\n            yield return (HashHigh: 0xde063fc696385f50UL, HashLow: 0x1b85374207acf59dUL, Seed: 0x6ef0b80e82afb6e6L,\n                Ascii: \"DYZbrjzRA49CJxbgbtMGholC08uAZwMx80APLGsHyAeWg4we170Y9bbvQ9ZJaOyoHMZ8Cm9npmac2moX7477HmhbSFJ9SGwrZwzM8XNFri7pW32jeiC7r0QE\");\n            yield return (HashHigh: 0x2680082ab8ceb373UL, HashLow: 0x5db11941e47b1c9dUL, Seed: 0x22b9503c0be28addL,\n                Ascii: \"a7WZkZdJNAo8YoZSEPykILtVSKnmofkQDPKbmn3z7KV3WCRnBLY1nMzIUcmYhc9y694NwkqEfcB6gYgxWSmIVhcnb6ajl3xuWaSi4a5NTTfVXb1MJ2ZNTZOX\");\n            yield return (HashHigh: 0xb4b1b28cc6cabafaUL, HashLow: 0xfeeb09d20ba3a6f3UL, Seed: 0x25d77c238fae0965L,\n                Ascii: \"ZVMmHy9A0KeocuovOZk1Tcdra0LYFTahBKJp1ZqBKz4S5ud0bp5SfWiFSFjU49wMYNxklCwpsqN404V3qQIhoxwPcAzk8p9Pc5LS976t0t0OaIFyVeMMD23K\");\n            yield return (HashHigh: 0x85c9e8adcc526728UL, HashLow: 0x804d1156fc444a37UL, Seed: 0x0000000000000000L,\n                Ascii: \"Yb5xDwVr49RumOz0TTNCo9UI4g9beuUiNAXdOgtnt2Ac4e0uSPeLDb0jDz0E7shdlBaNXYQqxhk8mXuDCp2TFdFu9sAidqgx3fzFg0lV6XTxiw7quTxq4YqQ\");\n            yield return (HashHigh: 0xfd6008f8965f9bdfUL, HashLow: 0x822bf11f7c923541UL, Seed: 0x0000000000000000L,\n                Ascii: \"2dM2EworvyZsPrddBQeV1Fy4nglGaNmb3AMx5XXdtB7JKMvWJ5FkmQK9TX5nZSsaOJ4ejodmbcXS3ouItsJyEgJDCVFye1Hsbmc9PlIvDvMMIUtM2K6tOY8Bb\");\n            yield return (HashHigh: 0xfbf500d2b085a299UL, HashLow: 0x06ac210f151b7287UL, Seed: 0x0000000000002500L,\n                Ascii: \"SDHTckez9eTizt2778eK2avXdb8ZPXTB2DUd5TxKqmjMTIGtGI7BF2p0JlnIWYsqzd3xn8JhpmnT2oWxWy3U2bw8NbE4aHp3vBPGaaUm2xpV6yaVsTTxuKfmk\");\n            yield return (HashHigh: 0xaeed15cf03515788UL, HashLow: 0xd96f76dd21e0b5fbUL, Seed: 0x0000000000001d58L,\n                Ascii: \"efKBPphMEfx7NKuSPiEvxsNMBR4k9ehqo2YR8HgCAK1ZMAacELKQnjr4zniqLfauvLkV3M4eYK0hWd6ITDIxCjbOkTpvNz9f4L4tjzNCP5oW8hjrZwA9PtLFk\");\n            yield return (HashHigh: 0xf4a66dbc18cf7da5UL, HashLow: 0x3be6de4330c1fd0bUL, Seed: 0x0000000000000000L,\n                Ascii: \"LB1wzaDyYNckrwL8ZqlTzqvwYKpK1L2Su5GwqGTyE895mzsFsPmetCadr9gXd3I7eZNzqR25oMnERLrMjSTmKYxRcLDLlFwSUeE3nN1Mxh6jOSdHlpASZKhDK\");\n            yield return (HashHigh: 0x7c57caa46a9fc2d5UL, HashLow: 0x566aac607fa0e927UL, Seed: 0x0000000000000000L,\n                Ascii: \"to0CMhNGgBNfmXsMx0db0UgVSfhwPn8kCuHbC05UOU9Pir7fwTkNS2D0WUBkk8TtlnRd4kPQa5HbAtE3sSeBYv6gOZnCfBSmzQBe84nYQLz0npj8C8P87CFnvi\");\n            yield return (HashHigh: 0x4fa5eb93bb896b8eUL, HashLow: 0xecc32559efe61ea5UL, Seed: 0x00000000000008d2L,\n                Ascii: \"Syjto1ID4pcwx4rmLfn0nL8tFwb5rRudN4fG6PsCLp7viesuyYUFXdtC9M3QXPHz2vLhm3OboqIczqjl77PxRrc36whJ5xOvi3pepo3yZwGgjhGmlqdtBm43vv\");\n            yield return (HashHigh: 0xd73aaac1842a7b17UL, HashLow: 0xdf8bb19cff4b4826UL, Seed: 0x0000000000000220L,\n                Ascii: \"6q6JUmGZeVs2S88i0qKiyOOqEEIm5bAJbVshthBolDkLtalZVll1O5ZT2iogZoCZkjJm5pEGaL2OCqP3hTXNznY7d1YW4jPAR6A5R50JnqPQC6it7yDl0B7rxg\");\n            yield return (HashHigh: 0x57bbeccdba6fb24dUL, HashLow: 0x7de92607e8bc5e2bUL, Seed: 0x0000000000000000L,\n                Ascii: \"eZH1fd8pO6EDmo0o1Bmuwt22D1fZvYqLhx7PztSU5IE8HWDK7tBAijYG1gBt07Uk3AJ71WkUEkormEdLK02RsY7MYNAeM3xJatJcohbylxgaT2hGKJ4Qw16Kux\");\n            yield return (HashHigh: 0xda27ff604be54cf4UL, HashLow: 0xefab37213621eedbUL, Seed: 0x119cc06277f49604L,\n                Ascii: \"4bUBTIsAjWzJoPYajd4sb71W9lF2zlcR1pNclTQJ9QGUQUcvLan3btn4FYEbpIJJ9tUdGC5ieQyzsuVMu51Ic76bdpkBSzPsJGPFlRUACXs6Ej3McXc7k7aJZv8\");\n            yield return (HashHigh: 0xd2be792d16d03a58UL, HashLow: 0x478448b6662d309fUL, Seed: 0x0000000000001df1L,\n                Ascii: \"n2vm68ZfMpgFzBAwg5IJdnWppUe8y1rjtQ9j5QPAhAhqg0JviKLmq89E8GzYL7Sa23lwPgGXLfC21obN8cSKoobNMEfXlFKsxvrmfazgAKio47bLpjLp9KugkD8\");\n            yield return (HashHigh: 0xb9166484caf99320UL, HashLow: 0x7af84bff1450cac5UL, Seed: 0x00000000000000feL,\n                Ascii: \"BPPIpwzff9njaLQhRKebBeLCJ6O3kpXA7K72KBYDERPNrhDpDXxk1a1O9f74cjxoEftOh98wFT750ZOhhBq1zlRUUDKHYofmUWzAXlpUaHLNbHo2EnQvW5xOhz0\");\n            yield return (HashHigh: 0x8f0f4bc9fd9e8c74UL, HashLow: 0x97572819e1af79eaUL, Seed: 0x0000000000001befL,\n                Ascii: \"9PSFC6Dtq23t1AXLeyaTEXkBbXRT8haIPej07DlsEFFisvp6Bkx9lK0nNeWGF56y8Zl9XmTIyF1hOQ2wFBAW4hEvL9bjGLbznPxmxVxi5AGOK4DwB4oCpYgnXY9\");\n            yield return (HashHigh: 0xa5ba4bc3457a1e47UL, HashLow: 0x6e07977cd679868cUL, Seed: 0x000000000000195bL,\n                Ascii: \"11rvPCNSxDfVupdWAD4cGbgX5aTY4vtgtY0pgZAoKDL4GNXtidM2QOIfRSQbGriGyYyce6HEb0kqrXU3CAjBKlkz995WXc3iCidZQGDCGtJMvlxpaCYYOao106UU\");\n            yield return (HashHigh: 0x421ed48dda1db2a1UL, HashLow: 0xcf3e570f5979bab8UL, Seed: 0x0000000000000000L,\n                Ascii: \"kh5Yj9RxyD2LupLfmbE2ohuldqEEqIZaQ1brSKZcDPuh7OFGA6rOVS78CwPyPKh1EB2U0JZpkiqXXRoZQX1y6nGQZBgXj6FlF7cSJEE58TuRv47ECFvlKwioRN2N\");\n            yield return (HashHigh: 0xf8732516ab6a77f6UL, HashLow: 0x946283a0f9c6c92bUL, Seed: 0x0000000000000c7aL,\n                Ascii: \"sy8HXdhWMyH6zELpNiBlFOVKcoisLkAwK3Vs2wMsvIihYwKCdrgP1SLYQ9VcTr9qjPdJllZ7KwDG7AzW1i6d4eUHlNhNHaCTqD4DqzMCnL4g4ObPAEFNMu5hES2F\");\n            yield return (HashHigh: 0x8eb142b851a11cc9UL, HashLow: 0xf734723bd77a90daUL, Seed: 0x6e791466d1b71ecfL,\n                Ascii: \"GVbT6QpqMbG6CD5PkyXhhgb2pj38HYJ3leVQhwRkuGuBjtGpBxKmLTfDCUZ4UcUPvR8pGW5ARTcYVWKqklFQ5R0pK0gDsLCurNBeeH8DPJmpK1XwZwRbL075ICfP\");\n            yield return (HashHigh: 0xe2b63d3130c2cdb9UL, HashLow: 0x490d423b611644f8UL, Seed: 0x0000000000002009L,\n                Ascii: \"ID04vto7CdUYgg14K0WbVzHmCas3lw1adGRN4UWp6llYwReFUI0xjOyOU4Nuf5r3iGuOWcmj0R8njVApDh0Xyn0s9af7yWRwBP06UsJOAFpSIaXjuGt9axkZX5ZFt\");\n            yield return (HashHigh: 0x0be651e910df272eUL, HashLow: 0xcd92ec687c41738fUL, Seed: 0x00000000000016adL,\n                Ascii: \"yicaI21xPFetRXBMXg048VnQ2B4ojMHQka58NDzE4PTKkmaOf0D2yGOb5kxbSLgqD7FBJCNPhXaUn04kcZOpJjgWLKhKkE93SeOgMq08038CrWlOAXCOBGbam69SF\");\n            yield return (HashHigh: 0xfb994721deb39aa3UL, HashLow: 0xff474b99c52b1a29UL, Seed: 0x000000000000110dL,\n                Ascii: \"aN36fVjiCSVWe4rhyn40Yn9uHRo6sfVNJCKz6vDLX41mdZg4H0LbCerAxI189qQGElgXzLEFO1uaUFT7OIhxmPO8v8XiH3eSk0nCHrzVHuBOwr4dNje4Zvd8IAPLv\");\n            yield return (HashHigh: 0x04db90bb35509330UL, HashLow: 0x2df49cfc5e66971fUL, Seed: 0x00000000000011f1L,\n                Ascii: \"WSObRIFudcaaiIma8jovld92hz8yf1isyIefqjV1DPWsdb2Mb0sbyBCXIciTdRMbMXdO6CTF7jjPhZ83qqLRngpWv5l2Yqm1Owy3EqVFgktelIxnDnoTVho9NGOD1\");\n            yield return (HashHigh: 0x6de7d0074f94bccbUL, HashLow: 0x42e85be151993721UL, Seed: 0x000000000000213bL,\n                Ascii: \"jDPUahItRlZneDoujRspI55yhCATOZbRMzp0sZwmMshcE84vugA4inws20JIeWSZSYcPqGNvwGqa6Ygzv6sZYS6eMEOwtLKuz93nb48uBhay2aWtMPdNuRxmzZaUBu\");\n            yield return (HashHigh: 0xa2584b5745534643UL, HashLow: 0xa88bbc1b7d1737c4UL, Seed: 0x0000000000000000L,\n                Ascii: \"kuVv7vsS9fsPOCZgTVeeYMJAumM3XuGdLwd13XhqOgNqGeLpcdgugmwtNyijl41CtQROLCx8to8nzvocNUeATjUfu3puYiZxyHmSsupADY8iQbMtpKUCAL5dm88WML\");\n            yield return (HashHigh: 0x59d34b5a643a793aUL, HashLow: 0x0daf1f6bdf9a166aUL, Seed: 0x7541e104150588ddL,\n                Ascii: \"7mJOM91tJRrFgnTzxpXD3A1fRWj9unBPhs60v2F6FqWB57sUWFJc7N6UG0WKnVVfVuWVD3L28GwguQMi1Fvw1GtoZToXiTsvpcnRqFeTVNp5eSrYHMHHBiF54qoCD6\");\n            yield return (HashHigh: 0xf11522ddb1bc96c9UL, HashLow: 0xe4269cdcbd2d6424UL, Seed: 0x0000000000001f1bL,\n                Ascii: \"yYEfhCPqNBZFil1tkG12vU3882dn9YL8HiAlvwmM80K6OVUWveM9MNBM0Nkgp3RfsXSR6Tz9V6vCnXwjrabwJ6xGPJTqz2ApkoJWN6cs1jKp4y2m0RoR15LsSLupUp\");\n            yield return (HashHigh: 0xd287daf1c8212cb0UL, HashLow: 0x223172e1bb0fc548UL, Seed: 0x0000000000001fbcL,\n                Ascii: \"jbLVx0sDosYXshOWv1Qh0mQTfxenkKM0puoQSTg0Y0ur3UzB846mgGj6dqIG5pgMCs30I1VYYDTBMfuBQ9JejRkvcKQ33lDDtOQDQRJjNm6GcnFhXAhoCK4PVAdIWy4\");\n            yield return (HashHigh: 0x733aa04ac5adb3a1UL, HashLow: 0x3e5e4267e0a59d46UL, Seed: 0x282bbf957aa4124bL,\n                Ascii: \"Iii5uebDxGwxHV6VURGxShQkPPcBfZgJTT1L2hQuoGyNfhmSm8oVPKce9APyZdnRuDpcjfmhyIgbCxEbxgxyl6HH2BXdGxTzJaCGsJGeiBquN6aahfkaE5xItLcMLds\");\n            yield return (HashHigh: 0x50fa41e2e6d42047UL, HashLow: 0x0f4c763efe3f92e4UL, Seed: 0x0000000000001da5L,\n                Ascii: \"1J8qWDXA1bTBa0zp81ZCm0gAG4OvOGKlK3sHCmDCBNJvE45oYhnw9uVI54Kqz5OazJIHpqSvMQ3UnQccSyjszKe9olSUukOEEzS6NOHQreuuDseYzQApdf2rkV2M0LZ\");\n            yield return (HashHigh: 0x88f31dece924dac6UL, HashLow: 0x7e691713defac1d6UL, Seed: 0x4e0078473dd91e60L,\n                Ascii: \"vJ75E3w5rzh5rpH7GP83uzRRIkx0mFuBOUjDnQfsXcjHIc4FVId4CjFRBXMtNDW3K6iNwgM9kWapyxMQj5WXfOk9zcxpANSdizfvliKn9J9c4L1jdiFL5pZeNkmHkXp\");\n            yield return (HashHigh: 0xdb8a765db1353d02UL, HashLow: 0x5e12382e881064f7UL, Seed: 0x00000000000024dfL,\n                Ascii: \"60vnJXQlyQfa1Ab3P5PHfLbq3uN7ZJ3lN7Wr1jEFweUHKIBbQbvmfoRtxFlEpkJF3BSX05Mcw0s4acFNBeiScjKyd91eICkXmCbqN0jME8gyu73qBUN5lvP3mLMDY7W2\");\n            yield return (HashHigh: 0x473464459a871ff6UL, HashLow: 0xef53b38ba91a93b0UL, Seed: 0x414a0e4285faeb0bL,\n                Ascii: \"0oXm4Ua8BSFugTc0jjJP7qqgKqqmAM5pjKx0fH1lsN5JOoUWwlSkpjiXDpWUWcakDbLN5HnomU7pfKLfGu4jVZCOdLs8IhkCm6KtidMd6VpvE3rveNgput5Wl15SnJxG\");\n            yield return (HashHigh: 0xb91f001c9a9f6eebUL, HashLow: 0x647a8e09af8e7ffeUL, Seed: 0x000000000000258dL,\n                Ascii: \"rDbjGANGnoqP1OyE1jS2Nh9u2jCe3I2aylK9AxrwWrX9eWeZktCCM1zHEWZyy3nkayGTMlZYrPUz3BV8aXmzH08XVJq9CONAa3gGInx8ul2oukX7gMVzn6HIktSVlrnf\");\n            yield return (HashHigh: 0x2491a7aa1060c4e1UL, HashLow: 0xdba0d6922f30bd0fUL, Seed: 0x0000000000000719L,\n                Ascii: \"Vb9DqE75q7FoDNwXC5z7JXv8MClHWVlP46ZM2DEpcnESepjjCoPc3A0SB3sdD5Qf5WFVZZD5eMK3d72wIatzLikDYdAkjGB2TBYELWnh9sbn1Ei9neg1wTkMj3CGM1a7\");\n            yield return (HashHigh: 0xba597cb8756e411aUL, HashLow: 0xa7723549559c62ecUL, Seed: 0x0000000000001b1dL,\n                Ascii: \"uqMPHc9Ks7bAPG6zdpkbSjcqkVXzOGBSyBXTvbzQlpdQ6Zv362rdkRlzBIbV7nPyLOGutx6Q4YD2wksGcsC6GapRBMT5QOQq3Vt6NkobpxENMG3anX1cChirvogNtnej8\");\n            yield return (HashHigh: 0x52a03823ed51021cUL, HashLow: 0xce6bd016f92cfee6UL, Seed: 0x54cca3d4fa3790bcL,\n                Ascii: \"9MR7gE7doHNszhTm9YvMpUSOYiQL98mr6xXzYLVVDxzFT0jG5Xpy0n52wk62MwX6uIOY7NzoZzJrQeoyUPOX0qrfYSCiSgDmgs62yJkZLPKYHW671T9JHEzKtyZ08l9Ev3\");\n            yield return (HashHigh: 0xa2fbc68b28ca3619UL, HashLow: 0x919887092bbc53e9UL, Seed: 0x0000000000000000L,\n                Ascii: \"U4MVPYsUfMzMZLh1554Kp8ro4m0CYRTG581ZSciQVu4pkps8pL3mrGW11rBxqWq1QAG2IjmYMpj3jYhIbFFNT8Ni0rIgGBtk8R6cS35Dy4NIlzPZZ3VeSNka3YbQH2JsQI\");\n            yield return (HashHigh: 0xd154e0ac11923be9UL, HashLow: 0x3452adce55076408UL, Seed: 0x0000000000000000L,\n                Ascii: \"9nN4HswXHi16IpInViwg08zARLQWPteDT7PGZ8rEm7jAxT6m1tjIfbOQWy3hBtg6QXGFpj0qKjUvdEmeGgN12hrI5eZMxQTZsbTIPpo1iNxkawtpeQFj8y7gfSgz1vZPPwP\");\n            yield return (HashHigh: 0x7bf8e4aca0875fcfUL, HashLow: 0x94cf2d90c2727cb3UL, Seed: 0x00000000000003eeL,\n                Ascii: \"OG3H6jQJUMEKuS6ScLLdUEKaOl7CAKC7wRrzyvFQJPl5kSTYtFzycrybLpLwRoQ3LSPEHWQtvnVA8vDoSaAc7qEo4CO4e1FvQ3gmAQps2FtPq8GG9q95S30uCHJwVuUSaiW\");\n            yield return (HashHigh: 0x45501ce0ea80325aUL, HashLow: 0xafdadb344df80b9dUL, Seed: 0x0000000000000000L,\n                Ascii: \"gPdhSSq4nip27S7b4skjCs3Rvu7oKnzUY5IIpMEDYomFC7QhpRlRqBEJcllvmhtsSBZHe9T7VktR4zRpilfa9DSj4EiyDrBpEX2eYqAAuzvgh9XAZ1S8L09Ua6YyddvEocO\");\n            yield return (HashHigh: 0x2445bf5ea33092e7UL, HashLow: 0x2477a33bc4271565UL, Seed: 0x00000000000020daL,\n                Ascii: \"jmiaRf4pl6y5mvJCawW9V8coo1w5P47Z7kLL6SqTnnX87gEAZA6V4lBmVyMxZmGHI19aFVCOXTvimQjpgyMZ0sKriuhdbO0IwR7pjln2RfZwOExrNAzcCiEHnEPKzMt7yQ2\");\n            yield return (HashHigh: 0xd0099560495820b3UL, HashLow: 0xd52b949f8e2e41d7UL, Seed: 0x00000000000011fcL,\n                Ascii: \"3NRVB5oUvOnIHozic5qU9QUQn9tGPz3F3A7ziKLusgsABEx3Q0UbnUjoiSURpumSCdjksxSE2Xbu4v5LRLsimqYSivFcmgia9j006UtTeANVrqZHo0PvwhI7wHfCZUM3fasY\");\n            yield return (HashHigh: 0x76ca93a810156068UL, HashLow: 0x3f833e46f7fc9592UL, Seed: 0x0000000000000000L,\n                Ascii: \"16U0mZVdknAxLjDYnszfD6Wl5VJaS1hq3e3riTqyHibOSueGwXi4Chv3cdlyeUOUjpHTjRrSa7akVQM7VzQ6I8waMVpt4ndYDyiwx9Wqivsec3qQak9h8EawBbKVpA1LIYvk\");\n            yield return (HashHigh: 0xba6e4dd8414b5c2cUL, HashLow: 0xcd4d7ec3a0bde018UL, Seed: 0x1f8d4a4ce16cd022L,\n                Ascii: \"WfPOMwQe8Yc0pW4Lzvijp4M6ySmHzteHVAgeTq01IMD8kyEZQPLq9tEmuiHM6WHDSf8ML9IVorqTQgFhAaiUXal72dEREUa1WWeusot7i3OMr3NOnyXc4itXjGC3Rbrtlzie\");\n            yield return (HashHigh: 0x5dc48a8e6279f419UL, HashLow: 0x1a7a23f90e501821UL, Seed: 0x0000000000000000L,\n                Ascii: \"pkEpdDVhUfUMS3ASIvA5FAgWcJaf7hn2j5lNpjwJKRDSTSkKK2g80S7TbtqYgcdK9FNcCCaSI5uAT2JIDyIx3S1X4DgcEg7A9FO3zVrLwrh8hqQrS1xB7yIIqelfKBSTNg6a\");\n            yield return (HashHigh: 0x7f5c3a9e40b94834UL, HashLow: 0x658564ad0a410ef5UL, Seed: 0x0000000000000c61L,\n                Ascii: \"8qgkEfNDcw0Fe4YA4JxGVZetLthMJ3OpR2xIZITaPR4F0nZW1xLvEGu4Ast6RMP8d9NY17Y85sqIuLI7QPSx7mj8ZwvJDcTMVlhuja6sJFwY4lwYMkrdiUyrzCt8ABJNohxWO\");\n            yield return (HashHigh: 0x05218554e3f0045eUL, HashLow: 0x2cf2b47147c64501UL, Seed: 0x0000000000001769L,\n                Ascii: \"F5cSZPLTlGxNoHDCfRYxxHfRjZobExObDlBdY6XgfUlQn41Ep9I6469ErOlgDAOxLknh7SbJeHWzMWRlNjdDQABmquDPPvunf3bmiTXwBojvDQheknbkqTJq5enJ5MDwkUdhs\");\n            yield return (HashHigh: 0xdc3e89f24178244bUL, HashLow: 0x0c8b54115eb4173fUL, Seed: 0x000000000000135fL,\n                Ascii: \"H1V6q9I6hIdiK5yGBsBSGLkKMGpcvTOUeKj1W0qHLgG8liwikP0EPL4R83BM199VTrIafmXA28fDpQQnMlQyMGEpDHXChYkAXjEKiz5xiRHAJoELpjOMA0VSqUZ4LyzSx3DWM\");\n            yield return (HashHigh: 0xe2b7147ca84780d8UL, HashLow: 0x6e936a3c7dbc86f9UL, Seed: 0x000000000000103eL,\n                Ascii: \"M0Vir8hbKd9ycWn7Ex9YTPSdN2jUxe8Od7R5FzVv1BCTIw5kM3lTkrE91oPc8DHQ2ze7Rdv1r2PGJaV9gqvcCSfDwA5vbEciCLEOqwFkClzNHKUtzDxlFHPjjqpkX7j8Gd9g3\");\n            yield return (HashHigh: 0x957948983d639781UL, HashLow: 0xbf66d81fc14edacaUL, Seed: 0x00000000000022f4L,\n                Ascii: \"UyI3ZMRVJ6IdKKyaO0hTImJM80Z3w66JktmiQ4YOAxEaSzoRibkmoZHAX2LyupgOWmoTol8ZXffaghlN1D967JKQlnZW1KzxzrbXBW13b6LiBQbCtC45hHBzhBHNJH96egKqH6\");\n            yield return (HashHigh: 0xc9de4b6024f681abUL, HashLow: 0x850126bea5d5eea0UL, Seed: 0x0000000000001a3eL,\n                Ascii: \"B0yiozgg7CMWHU3rQc8u87BRSB77mmFfo5dRJfnPLU1hCdrZtfFptYIlBv5mcDJRXfJ7YxnpSq6reI6oWnJoSi8kHIFOyiqePaS9auXA2KkD5XZMHVRae72F0fPdIXRAh6qmAc\");\n            yield return (HashHigh: 0xaaa039846de9d858UL, HashLow: 0x342cf78049f79426UL, Seed: 0x0000000000002551L,\n                Ascii: \"rXNLAbMWlaSEJtHZg7KcdKwVhN0tirSYXfSH6LtsZ8X2aBKHLC5KkJCQuTDKJIym3AW4Fy0LqUVbyoPo0EF2xfh8pVwG4h0bSgKCfAIduI8A9D45Fm8WMuV5wd8uR4DomM1Tvf\");\n            yield return (HashHigh: 0xd16a907209a4656eUL, HashLow: 0x27b1515859939a09UL, Seed: 0x0000000000000000L,\n                Ascii: \"O9SUvMx6NYYU1i9iKK3dVYwU4mOB6tsBAOzlBgv1nObsPf91OVQoYHXLiZTIYELA8uJKhbgcKKGJ7OWqJ5Pf43dkpTQZoi1QpC7OAfGtFuqeiHT87LKnsv6w4YzI8aj0a7pDZ9\");\n            yield return (HashHigh: 0x2f6a3b729b39fb53UL, HashLow: 0x2aeb1dcf7bf69f09UL, Seed: 0x0000000000000000L,\n                Ascii: \"k9qB2FUXd3TaZuIivj58Wshydm0OfxdJZu6llqoWjEu6et1ObBscfKjQ1axmf69Yu9Xn3n1D5L8fNCuMBWWijGRIk0qLKgnJ0r5MCRIlmPm6nXSYh4ucLASRjENHZwqyWW5K2cI\");\n            yield return (HashHigh: 0x3f2813e97cb75496UL, HashLow: 0x354a521471755dcbUL, Seed: 0x00000000000000b2L,\n                Ascii: \"Hoi7QDtELUdDFqVnamEQAh3BFz37L2U96Yc9bVQMjHtzpGRiqCS8P4vM5UyCQYPDgaR6xcLfHzpEDwx2NLmEuVqTBXyBRfn2rRPoViuh0yanJpbbugRhXsTkdfUBV7WrVkodMc9\");\n            yield return (HashHigh: 0x067d0df9cb56eb1aUL, HashLow: 0x174242594750774fUL, Seed: 0x0000000000000ad0L,\n                Ascii: \"HYpEYSzz4djNcmGn816C9VFfbbb5IWjxRxtp1oBSgRymSEOosG2d8UbqsNakdoBuNecS5TXW9XjebX8h0gXNhEmhakMttmLerjQog2Yhf8uPYUqhb5YRnN57pNW3voiA3Gl8hGy\");\n            yield return (HashHigh: 0x99d0fc8e007d3e10UL, HashLow: 0xe75914d0abf15175UL, Seed: 0x0000000000001cafL,\n                Ascii: \"J0O182AfCRPaOO51XlQaRktTQvkFW8ASaYAmqIuz7tjQ1ViWtk1NAuUQwTL0k51Ph9YmTj7nF6MPoBnryzfTUN9OCbcYCKUm98cBvjhJXZOPTJt4h3fCkSJ1EClyMAwVyQRRoZY\");\n            yield return (HashHigh: 0xe91262705d24d791UL, HashLow: 0xd4a950023a53258eUL, Seed: 0x0000000000000bbeL,\n                Ascii: \"OdsE4rVr8LKy8AXhYgzQYwIU7F70FGaFY3SZwNYnkgQW2iW9d220JUIiYTfkG3MWdzfBsdTAggmH8yZwAyKaF3Zl5gLHm8ajax9s0twPFEcHgrGpTQmtqdXtetop1vEE1ysDxm9x\");\n            yield return (HashHigh: 0x44386292653ce4a0UL, HashLow: 0xa1e9f5dc1bf89cf4UL, Seed: 0x0000000000000000L,\n                Ascii: \"83rTxhOPcDzcCyO5EoZkbc0NErhb4mWZ1NC98aK1AbC5bisvsmDfQQAWAmHCkb76jwFRTKuorGmugdrUyO9VMLMpIn6XY2V9Rr7VY3kShTTd2QpUgJxcigy3AAZ6uaXt2cNT1gcH\");\n            yield return (HashHigh: 0x8152a2ea2ec5c72aUL, HashLow: 0x6c7a47ec036d6667UL, Seed: 0x0000000000000000L,\n                Ascii: \"0bvwRn5eaAx7Yd4fv9ZAw1IuwIpO9eQescxy3S784602dan9jmjKfqRwTiYF6vhkGjN3w0JPlxlyiyrY4julxexONinlGVLqsH92m5e3wxXEPMjmlozY5Ru7ecuZn1TWTBgipcGm\");\n            yield return (HashHigh: 0xcf6eae1abf46fef9UL, HashLow: 0x0a102546f3cfae9cUL, Seed: 0x0000000000000000L,\n                Ascii: \"Zj8ZXsJcjfcOKSvGAu53hSYTLXBxgAft3WIWmhYGti15rzRDaXmWYIwsgZxTdGQX4nktfzfP02kb6s0FxnAJCWN9pLRwZicDjHhrur3trefUjRROE3HQ5tI6ALMXiz5PHXjjC3W8\");\n            yield return (HashHigh: 0x90bc03d216103cd0UL, HashLow: 0x17d577f06417ea21UL, Seed: 0x0000000000002089L,\n                Ascii: \"nqlcFmZYVA2UnbzyUj25rR20uy9XRUYMIn25uF8ld2HkKHrzTZpHwVuLcieb8bTsIRMBTyZ0D7uDLf1JCde2GN2QAcX7aKMMyPakmaRKnRGMzVVEvwc2edrvLmty79vGMu2jAZFtE\");\n            yield return (HashHigh: 0x73369139f9a72bb4UL, HashLow: 0x49f9f84e61878049UL, Seed: 0x0000000000002118L,\n                Ascii: \"50eWLaSIzVFSAE1y2jxPu4pXhbUn5fbrZ2ISzjeWXClpH7pYI3fbYbZ2fWLkKt4LbAUtQ91o0B3oJGAQdIXlvcB0zao8KNRcThuSfT135gRNdukfDjmpINltxRSafuoxDRHIgKfS5\");\n            yield return (HashHigh: 0xb693956317161676UL, HashLow: 0xb3d9ae214bae6196UL, Seed: 0x0000000000001fd2L,\n                Ascii: \"XAdZWNfdjveSGCbiQoUzRIVRpTRw38a4si2uK1ujrUi8x9XOLgn0EIMDdTTnPYGyT6YCID6jjIiuaj1ljvEG1POgWmcTXpISyIU7fv5deBztXiicZDbL61NcH6ktStaLByZI9MDCW\");\n            yield return (HashHigh: 0x82aa3ed78dd761f3UL, HashLow: 0xcf9561e21705fbf6UL, Seed: 0x0000000000000000L,\n                Ascii: \"QHuDIZ23SZ00UrLu1Augid9QqPRPW3YF2yNX2Jb1bWwmRJnaGnD8W36z2g2u7EeU0oynrKLT1S6zAL1v9MgqbdfDOdPJpABxGz5UIXkf5YJCbMLD8u7ifiFipSTmkw2cqhBnBcbSP\");\n            yield return (HashHigh: 0x46327ab1e629dea9UL, HashLow: 0xbab6c5cc7b4463f7UL, Seed: 0x000000000000065aL,\n                Ascii: \"vTJfi86OzxCEBZIgdnuoNwRsN5myyrktrH6CmxCNnqidWYYqIqOTrWPT8A8vXkqExoex7mJu7xfvG8FIHLVExk8pmqsD9CWx7jOvQm9OS3wsoIAeOyRrQ3zeRBKKLbXwgw5Sv6O8EK\");\n            yield return (HashHigh: 0xf19335ff25be68b8UL, HashLow: 0x60c586415e0ea0b9UL, Seed: 0x00000000000025c9L,\n                Ascii: \"aeR4Ikfbab1jcP3xOZKbQncSKqTteyRRI47ndwQ2lAVlKXe6T9qrjQMTOMNHl5Z2TpVexHZfxk3TGOmK6c08EmCk2KhJ7Hbk6MR4pzvfGh0jba7cKKQ4FjzFKUgoGkTLEIUCpjRRDZ\");\n            yield return (HashHigh: 0xc234cc07f4771acbUL, HashLow: 0x7e1275a17b505a4cUL, Seed: 0x1b913e9ede6d5cc2L,\n                Ascii: \"7Y8uKD0vmUdO5BNaHvDCBZfJv47KNbDIRWnmPgGYUh50RzTkEqoe1eBr9vauaV16bvZcusbjs5ruqQ5xQDNIEU1UG4Nu2BTA2e9D8TxrtXH6zjDxiRTtY6K2bHhWG0xKA634jTqxvr\");\n            yield return (HashHigh: 0xcf396d47d97e68e8UL, HashLow: 0x387603d6583b9770UL, Seed: 0x0000000000002128L,\n                Ascii: \"FS4Q7RAFeTyOz5nyYF9WRtUsrhKcslqBwdSIowySyxNxIeJRd2PIiDKGF2MUGOvoHx4FpA44kcxRJeVzfjUOjKDR8OiUjGZlVpFBYrCB6OTDPnuGhFkba0innKsQF5ZgjEvlX49EJI\");\n            yield return (HashHigh: 0x46d0e82fcee7e71fUL, HashLow: 0x2fef91b105aefadeUL, Seed: 0x57fb342f893572acL,\n                Ascii: \"LABT9OF4MVWIPO2nxE6RYLjq5svbYkH9KLUDI8kpKb6CItxG73SCMAPRSk64Geyc8tHDMjwkWkyNiT8idQ82r8nL7It228YlhePGw8jkuxChsnNFmsDGDgy7xAjMgO04XrEhPBjpAdy\");\n            yield return (HashHigh: 0x149f3ed8949b442eUL, HashLow: 0x4b9d564fa69a10d8UL, Seed: 0x0000000000000236L,\n                Ascii: \"oYxflnPgurDiUW6nnQnZGDzw3CC3WUNWlhLbHgpZJm76oTBJlqTUrcMomp5MAfjTaUTlREu8DUL2wjtl4gp0ZlZ0sRHEEAqFTgZOyKe90kZ1NIIzCRQO0QTaTMNaP7bipyIA7Yz8cv1\");\n            yield return (HashHigh: 0x906858abaa97f581UL, HashLow: 0x160d1edfcfd5f284UL, Seed: 0x5aeb29b2d48b91eaL,\n                Ascii: \"i08q4MC0QpQ92tpeqTUgtf0V4NMrgf6Ui6XryC2zNrNSuQN6edxj9d74OnnwiZO5cZCLwAKKz3Mupafzka1DxhoCD5huf1OV63JlJogojViYyXKo0CPPKbjGCOw84rHRaG4x77QNHOU\");\n            yield return (HashHigh: 0x56ea46ab0c2269feUL, HashLow: 0x386f78c4ccb8e3abUL, Seed: 0x0000000000001bd1L,\n                Ascii: \"0c8W21X9nZ6HEZBDWIPFCvaCKLR0ExjIsMprL61MqO4GLJ4DSxcA5IhNKRgIHS33BCVWMISftY9fImhGe6wduMTEKXSHITqMx94CKxuFDm8psPe2qdA317K52dMZYPQcGWIMI9ZQur2\");\n            yield return (HashHigh: 0xf6ed7ea3379ce478UL, HashLow: 0xe98892fd4a45e93eUL, Seed: 0x000000000000219eL,\n                Ascii: \"RQncXAONa98LllMBK9qAt9ms19zNIVMrJrVcuOhcokwFmyMF0geyJeUZkVMmhbzbzujQPC4kNcwN1Vdt70KzagMvhIT7wSOHBMu1NUGIaBZXqxyE0EDaocrK44y2uOxkHz3bbFbFWyLy\");\n            yield return (HashHigh: 0x7a7ec28247cf1fd5UL, HashLow: 0x47841f890808095aUL, Seed: 0x76c7dd87ed6bae92L,\n                Ascii: \"koRmL1gHtX7WUX86WV2fnTtWrlLUw2KrMkTcsCtpiacCPsSqnPMlP8e3IB6LZf2AGSRYJ30GrfwdM03KPCnsDwGxd6xkIGAeiQhbQl3zqk1NhebSmfAdBi67SVOyWBD1HknGEd80zPtN\");\n            yield return (HashHigh: 0x9d9adab41cb135b2UL, HashLow: 0xabaa9832ec798cc5UL, Seed: 0x0000000000000000L,\n                Ascii: \"6U3RW7QvEd28xpKj5AXhaxt9SzNlaAfen6667b9wnCig729J3UnOKoYaSRi2f14aXDEQpYTgdsXE7zBm0yKb0QfpbSX0n1TLlFFnTU32ebIUmdWFQDX9i8k8r3PMBY4SXsmByI5xnP2Q\");\n            yield return (HashHigh: 0xdd6880902f07c83cUL, HashLow: 0xbfcb95237c2ffa17UL, Seed: 0x1b03d5aeaa9f87dfL,\n                Ascii: \"cJz36xeOEDL4lWkNyVDoVB3xg8W4rbZ6pgnDpecDuUQhsy0GwIufGOz2g5QkMhoMyv4wjkSOI1h6TmnD6840w54weVTGJJAto3j4lY2KcyNiftl5NKVVh3bpLeHUlTSTs0vUYELw0t1a\");\n            yield return (HashHigh: 0x57bfb494f96671c3UL, HashLow: 0x8fed4887f4f2d7e9UL, Seed: 0x0000000000001122L,\n                Ascii: \"LRr0gGIKPbSYSzJ6dkhAawEUcaexhjB3mRmOdqleUevzPNqBJaaXnhh0D9tnvwaKYLnbK7IYfElrPVlvIbbZK5yPtHfMxkmis1yfBmiu7xml6sNmZt5CisV1RjEl9gjj1Vx9zhsh66pNT\");\n            yield return (HashHigh: 0x7a1d6a7a5c8bf46cUL, HashLow: 0x8d9be3b69e03f6f2UL, Seed: 0x000000000000266bL,\n                Ascii: \"INqvwfmkN70mrx1CLzDvgyLMaIDeqAt3rKqLp9j0dKfPfyUenN0fHVC7axbd85i9CRcuN81ENMlTlA4pdM1Z0EJBEi11drzCAr1Qaw2CMQhvJCmft35NVMoBfn6dBnx9RZP2zqdW1ZK8r\");\n            yield return (HashHigh: 0x4fc45455b9cb6222UL, HashLow: 0x37b4072ce231f1a6UL, Seed: 0x0000000000001827L,\n                Ascii: \"ueBA0AtMdwP2kkOh9BHBYJnFQ8UjWieCTRMmkRbNVM0Cs8wpAWEKF8U5w35K09tyHkvH8SAAYiOJbJxDbf6mKWmT34WWpon65Ps0wSj0fc3hb7ArItHHh0yEV0orcwXTvCCSBgIUf9WPF\");\n            yield return (HashHigh: 0xe73461416c2c1ff8UL, HashLow: 0xfdc320a6041fbee7UL, Seed: 0x0000000000001e98L,\n                Ascii: \"XrQz5QVeOXyGV4REu5ZBI1qeHiYFoZYnzaL9c9HBlXiMSJISAc0Ix0X6K2AdfbvaeHlI79HBT4OGDtSG3gUntptaPELq3rhiQeIPQKZnHlDVtQMTdMqEwv190P5NvbTnq9MiNd4V2OtkE\");\n            yield return (HashHigh: 0x9ecbfc7c98fde54eUL, HashLow: 0xbf0a0003d6615773UL, Seed: 0x0f8be7479eb05133L,\n                Ascii: \"YCeS8ejYuPJYOsEsvse6xfCKgZ4rDBIfCsEuThLeS1vRxNabzC5WGEMrWt96EYwGvWtStxbEcqeuzDjco3iieSt23euOIHodAkLeH6fYaEdJ9wg1c3kaxjBy76xcUUvUgQdNeyIgixjJBb\");\n            yield return (HashHigh: 0xa5d69dbb3136ba43UL, HashLow: 0x8965623726f1cd76UL, Seed: 0x0000000000000000L,\n                Ascii: \"NZRIvp7eLAe9SoC5Furbk3IWXNR4GrOA8smVblKjNBj62ArLuReMOOiXQkRn964AnCNcYAJl2eKXuVCmYchYUN31we4dCcTqNXSZr6Yq4hCgKY4Uj8WeboayZ95mwAaChaLFlAlLP38DvH\");\n            yield return (HashHigh: 0xe19268c0094ee61dUL, HashLow: 0x60eab39cb1c5fd27UL, Seed: 0x0000000000000000L,\n                Ascii: \"bnbwbxBNUrVu2O9WdVObgmXRNk91ddPOcrfjgUpP2Qhg8ug3W63Kd0Gs0nc30h4kcjI8wtRYhlmsDKLdLRrCHtPnrlNOttBIcL3tls5kzgoHriyk1TyIcb6Z3z9OdNokTghPnqp5bTfigN\");\n            yield return (HashHigh: 0x57c68037d704a5fdUL, HashLow: 0xb8daaa7c4abbf90bUL, Seed: 0x0000000000000d05L,\n                Ascii: \"tzlNV7L4NVKgZpn6e6Aq8BqTNug8x1ryUYqTG3TadfPFmYboOPqgUIY0NJNMgqdxRUaUe2U2kaVHMuddKztIeX2gU7qEeb9XRFxeHZAVaIZ6lYLUXv1gzYDmw9trFYenp5EnyOzvutTdYN\");\n            yield return (HashHigh: 0x88edaa2398e168c7UL, HashLow: 0x0a5e54cbd8db37ceUL, Seed: 0x00000000000014d3L,\n                Ascii: \"ZGwLelMo5hB8lZAJEImVcUlqaSuWYvHq1XBIAagwJ2Mq0hM5bbj7r9yyDj8m1dRQeGch2Sv7gZNWKghhbOLckJ07kEF2YPR8gwp3PgNXE0dNMUEiin7725FcnSTY2bOuRO3arZTjwLjwsaG\");\n            yield return (HashHigh: 0x7f7412573832229cUL, HashLow: 0x61cf242bf6beae2bUL, Seed: 0x0000000000001cd8L,\n                Ascii: \"2vECEMJDes34YpXzV1BUUYtVPPcd92N7tg88CUw1oMj5W4eiZIQ6cXi1tQos5T1kLpH2oixJSeSqLu5h8LxganABgUzFPYOjIWL9uOEuDfUMsgktgQ4bU0cHw2nC8hFlCZDxqtnnhTrQjVR\");\n            yield return (HashHigh: 0x8e74db8449204145UL, HashLow: 0xb5bd0e09129ef0c2UL, Seed: 0x7661f00871943a00L,\n                Ascii: \"4kNidsgh1ULYzj0rbKMjQMCimtXWVjt18nxVpMP4F9KxA59c3nniCIXKbCvq5HXeqxE59L9W8uHEBBhHX1ahTR3p9LEnCXtPM4m8WWNW542LJTQFCtyZ5IR1kqB75Wdehw3ZYdYTci9AUvz\");\n            yield return (HashHigh: 0x5c69c4ee5489a887UL, HashLow: 0xe2aefd1975236a58UL, Seed: 0x0000000000000000L,\n                Ascii: \"xSnYEnPY0DFcZXjabmJZZv11XR63GM6Ukf9aPmjQxRwmlOED837tCB521Tv6zNowcu7aRCx3u6FkE0tHF5jbHIzUD6cJTMwKLnhjSQ89qwNLmNQUdCd3BMnmShmoQ14dj7Xxo8nE3pvQQMV\");\n            yield return (HashHigh: 0x9e8802a2cb965361UL, HashLow: 0x7c75e321588b4f32UL, Seed: 0x0000000000001608L,\n                Ascii: \"16TEUrYwuNZN7nXydHKcqgL7J8NXZCHc5AHRNtTYEB0wXHtkOWORDf0TRUuOSqj9orOgHyr7VETWFWcy11fChAROkyXXpYe7RkBbhERdMBmdaSMRSLpvZ4HkiX3d1F2iwGTBKipzpy5J4qmB\");\n            yield return (HashHigh: 0x9b443d5544cef0ceUL, HashLow: 0xb73ad12fa092570dUL, Seed: 0x0000000000001b7aL,\n                Ascii: \"nGVDgcQ6ZW8W2bokBryEg8Z3m7grx6B6s7iSXcnHNuEpp3fd9vKnt697JFlrV5JFLc8cZ83bSJWm4Xn4T1OfEzKl6cXg43qFJgYY410R7yxKX5r8XClgz3ZyyzrSqxiVjk12sZA85vFXm5EE\");\n            yield return (HashHigh: 0xb59a299a00349adeUL, HashLow: 0x8f68ef6ec9a8e219UL, Seed: 0x0000000000001471L,\n                Ascii: \"uW1clwZEqFxakgn0ExK0TYbfjv4FCVpWP65T2wy0eA7iS50iztHqIYuTOsoPpcYIVunRjBOcMG3OfFY94uWDqHxwGwzssHzCO61MtCLBvTxIZ8J410bL1YgRNoLgZKEdIC93Hb6YvTSP3Adj\");\n            yield return (HashHigh: 0x039806bab62ebf00UL, HashLow: 0x069841c8a7277c82UL, Seed: 0x0000000000001550L,\n                Ascii: \"QBkETJmofm4YRD3TQddoKvpyjzm3LMjsCkOoIBlbr6yzDBe0xT8PE2Hx4cHPub6P3O4oAv5sqGH79yHxJPyugMpmczKCKtFR4nbBWklfgQzZDoNv2i6816YDIAjKWjjpKtAMCrKTVmw0xkFO\");\n            yield return (HashHigh: 0xd46fd39001c8dffcUL, HashLow: 0x699a5a5c7b0e8e5fUL, Seed: 0x0000000000000000L,\n                Ascii: \"h7vxY18IBFufeMfQEF0uvNH441g0xOK3jfM7J6R3pTgiYmzyX8rp6LGUvUMCNZzi6AefpdtWcHn1SX7E036pJZFRSemmpaBhUoQbBm5hA8g0DEx8NFcPNJ1ur5AaywSC0DTTteFXG6tBmkzmw\");\n            yield return (HashHigh: 0x8f690e7c0d292b38UL, HashLow: 0xe6e76c1b01005b68UL, Seed: 0x0000000000001455L,\n                Ascii: \"XM5roMXpfUT6yezGaKFFvx2CWI28KXu0jfWo3VKvIoB62dd9cOMt7DHs5xSxWjwYjkqKBnOZMExbv28liPpEQ8stFg2cMy3o0fQIFnt8poRKfmvCrREGuq71m63FTa2rQmGJUyTK1UAuUlTEe\");\n            yield return (HashHigh: 0xbbce0106605b3a5cUL, HashLow: 0xdfadec21f7e67cb9UL, Seed: 0x000000000000248dL,\n                Ascii: \"MkD2kzabFivfDIm1DUFFVje69UYx4KP7zb4gM9dDlT4vTDX9Boo7YloTU2Lm402XU84QenglLDDyCF00z0D27lteqzYRmXkH1CbmdFRoAamtW4wILybXYQeYGGKXivPFpzkfPsWhzz9j4wnhP\");\n            yield return (HashHigh: 0x742b6275ee7ed929UL, HashLow: 0x43651530f20e227aUL, Seed: 0x0000000000000000L,\n                Ascii: \"lZh19faRQKjevEwNpVH02ADNfnLL6hceJP5yPxo5Bkd8irhjrRa227eaMlfrqwsAF1GsmH9tSDQJRGi7CGA0icgHUlcogKoYHIiglBHwLFNY74bbY8anenvnp88VfZsORihIwh3Ip8lhfLssf\");\n            yield return (HashHigh: 0xae4c5f19ea44abedUL, HashLow: 0x0dbf7f3cb87e4e5eUL, Seed: 0x5053e8563b8e105bL,\n                Ascii: \"mji9X45Kg2ieBWzBIJgKlAVI5xu3jNoLaFju9cRpNZs59VUvR3bxxBbb6AUMUFgDm6uXJY07m76VMUhGjuNQfJL1Rek2WarSzKIf8ZXnKVOHAoEgoOV04W6rBBsRoKCaMaXyUy2HAF078IYhWz\");\n            yield return (HashHigh: 0x6b80d81c159424e6UL, HashLow: 0x6d467762269203b1UL, Seed: 0x0000000000001c68L,\n                Ascii: \"QhdEgUvMnNhbiiKccrmrE11Xrrp2HiPhTIKyFWJb51zUEWc7Hwszj3KH7tbvuVcaPsrfogRgsXeO3GlBkZ6iXqRccHPVdSZcKZWHjS2nrgwbzZXKuxvb3st2xZuRctBTbKeRWlmyApmwyhZNXE\");\n            yield return (HashHigh: 0xabb8300c450b606fUL, HashLow: 0xfac2e60a8daa2723UL, Seed: 0x0000000000000000L,\n                Ascii: \"C6NSXfV5l88vvycmtINmb3FQ9DqTA7stdWvF1ZGmZzn8IOT9PkLRYwu29xBGz3u64DtOqhcWs29TWacrLo3htPrg9GobyClvNHHEq0o0OAmihp8K45cJb3tdeiXTZIY1Czrcpj0VABvZn6mkGO\");\n            yield return (HashHigh: 0x15dbac54c2a75015UL, HashLow: 0xef99ba1251b78649UL, Seed: 0x0000000000001718L,\n                Ascii: \"kbeaxNxCAOMaJZG4ndPplTGKwdw2UIukSbkSuWxFyFnVp5rfUw7RMAfIjgsE1lFaigGI3ALU5gyTXEMo0xlzFz74GZ7PzraAIyEHpW4yMeltmndUlnj21LBiXRWTCkriVH2uNupXBS2XC43OmR\");\n            yield return (HashHigh: 0xabe2973c92d0f517UL, HashLow: 0x280c5be1560f7c1dUL, Seed: 0x00000000000002aaL,\n                Ascii: \"lRDPYl0Iv939jZw9iglpNKD9uNKxoK26xOG3XmFMAOPKSl6a2ZHc4NCFVHP4jCxwVXskI3buxPZr3yFXt8oqCaA7gZxKCgREcIDoUJEMiIq50OQoIfCr3okNQPDM7zzg5cqZRQhn520ghcYTiAk\");\n            yield return (HashHigh: 0xeb3faf63d11ab3aaUL, HashLow: 0xe1c8e373561c33c0UL, Seed: 0x6cafbbc0d4d9d448L,\n                Ascii: \"2SE1OL9I2HXxFeZ9cwpG1bvHORfMYzlHqH4O2DMqPiDBQNssznaruH0lD5ggyyixdtdr0LIUyOdywEFJbtsdpRZloOJHNyGvRZ13AKfbnp1d0cI4OBDSEtljyVPKwYff7bT1UMD5Qb7GSCHD8yy\");\n            yield return (HashHigh: 0xfe2d9aea8ed87e2eUL, HashLow: 0xa90547857addba86UL, Seed: 0x0000000000001d92L,\n                Ascii: \"VrmLgJssGQMypADPBHCcZzfAf02WEAVfmDdX3ROFbBxUKu57jQEaPDv6yF1yuZrUM1GmrwWj7jpZfF5xPbVBD8G6HBKjhXj7lZuzEfn1HTFzWvvhRCm4lsO16zhYIYt2kdDguWTBUTxz8jE5ciW\");\n            yield return (HashHigh: 0x2e1410ae61645e3aUL, HashLow: 0x239d49e758cf2e6eUL, Seed: 0x0000000000000483L,\n                Ascii: \"YqLOaCkvunkE6MNqJpIbwvfcQhkUGG6JEewerE7rHH6797Ln4KzEelspi45h4SmHAjdNDNcM3Cvm0F6AbNhnhqtBFdFaby7GEPeeQaWMqAQ8Q0ig1BN1juCwfflybwbLaA8Jokd9ZXVwA2W3SKw\");\n            yield return (HashHigh: 0xd7dac2de6f2eb1f4UL, HashLow: 0x1ce3d2d5b5fee8bdUL, Seed: 0x000000000000015dL,\n                Ascii: \"wdwPvtZuwFk2xZz5ILImhDQoCQzoWDgkUnWLJiqAg2UHh171FoHHRZHVuFPAAUBeBC7g0rTzFtEbvPjmAuph55JHMPJ66PzXSg6oKj1GE6l2sM4v41TV1S17c3rOr36P0VXDpzJrDqNjYefaDcrD\");\n            yield return (HashHigh: 0x7952d8ec83229e0eUL, HashLow: 0x2a0523aad50caeceUL, Seed: 0x0000000000000000L,\n                Ascii: \"Ca21pwuAz4ChrAWVQCQaGiGufxKTd2Juom4dcuPa7vML1kzz87lAQ4Sr4Pspv09YfvAyPzKltoBE2VxxvkkDgrRQxJ9NhGoZbFj9yVyMvpMSsqgGHVCsUuWhROOQJt6Lw9PcL45lHWCcheDrQejt\");\n            yield return (HashHigh: 0x66ca0eb368070887UL, HashLow: 0x44474726bbcb0ff4UL, Seed: 0x000000000000150bL,\n                Ascii: \"KnSIM1z4E2EkYDzGqSxyMxy8kkxwQbdCYOloyzm2pKQ7wjDs6znbxIbeXx5T5jFaPv6D0rwbywt7RBaAd094bSl82if1n3bea8tTzKaWHrHyztPRvdIOyjYmJUwLXEAFTnsIfU4w7tkD6wP7hrgP\");\n            yield return (HashHigh: 0xca7f96ac9bf04d6eUL, HashLow: 0x8190fd1bfdcc3ffeUL, Seed: 0x00000000000003d6L,\n                Ascii: \"YlEO2h05Ro9uZTDjpeVVHBcBYTyrarAQyNaUboQ2F48CmEFhcd78JPfhMD8IPgSDBR6gZzwTnd0AEIpWOhFyHxQTWT95EtRbky7XPXq74npH9zDWUO5Oa5wwOZXLRNTNwDuZARcmmf1kJEgNTnpH\");\n            yield return (HashHigh: 0xb6ac087a0d45e20dUL, HashLow: 0xc54c9518bb3d0a6dUL, Seed: 0x0000000000000ffbL,\n                Ascii: \"RiWtMv91x0z3MJi9YfUq8rJcpeBCwIMyaCMGjuaunyQRUMg7f2ySvTu8wIpg50dpyUWCBskBErrOSFveIvWoVfV1085dXHrG7nUEwl8IrMKendmmfz1yhJ6akVYk5cFoQam96fzyvsQD8BB6GimHE\");\n            yield return (HashHigh: 0x628aba5d463f809cUL, HashLow: 0x21cd0e6bf33a336cUL, Seed: 0x00000000000011f1L,\n                Ascii: \"mnv36rJDzm1Zochb46MhGXcLeDZbKSZ5WK1jSa8i4IluVBGOgfAJHSF2AS7YHZANxDCLJVVloSLxeVL0PGrrwQxmdIXNYbTuRT2xUmAg74oJh832LD6D6IfO3J5DEsmDc1B99aIGMpgatVj6z8hIW\");\n            yield return (HashHigh: 0xb62eff46e66790caUL, HashLow: 0x3adfedcfdd201812UL, Seed: 0x0000000000001a75L,\n                Ascii: \"31nAhSK6lKwLUMflSqSxLBWCfoRlfKPDWo9XTOOFnwdFoPPsrkYXXFpE5toYNUzmEFZ0xC5KeYBIa9xeVJ8w0nGi6ISL8PDhl8mBeaaHn68WvOr5SsdMP5l5IDmaxsftmmBs37NtG0fHuh6ICifl5\");\n            yield return (HashHigh: 0x6803ee2e26725c30UL, HashLow: 0xe43ecf314a3a82d3UL, Seed: 0x0000000000000d44L,\n                Ascii: \"ANpgMiMNheGfrkOHwYj27tY1XBzItUDmuyCRjfuazR702hViGWK89PD0QxDdWJDxgvY2UY9IjluyUiHpMBoycE0d4nS88MUwF2vov0gjvJ4LJ1cUfCYvptYhPQHVyfpRxXZ24yJNnbjmbrb3EMFXa\");\n            yield return (HashHigh: 0x7f8cc78f768070faUL, HashLow: 0xe2397c15cc54e954UL, Seed: 0x00000000000017caL,\n                Ascii: \"P86XZCtYQO4z23K3Os2V1deOCsWdEEJI2APQ83oDSn51Na4hioDJzhkVK51cIPJC71l0tTcWx9uZmdOzOCni8x79irZUZXaJokHlEf2rloZ0TehEIH7wObIuH09lIkQocRRBJR5M6PSYVAoU7MiFPQ\");\n            yield return (HashHigh: 0x0e76a187aac9fac9UL, HashLow: 0xca0fc091795e03a9UL, Seed: 0x0000000000000000L,\n                Ascii: \"506lXaeVt1PN957la0rgUiKtGxB4Ki2hqgTK832nY1vtUkXcdwQVvWIaDrn28WvMUAR8AoZcxIxcYsNfT1iXgNohzJbDSSnkNTCj6rAgsZOWxpsPJiUlbEJNZi5gsZBGt5UMb3XuHAXf6cKIhk2izS\");\n            yield return (HashHigh: 0x4acf974a7bfe9a5fUL, HashLow: 0x7f7f0b179b5df850UL, Seed: 0x74422383d0621306L,\n                Ascii: \"5RR4CrqvBsonK7drBXlhL1VUQxm6cX4UKtYg8zZOW9pRFaJCM2BjEBAjN5NGBNUq3UVyHF5XQOtU88ZkpMwoAkrekG4UlpOdm4DmB6P1UVpSCuAcAJNO3HSkYyG4jMnxLrWZsoN54ZSm3ZC7Fd7b9q\");\n            yield return (HashHigh: 0xa2554fd13f900ddbUL, HashLow: 0xfbbc4658bb118caeUL, Seed: 0x00000000000020d3L,\n                Ascii: \"Zca6ISTkVdarTdiYoiCtulPQhB4szxFmw7GGTptQqyCEdDxaCdTTwHoHRncshyTHadwJC5Xpnmx6HHVedezqatsCtOGGq0rvk4umVLdvqgNcJsjx2EVbK9xIWgWIoxIYFqh4HbROxI958uXMBP4KEw\");\n            yield return (HashHigh: 0x0f2680af7a218693UL, HashLow: 0x717537706f0ea759UL, Seed: 0x00000000000025a8L,\n                Ascii: \"7CwoN6n1mk3yjMN70v2BIbDP0DxSxSrmEkAh26csqE5MIdD0bDQ8CHVF1t8MlQENE9Usv77bCm23GGSJO1zwWBwMfw77H9jONyFhh9IxyTkiFDiPyJZHPAFAI7Khh5BWeS69XSROUDkCYEr2w3wMD7J\");\n            yield return (HashHigh: 0x910b6eaf09d691c4UL, HashLow: 0x3702983700355d54UL, Seed: 0x0000000000001e3fL,\n                Ascii: \"mWYT7sChygmozGjDYHiRHOKCIZ5MpMOINswQw5rMn7aNT927s43Fu1VbDFCI65WuzfJFQdH5T3B5V5azx7iewhxIEAyxQ8LMkyIfwgrGaN968Eo3lQ85LWk3dP5vcYsD6e6WuCpxVQ9ehN1oNyGBUFh\");\n            yield return (HashHigh: 0xe865d9d3c9509fdeUL, HashLow: 0x0a13d1d4770b26b1UL, Seed: 0x1eadf009cbf8ac7dL,\n                Ascii: \"FVIs5vdoGlQH8mO7gwIr6dzuitt7tCLlto3j9ISwyo2ccMZVwfFgpmI52ZSzMHxd1jk9gUu0ap2qRVMQoY8EQan7tTGO0UJeYChSsgLmsA6N19adBoUG0Jl2aLuAUpJOxkUwWtnqBweYzskBihqeeeK\");\n            yield return (HashHigh: 0x035bd324b14e0973UL, HashLow: 0x64f04e9ebacb5cf8UL, Seed: 0x0000000000000286L,\n                Ascii: \"9r7sdylVeJ6UPrid18hQRVGKD9aHkJg0MgrpFQBiJL1LyS7GKbg53W3dpFpZX4VKDtqVU22QdAtuhkBRG0ARJ2CvJcvhG85kiS3xRiOjtRr1LyBAhmP0Sc7qDxZGVRz4c8xX2Uxqk6lKugvHSDqm1rD\");\n            yield return (HashHigh: 0xdc81ff3582298a62UL, HashLow: 0xb47d5072f96dba1dUL, Seed: 0x000000000000248aL,\n                Ascii: \"f1CzSvUf7nMOhfG0aLlFfETuxIA8g2DHzWv48KA1gg9up1gdB4IpWMwOBlon2i0iAma3p9t4otplwQqGkcdwLKI1CBu0PZhNDihtsBTnvsIXM3CnA8XGZ352FYJ4aMyRVMFFse5fAOXwM1Zw6u7yhyKE\");\n            yield return (HashHigh: 0x5f87bcb4478ba699UL, HashLow: 0xb3d241c78d5d87e3UL, Seed: 0x0000000000000065L,\n                Ascii: \"zZKL0OlySsRishB74cl4RGBN2d9OWsFhWNZWdeFUisBNX2UwuLWHR784AKOeIDSxMkvN5AthRuxjClrO76vQl8OBozvGWUMKeSqlLNR9vywn8orNrBp354Edxc9ByHPT2toJUniK6ZJBy0MibcxrQ7CG\");\n            yield return (HashHigh: 0x18e6db40e10ad21dUL, HashLow: 0x8a5e5811e526a6dcUL, Seed: 0x0000000000000000L,\n                Ascii: \"0cMGeRh3IXvLixGzdMVb9xBGjA6kEu4IamxKrYBh4e66zsoCJKZqorkk70vMXiiU8HDAZ3L0hQafI8AXRGUt52gIFbx52etqU36ye7ZZA05WwURAxSfohBVJR4CyHgAwtvZPnAIQTYqUVabcuvpVMNlO\");\n            yield return (HashHigh: 0x3ff386d2dbd478e5UL, HashLow: 0x53f2dd2465dc929eUL, Seed: 0x575d01e52051c5cdL,\n                Ascii: \"RASyAErgK2cfd8LnRO5t0PyCVNbsfcru6yQkeyNQ3MWQ3T48eMowT4HFcE2ZppMsBXZm1e29iIsPpIzcOM9ZWEf5GVOlO5Xjyb1yuzHVtgPXEKbAvJJGjeuKpNtIriONajKOn1TdWUnT2jcoQpexBmUD\");\n            yield return (HashHigh: 0xb9916b8decc426f3UL, HashLow: 0x440287edfb38796eUL, Seed: 0x00000000000023a3L,\n                Ascii: \"63iWiybDwerjql22wHy5iLaIkJA6yU4pbimzlndJqI3pHt1RoVud6cmtgxc1V2Lzg77Ij2ozFJ4OewXmcLus9dVxiD1nn8iHtl73mce7FD6rzJhZAm7LYfqn3W6u3dwnZl1JYHSeHtwrhZBRLhVbDYp7O\");\n            yield return (HashHigh: 0x75ceaf3cbe571522UL, HashLow: 0x015cbb373398be1cUL, Seed: 0x0000000000000014L,\n                Ascii: \"ACkIGaxRIZMiLn6IKDnj2TQKLxoO9FFCkpwHqiBjTEP5HlIzbJxfwfU2iRFT83QNJg7JsrFNb6euxR3Q3AhRgNLblJD7A74H7Dr31dqs0FujW8l9WcizDpfUVpS9A8lsll1uZqZmk83kpxOmt0UyDlnu1\");\n            yield return (HashHigh: 0xd9b745edef8d46d5UL, HashLow: 0xa159928e9af71958UL, Seed: 0x0000000000001dc5L,\n                Ascii: \"pDWf5Nm5aVeWCKqWj0ZzCuCG41CG3uMD4K7HbVfsyRHBb8PPxlUaZZafBNw5PzReVrZInVGGz7J1B0gHcXBgWi67bFD8JKjGRGUhHrEs1GP18TmFxQYnsugA71HtbNZMTkrQmKEmOEcDUbQVsQOivL5T8\");\n            yield return (HashHigh: 0x9ae0141c6bd9edb1UL, HashLow: 0xf48bd5b303b935caUL, Seed: 0x00000000000002d3L,\n                Ascii: \"hQ5invCoIPWENdwevPniAqnrcOX59VfELHjdysQntRUyXVEcPrb0jhprmY1MiAbfsYrqsAkjqR3allmcIuRwzub6yBu3H5IFl9Y31ZbbPZ2QLKRlXFurlrRaHjNtiOjNT0YqW6JLixmNBFMw6xAfdPArk\");\n            yield return (HashHigh: 0xe052b33ac613296cUL, HashLow: 0xc28f3e77fa1d950fUL, Seed: 0x000000000000155dL,\n                Ascii: \"Y4JbTln4lJObiJ7EQRU2CPLoLhwGf2Lk6jJnoUhQrS6nEcn5EbEJiHmaXI3aXr9Bm2STZlA1uaV4AMXeCvtdbHKePn0lPjgII0WX6fOnpYpOGjXjPSt6ad14XlSFI4YwmqLsA9lrYJa5R0bkkAi62E8rMn\");\n            yield return (HashHigh: 0x6993e62da22fcb52UL, HashLow: 0x468bd1a9f938bcf6UL, Seed: 0x0000000000001102L,\n                Ascii: \"VrD0o8djpXMDKYuKitrNnCC83Q5ijSNlCAuyIql4CHAuBxC8LklWurywYciPmaarWef5zacECokLWd02dKXG2jHRwHFzEkkgjky94CZHJsEUAoIRTvbXSMPZA2880UbkIbQ2Sm5zrXQsoMoGwrQZaKxugm\");\n            yield return (HashHigh: 0xa2e617fec14cbf83UL, HashLow: 0xe238025be6e76cd1UL, Seed: 0x384c038aecc68846L,\n                Ascii: \"xMEm4HPPaNLsqoqtloLN8ygMjf5O9hbLEVuSG6X61BzNShJWDtRxzRXZ5sKhxASjBmweXMrkoG9s7ri3Lv9CRZ0H74L4HNR8GPQQlX8sqXy1TBAaeRUXkZadZtNwyjXNULCuAsLgfCDjndDr8sGVtL1OBJ\");\n            yield return (HashHigh: 0x1d60f5062b0eaaf7UL, HashLow: 0xb32e85a98f9bac34UL, Seed: 0x0000000000001c35L,\n                Ascii: \"eHjiuI0JzxZSiHdZetVhEqyWE2AoxnU9W2aUNEehVlwoTlW8ca9Z9IRWc17NE3DEvBormfTJOjwUKXdv6OI1u1nspYUHJ8qY9zJVgFSVf6nQl09sG2TOVHrgspV0WFTgzOGfsvhJoHsRYRgh96BuS1hY0S\");\n            yield return (HashHigh: 0xd0fb4506107a2b68UL, HashLow: 0x1d3166fed32819b7UL, Seed: 0x0000000000000000L,\n                Ascii: \"yfPiKy0htYoBIT0XWK9OCGJFZ89aknaEG2iTdxMCUl4MBt8u4zTucKtg55gUVGSpqT7Ui8oayu0qJLyeu6YeT9GjEKz7ymcl1nI1jR204GL0Vgi7TAxCraZDGzu9KQE80S1Yzxb1dY07MyZhUL7oyWoXnm4\");\n            yield return (HashHigh: 0xbe7032384d0f3724UL, HashLow: 0x6818d4ee69d44f9eUL, Seed: 0x00000000000015eeL,\n                Ascii: \"Hb1ulxeUfjEalMMwNcgWGvRKc8U47rPPUOc8dgfbfIEpFOV3NX6IEPGhnzNK6jOiDlssWFdeaL9vLOCWloY0Hx1MPUzNpPx1N7p5Y1d6CtrK97ciOXarxEJz5aFU5v1KqCfC4JdJiomACEOp2MCsnmJz1xg\");\n            yield return (HashHigh: 0x8d37639a76505f42UL, HashLow: 0xcff4abbbcf63b706UL, Seed: 0x0000000000000cf1L,\n                Ascii: \"m6FxWVVTtTVJgteLjAr1UnxEQoTJiVg8ULaj2L7O91gfbBe5olfO2xwDsLcTpidQmhMyGCtOBr1hVO3Ugnl678jn89UdDu7B06yBTg93y08gD6P671JBkRqgQV3vNN5o76DaandiNfg8QJrwkmidGHHYhaA\");\n            yield return (HashHigh: 0x42a059387e6ac267UL, HashLow: 0xd9d2eef67e3ccabfUL, Seed: 0x000000000000095cL,\n                Ascii: \"wzLjHXCGSajJWmj95VcIHoLZ9lP4xydL1tJsTsM7hNhD8vTFwvzteCmxBd9QTHul40VzyucnIlZpt7IXE5mbuRNTD8xqdg76uXGzPYCBx8H1Apydw9zOHpRJRhIz89HEsP74ePBYAaETTxwgNLlKApt3zOe\");\n            yield return (HashHigh: 0x806ba8fa309b06d5UL, HashLow: 0x0a60f6a4e1e98c3fUL, Seed: 0x0000000000000c55L,\n                Ascii: \"u1urrFActQ6OHUkGPZkVZBOKcJGu7WAGe0VU8x61gM4HqUI6Cbdq3WKewjzneNl3zvxZ9qylzwZ6iyaz9DjmfsPBB9VJfKC0XOBFGRHsEghTwFwmdeXs2O78quvRFP0vEXD9rzctYXYPzqvMcNQBs29tWMsA\");\n            yield return (HashHigh: 0xf386b0b63b3345adUL, HashLow: 0xd25f8cb14232721cUL, Seed: 0x000000000000241fL,\n                Ascii: \"MB19edtYkCHPdZKlQpdLnzpRI0G73IN2djAIZPAnQEgoyQYNaTLJiG3XuoW5Br6nE3TcfzZsOfwIf4iOu5rzts0UjmOQXM2NTOQAfXqsAW6hHzS94BgHfjyOlOjrjR5qGorJxx3eNY24hgKNVH686b6rb6Sa\");\n            yield return (HashHigh: 0xd6a88e83f520d4bcUL, HashLow: 0xdb5df31e841f366fUL, Seed: 0x0000000000002499L,\n                Ascii: \"MfKVGmZXEkUCm5FWOBPCmQnjgqK40oZsjdZjUfiyVlT51MDRNN1M8Igm46TLUmehoj8FvjMwQBZMZ2f307c4VHq9XJSHrlzleZ2pu2WXkQxlVM8bYKSgX0c0dITSgilVBWYb05uzKdxDXdt05SdI6GoEaFR5\");\n            yield return (HashHigh: 0xc0a86717adfedfd9UL, HashLow: 0x0e21405a8fcafb86UL, Seed: 0x0000000000000da6L,\n                Ascii: \"ydXxM6vIjrISOJL7dQVQUvuIfjOdyiptXUuWcHgFIQwyhmUGeEdVEIdICVUSzuRlMwatIE9scF85DNJZjksaYGblCeaawoBgDylTFIdlipgQ10BGxVbrpbRGAE2vshvgbLRmyteU7yt0CKOkZDIxdW3QF39G\");\n            yield return (HashHigh: 0x2036a451068584d0UL, HashLow: 0x10f79f60d94e4455UL, Seed: 0x50cc1ea8563a34c9L,\n                Ascii: \"Tubapz3FQuUbljkXjfqs94japLyuOfNYxMXcwosPdRM8udnzFzivbsa9ovq35KJ7Kqc1fTN83wajhIG01T3JLfGl2hV2R4eoWzgJvTdqzDs6Co9PVHRqPIIycaEUwA7SrxiVvcoHXJm5KITZI3QznRShpZqOL\");\n            yield return (HashHigh: 0x710b20a1b5ef6239UL, HashLow: 0x8e179eca51c1099aUL, Seed: 0x25ce729810d4079bL,\n                Ascii: \"Vs2XzwmoUIY89K94OPUdTm8JiYJ8QMyf9DseOZDlP4M5nnJEBIzpHyToV5wY3NwOjfscaPTB2mhVgIHvs0O1WtELXX2KyLyP8u0ynBdPWKCQzwl6GAkC1yfx1BYRMr82X9rLDYW4nfObG4XKAhIEZd3MCzEua\");\n            yield return (HashHigh: 0x167df0d01a3cb63eUL, HashLow: 0x9a9b65ef84871f14UL, Seed: 0x1e01bf58a2995f69L,\n                Ascii: \"3Qw7U87hMFvrz9vXTV3cq6wulh5uZgo0XzyZLMgLNpNeYBeKCXi3GpVuTjSiiXm9hiL7YJ5ZK93V3SsrWhK3CrIXBhm7m69kGBwgxY7aF9idxWcPiCwJru66lI11Ep1gUGdUmyyCqmurzqpv1uE4ZbXITcvRt\");\n            yield return (HashHigh: 0x5e5e09b08ad55e90UL, HashLow: 0x714381efc5892d5bUL, Seed: 0x0000000000001b7aL,\n                Ascii: \"teilLoRmzlGc5Ebm3B3ArhH6f1sZ2qAyVXyiurRzZ2Sy9yoBrN8SktjjlU2TWHr5NUPC9zz1zX0FW8sk6xobnfSdsdet0JgidHflK4IeQLhWeGJTg04jEei5YiFt6abmfyGvIddICdNtDtN93IZBKou35UYxN\");\n            yield return (HashHigh: 0xebece3096fdf3523UL, HashLow: 0x992b35c9a8d6e370UL, Seed: 0x23fd58b8d01cf794L,\n                Ascii: \"HMAPg9YS9ggf6OGW8eQzUFvysR7jmGcwAjMltQ8mXMiN0nrCtKqhRaQQyc8WiBZpgLtTsgvBaKfPglRA2HPLNzu28Q6xNG2UEvhdS1qJRYBglRDBItcN1pwjIyCeewM00wTToh03nXXP9xUS2Odv1S4CAzxeKG\");\n            yield return (HashHigh: 0x0becceaf5fb196f9UL, HashLow: 0x2c82a10629b452a7UL, Seed: 0x00000000000007a7L,\n                Ascii: \"rEcZMF0bj2imyLVxiuOUlM6pMlC6gwo5fWlYNx1UjDb8RyGf2JUrYbvDz9SpUzeJ0EE7e83PSVVtUKPE6wioBQ3DiH3b9nRXD37LstFYriMdcT5omHHZxZvR08yqitrpRIJtTVFFTUAIgoRZxpgJGW8ssAkmY9\");\n            yield return (HashHigh: 0x7eda0ab5418f5599UL, HashLow: 0x1abcf02977c08ef4UL, Seed: 0x0000000000000607L,\n                Ascii: \"VUAU8d9A9JaJxsMHWm9DSsa3fU0LX1HVe0pGTZoVGcQMrtikk4fAJPUi1Zl9U6Vy5lkkwY94EdxY31VPcKfm94kviQ9a3uelIligqUQ9KtachOw6wm1sCTnJ3dDmZGzbUafyFOe2TgIQf2iORP8BzOPwt4pn87\");\n            yield return (HashHigh: 0x913992f5431498aaUL, HashLow: 0x55f6b082c3074b3cUL, Seed: 0x3c2902e3451cc760L,\n                Ascii: \"KjchkxMHEzdw2pPGSaSMmmnTtUJmzf0XkICXwpEaC0W8Jsfm0At8azF9hdcoZnYSGD0DXASpWQvLCBQH9bJP17gRsJvH56shCfgTzp7ns9NYYEao2tJj0zIjbQMmMTo5cNEtfQl6xGZENSWwqfXUn6WLd1NM7P\");\n            yield return (HashHigh: 0xe53ff56ac0850865UL, HashLow: 0xd05a46c85431d126UL, Seed: 0x0000000000000000L,\n                Ascii: \"IiBxrgW2w6mBZzsR6GeF9sB3l7I34uKW95L9NvrwMl85aUozrXwYXHxb6UE6EjasVcMOOFxSkH2gUxWeWb5Frf5HmadebjNQmbe76g8NGqnGpNEOhmwwbH9areTGnF1dzck6cZRbuwAOdBndLxzp8CXqwQtXpmM\");\n            yield return (HashHigh: 0x77f3acc4a79702d1UL, HashLow: 0x877817e65309e04aUL, Seed: 0x0000000000000000L,\n                Ascii: \"1NceKUaAZTYZ0iecBTH3JkOcsfT71BIsuY0AuyMA2fxlaoe8e26upSR9vGKl97oBMgZKPw5lTPSb5UCemUoGNYqHSVNUmqsRrNezeFXS5L8mnAhfgYa2i1VCoYnRP1wtwYFHdJ7wqZNNmHkxUmqGMuQdJu71axT\");\n            yield return (HashHigh: 0x0010e3c1c07669aaUL, HashLow: 0x300983f5cfa705cfUL, Seed: 0x6777505caa5b9166L,\n                Ascii: \"lIrKpXvXKWI16oZEvS9Fs7BWiwjrFVDdEW4zVb9gt1WiIodsSfXtqu20Z2WlCdQEsEMKi6aL4IhOtG3u603nRTb86R77S1eiAaOjDTdAxVmCeTzQLGz1LnMtNmyC6n82mOt0dD5qsA76opQZmA1VjnYB4TGuIbu\");\n            yield return (HashHigh: 0xd00279ab4df8a58cUL, HashLow: 0x776e20f501ef727fUL, Seed: 0x00000000000018acL,\n                Ascii: \"QtxcQDjjVqymMG4ESynWyEtG5J48iGfFg8DYczpwOo6MoeEYwqTtAVOpdCLFhJkiAnaAxvGy3YOJxnoMrk9ubOSWeWAKx0OmuQMtQBuJAtZyWuIYfngKLAfWVcfbbKfz2HJFNbbJILQhjVwvkI05Fr7xnfPMB5e\");\n            yield return (HashHigh: 0x7191d5e0d74e2b30UL, HashLow: 0x02d407cf0a5dfdd1UL, Seed: 0x1c8c8928397043ebL,\n                Ascii: \"Y7fXUKQipnEtMzOFxH3rZojzw9HUw0pko7wNGm8IqYruxttgBScSAgj6uN9x40EYFq0DNdetX4eqplZRFaayvPlR70XlvX55JQu2ClGpveMdHbh3LDJInlIJbvGzc50jluJ6xWnPThMRK70ifM69obKUh8QEuLMX\");\n            yield return (HashHigh: 0x31745183c4312c2bUL, HashLow: 0x29fc371ddbbc1270UL, Seed: 0x0000000000000000L,\n                Ascii: \"HzVRodZLoIsR7yjNoOvev7Hx23M4zXYylsuJMgxVPZ2kDdCsyG7JopItDEqZJk1TVHX71xDAvogeOO6fhC9TTZWYm2KtMZCKlYqdDKNvkzXDcHpJcOsDSHxMbkb8BMBZSEzp3PSpk5lbjhsthpKwqCTHyenbTOMB\");\n            yield return (HashHigh: 0x8347a82729e1d1b1UL, HashLow: 0x047fd580bc62c034UL, Seed: 0x3760d5c09f8db647L,\n                Ascii: \"ZfRUlMvz6ihV0GtOaUEC6pVp6a6OA59nNTBlt9CtrZ6RKz8317XC0AKWm5PnxVidImQeeX0pRDkuFXmfi5U256QffEbmJdw2NvYvyOQYZmGDWp6UlbwgRVRp2srwEl5dWpuUfMVeyNBMJW1hV4nAgxpAOHYtxTp7\");\n            yield return (HashHigh: 0x37c86788fe7254f4UL, HashLow: 0x34ac2aadc84772c0UL, Seed: 0x0000000000000000L,\n                Ascii: \"ao4zfgApzSbgG4Ftq9wf5QgDZirSVqA1PPK546x3LOgNG2JQHhjT65oby3dgQ1Byaqo87dAHtvhbSoMJKJ6gXpEG1ZaGMtDU11jw28rbqkNkPRGhFFA65ZEcTPtiKAHggYfJjxEPQ66UqJrLlYa3GW459GVPeoFo\");\n            yield return (HashHigh: 0x702f9caa1fe83a57UL, HashLow: 0x1ad19dc0b1cb4298UL, Seed: 0x79e642717fbf5a27L,\n                Ascii: \"8soJhddrb3vn3BzioBaOmKi0Fo0mbjpFyrpcc5mJ0VnCWjS0YyBOswiRTMoVQYxoNdN2k2wzkJX23QwpXACid2h86nv27YnPS1L5rpIhFqdTROgS5r6mNFRTxbQFAvbqu00nCzxKgw5GJu4qvB7ipXbnpWjWu9SWB\");\n            yield return (HashHigh: 0xb2da83048486a843UL, HashLow: 0x8fd1449b08d84631UL, Seed: 0x0000000000000000L,\n                Ascii: \"uCTbnQFcR82L2E59yMlIT8LsKURuLM0RZUlCODP8ArNwhlkRAetszECVonCjW1QSVB4xYvzusAb164DU66ElcODEaV15ufuztpD6tT82Sj9R6tcdLYOBC6aNMvnimakXTYkNvi091QRpPST1jOoNlJWWOUtYYE0lp\");\n            yield return (HashHigh: 0x1fdd0173c6008b82UL, HashLow: 0x7cffe4234efae13aUL, Seed: 0x000000000000047bL,\n                Ascii: \"MvbXwjtP6WnGNEVx4iJ61MGaEwTZIAfCBwHX9WKOXCl1UAP0h84AhcG9iz6WZOme36zlkXdrJkDa1UQNZmcg0JrX9oNXPLha84UD4o8TNCSkbEitP3L70Aasn1Jjyw5UbFvcSNHMNBhEgBBF7b3olBorHCCSzYaGX\");\n            yield return (HashHigh: 0x69c8483b197d2b3eUL, HashLow: 0x07b4631ff422cda1UL, Seed: 0x00000000000021b6L,\n                Ascii: \"HjFuXIJSeEXBU445lsex6x1BJeMOmD0OlaqLRwQIJSnBbwfAUv3muHK5t5kH9Dr1oDbSzs4zJ84D5UDoFvKBwMUJWZc5jGTE5gtpTznhVoTRXIKtAzIzysg8pA2aTvUeoYTTo0DNUHwYddlvMriG3HPEOuwPZDs9W\");\n            yield return (HashHigh: 0xe96c1fb346eb09a0UL, HashLow: 0xab3dad0f03e04e52UL, Seed: 0x0000000000000000L,\n                Ascii: \"0gABXgE7m768NXW5kMNQ8ouE7LuSq4ncHhBP2jblEAqHn2rFhuLSNoD4LXmhvfYlDpEueh9IIps1UXmwEEUfoRCZLXwMwJd86nyFcA2finm7MsVOKCbAnGnsHh0aXcgcB9bJ7UZc6xlrSAbyzESkeyQOY4mWKyJhyf\");\n            yield return (HashHigh: 0x13980da167fd31d4UL, HashLow: 0x55cdf4b576c9a190UL, Seed: 0x00000000000026e2L,\n                Ascii: \"m46SbDPvUCuopzRosoOzoh1svBy4yg7SU4XYnJOmD9bLDdTFx6Tfkf7BHOmaJcx445mUtBHw1NpuyMYCUfp8kD3CUDpN3oDGmzpnvS1ei2r78tQn2rPSu70n75s4wXQukEvbtkQVE3zbSCl0h1h0vmjy4vGqz1T9sZ\");\n            yield return (HashHigh: 0xa4a7a2f1ed370b2aUL, HashLow: 0xd3420621784f50ecUL, Seed: 0x0000000000002674L,\n                Ascii: \"Otm5vGmVV6jF8TLUAHeHnxtSvH667GG88QdLrHzvJFdsmhiAZotqgmidTP3skJIf7YgM904PRVEGntlT0F0vAP5883qPKINAB1lj5NDGYTlU8UTkjM1eDziygtyKTaoftVW0JXVvZOldbL9K9f1p95YyzGxHxdeQER\");\n            yield return (HashHigh: 0xc64d95640c1e4756UL, HashLow: 0xe6994773f20366adUL, Seed: 0x0000000000000000L,\n                Ascii: \"4oiCjBB9RQvl2aEzhG6Mq2J5kxxzj0xuJQfd4OXoOkOPT3Wfbg1E4Dvi3ch5VN8Zni4udCQlQqEOvhORazvnulCyZme9t5OoAIVxB48wWdJWhZuHOsPsziX1Hi5DMRCnyuphm8IHtUP6eE9XUoaPn7DCiEujVnusWJ\");\n            yield return (HashHigh: 0xbfc74a714df51f94UL, HashLow: 0xbf2853c55f9d2fd5UL, Seed: 0x0000000000000000L,\n                Ascii: \"ay05ztOO6vxffFs5jon3nuCYOE5RrLdooRRDibetaLfWwMYgkSuj4wZLQeLSFDIy9UdhSLRjGN6AkSxUuDxNaZmvXboqH6ox7WOM0SvRur6fsVaHgkZ2yM4X9ybQRSQK43kWEsIwOJn81YXgMLrA2G0Jl1BWtbSDTsq\");\n            yield return (HashHigh: 0x475e2118386c16c5UL, HashLow: 0x2d9b637b67eb6236UL, Seed: 0x0000000000000fc6L,\n                Ascii: \"0TC1betJD5n0UTWOYp9KG3stDTCK4IRpCzPPdLjIQlmgweMdDtRQDJq6RwTVHZEMVOxmaEttgkuxKI0LyA9VM1CBIeZuVK6w1wAai6LGTIh5S2qcYiZkFRKrurNLie89NfRM1gGuiz5SWpkMih3sWhOL51fKRxSK9aB\");\n            yield return (HashHigh: 0x55d822ae3bf4c8e4UL, HashLow: 0xf0b4338f997ec38aUL, Seed: 0x0000000000000fb9L,\n                Ascii: \"7tBqI0zFhDi2TI7n2fVF6t7tfaisgpZNTEzJK8XBO6TDX2oGNERANFK5EzzA2npjI63vefCaDtNBHPQJVUhenNWwjMJ8rVdeerM7PlZyJqTBnXIEnFpfSnWCg55PsDXsQo4tX8LgxM1HYiwhab8FB5o9tdCpwWjsGa7\");\n            yield return (HashHigh: 0xb177a7d281e70903UL, HashLow: 0x6642a1661e1dfe3eUL, Seed: 0x000000000000019bL,\n                Ascii: \"ogI7UGx94eVJAUXcfXLLAip89FeiJNgZhSLyctvpO0WAPpVbLqmB8aY2pbdMrDIaJJGQ63OCp5vj53b5AhuU9qeun2C43v5F0fBFaeuCs9g5e7X5w3PC50IHNm3dt0NDZNiesyt8YtrYhFuVyW3Gwiyn9lQnkQOFRJG\");\n            yield return (HashHigh: 0x190e4cc15dbb84fcUL, HashLow: 0xa95602ea7a6b049bUL, Seed: 0x0000000000000000L,\n                Ascii: \"d3OblcFTEllzMGUk7FKNQM4yuV9i9PzQQtPs3G9bxbseeHRfnywdCkvv3btlshYExqVG3fFh39Wqqp0re0umNfJhdQDn3aKix002yzbWaqsBifnYMbSoPg6GyzOIRpSE9Ev7qtB8AtOPi3Ehvcs0t17rLS1oEPXEfjwJ\");\n            yield return (HashHigh: 0x18b6817ecd7ba2cbUL, HashLow: 0x4981cbe58b07ada9UL, Seed: 0x0000000000000595L,\n                Ascii: \"39a2kzihtWSooZlSR0E6zMij0MRIGFOoP1AVVPtxT7l28cUUStWSYzkmtAj7fdHaoYkF6IamxRE9d9RJ66bgcvxE7PtwXYEwE90aQ4Dzg7OeBX7EdUw4jWNtPpi0aLRQDzGqLk0sCrqDxDAfyu7rJufUSHxB6dEa0Fwj\");\n            yield return (HashHigh: 0xf60fe6319c931d14UL, HashLow: 0x1e46ffeeb3f98408UL, Seed: 0x000000000000144bL,\n                Ascii: \"nqNm2Z9wJ53A0uCS5at6v1SLNTQKxldOhyLTaAAsqwuUCxqz5AwEr94jklUcI5ewVWc048aDkoaumWZVkq4PDQWn3uuBb77tJ6QrOHsT1lTu7XPrxuDnumG6Io2qyJkVKoQ3pfNLPs59fTbCLyCsXkoBt7XUPtTbs31S\");\n            yield return (HashHigh: 0x59cf6efb67a89104UL, HashLow: 0x1e69d10c8fdeff2bUL, Seed: 0x0000000000001b64L,\n                Ascii: \"VFFUtoHwiGTiDo5Ce8wpCGFcpwREf6m9CfWejh9KcqlekxNxhlsShqOfY79Y6rbBdhYKIf6lQKO7lkwFlvSGWQV2tCZH9sUz6NVVcuogH1RtzmNfnGILLHpwFU3NAI1eAOhmXqPoMVvWbTzQ5vgIEKZ4Vhk5kDL9FO6M\");\n            yield return (HashHigh: 0xbc6133ee2a1394efUL, HashLow: 0x2ebad593f2de9e4aUL, Seed: 0x0000000000000ec4L,\n                Ascii: \"EYWylwmIZryh8ywRf9p7fGwyl6auKZm2B5DUfvG9Tp58RmcISiDmaGhQFbPVp2sAe4xQQi7eixU4m73nB6iKhJCQJjtoNssxWwoWCQpA0r0K1L37pGyMf6toUC31c50oyVwJfppdO0g4vBAECaBoHAMVoqA5xtnLlYrFJ\");\n            yield return (HashHigh: 0x98ca9dbe5d8b2c46UL, HashLow: 0xe9a7b1743eaa5260UL, Seed: 0x5f0f8f008cb448ccL,\n                Ascii: \"TSGEoEUeacXsHOsAUHFL5Ya5zEVOnMgtYZyBYOI8d5euiYw7PavCK7xAIhGJ1EaMtNrKQLzaZS2y4jyfvGXWedGHClfC04zhGPRbsvVKIa7aXGMFaIq3Stzj65D3brutKMvcQZYOIK90LXL47LyLUIZN3DHSrzOOgmm4P\");\n            yield return (HashHigh: 0xc52b091d5444c7ceUL, HashLow: 0x0571a3c218987ab1UL, Seed: 0x20f0f02e5f401aebL,\n                Ascii: \"JxyYsERzBkehNnCb8CrNUJ8vomqJQ3AvKUW9xczR6nZBCRQ70OoLMFag4sd9uUO2iaMfpej7iP1X72WtH8htlavohdGxefkScgi2iZVRD1S5s6E5JP0XaIFJ2whK28hrumfLRbwQBh2eCgK4OGNM2Vm866u7m5N7IsBQn\");\n            yield return (HashHigh: 0xb0661164bc99dac2UL, HashLow: 0x0091985bb0faf198UL, Seed: 0x0000000000001295L,\n                Ascii: \"mGHQ0u4zgPiTK747dKXZmbfNi9ysFykGTrJmSRpCE4s7gow05r971UvrqDWNGPKjjZZcJg0ZvvhV0lslVsZ6a3yw3AXHS06Wp2QSpQuskJrMLiAnzu6LgKGKMc21D8O7hnr4820P506ZiGzVfeO0CeB4toFYNd7PVB96l\");\n            yield return (HashHigh: 0x13d820a85079dbb8UL, HashLow: 0xc234d6da41754b85UL, Seed: 0x00000000000008cfL,\n                Ascii: \"B2ODuv3lFxt3qofD7lNmxvzpINollwlEZodmWjMPYHn29b2RsUCMGjMkYcxJKUpF4LNC14283aowzsqa2VrtUuQUyQFCIC5qcUcj0ABEDnhzUkk5rHnLVs17rhUeaCQfijc9ubvFzT6dVPasAYFu1ERHMiXctm21kwKuaC\");\n            yield return (HashHigh: 0x156d55e92dd16559UL, HashLow: 0x3ad31a70b4169bbcUL, Seed: 0x0000000000001246L,\n                Ascii: \"bKUMbezUjDvlxfV2DrfYQZrIef9tk9zupc8xyyq9LK0zQ0U1BgM7s6JAafSQXmK9lVYLLckbaULYxmhnaVjvwLStHZrld0g5W5UDgIygHvoBeXB6OYsuUbfjmP4LrHzFr28kBmqzmfhYJSv3PnBArSleZxfLoSU0lfh8Fl\");\n            yield return (HashHigh: 0x7e32224321d14130UL, HashLow: 0x0d4b0583fb4eb7f5UL, Seed: 0x1b007726071e7058L,\n                Ascii: \"4KW4aAYsR6GkllK4WGt6RkzTPVw6arqy6tVMmra4diCo7iIoCxwAICkGpMITGYt5NXWYxNGwekswGjPU2oNA38EiWGWohCCR0NJMX3NAzbn85kq3G1ntdVWpV2CxK0QVbkCRsVymxKuD58qPblbD5NMq1tGZWPTY8PNlw4\");\n            yield return (HashHigh: 0x8489fe8da06167d5UL, HashLow: 0x1744abae93c39944UL, Seed: 0x0000000000000a11L,\n                Ascii: \"uFwcXzidGnJX0g1fRClmTSHrfpB2p7ZriGoq9a5GkMiqmdihUfOg3cC5WbYVWnWSU2szmeeolCLnT62oWrNNeIyQE3xAebkWRjQ0wJMvFNCZtkhDcZxX5nHT0pkMDk2W7xmT8MgN4bYO0Ze3ToN7oONG4JVPAYODqS3HTu\");\n            yield return (HashHigh: 0x8263e3c2bf745f71UL, HashLow: 0x6780c6353f4b6f02UL, Seed: 0x0000000000001c19L,\n                Ascii: \"FAuCN3mA3XboKGeskyl2jzyDFlcRwrtSUuih2vLkE5nELy3xGKB4bSnzhkyHMBCjvfpyqsqohAr5HmwdEacCZ5TWa0aym063UJpDnFN9EUErtqFARiq1Bgv6BxBaQiIDB0InavI1cKbznOUddVxS6uPXPt1RM3Ae2eqWwZP\");\n            yield return (HashHigh: 0xfd6841f2f18c5262UL, HashLow: 0x181b3f1fa4002141UL, Seed: 0x0000000000000ea8L,\n                Ascii: \"DmmRYqWD0NqRtiUbaLLodxyDMcmFavA6AYfaN75Xu4WbVALfC0pGrM82bX8zG63Jbd4Jf08qTi1EyVohXkiqCcavOE0i1txTl2fpIOtYuIXL9sc2eonjbuLjoxG8Y6BQWEaqP0h4AZFcFYD7edvqZpek4s7JI5gUpRgQmzF\");\n            yield return (HashHigh: 0x93dc0aa6251be6b4UL, HashLow: 0x5e6c9a4de565a086UL, Seed: 0x0000000000001e25L,\n                Ascii: \"oLpP6h4aqJFX2oEbIMGtrKEHJu9K1mZsv5C1COJdEsHraUyHBKJJjWaaSaqy5YErcJFosnEBvOL9fi196BhwNzPm7tc88Dv2ZuARvIffOZkuzB640TND6To0lUmar92iTs0tHshgbzscV4qSkKoAWwuieAonG8CUOVaYvqv\");\n            yield return (HashHigh: 0x964b3e78919b8a06UL, HashLow: 0x4979b4930dc50b4fUL, Seed: 0x0000000000001eefL,\n                Ascii: \"EiFDWQoocRk2oLlnRbTa90CrcSPfE9pHuMEuzw1V6PNk2TEmW596EgXfyAbramxQxDQ6nfLnJi7SK1CXNySz5sXKcSOLWI6bNIbbIO146PIDDKQUeP3UE7jOU9oWiLkd3t8OASON1HmDOMVIFJFDJKQW1eeFeKc8F14buT6\");\n            yield return (HashHigh: 0xf4c9bab56f3c9fe1UL, HashLow: 0x3949c71ed7cd3354UL, Seed: 0x0000000000001686L,\n                Ascii: \"G46BeGhk3L6lIhNk20fRI6NHp8t5Y53kfn7UV0F1ZIkjKpsXsGtKw57alhPdT7nTC4QrH2Y9byKZUckDWYO5fdcMhmNlbwjblpXwLsNlqEG1wH9s8wOrdgGZliuLcoqQHXN8aSRNg0v8WHr2IRjyjwKQx392I1Qg36m3tDGW\");\n            yield return (HashHigh: 0xb85f97bd5a7cf658UL, HashLow: 0xc1103d58a79a2f0bUL, Seed: 0x7ee96f72c661a920L,\n                Ascii: \"lXCf0G9tGPCiFzFhhJPNwavhc81yh3imEgZwfBTzdWqD1Ehg0mSFGDZKa7onMP9QPaEkdv5xkX4Ozc2H9v6RQjVdzq7s9KeM9BuPqllVAvZl0RUs5jq1omWntpf7QG5dBz8GD8eoVMX0RfG0f1FJ2bc3z6WWtCSNGLsoXkG1\");\n            yield return (HashHigh: 0x48eba4a506993ce6UL, HashLow: 0x1ed7516893000976UL, Seed: 0x0000000000000000L,\n                Ascii: \"DV3Mg3Jhs0IdFiNXmyHyV8WG0bRMEJrzNMgQuUlrEozWsJY4FwzYoiro2xv1Cuv3VhlkLfj2Zzjw4ssWF0jpnEp60iUXF6L7JxXE8Q5ZmcuoxbeIaqiJMUFu1HYjHnwtQY1YA9JmEbAUtbQyjRwr6U2n0So95SY0dhzcnWAg\");\n            yield return (HashHigh: 0x50fe8bea606cb254UL, HashLow: 0x83ad0668bfb57be3UL, Seed: 0x0000000000000000L,\n                Ascii: \"UFYQ6EksaCxSOFR9IBWTaqOlTPWBamLYhNOJ2bSRjTrYwNJqbgqYdPF2VnzyyKDd7hmJP3JSaCtDscRlCIUTVImZvPeLKwYzaMjiWAoaAKf5U47OrSWfCvlCWWaMtkTBRjlVguOEPiw0piqbp4v1BnPkO53qofFOSyFS9hU2\");\n            yield return (HashHigh: 0xf9ed5d76217b133fUL, HashLow: 0xf4cac77651431689UL, Seed: 0x0000000000000736L,\n                Ascii: \"Ycfm5RRicse1McJ3pUaQasVQCBPB4fMn4UFJnkZGy2Jz3qU3rmTWldgtsQqqNlNewIBsXBWbCKVw6rnCxsOTkUwpSt94mRQBUzgng9c8K0txX7sDUkQfQ2obbhyCeMChfhDyv9iYb32hfLDc2qTwiyjAqe7mIBa2YBac5YLMa\");\n            yield return (HashHigh: 0x50894f2aedd70fa3UL, HashLow: 0x893ec422e4e3d72dUL, Seed: 0x0000000000000000L,\n                Ascii: \"TGrNfG6t279sfcTxZwhV8q4w5qWLjC4fCHAxc2BybPffMlwUA6SbAhiYRnJ1FSX2Ve9ycbDKM8ndkJf1G4BWfxispDLNAFDqeZnG8GyfelRK0njYMQgqCcYlIeYXhkLw2TNR3HiR0vKNDeo0PjHFTB2aCHEPG5ZZ3yoGwYaGX\");\n            yield return (HashHigh: 0xee498cdbf46484e1UL, HashLow: 0xde46f2caf14a94dfUL, Seed: 0x0000000000001099L,\n                Ascii: \"byYoDNAqkwTTjOJzPNGT1QjYBHXqSGpMBXFika3fsMjPm4WIUSBX8RzfAYsntzlZv22amjp8LpyQmHwK5YceDrZe2D8ZNLplxeQ1cAOQRwNJG7wIVZDS6OBWJakx9dwXdTLtIul8jicOX6YwCkgneMI8qG9AeqB7oPPSSRbAJ\");\n            yield return (HashHigh: 0x020bcd0e20dc907cUL, HashLow: 0x6b049025463a099dUL, Seed: 0x0000000000000000L,\n                Ascii: \"eFvEvT511W4r8irHUFyq5xVn0CqRS6w3UaLXKTXjTfRDrOtidaDnlJ7n5BxsBPqs8wJYqsy2xKs0c2xpcOMQuY2eM7XKbeXlwCnKbfGMsjOoBx702j5CISzowT8lA9hVLHTOLT5ptWOprU2Cazt7SlhXvQpjCutzWxQNbwm4f\");\n            yield return (HashHigh: 0x778d6ac68596886eUL, HashLow: 0x8b521faeaa7f0ae7UL, Seed: 0x0000000000000000L,\n                Ascii: \"69t4PnV9HZjqxyd614OpQ4UUVFaLwLZjHwswUVhd9w5WRpOOkgLHwinBSOTBdBGdzVcD5LlQ8rfEfG0PUPY8OpcXvxLFSp5y690sQPgisz3dsZQkPGwTfRWXniGtLugTEV9DvBqe26JsflgQ3WrAgL61pesPLqUjGQOjTZ1SOs\");\n            yield return (HashHigh: 0x43b59cde0bd1ea06UL, HashLow: 0x976649111906d646UL, Seed: 0x5b6591895d28d90dL,\n                Ascii: \"7LoO3KeIOyuTzZUVLLhkpHHDk73ESMrTtrgAvb8u43USMk6oWdez3ltcbz5dufMfnBRJG1oTNFArxx2YJqO3i8UVdkAA6Xar24iigoQIN4wYHZGJ1HKJJkcVunTR0rQrcwaKTxxgDqo0wd4YdAxx85mNT59P3uRpGpHIhYBFzo\");\n            yield return (HashHigh: 0x01e8375fdcf288fbUL, HashLow: 0xe6f047aeb8f4caaaUL, Seed: 0x0000000000000f3dL,\n                Ascii: \"yphlsnEFmkZwrMKri2QCAhHbNnMViBQuLV06ja42hK7D68O8Y9TkFO5mwYVZVAqnbEw5i3D1XNcmsyfyk5CmKQHq74h6YSN8291cBDvQ8lCdUeVRPxE8Jqds47truLtYK2xPMuYoY2I0aQcRNdWR5JIdtQe7KSBEzyR3qgVmYc\");\n            yield return (HashHigh: 0x62fb0aae35603ceeUL, HashLow: 0x35e6a50dba0142d6UL, Seed: 0x0000000000000a6bL,\n                Ascii: \"RNjhtZxCyOOjXrJABHwbEp3oXQIfeYijz2H6a965ITyBXArhkw49dtRSmpdakArrBtgMLRpzG7FPn8aKdCTh6bbxcMTUYfUH8HVAAtedFqyX7jJ9jyI4FrkPOKSiEjXpL06mlyJFGZV4wXNMlygi579Dl6EF9I1cItF5Y4zrhx\");\n            yield return (HashHigh: 0xcabfdbb5aa4bc3afUL, HashLow: 0x11ee1c6bfb6942e9UL, Seed: 0x4bbf94d0e3316a9eL,\n                Ascii: \"Ve5FS4djrjD7bhCuXFhvQceTEKnr1ILCeEyfEmznIfIfDLxNBB5teSTP7EIQM9AxNe9GqivC7aU0e84LHgJcbURShbVfJ74rs1VbkLB1jKFqkq2dGmNyKJJMBTd7NhSoe8Xxo0a7zV7173HbVSotvDmcZkroJQWFLXidem3vpNn\");\n            yield return (HashHigh: 0xf167bc9f31d02ba4UL, HashLow: 0x8c659dcc845e0418UL, Seed: 0x00000000000008a1L,\n                Ascii: \"SxYJKtcy22X2DlPHAXXvX8H8dwsHH2s2BDp0KMWaF6gBut1nEArXUoHGKOq9aMhBHYr7zjWJ0ANdPVFsZQBVsxuJ39K6rQGrI2NJNwikoCL0cLSa8rLGSyu735qpa42kgaigj6RmDgnc47p7HfHPyvudYV18oqK8cDiBdEJ160B\");\n            yield return (HashHigh: 0x0864011cfb8b65ddUL, HashLow: 0x3eba99ac53b9c432UL, Seed: 0x00000000000016caL,\n                Ascii: \"t7J7gMiUNjRyVclvZ4jDA5GLmxDLHR0Nz3JaLBoNq6mWPYUp5QNCEMOZ4qDnjHT9Mo2RgdKtGGeT8axHb0lrM5WhQX31Lzh5nITkU1WUpKhKXAnVvXvpPC5FjRexZRwgjAkE1lgNlMZBA3MNr3sagaJLrZQoREGAJq8EVYcWror\");\n            yield return (HashHigh: 0x11a022f54ea382e9UL, HashLow: 0x0d6e442c556dd575UL, Seed: 0x0000000000001d40L,\n                Ascii: \"f9Sl7veXY1JwUr5KTQaQauyOVxeD6iuWp7KzhBsUI07Qp69jUqlpqPG1propVwt9pAcghPpr3vOkuHPWdtCcpsQ17YTC1MrZqv1vUs21zHHono4ITzSP4vCXzguU2SiMd3zltIi1O4MOb9nEyduJGDzy0aIJA6V6moDBYykyxft\");\n            yield return (HashHigh: 0xfaae73443af8fbe1UL, HashLow: 0xa0bb3b31a76670d2UL, Seed: 0x0000000000002639L,\n                Ascii: \"DPFLTNJwyO15kY2flHP2CJjYhGs7cCxhIdiXdOvScO4JY1HAyqyjrzN1W4AKXCkVTQnNoD8p3QvisKTeK1jFRPMrplnoxyDti2f9vFLkIadn43txwZtwudaqzixWHdj26LHvQKYdHo67lEaxWOqxV5R6nXYChKDZm382oeW4Avbx\");\n            yield return (HashHigh: 0xdcd41291711fc457UL, HashLow: 0x08dc9cbe1bc37ba8UL, Seed: 0x0000000000000b97L,\n                Ascii: \"li8b9ODwJRG7oQ2xanuTE1TdLAGxVNqexRDdsN5yvD5vwcgkF09F8Z3e4jQZcPKsQ7Rse1k14tm91z34vTxBHbBhhht2s9UuYr0RgmZP1t14hCtxxHGbfn7iXTxxce1RDMzyOBjV8TD1L2uiev7XK4QfigJZ8ZbJ6ZkBjea3r7zN\");\n            yield return (HashHigh: 0x4362ea87528cf65fUL, HashLow: 0x1c02f7c9fd03623eUL, Seed: 0x41e37724bae99a43L,\n                Ascii: \"QXIZfwWkXQkRwZOCC1Rn52AN29lLufsyDdtWMgkN37yUHN8QSTgU23DMke9zphultPnjiXSmuZG4FxAMNkm2Cxvbw2KBUq4lQl2WtW4FY8f2MLu1XYcdwTYRFBDt8EVZRI5OngKLTHB6koRF2NZ1l609ESGyR5WN2lDzlz4heq5U\");\n            yield return (HashHigh: 0x078010e4c09442d2UL, HashLow: 0xacc29fe09d2d618fUL, Seed: 0x0000000000000000L,\n                Ascii: \"JN0f75tX7QOtnnD5Uewz0xVY5l9pnTuNBCXQjd62JKAkbqYOGLOKN4qM482gC6TmNyWbjNlVndw4hopzHGJB2thEoNO1d43R5bSDc77jvXeZ8zPp5mfbIAAoTnsFbCFjDVfVtCYHHMz49JE8IWThoguCwoSQDQxLc8e7QRl3hEAh\");\n            yield return (HashHigh: 0x5b4033774bac63d6UL, HashLow: 0xf4b90080241c673bUL, Seed: 0x00000000000006a7L,\n                Ascii: \"Si5ePHomZqzQcU8dkfDQsnLpQA4Ys0eUuJQnLnAGU533xVzVwr3i4OR7ajLCR7DOX2Xn91pUCZgQ5yyJ8nfDU6YRBnaSywnkDdrpYp619DpZCBLlzqyCnaCCVPMVOthcXm5o4goGS3yaGxJfRYCnMoy8whFGgM4OREQFbFFF9frAK\");\n            yield return (HashHigh: 0x31d7ebea32534710UL, HashLow: 0x579b64df2a3d6e88UL, Seed: 0x0000000000000000L,\n                Ascii: \"qgVnQMzRNPkx4wFffJKN5iSPLgOQwRl9Qxo4oa5Ayi2KaMIB0K03LtzfNYBkKLbj1AbJkTHVlnvtvlNReKJCMmwn3NXSEwp54qNO2lwWQO64u27Moqg0vq5gS5DXfIS9FTOYkWVka6jNfn846s6yQa3iE5sBSeazk4domSEjjw7iF\");\n            yield return (HashHigh: 0xeed387b84454392bUL, HashLow: 0xb2036982f03abbe7UL, Seed: 0x00000000000008fbL,\n                Ascii: \"yCh3xyhOIarvSlLsPB54PQ4EoqkQH69UQrhwgUDD8IV6HrCxu5EQMMiWYpeSfnXhtNCGzU5xbsSrK3LxYq7AkZqycazjplStIbeD8IUuaY70dRLh9RGToYfHEJpVKiBRN3Ei4uIksoYq3eM66pZyUag908THDQsFsJrrmqqChdorH\");\n            yield return (HashHigh: 0x683fba73342a0c05UL, HashLow: 0x3b24b27a043aa11bUL, Seed: 0x7f55f3730aa104d1L,\n                Ascii: \"OpIHHgp1poW3DqK0flDsZbExyh8odgUdC5KGUIHPZbRp8gxKauoOcdrfuWrwHIz4K4q2QVHIXqCjP5jbCM237CJDSmEXBQm5Xe0fsTgzE7XlPRdeS3QSdrkWEE38FFiTsSlqlQbzCTzI8nREphY9dxViO63kxDkWOKZ1NIeKuUrFC\");\n            yield return (HashHigh: 0x8d31f628ac99633aUL, HashLow: 0x042b00e0f610a5b7UL, Seed: 0x00000000000022c9L,\n                Ascii: \"zaA4n2ZzbeHZICkmWLOUqOo6DSpcGaknEnZmULFYD5clAyrvkEkpbktQiYjjs6CgYnd1q5tn5kgAlRKg5IB7jhcD2uEJRNT5AMXvon83GrX64c9cxRsIPNgBODuzvdsFBJOPikJ2IaQgH2O6eoO7mLQw41pQFbVSWvJUnwsWoco1dQ\");\n            yield return (HashHigh: 0x714841c17a4c501fUL, HashLow: 0x98c9ebd473d1d33aUL, Seed: 0x6adc8b669bd6311bL,\n                Ascii: \"TBrNqFvW930t1B0Cf7nNX2jvcnnTyuLYHhinwCkeKplwLBZlVtiA3PAqHPtcX5KBT9yvhJtoBMHw0dYhSsSNx8LKHFqe1RrSfjMmp6BLUYrOtbykkf5Zf5dKo8Cw2BY87RoTC04RRsDEMB5s0f2Idyc63aP8wDJ5BqisAH1GSSSG86\");\n            yield return (HashHigh: 0x0ecdc7721ef53c7aUL, HashLow: 0xce3e665b82fb0f60UL, Seed: 0x00000000000017d2L,\n                Ascii: \"TQuxURhF6DjeDoo9sGcQt9pTeyy3O709uT8FBfjZZTBiuXl8KPSnJzK0aKWFgHCwu7PMGCkZQw7bWfV5MUGdywz0WUE0twTBeKcmGoCe5XR18R0X1w0XbkC9sFKGZIaTKwbXqeFB46Xrb5CiZnZ9hGVBJKqac8dWO8yVgNzWvsZzWL\");\n            yield return (HashHigh: 0xae86c7e6da343610UL, HashLow: 0x52c19a2b2aa26427UL, Seed: 0x0000000000002194L,\n                Ascii: \"ZbzTdTGpIRbfH14hhoaoq8swak0oK0wYRImyQ06Gospcns9avJo7aAxY1xHo1gMrKW6f9ZXqqrkaNB4xx3CZP5egAyN1NNwLz7BLdBlWrpxJWRg7IqSdqsGAVWKt5iNmyTaN8Fhw6yUpxVqruGJyCHQ5zkM8rW6xFSr4gXDIrNzmWC\");\n            yield return (HashHigh: 0xbd4f02c75b23d00aUL, HashLow: 0xc7b67ca38825b072UL, Seed: 0x0000000000000000L,\n                Ascii: \"a3zegmCznlfo8ePYK3gLwiSR0viat3PIjkjl7oyt5xQ3QJE4MYrqAW5AJwwCJpNWIO6WpYZsA5EchW8qD0iVec5hRv8NEKDTPopzR8ttgGXtjcO2MFwrR413qxfK3NxxWtdJ5cfJBCzAuSxrdQNYBLfLMy0HaAQ11855fhSvKJ7kQ2z\");\n            yield return (HashHigh: 0xeaa087b5d4869bc5UL, HashLow: 0xfcb0397e4d475450UL, Seed: 0x0000000000000000L,\n                Ascii: \"h8cEn1EWrsatjwjYT9bwKJz6Axxs7pQ6f1lvydrOqtkP0UHjyxR1INj5Z3HV089qdMQNxlrKwnGhrlq4I4iKxlTJIvVFM8HzgEaqoh8QQqDABobpN9lbfQsjlbJNM3gH4FSUDrLfNcr6cSAIjqlYEdv1Md0YaDlqsul53iXwpVPgC0c\");\n            yield return (HashHigh: 0x6c8e0ffc04d27b5aUL, HashLow: 0xa843d4ab90b30bfdUL, Seed: 0x0000000000002589L,\n                Ascii: \"viOHAyJJSBIki64hUgbwyguF2MhMloJgbw7dAy5pijA3zbJObpRolOrFr7aG4Mx3vXGfr97eHvN5EOaYS85daM70YM7vm0SDijlYdr3C95kfSavEnx5TZlpQuMfwxX7MxfbWUZkxTeJfQVpQos6wBHNIG1kv2f1yIB6gTdZC9CP6Qql\");\n            yield return (HashHigh: 0x52e291cde1ff3c70UL, HashLow: 0xbe53b4541430fe93UL, Seed: 0x0000000000002343L,\n                Ascii: \"RN2Ed0iusynRxoH9LTGfbhEB0VE1aE6grVGPqCatvVazhxoTzz4XH6Tfun9YEVLoHnEYGN5ofv7F303wGv06LvwnZQ1HiukdekVchbdcNSeVN3tplqxZERR7HBqJPzOdBkrXcjlrtWKQkEgKRliMpcFxgEj16EDV7Cu8PIvAch3c4oh\");\n            yield return (HashHigh: 0xea176312a5391d3fUL, HashLow: 0x5796c33a93bcf090UL, Seed: 0x0000000000000887L,\n                Ascii: \"C6d4lvLwj6L4OtadVcgzbHHXeZnXHHTNwJnlz2ORtfiSiZ5jAKDC5BnOyGuGjMc7wX3JY7TJh00PeCEVoxHn0yF1Nn68OdHnWhjzVoyjOjuG0tFm7Yk9sQbXkPqbCa47fkxQbjXna2qenclMYTSfng0yauu2xMxnQY3qcKbrpSrdED65\");\n            yield return (HashHigh: 0x77d149fb1c1bbb60UL, HashLow: 0xdf91f97615da47afUL, Seed: 0x00000000000017a3L,\n                Ascii: \"dZhFolrz3cgY7Bcq6joKumrEi9JNFY70F2CFIMe2SxObMQYGf52odirMHQcfPCiV60WnFOWJmJBd3rPXdDrcoBdwObFRvCudXHaAWcujfw8c15DGZHlWLk1nZUGIIDR6XYnhgrJ3WETHGQ4877JEWt5I0qVenQyQezpDz09mX6CK2zhx\");\n            yield return (HashHigh: 0x0052ead23718fb97UL, HashLow: 0x2b20b26782f12dc2UL, Seed: 0x000000000000230bL,\n                Ascii: \"dLsYLvmOQYnDDlxDUXalLzd1hFQggKxJBB1jtWnePp2t4GQUK8AvuEtXsih6rvdB4r85lthPIhkcDVcGmFrKLMuYfzm3N8eCSfab9WD1MztTJkUxckYzMSuynESDlLUVWbxlgeHSevClVjKvqpsHCa007dEsuSiIvswFmnH8a0mQUpRh\");\n            yield return (HashHigh: 0x2a8aa8329e17d7f2UL, HashLow: 0x01d0c60ac482e355UL, Seed: 0x0000000000000000L,\n                Ascii: \"J57JXjaL5JLObJQ3oUgLErePCRDzNmtkBDUmVsU1pwTtydAIDL1pGiAbRqimx2z3aUDtLp01F9NJgpBnTDtvNTSW7UGxL0qe3UhUiKbaAvEbUTWlPvTippmQBnf7yfnGCQCYXIRi3DyCXgvYWwqFR9eqB0ZTXg6WL371956TmsfNHgQQ\");\n            yield return (HashHigh: 0xd81333e21dc966d2UL, HashLow: 0x75810237bcaf7e12UL, Seed: 0x0000000000001dccL,\n                Ascii: \"Lq8p2D0n05LdsOWZSC1ZW525PgNUp5nPtzmH2alnzXQg5TZRnrP0aZacyeybvi2KHpPB84lCFZ8CBlk5hvrIbuWo5ji1cwON7QL3AQ3vqVCUbmvnmiO3ylX14r3huWVEtVxFRYVNBjNpv4icH8VoYzfHkmQ2qbamgTz0lmM93qbgIPLnJ\");\n            yield return (HashHigh: 0x426f8be8cabf80fdUL, HashLow: 0x9b1cf70dd5dc5f44UL, Seed: 0x0000000000000000L,\n                Ascii: \"VkpCNWkIT5EJxuRljD0VJvqY5oN82jUPkHdXlBkSmHYDCuCuBxCdbZKS4pw93Pd2EohxIGFO06p4BBCsIceenb6IWVVdIiKZ8ikKjpm1gjr9RijjMxzvgvnW75l8VxNt1jAJ1Exyb58zNPP2nwz9rLqlSjEOaCItOQx2rQrnqXC2Lh3dz\");\n            yield return (HashHigh: 0x749253d468c1b764UL, HashLow: 0xf5ba8a765f3ed485UL, Seed: 0x1c30f1d9689a88cdL,\n                Ascii: \"HW9zQM7NDJfQSwMCXH53n1SFltoHkx39AdTkKuwTPg8V2MIQcy6SKYtqYNFjiCQW1iDSTQxYLcPmZRarmj4aj4n2psQW2oiKX2Vhlc5KgEdApEXsc5qqYxcDqUzv8nHNDexnAmagY2Cgi5IHC3APhDwT6oEpBslz2gBBUyTfF3iz0g3pD\");\n            yield return (HashHigh: 0xfa76e5960557f0a5UL, HashLow: 0xf5644a5e1ef9c344UL, Seed: 0x0000000000000000L,\n                Ascii: \"f0TDQc3ksKMeoz0XKg7ubWELhCTzvrtP8GwCVSJT7lSTo7ucoFlblH79GnkNvOv6gsFxCWWlKjKPFjo5wmOe27DMu9kZ9VXwnTbnGDriFtaH6S7BOR83KHvXm9Y3whL1GEWHQs6sY7XBDmCDwEjtXQmBfx4K22i9YdlU1B64e17JXP1Sd\");\n            yield return (HashHigh: 0x57da73c5d100d1eeUL, HashLow: 0x87dd5d00b9428d8dUL, Seed: 0x0000000000000bd7L,\n                Ascii: \"NWqOsKqA2yneMRscJuSwCDRnCcJ8BRZdH5r0bKcFOJ85TB2Wsfx7p7ZIgjyApCuzWbpbqKDYEdwXeMC1n52dQkYehWUhFhi3oVQ6SCilf70cGE5zgktSFkuNbw1gUmXDRiGaXPBnxUZZPwapo05i0onEdQ3XxFV8cGBA0ScipSIujBfgve\");\n            yield return (HashHigh: 0xf35e60cbcfea325bUL, HashLow: 0x82c4ed84e5bfd752UL, Seed: 0x00000000000020afL,\n                Ascii: \"eJmud8YcT1ocwrNQ2md1y8jenLAi7CXqWmp0yuPSZtTyHBEu9qMlIDiv64Df98NtF8jWJdNnM7FlYxc8HiLLm51Y9kEpsH6a79ARqNRa9EIR506YqLxQLWz7ai9pOD82iUrXQ3BAMluQk2KkhB7hYeOJ6ZjeWuLeiOndP0kKgJTRvx1U5x\");\n            yield return (HashHigh: 0x8efab55fbd06fbcaUL, HashLow: 0x730cfbb84773719eUL, Seed: 0x0000000000002306L,\n                Ascii: \"18fhz9SuiXQoq8efCDhF9ey8dDrXUuripB3dgCC7aRA9JlmLfcpHcqqwFLXoqapfF2IWOPqvISuIfBU6imlz4eIGtdY2TIiX5B3XLX1LuDKhfrescbh8wZWYZyAgMqCq39gIhKLeDOp3FUwtpJ15bgyCcYfXCjZswksZbP82XKMi99Zz39\");\n            yield return (HashHigh: 0xfcfb1ed2ae9be467UL, HashLow: 0xc611816a7dbe53edUL, Seed: 0x0000000000000059L,\n                Ascii: \"RSlDwXPk7QRaouwN3ZpDby96hMHm8Pdrchzs8N37NjQa2fhE23jUVBBMRauHxUV9XsHXQRNi4WYqCJqGOsGB3ebRIUKtfRmRCLdte5nYozGvhDB0itCZrLl2KW9YjbYQSylHawBo54P91CJJIyCfZBHtM31GvP4Kf54N9TmfJeHvolInO0\");\n            yield return (HashHigh: 0x8c591e9f650f65abUL, HashLow: 0x7b4807faff71aff8UL, Seed: 0x0000000000001648L,\n                Ascii: \"MtdxsWT3aivOWEiFfI3rZeYfyhGraz5WRKGMUMFSew31QObTxntiBuaR5B1lCqHWmyrrMc9rjrKD9BmZ9kkMdrO2veSduNPiJ1E3k79doASJhCN6D4W41aHRUk1tk5d0WRtczms1b4xTQpXklrrPKyuOnD2w4jrIPdQdqhbOYIV9as53Ix6\");\n            yield return (HashHigh: 0x7a84dbe2229148e6UL, HashLow: 0x3c71ade5cccae1eeUL, Seed: 0x0000000000000000L,\n                Ascii: \"dZvz5IhrziZVFIqSsMPsTYqm2yZXVlK16KRz9HOnoIVTXndJ9wXy8snmPBlmE4UVKMl43htrrMXmGHnn2uF5TbdXSyMDe4eM1I7nP73FZVj3qcTwyMm1E6Eqgrv6ueXkSDypLaJoO4c91lBehmBBQBfMMbzK12IhAe0oBFfYJNR89WrE2T2\");\n            yield return (HashHigh: 0x1c9ed20f10b15e85UL, HashLow: 0xab82598b27805beaUL, Seed: 0x00000000000011c7L,\n                Ascii: \"3pZGgG0wdGRvQKX4q8EyvTnxuNREvdVOd19Oh04AW4cnzcp2rmM1848odP0Hz3MqXI7ZAoEfNv2Dzj4DTSHY8nCF91SZ5zGeWvJtaDcz3IPGAQ08NBb9QT7xXVC65Edx6g6wF93LSKJRemBCmcm4mKdPcV312XXuZeEoORzXUENzizlXQHQ\");\n            yield return (HashHigh: 0x9013f6cefbd7da90UL, HashLow: 0x8226f413a329f3ebUL, Seed: 0x0000000000002462L,\n                Ascii: \"7960wj69aXsHI0qmPHgQzqQ5ZW8M9AcuYsUmmNX46uzwCvOx9Uu9KzpFUjhlDu2mwdbvdHfKMnx1td7hAKmLgMKYQ6kvYSevcSWfhNJZAUSVAe1ZzaEzgELBY9hAp4eLv3My39GdzsQPb9F3r0JvVL3B1hvgAGu0QEI8acrOlfcu5KQeFCA\");\n            yield return (HashHigh: 0x1e6f5beb7c2b5ddcUL, HashLow: 0x6ca379d33520d6daUL, Seed: 0x00000000000016d5L,\n                Ascii: \"yW2PrCj4oEhwXiS3a3Ap1rsrOqXMwMFSngA5zZvYNHvjEQh1LP6XMFOuAUbUtDLRovZ3TCAtbAo49Bypi1VoKj63sVCe2EIgVb0YKWQs0L8tqRPbwRfrjdbqBqT74SipSqlUFGAD4KL4C9uKXCl7dWIvz8oyAUrmhBpat9teMSiRM80gWL8L\");\n            yield return (HashHigh: 0x595b6d555ebcb501UL, HashLow: 0x4ec3907a264fa28bUL, Seed: 0x0000000000000000L,\n                Ascii: \"tKkewASucUiCiFRIrqgHXnih6szxGRKOEe7jgyaepXGV38nRzcyXuvomMBRWW5XcIijG2I9J0VxJsida1PyIJK0evR3PZp8EQpMDmn7PmwFB6JzTRzRurD7YeIXcZFBfryGdpY0sLZQYn6MMbceeRqsxw17mYcs4t1V4wYsnu16iWpKX9olC\");\n            yield return (HashHigh: 0xf727c8160703b060UL, HashLow: 0xe0e1f2f2c4c16976UL, Seed: 0x4e1c2997f7786979L,\n                Ascii: \"tx2gAcVeuWYTQnLACJk8GUGaeedDIblXsXQD8ITi9ZmyNNe383ByCRAeytfKe1SYWi1rXT6Y5tcJIqeab3H7NOnZnw3XhItAdbfKpBy2ENJiVyPtSMs1cLlaN2JqmRrdrThygetWxYeVdFxJmawobIdyzvtjnuykne6Pc4cEqthI6kmRe6LN\");\n            yield return (HashHigh: 0x90274619609d3ad3UL, HashLow: 0x64e2fdb2a6393379UL, Seed: 0x0000000000000177L,\n                Ascii: \"Pn1S7LvUboNX29kV6hDbNUY2mRLNUJwGqsTomTlo60bvXQEq7pJwdGNlJ5KTLV9RVD7NFegUF982RmmJxXIIQimj4fgvvUYq5jtAkT9OltBJvinqNuYneYRAWLSqh8Xoa9j4z3qiYXhegEJxuaoQ85ePlXcgDyljaPAWaFUZI1b2JCyYtzVp\");\n            yield return (HashHigh: 0xd0ce809f65d51a6cUL, HashLow: 0xf019e440b2a9f8b9UL, Seed: 0x0000000000002484L,\n                Ascii: \"flBRRzYt1hrYXdrwGBey2oQuqX0Xe4FeGE0MUhMHnv48P0Tjkm7M9P8xWEp9Mnb4XTnyW7rtNZiodPyCmgS1QGEFeOFluj5m0Qu6YqZ8QEGmTln7Bck7AGhN0KQLwo4ZKTDEOz8GHJK46MEhoV1h47VRhnqwrp08v03FWLQgUub82bR9y2vwm\");\n            yield return (HashHigh: 0xa5386bf2da5d7ed9UL, HashLow: 0x9409f3e192df2f27UL, Seed: 0x3aeda318187a8ceaL,\n                Ascii: \"xakiyYp1uPRDpENkGatZqaaVSCqSglYxE3EW75mb6ocRpXxyYtsE96glnTti6Ax34ocuI5kSKu1SUwXYNJeiXVcOR4c1ditIgbJOTWcdSjVVszT1SXkz7h0mX3zbwHkta81pf0yI1iqF0qVy7nbgcI23bOWymEFXFEwVWzqrsh3q0ZyxM0F0m\");\n            yield return (HashHigh: 0xd556eab56954012bUL, HashLow: 0x6349fc948903888bUL, Seed: 0x0000000000000b95L,\n                Ascii: \"MAP4ZluXtkCysWGhXgNp8g5XJdAoZgQd69WwQ5kiKcNTJXDAau8YfoAh0wQp3Pt8xRTIwgqpXLibJPkPVWJrJ3a0iVFco3A1cMd9AUZeDlIngYbKUhVkDJ8ySPGymOowWR1bF1G3lJtckamNEcnflIfVUaofCBTJ1juuJgwHqOlYJsgaF9LS8\");\n            yield return (HashHigh: 0x7587bace1fed79a7UL, HashLow: 0x98694af975387964UL, Seed: 0x00000000000023caL,\n                Ascii: \"pdI32M9n3BMoIz8POWSaaXprQtrNMbGttrQs1jJhm0dTx6MLRV58Y5Saa1FWxbHcWHlkymDo9VNVUI1KXqmlpZGPEvDcf16uxTkawDZvO8xAXvBaDyHqGNqldJQhsLtz2rRlm4N41SUhKB9Hl6oQjbfmRlRxXc4n4mO7qUdQfsjCjS4h8r4Nl\");\n            yield return (HashHigh: 0x9647f2ee2642fe11UL, HashLow: 0xf01004e49da8f6aeUL, Seed: 0x000000000000096dL,\n                Ascii: \"v2yB464jsFYA57ehyggHcHUIDgnlyy2iBToexISkax6CTrlf8haI8QqjZG1YL0hBWOc1JOAahb3IX7Jj8uSAFqKOCOwshDyuih5jisPPzNScDo1NP98EHsujAo5c7EUyDCucvDfyatwjMTDRy1z6NnpdrYKocXpOQfuLRM1RYg9QY2Xo5e6ahq\");\n            yield return (HashHigh: 0x533eff4cf96fa0f4UL, HashLow: 0xe6330ac99d86b66bUL, Seed: 0x0000000000001cebL,\n                Ascii: \"d6Z1rQHNfl4razuB91Z7dMCCqIbPUemIl1uCFwp1dkZddKBQ30fhbD2OCRby3hrUTkrG7rGqhOZ35qE0WltDskgeGPZZdkcGMISX41JwjxDXg00a6kDvKupwyQzK868kESLJ8SElB7G3XAu6fNbvwdTFhL43T872PKF7Y6wnkK1dq6fcGuIRNz\");\n            yield return (HashHigh: 0x76552d9af28b6515UL, HashLow: 0xd684e48cd98bf1e6UL, Seed: 0x144723cfee66f76bL,\n                Ascii: \"zTUm7XCHKUGnExdeHD4d3n00gJo1dDsJV880dRneEw12DxJQwbkf1kfge90GblTqRwyDEdEqL3ygOc77onaKIux5mSz5DI5O3Lc6r7ynQzOyJ4iBfZUu2IdBT89hdeo2FECqlN4qikHysfz66Cw8umK0xJ7AwJWZGgmt0KsSdm4KSgXDmQumj5\");\n            yield return (HashHigh: 0x4bac13f22d9240c0UL, HashLow: 0x106e5a9b3a661a45UL, Seed: 0x000000000000030aL,\n                Ascii: \"a551YE3acidpdsBEAbKSVafw9T5oA2FlaXpDOjBILDTLOJsgqCqR396yARyFkvQWU90eu9lM2Ts14MBuD3ZG0gNHe2txRmCejSR7FPvcYQiqsoCSWE1XYEZqnM7MpNENmCyULgc9jahlaRZcHi6cjivtHBKMgK7GdjKEnhn0oGNG2aJF1Jlm2A\");\n            yield return (HashHigh: 0x09c233be3425aad7UL, HashLow: 0x286f4e05c02a9cebUL, Seed: 0x0000000000000000L,\n                Ascii: \"N8zaWjtUPYwptlEtQHKytOaUXDLtti1azxEysaZMzVzXiF29t2gNjwM3DEHyBpRsO5tttioaLgXoLNYBGtmMyrobhVLpzSLlS6HlC44PpvCwimAiyduddCVUUq9giXLMLGNBtmRg5lxhrBfhLyyVTX3uE3u10gfNGnvixQ4sNwzXQVfBW982Fib\");\n            yield return (HashHigh: 0xe9964ed4dca9b6c8UL, HashLow: 0x178a49d366adcaeeUL, Seed: 0x0000000000000d47L,\n                Ascii: \"ca0CQsE9xvx5zoHANK3MHhVfwxuu07LZHeEuXwosS1y0ugSBa6pR8ac8SlnS5LB9wFCIUSiDiThnigKVi9UqSoXgFmJ5YN9l6NPJSfB10dCzz6Qxc5uJXhA7H3xqMVE548HLwaen8YQubkRCpVdHgnSPMHKssKchUZxUOlHHgGRbBaLoGIArnce\");\n            yield return (HashHigh: 0x704e7ae0402be062UL, HashLow: 0x3bbbc379ef25faadUL, Seed: 0x5568b6f89bac7088L,\n                Ascii: \"QixL5o3UG6iQCF2PplvydxVCtIjonJiKHCdZaEUD1RGjN1gqR4uGMwcB0MZP91IyEhUyu1Rx6DJmRyHGLdFZjLkXMtYAQdfms9G4wvO0QPzAYJbsz3Y5ap8ciOi6LX4aOJWAvf5ziD0uJ1TQWAqupVSpJmu2hsrT193iOYmTbXc1Lfgci75Ai8E\");\n            yield return (HashHigh: 0x6c1a406264ff52f3UL, HashLow: 0x1b3a2fe87d7a903aUL, Seed: 0x0000000000000000L,\n                Ascii: \"mnriVJXia45AHhEjsZeismFaGZnDH46U4Ipl07CN39zUsfwNguHdfumNQczQOjbCZjx5EzUGix1989IKEiIIbs19krp5JJRiVBsp6j2r7bwJwaPANOllxQGhzFs18scV8QoVDbG4amGu9LoKKJ5a059GcP3QrahRBfEH0LRLOa99ctrOkojZu3t\");\n            yield return (HashHigh: 0xaaad93ce1ce47555UL, HashLow: 0x80e7bc0b2b241da8UL, Seed: 0x65ad2bc75727a669L,\n                Ascii: \"BLwpEgFYeGxJJb1qrdp975NnOy6AWRMj7LA842tJFqWLUUGaa3PsDCa9zOOIIgIiTNTYRJCvBTtPeoXOiTqvKsLs2n3XfNMTLjrBACeUO4J5LbrKToq5URAR9l6DRvsaIlYANAXAEbj4R4FaOFarRUuNt2n0svPqSMZWCQgSRtKmuTSWE4BRTKdg\");\n            yield return (HashHigh: 0x2566d9abe6562bcfUL, HashLow: 0x255888c202842eefUL, Seed: 0x0000000000000000L,\n                Ascii: \"ZCMAzC4R4SolVuavlBOqxhSjlr4sRN8x5EWoKzxvN3H3jNjJ1Ckz0NrAdV9bp3tNxN9kwssCM56oEG1KHCTgJ1t0Z10Qes09k1JuO24swHp7Y1IySnK7SqjI0ZwETMCiQFL4qtsXt62ecCRzem3l5HiwXtfkYeBYu793tdJlcRy5V1PRSGkB843g\");\n            yield return (HashHigh: 0x2e704aa1e8413e4aUL, HashLow: 0x535c775b9828526fUL, Seed: 0x0000000000002279L,\n                Ascii: \"cHahV0PeKgS4onXHTJYVusiYLXtbgXBHgW36ziefpkCzVBnrhM7N75u7azuu2wIWqkVAoOD0LHhN8MWeFVQsg9ErppcUE22HaCHyXwJ3PKwKf6DylWXe3QXzWMmGMcNe935CA0vBoQvEDA9EawTdxa03SgwUApCF3KcVmYTCA3rfKgkKlyp42Nz7\");\n            yield return (HashHigh: 0x052565cc459ed07cUL, HashLow: 0xa588a8a90b82d2edUL, Seed: 0x0000000000000db3L,\n                Ascii: \"21ZCWnU0rbsDyYJIgw7qcYmRCOGF6cT6Ovq4irqpQpU0ATCqh9NvrrW8izTwx1zemE9PS1dxROTOXDLkrSyGBaZDijLUKHjnpLzd5zacpW0H6TaT3HL1pLm5K3obvwavi9V14AOvQGQl0DpgHUHpd5RFFDiGsSM2urjP2yHZrChkjwuKh6cME6Ik\");\n            yield return (HashHigh: 0xf612942c62c65ae6UL, HashLow: 0x38dc577e8251a098UL, Seed: 0x0000000000002345L,\n                Ascii: \"z1ioVlUCa5wzoh01a4WOUhY9uj4fNcA2T1HiowIKE5eKPqaJfFB4NSlH0HiWpObtpV55ESYNeVD5gLSp3TOYgRl7VylkpJDUPjniPLSlfHJHVbHN9SIzEPqXn915PIFzrn0LoyMOfWyduJH1vVG4jHgNFKDRNbzIiaznFYUDfGAjmdqusykzTlupo\");\n            yield return (HashHigh: 0x7a86cb6d74f46f09UL, HashLow: 0xfc481702f833d969UL, Seed: 0x50d6ef30cff0396fL,\n                Ascii: \"LHditi1jQVTporJKnT90iwBECIdcVV8SCfYL4SwEWYBQygOC523O4beSJERUb4FIszAvarFvFWUUW1ADGk6qiTKk8WJ6QVynphASLoBRP0Ns6KzNJGKBRYkm4MgFnD7klrBvmrMVrwndYNHcoiDiccHFX0tgX2v6dmYfdYmIA8JrpxxCS0F5rywav\");\n            yield return (HashHigh: 0x2426115c57801c4eUL, HashLow: 0x5a8ab15637d25c46UL, Seed: 0x0000000000000967L,\n                Ascii: \"aG7JhuytrqbKSBeGsw1M2HFyqPldvTVLlhKrLFZre5arHSuTe7lAdoQkSRGn6Cs2pZXhm4VItNqsjvBEyPatyoIFzxNWwxkuJerDGDDqdQe4ZaA3CtxkwvYeyM1rvP3sNiLbzngb7kbSfaYNUcfrZQSNDn6NOsjL9JQAt5bFYHpdyQmVzIBVicDTe\");\n            yield return (HashHigh: 0xb89120874a5a751fUL, HashLow: 0xe4755f276a5fec43UL, Seed: 0x000000000000127dL,\n                Ascii: \"O2FnWmdorQDXrcKFqb4LoICVEjePiqRfSoJj6g7bpQ7L8dIpKjAU1XYA5JYL7pSj04V1L4UZq8SNS51ngDYq8PE5zbMDflca7AIxsU6dVK7i0CusqTWOPU73I2XwjttAyhgO4eHLyIYkkd6rKMdYYAdKObsuLBOs3zDWkSXzEoUTjrcmAOnoSyAFT\");\n            yield return (HashHigh: 0x4a9437d7970c9ee6UL, HashLow: 0x34b2da479b63e462UL, Seed: 0x1f5466a634b2344fL,\n                Ascii: \"7UKc1xLfwgsT6EIWH7d9nJ71CZKIlK8f14bJrGtZw4kSj3sBbOi7Et14bEOSyJv7iEOEpUdZr80FOZaZLe21rLXCpEz3eJKhcv2GAc5LLCoHGLvhKT02BoUJYIsTZGy8pasoGSVZ3y5nkO7q43nlU1QyuyI9Tlbp6qxdqEp10ZBXExjttA2ms8EHdh\");\n            yield return (HashHigh: 0x033043b997df9121UL, HashLow: 0xbfb495f480361250UL, Seed: 0x5333704f0de8d057L,\n                Ascii: \"KmEMSK9wnBzxZZuLqHt3Rp7Ca8run5dGywtmJ82nnLwpgjF7ef82O7aiOuNtkOmIEPZVO2xGbZxWw6oLbarM6QuPLQxozommRgwfI9ANID1KlxyQfeIQCTZ6FxpjsysZhB06pTk8Ia7aSSq2y3E3z0fU7SRBZKdfbeNoG7V9TOEvgLaDvKMAjtkXS9\");\n            yield return (HashHigh: 0x8ce49661508b800fUL, HashLow: 0x104fb7405d4c12ffUL, Seed: 0x0000000000000d61L,\n                Ascii: \"0sWIE1CjQRzucXici9FVQj1X5v15FH5TqDWr2mU9yBjiLg4wX1RzSREVeapJcqd3HOHXyc5WDbNawA8E5f1CNKobgNDvzudSN3B0DU8ThHCNpqeWJji8ZYOMomTzHfvJl7EfhauJEA2AbS6I2YrlLaJRnFsp1FxWZDP90wv35GjDSQgGfPQrXBDsPg\");\n            yield return (HashHigh: 0x5cf4819d192b144fUL, HashLow: 0x413a1370cb73c003UL, Seed: 0x0000000000000000L,\n                Ascii: \"j4DP169lyPbb2ngAcgQ8zhCwwZvp8rZpR04glQVUuv149TPFjbM3OFI4AaR9tZ6ywHjI1dj3DJA2cosLJCSdeaPf61tFrjqL1IpA1fmyfZtzUjOC34DZ1hGCKwra4pcwNKzwFtgtvMQBfkoHVCeoO3q43BPFJLxRET8vz1cHQFXVdEHGLTxgSCfO6c\");\n            yield return (HashHigh: 0x4a60204af8fd5160UL, HashLow: 0x0b8fc132793e0973UL, Seed: 0x0000000000000000L,\n                Ascii: \"QXvSj1TRkxyJ2oNPhfDScOxR1yysCzWx2xcZClxeQDXB6S76pQgMJ6frZW5WKRPoAfCrZ9qpycaWvRzxo56jBoaTaFcSMvAibeHRoQcSmKLMAX9cC8lY0T4gFjNkO2bqiRy5cUrbS1ksHotXiBQEuT7ukaj3z7qfTa49SfjY5M19c0HobFUAXl9LHZ8\");\n            yield return (HashHigh: 0xac74a766f3820941UL, HashLow: 0x5f5ac295cc8fb2beUL, Seed: 0x000000000000063dL,\n                Ascii: \"WDiVQUckZZ9EdzM1Rr7X8Vy3lmiVQJjyHfXjptvM0ND8qvMrZU0mCCTs8JKCsxsRI0vJahOSxvJA2nmo1lBgv1WxMFdomur6rNmhnJT9BBoGNwvjkNWB1RaUW48pf8bjWHxQ5dSQCBurFIM0xSbzAMpD6fbldCHfs3rPCcM0Q5p5Tpg5qvMVMBq8YAS\");\n            yield return (HashHigh: 0x800543faf368d033UL, HashLow: 0x6fb501af8b02a5a4UL, Seed: 0x0f5a789a30d0d57fL,\n                Ascii: \"ERqJy7lwgnX8MtZwlGqJDKcBH0oD0qen7ZhM7IqzYTKBZJeHervu5svOIBYpX5QL6yGED1clTZZea20MH1Vqa7TxlBNHqvVQgogH4xPGK3cZVlqs0707DtyX3d90t7X70ZFQ0YrAsjTgFCtwUiqiWBHW6jtOFjX5guRs2AQoKPDQRvQprHJqTbaJpL5\");\n            yield return (HashHigh: 0x60df6933e2b087b1UL, HashLow: 0x05b55899e6e495d5UL, Seed: 0x0000000000000b78L,\n                Ascii: \"8qwcfLY0YL8Rhev6F4Yh2UFvKUYFwRNolzqxZWEYKysMwH0SMQs0Q6L3zfvuyfYVf1zTtxmgtc4VaU9w9RBJkbapICbz7Su0IbJrlZj7g5QnJsfX1FlcD3DXJSwFcrbmzUQx5fTqRUingqagLNu74Hk3LdhonukC8qUf2KXxNKlGNHUcta6bD6PmuCD\");\n            yield return (HashHigh: 0x05a220a112399858UL, HashLow: 0x61d378511b077d3dUL, Seed: 0x0000000000000000L,\n                Ascii: \"XYn3EnzSkomK6EzY1PaQaoWertGvTTEnrS92QSFEf7Yl0JHfQHdH0aDodYrK7NhJPXKJmC0nJIWucSR3z5O1rtPfZ3YKjcemEShMTZLY5Vo5QUGVfz3qJLR8OJEbFuiUF7lebMcA6n8vTrkxNnAWFq3LeCuW33cS6hgoen4mUsS3aNVNwjWZYPKcuIxU\");\n            yield return (HashHigh: 0xeb34d7dd80c5a279UL, HashLow: 0xd67d7b4c5471d896UL, Seed: 0x0000000000001c87L,\n                Ascii: \"psJi17TqMilZ9KIO1XVZap6eFczLL4WtHJiixM5ylMcrKiS2uWrZTnmsxTVAzzKEWN411xYRCtr7ZGIw35Mi7KBTH3TBULI5QCWYxucww28EZyUIC017YdDY1vZPt5H5je8qUux23YTXglhSqFdfDEyfDiN29q2LZFr8j7ro6rCW6k3qpqrzBzysE5iq\");\n            yield return (HashHigh: 0x27cc3347e65b7c04UL, HashLow: 0xe811b1b385409419UL, Seed: 0x000000000000023dL,\n                Ascii: \"3EiVYxYs1VPn5fzkC3gpXJfakAtoeKnmmIoE4MOVVUf1ZiaRhd26wB7kec6I4vMtacA94aVdoY9QUEs3xdSVXXABd3IjjCjWLk6OEugYzM66ZJxKIdrKHbZ9znh3tWErWhlGxGVTE3Yi32j8Rud6JGf6WFgi2EZGsaw9MdeGqoNZk69GNaiPXocfNiLD\");\n            yield return (HashHigh: 0x8cc07daadcf457ddUL, HashLow: 0xf87fdb33c99717e8UL, Seed: 0x0000000000000000L,\n                Ascii: \"46FpeGnsUKlV4iqKU14iUoDneTxp9ZhoQCscrpXrDYyntdHUDNtIQWYodm9PqZFwm3Dznz97I7inlhxPFa9m9Jq6ee29IvxaRbOo0UwQ8KE9T1AQTVFttkhkn2pZ1l6TKPsPo6wtCL9m2jyEvIY2HcBDQaxKSesVbCTd5Ufy0xaUm6o9Q06ogzJkziAf\");\n            yield return (HashHigh: 0xe10526f13c12ee60UL, HashLow: 0x93c6cbad90ce9eb2UL, Seed: 0x0000000000000000L,\n                Ascii: \"JmNWKJBt4LH3rbfFyVyaPkNuwwwjTS2RQ62nwGQBwF41isH9GTTF8Wrwd6Y2gZbI5ybqIMxOFWnDWN3jmTIyjjTKxDteIRjP9iRtbFtQWNB9ptt7OzDnxVajIHrJI5Qqes4kMzc9FkUeVJ52iTHbaoczMksYsYCKPCGIXQN3zKtMRUhggHLP1wFVyAROF\");\n            yield return (HashHigh: 0x2f2551f1f7b7df8dUL, HashLow: 0x62a2a6153a624c4cUL, Seed: 0x0000000000000000L,\n                Ascii: \"W6trZ2sxJE5sR575xVY5Gr1RXdXkShRgfa3xyqt670Zy7OnWKXwmipmRqY5AujAYBJy2YpPy8GbqwB7EbyqAawtLFF9L8aQr4vAkQf1oyVhWkeJ2PExP3X6yAgPL6SrJVSaveoUJ9rWgSKrnQgvw8i8TaTd7c5WotRzZi5fUHvWyu2AHUkopnN25wDZPr\");\n            yield return (HashHigh: 0xe11987cd53f3ee5aUL, HashLow: 0x956fe88548a6c503UL, Seed: 0x00000000000003d2L,\n                Ascii: \"OoCx5frXeT5abvARZQF8DbdwrN3yZJlmd2l7HqH176vO2TzOeRnYnhsMygvpcp6LSJlY2XCTSp06uK4q6GLRnmpeRs5Wllft5WUMLqsXuT5hRrRGOzGQvM4iH5coaYMFn8YwvtB9sD6p9oMwOKaSVoVLHPLeUFLr65A9QXtF8Y1clukhKWepfc4EhTnbl\");\n            yield return (HashHigh: 0xfbfa6f369b67478fUL, HashLow: 0x481128de8006f74fUL, Seed: 0x0000000000000a72L,\n                Ascii: \"PBCC5mjFekV8Hndfcv6jgSDcrJuLDQhIg9R4XISyapqDdSmk21al9rtQZkDztkbKNi7LqQ8aDRJnnKTfia5J713I7znjER5h536BmTdIHqUblGISBJgNgN7cURT23SfrJ4jbfoYgGWzm1zLqUWMuyMRDsAgfnNNrQIYG3TTQxtZ7g0BejJPKgo7CVXwsQ\");\n            yield return (HashHigh: 0xfc1a3a2ba998c77bUL, HashLow: 0x18d0a09d8933f273UL, Seed: 0x75db5b20f097c469L,\n                Ascii: \"rvjxm10eoISk1JvBdZ0FtVfX3DZq0WIisqXILTnPOevfy9yxV6MRKg4DjaeT51OwU96vVMWD7lNDysWuJpnxO2hJrorItYjToF79P1eLRgOqApetmpDNxj7Dwuj2wjErduxt2AYZfduLB6LLFEjnvuegUPDnSR2QauVB79fTDvftTWzz73dIF29UO7F0U3\");\n            yield return (HashHigh: 0x3b2a3919ba67e333UL, HashLow: 0xfb1592fdd939111cUL, Seed: 0x00000000000006a1L,\n                Ascii: \"ql0avRT5wcDNIGMPGoFvAnVnAFgvm1dwRmk18ZzQVYRvuldA9NoqF7umL1UOJrx2xOts7Xc7dmuWnKCOkH7YhnpWhGwY2IVwh4T0IWRnkZfF1kJXwtleX6pgErY2vfux7kdmYrx7LNjH0sJ0JFtlrXUq5KHdVWpOKFD5oMY0PDMtaEfgXF79bQtYSDyYzZ\");\n            yield return (HashHigh: 0xfa54c870d9f4161dUL, HashLow: 0x8b72dc86c8678a82UL, Seed: 0x0000000000000000L,\n                Ascii: \"U3YUfYEra0YIs8gt5qsUVsSRx2swlTua0XpIgRwxlHFm2J8Dei6xEFxPA4BUkCSBvvQveo6wvtREcBRuHSeOmxgWecXsMQVzJXwdFiiYP5qWKIlNmNZGjvAvqPBFNzkfZmhR0BWMpwPMY7nB5RVKFyhAWHOeryTtdJkCrKxT8Z9y9Anhg139jjNeFl06cU\");\n            yield return (HashHigh: 0xdd54dcf0fb3fc438UL, HashLow: 0x9003a190f57b5789UL, Seed: 0x7f92fda1109c7005L,\n                Ascii: \"UpkixotoQNGcONcTFsbtb4mcFM2w7hrashYpRpUc5F9uKI5h16RlvkqICfgyUEVwjvFfN8hFD6YRtV32c2KdLYWTX5di9tjhkWIBipThPPMmoSejZIWjE3Z1tjcgbbZb0pZFv020phWTeXxw3wlQpZWA8gFRckBL6tVY6oWtbV6gUGY7nJF69XXRbTCr1R\");\n            yield return (HashHigh: 0x4cea21f626653dd6UL, HashLow: 0x502ceb87c379b6b9UL, Seed: 0x0000000000001263L,\n                Ascii: \"km4CV6neshlr0GzepVNIEnWXRi8hYyhmHiS3fJzHh4YbpdZAasUCg7cFr3mPMuQPqDDUYhZeqZhj0985eQQyE29kEUGSUqnxKUwVb4AGUIhIjRTGvocnEEF46MfmSh4vrmLz4aFn8toOYlpY4fZPAMziZOXEcSe1qXOUxypG4dkQFnxXU931Mf8qZzQZCD8\");\n            yield return (HashHigh: 0xe814d6f0e113b96fUL, HashLow: 0x21845c4bc1751820UL, Seed: 0x00000000000024d2L,\n                Ascii: \"iOPgLWdCy1lrEuxUcHiPPSIubuiBiihc22LKoOqH1nzCbjFnm5TUKqArnMgnvmdSHde04Fx6dgf1bZSD0fML5mJnNSahGcxQiD6ow9KayC7W2z7Pz7vmDhKxJ4OVMq13fkvXcEDAj1MBuVQIZ0dmUsirUdomFQnOZkpD5XTJ2Usz0Dzc4vDsksgBF2osLn8\");\n            yield return (HashHigh: 0x49d5946ecce52836UL, HashLow: 0x264fab8ee4715ca0UL, Seed: 0x4fb24495dffafc30L,\n                Ascii: \"Vleawe0EnlMWaznjUaZDoOjvEzt1iaWrmD33usV3KWps7BeoysYXDbl80iA2ZzjRMnjuN6YU8nSPRpSdJtdFwNSNiO7NguPGzGaGXbskQ6cduOS1LESdr1hEhQEuSMEmrhYkc8kETwwUn2fiHYA6yGxz86w9VRxMa2Z2zVtjrbT0Hx3kL4a32fXrao8C9Zl\");\n            yield return (HashHigh: 0x4960d28ad27aea08UL, HashLow: 0x73cafc7d21008410UL, Seed: 0x0000000000000000L,\n                Ascii: \"1uRmqXqP3y7BezETYuqIb4eRq44oUDrQMiCzYu8Tl2eR3UcN04BRUljItKwjBSNV6ZKrwVTSqvHAjnUP4MSAMz2Rj6kuxj0NrXhsWonPPPeBgtgbyv7Efb4Y32nHHBwJv3eeHs51sEOpiqF2TJXRCsvzJ5lfqt7jicS3GEZ9PddVFSWohyvZITlL32y10J2\");\n            yield return (HashHigh: 0xe6fe970ffd59ac38UL, HashLow: 0x0575ae2d2d390520UL, Seed: 0x0000000000000a75L,\n                Ascii: \"T0NKoiP1ejhTNTIjwlRjfhf8aRDsM8eOGcomBjvwm6NkdiS4Ap2okyONWEtU6ZB9btDnRChjgLLDikHqKdtDUCv7kkfATbaWxKsP9PXc2wQemb7azIxNqUtczT1BxMiOETCEz6AZ5YXmd8JRvvC8Ww3MUzfKK5jmFBeT8vCYBEVarhfHpK7PDZRn4u1brrlY\");\n            yield return (HashHigh: 0x1c43f33d2122e752UL, HashLow: 0x87e605489da106a4UL, Seed: 0x0000000000000974L,\n                Ascii: \"e2exMRoBFO0WrmVhccHLXi5eucVyumPed5UUYOsYSzk3tstsPBEkmQt7q893koyF96vJuXJ5VjXhnE9kSPLvqJag15ORzCPdi6eJtshBQRauvsnIkxssAOoMN6rvR26UAOfj4srMrvsLpKa4qNGGR7MP6IrVs45FznrCys1XuxCgKFrGP0i6CPK1AoTVI5xs\");\n            yield return (HashHigh: 0x47660e95e2ae55b7UL, HashLow: 0x14fc34dab595ac5dUL, Seed: 0x0000000000002073L,\n                Ascii: \"TSQqxL0dGMSGwcQhYaaoKOSeUZnATbGTJPrUhaa2MDMR1CWS0NFf0apxUP3YNPQwQXdtlaUmgMpIxEYuHWY2ZstR8CjtysIQbZKclsaTJC2ehp9MClfkRQTR0yGt8DwfFgicUMoNjF8bgfp9KuE5iBNBjpvVyyPw2Pnx98pWJCog3JyUCegTVSxO8cPoswgI\");\n            yield return (HashHigh: 0x860c1619cd22e4caUL, HashLow: 0xd532592a52ab9f87UL, Seed: 0x00000000000004f6L,\n                Ascii: \"iXTGoPucJks6tsvfmjnpmkzfnTkycGlJwcsQVqWsp5ReZEceZcXrHNVfUvn4uK5jm5i0pLwkgHjraNM02wlGZ5AwhXLSXhea32lcUL0G9ArAyF1VEysZZkiquHDeEjxr00yKHHFyjrMrZrt5xQS03Pq1WR8R5Tp49CLNa7AcOuR8wnIItmeMZI4kPwdQCEUH\");\n            yield return (HashHigh: 0x3d660793218c261eUL, HashLow: 0x051b34110a3955baUL, Seed: 0x0000000000000270L,\n                Ascii: \"wJTg47sVQ9N39ZF5ibtniA8XB0rbEZTPoIsFfdKEVEeGaDAG8abDD5Fa8Sjv93Jk1iNNKjg02Rkv0Vre4KTMS0usJa5fH4kJVHxPbJt7wyzMtEZBSnHJlxcE3tm2rZfD1Fqtcs4JbOFry391CL6Y4SZkqM6AJXYliPzxRfnZXMACCLCtrdnxLqUqGXeMPvXTx\");\n            yield return (HashHigh: 0x8eff2cd0bba2eb17UL, HashLow: 0x8aae0a364fc7203bUL, Seed: 0x000000000000124dL,\n                Ascii: \"0BOwda1cclUajOSEMC2bGST5vm9ZtCE9ee32HgqtfIP6uA6rcS1P7aKFQRed2437Dlnpj87gY8xrDgraOmjf2ruJ6sQVo9XlbKRjmkvkg7RsoSIwelsoEBIXZ6MiadbyW65ynEf2m3vwD42DptkKBYBLqoTgAAyE8Egd3BspMQEh9OpYlpNnYZiDPJvZo8e3q\");\n            yield return (HashHigh: 0xbe464997daf45adfUL, HashLow: 0xfb70365ba36e2915UL, Seed: 0x32563880bd11daecL,\n                Ascii: \"Mq86Fm66UGSkmfDadjSS3UQSbQxqR5Hn4AFy3wthh3PB9q0m4xyF9Ob1844LSQulwt43Yn2QTFsmSElfyPA0FO26NnSEhBQ6giIEsmCRTiRoav6gP4jNwK0UOr3zWlgprKpeDIzBDuavaEzLC8UImmoQd60CyOymdyQn1NEqnJypOC1HEVKENXIz8mrU514ON\");\n            yield return (HashHigh: 0xc8c19e2f58a8472fUL, HashLow: 0xa7b974bf25aa4c71UL, Seed: 0x0000000000001de2L,\n                Ascii: \"50aHDDC2wpcxTjo82ukkjaWAak0xsVlYqeWABZwHSXB6EjsvTWPqxMUDLDk6IenJR1uErGD5CmFj0KkT1c4MWDoQjx3M2ooMmSe8Bg6iM0cO1EWxkFZZWvcmXh3w0dOJ411oZ5IHBx91mcmSomWr3OssJkqc0FkcJF2u3CM3ll4jMILl6Rj8FVqg6bNgSp1jB\");\n            yield return (HashHigh: 0x23220c656ae84b56UL, HashLow: 0x60bf84ebac2cbe62UL, Seed: 0x0000000000000000L,\n                Ascii: \"FTwBoP8usBBvjMziZZrDaZfnouXR6nenK0TgWmKfsPybU7Nz2wVwp2srQMoEUNsAI0OnmHl4oTj3LOrRXQlirr0ALGTROHyUizVVAKGJsKN4TBpAyZGrRbqF2pDrG9rLbqOWVfjwTRvZns6swXKyEtcQWW0jq19j4oHhf8Wr7jh4ixAsMgCVvmqhJiuoTlKJI7\");\n            yield return (HashHigh: 0xfb2a4a921455d634UL, HashLow: 0xc774f948089c4fdaUL, Seed: 0x0000000000001686L,\n                Ascii: \"ZXLkd1gbDppBcMhsne20O40Y2xygpbv94455Jx84KmQhvRtJzG9DC6nW65C12uCTX6K7J8PDmRhNruHDy9mwV9EI5eTgLFvMTApz3UXaFGWqAHQzsul1TdyCSGvkKoZ8mX3P78Cs2IthvaubYsq2Oyt8oBgEVR3UxwbXGic4qfnMVLtHygRIhvn2AkkXkh0QSv\");\n            yield return (HashHigh: 0x0dd9408580971eaaUL, HashLow: 0xc37815bbbf32af33UL, Seed: 0x2bc608cf2207aee5L,\n                Ascii: \"0jU730nzyIsZYmFFEKW7LqzjhNFOINPtcIrGKxIRn14R7DE6D0gV3Ujw5Tn3CHLpwlEucGcAH3DKhZOexmadErC4T3Ma1QC5TgvZ3qcwcpiuBgXbU6ifMdkTpgx618rHvyKkJG1n74HRwKcIJWgN7j7xrCPjOCBU9s40H8Xk2i4YnS6kR1wOiRaMeBame3evyo\");\n            yield return (HashHigh: 0x7a5d13bd58ef273eUL, HashLow: 0xa8a9a52dcab75ee2UL, Seed: 0x00000000000009cfL,\n                Ascii: \"VlZBGeqf7vixsvJNQBhm6bYGwri41Zvpc4xzrWX51JjtrYRfOzxXMNDB4ZnyW807FNTmQodYQpULseqOopIMisipjHszqUoVWOTh1J2rBgTe3NiFGNC5mvLPqDrB4el08a88298Weg1LQZH4ZpCTgwgzS6VU0K45b0XSZwIusVykz2du8yW3NELg33X1mbWoNU\");\n            yield return (HashHigh: 0x8475dd060f60fc69UL, HashLow: 0x0edad37e205c1287UL, Seed: 0x00000000000013b2L,\n                Ascii: \"kfOh6LpJy1c0R9OfjpumomrPdrEQWkY4fEFsiCAqQpU88sCKRDHsRcCdXB6kZRnpL907YTb0Yb9JPPpDUlXsxWKQkntkjFOKURvxVWdPHNfV7hWG5OtmwfvKVJH6sQsbtlfRC7jGH7JqDUF7twv6rNcYH8xA9St74f4rINqRR3LzlyJ7dFqUwQNPAKK71vNgI4h\");\n            yield return (HashHigh: 0x3feebafc79c6e690UL, HashLow: 0x8bf036a3fc566396UL, Seed: 0x059e6144ab7385c7L,\n                Ascii: \"E8LvErh2dHlbiDcIzaz4bTJBcPPnI4jREgmFX6i83SGvXG4ezYf1b19LWXqbDD6Drg6aUCIoLSh70F2wcNsbcviDrQr9DzazOLYYQNWBHWtrWji59OgLXu1dlJFQIdX9ZjQIKOskeexktDSixJ6fdfWZ1IH0cYbg4baMDzX8GmTPnBuIoxnj0X9JiWDCuyNjBPX\");\n            yield return (HashHigh: 0x7e134f3caab01aedUL, HashLow: 0x95545c39856041c9UL, Seed: 0x00000000000022ffL,\n                Ascii: \"iTWosRgGzLwZXX7UUrqI7OLPrcNVZGDvf9f2u0TmkLLnRUvK1GdVoQrykfcUC0wraOEu3F5yDB6AEYSpsmek9kiPeLxkajuPkvIASVvF0VJj9PLhXwS6eGsvrrEDItewb4HxEKtQurBtqpIagjWkKSb3VfiEoW1EzHp46cNkcL7Exd4YG3N8Plixy0N4tHh8nrH\");\n            yield return (HashHigh: 0xa71f6378d079d547UL, HashLow: 0xd59af747daef2965UL, Seed: 0x0000000000000000L,\n                Ascii: \"zTPaxuYpXy0RMWlEPzUHHSud1xUz4zXnHIsxvn4u07SXkkVW6e4VkZV3u7KsNQaI7y7jYeoAXquNBzMrTfLfPEWoijoPGaMiPJ1127GwFT4yuadB9ehG9PXeFpq8js5eJCgMGKPJWoYT1xR5PAI9YyXNZX6PBPNJCJFV0uQnEoIWo1ZZIfoX6rl0XrkLUfyZiD0\");\n            yield return (HashHigh: 0x983865a285dc7fc5UL, HashLow: 0xb21a62c104658163UL, Seed: 0x0000000000001677L,\n                Ascii: \"okeRXrWl7WKE0rpSq2LjGbWDJjsNgHKRlF1a4DQ8M3gyhPQ9k7qsOhHcYXhHBHJxoa2WruDDtO2L9iONUpmW1jqARn8S1DTbk7TMM9YWtyeIgirAEKVyeQ4Ibd7FHKVls3AOtUYoH7aGrDFkLgPdjdtrjvVDBTODFI0vM9RUOYlAtuHUXredKtLaMlnRZYsLfj6n\");\n            yield return (HashHigh: 0x7163ac5b43bb2515UL, HashLow: 0x6e50aa0641caa241UL, Seed: 0x0000000000000000L,\n                Ascii: \"mVQPVPD2S9zDg6im0K04xSDtxJXYSn0WBtOjAp3ZmosraMtSQ3EfOURnByQDAtCrUE0UZqbIFOORusqZmU00GP3VLD11JQ17GG9JwRd4Zr2rQiwmJF0nCyexH0vhUAAo3x99951cn9tpFM2tkZBnjSKalgh6gGPZNtrWFmMYZo37ClUPXgskdDGzilIwpUInzg5x\");\n            yield return (HashHigh: 0x6ab0824846cfaf8cUL, HashLow: 0x8e67e6058b55ebeaUL, Seed: 0x0000000000001187L,\n                Ascii: \"SNsrE3l1LFCloXtSEZT3wmG8OmSxi8CLJG0Oyjxl7H5VkAMpgnfb0D5oXRq5eo0kIYTsgwVcyw3gx3GJZxWJ1UWZXGoc5tAGlURMqomHO0YqmIlWStQfa7oUi3qvcdGBAXwnRXkEvliAbx0X25fpTVhgEUJMSrR9PREGH0wJW1aThY0AUsEY4JRAcGMe5EVB5eo6\");\n            yield return (HashHigh: 0xbb7c982db9474694UL, HashLow: 0x545a0cf45fee623cUL, Seed: 0x0000000000002448L,\n                Ascii: \"4gzo7Lxz1oPfOsfDiomHKGFIb5avvfVOQXtSN1KcefGd4QmabYXPDBN9Iq08jEIK52ZYHRIB35zrmhNMB7rVdqdH1uYdq8mQeFITakHEQQfUktQb51YLAFgoEWn47GKMLXHctmlNfCCmXHXCiMca1WHJrenVRnqF8Htyglc7pqK77wXLwKPcmOU2nK1C2vJlg3RZ\");\n            yield return (HashHigh: 0x0a15e68a034d9c7aUL, HashLow: 0x71ccd190e6b75777UL, Seed: 0x0000000000000000L,\n                Ascii: \"gxD8dp9Es2jaH9Fp7sDhFo9O9dutlkzzf5lbY0DEeHANikDwZCuV57OAPebSXMfDg40gZCcAyWfj2J6zKb9kLyke0hAPK0CGGhSocwqQFOA2K7MZCFk9ljI2y7r0FdLsu7xcWy8S6lCAvNtxv0M6ftPQWDFQyRwehmpJUBwewOuFZ7VZbaGidfPt7j8AxSozVrocU\");\n            yield return (HashHigh: 0x8e9642b5e60ada61UL, HashLow: 0x3aa569a04ba548d9UL, Seed: 0x6bce3584ea311313L,\n                Ascii: \"xGVxFjsFy5GNRyTALes79BwSPskiYumMr1oNJ06heHqpdGUJHjqfuMp9HR4bXcnDTN5p1tdnLN6b7Wkoz87B2qrgN697oPS34WKkcACWbwHo7uawfjJagfG3GPrBbRCJJhOuRrw2288s0DSXZQVpTCjhAygQE3pdHOv08rvUnorPJgmChV4EOWbu5TYiBC4tDTjKV\");\n            yield return (HashHigh: 0x5e32a28735e97926UL, HashLow: 0x0fbe4d9644d9e453UL, Seed: 0x0000000000001c2fL,\n                Ascii: \"EINQYV7PKpQRCBjwXJINeSzcigzh8DGR09DeVLvpmqp0sbcuPeQEjCugarM9tNOPb8kSSfrTe36xHrz2i4qL5ePIx6a4Aypzi4aMs1x5E32MKIyQtsrMLPWhy9hIvvYIB8xQYBEBDQFvzIKTJ1eoIR25cn0u6bzH3O4IPqGzecHbRm3mxIrCWq7CWgVLI3AHheMHU\");\n            yield return (HashHigh: 0x35bfd4d027363204UL, HashLow: 0x572346097822beedUL, Seed: 0x0000000000000da1L,\n                Ascii: \"st05R0wLsgNC1YYfCRgGe3r2HnQutl3h9R1Yxqdr2yDFcNZZYFOScEmrgjbnD63nMwrebYsunf2graifBydzdXW8boxF31oVA9gGkwNxPWRmzf3RdH3MFFt9DNK94uyF2cH0CEVA3hG8J4yhJLoz1BQHgHEK4p0sCkMeRK23XAp3xVSMnpaL0OCyZ8nGLYAUjVjhM\");\n            yield return (HashHigh: 0x5b16eebab182d6c0UL, HashLow: 0x5e343b99c20cc4b9UL, Seed: 0x00000000000001f1L,\n                Ascii: \"eNVVlGptzIUZLWdU2T8l8zVxwo4NZGGMYVPQjHfHB1tD4CPxPuXvnBF5AVngIZRSiK4ZZXMbgBgsCIteJzkMlMUVz05ZsIRSpIQK5eFwLsDOGLfiaTb8Bf9tsvg5EijRqMSJUeJAwJ3JGIHRbvnWoVLv4kLvUwsjIXcEOGxSEUaUjO6g1JZhlj4nn1IbSniaeTrWuf\");\n            yield return (HashHigh: 0x8f4a34c6b345afecUL, HashLow: 0x0737329deb2c430cUL, Seed: 0x0000000000001047L,\n                Ascii: \"0kv3KDl6zCMnofBv1kDEtL3Qo6F4pF3ojNuoUQDlTtbnz5AiF857PKJg1zwomMw6uNKJLDMYODmJ0s3x3KEmy9ueM99Wpmn9kVtniusi1caGOYAA8cOrpNtmlzZXR1R7RkS9bbj9zgWQVjoaUW3LGuOPOrHk7X06fev7ftKFJTUCYlBoCI7EehaSozTHM17c7M0DAs\");\n            yield return (HashHigh: 0x3fdfe9916d74b8a8UL, HashLow: 0x668cc92b915b5505UL, Seed: 0x0000000000000000L,\n                Ascii: \"A4rHJS19TNCabgywUE0pljIza5JFJ9UOpYXI8g4x6AcgXFaTETYhF5dkO3lHBM9twkRhTeNVtgq64mrZqXXKZcE9JGgnIbp97BObIy6TfwqaHZGuKPYHMbxVd1SQaGrbPydcDqiYOuH0NBMCWf6tltxR587HPqX3hjNxbjVJM23dqA9OHygWm0X3PZ9mTcIHaCR5J3\");\n            yield return (HashHigh: 0xb858ebc7a33cfc1cUL, HashLow: 0x97eb03ed94b11bbeUL, Seed: 0x6eaac083a09881cdL,\n                Ascii: \"9y3Te5AvOOJ76IxcjcZyCqWacELsegeusXL8p4JmCoiDk4x2afdSOFWLMcVYNT0MqtbewJmkuNYHVzDwd6unfbrtuXZ7YXrWrMteD2btijMlpKKy6DN3rOYsz5gEF652OiHAK2clHqegYzvWllL92h3AV68t3Ots7RIwxZpuwils66gpISYWGeZwzyUVe136OLZbBf\");\n            yield return (HashHigh: 0x87e19c32b0d78288UL, HashLow: 0x77e0cf47b61b8c13UL, Seed: 0x39b2708786296a3dL,\n                Ascii: \"77GKm15HN9YcPLaFCjgHNheN29NmvQdYGgwhrbMcjECG7bBMSvlf330O5maD00Necro281700cNgSb02HqAFTAqqgStbtcdgbiAiTgoEpTK7VixXjRxnUfGRV0nubNgamyP1gVxGLcXbLQJxm88Qlh5jYYuofHg59VOesQenJPBZtXSlPsTfsQP8GR54AWzhhndfUR1\");\n            yield return (HashHigh: 0x6fbaa142f0df6237UL, HashLow: 0x9a7dcd73db310ffaUL, Seed: 0x0000000000001c20L,\n                Ascii: \"prtgeiSM0Rr09rr90Q4i6lTfBQgI9pEB69QysRc4tkJVu83b7bNZKvLaWZxSZ5PngjF29h296rfKs7qzVNHXYjGvASFXmPRpB90DQdcXNFbUB3OEnvklMXyVLXizbjGlOSTRzqESiLYrOwwVWDurIedIRp3rBKYaecBrNAIzWlXv5sUPPTQDcM3fVuHIHmb5Eo6fVfh\");\n            yield return (HashHigh: 0xb46638f16268a657UL, HashLow: 0x0df797c69706bdccUL, Seed: 0x0000000000000000L,\n                Ascii: \"QFFMSp1luSh32MHpoTC24NHOfCyIGiBdyoHY9njPElMQnDXsNIfgtnVs1TjiSDn0MIi0d25cuVjdwEcYI4ZoTECHazYQcSkvzxn79LjuK21Urha09w0N2lCyv8pf6XpJBRBEyKQS0v5nSIQ48fVTaa32AlWGZRiTi8FbO5jYz4l4QVoXlXN4qzROPsjOQTg9o4LGsXH\");\n            yield return (HashHigh: 0x36c92e2df52eb59cUL, HashLow: 0xe424e61f62f30bdeUL, Seed: 0x0000000000000000L,\n                Ascii: \"ic5H6y6VLOh3d8LxbBkaCsBnnK9DRm6BoqMJ2ty8pzdTq2S7vY7SIgTR7illK6360xrqSQrlh9asCEFlLm8cUUDVkPVSgjaZbtamCC2Bxcz4QghRYQlQUHjN5sOjLqN1LgLZLQFKszjHjQTJdj4NUr09tbW0zLA2rn4soutXq6tAix7JozDpLH7yXShybA4PiSRWDbs\");\n            yield return (HashHigh: 0x6a2924e1a97dd7fcUL, HashLow: 0x13ed98dbc25604f7UL, Seed: 0x0000000000000000L,\n                Ascii: \"n1bjmOYe7NMcghKYScBlGRVTtLTlEIODjxY9CULIHdnDRSTNxmfquaHDy9jpss9VKp5bDpxLPg28uUzs0ZdckeSNIfprYlQMGrUdgqDgRWLJjML01wIWkAa0ei7ngTCfpFWBX1WZIvpmgLzybv7ieU7uOzSeDFGAM1c1uP1sEkSvKPHDSUDa6qx7q9bdrDtqmg1TsE8b\");\n            yield return (HashHigh: 0x046c7ab74efd2742UL, HashLow: 0x8038692ca26033e3UL, Seed: 0x0000000000000000L,\n                Ascii: \"ERu1x9IgVGUehmOv54iL0asx725pWMTcWZ1a7BykhIVyvkT6TvujesPBT7G9uqbxr0vPVIZKhQk3eoCWkN5jNaHorvyBzGu9TGGDIPLCNfICmvUoZQ3tCDtuU7a8uR77X0xPaJghT49EibKDv83ITUue1SXYKTOkyMcH5K9eEOy1q1zGwu1e7rl0DQaml7qMcRX584zx\");\n            yield return (HashHigh: 0xb5d837874a52973bUL, HashLow: 0x242c8ce2f79eb12aUL, Seed: 0x00000000000010ffL,\n                Ascii: \"XEOAfSCaBmxlGweXaEyY108UlYD2t8KbkJ2F6KtevwvZ6YuDq1WwmdsRodUygwFsPsJdNCzZXTznSFONEX2BAqxWSJCdAc1vRfu4ANZZB3gfXH87MqJCrY8A7945ikpWH0GqCXojfhX9QMhQz1JPOGyE1MP3cwCh5opqMc6t5vP2DUTjXmjXCWyiL2PS41S1Q9zI29Gz\");\n            yield return (HashHigh: 0x85c31e633c183a0dUL, HashLow: 0x4f04b67ce498a52dUL, Seed: 0x0000000000001f51L,\n                Ascii: \"jdSPmVTMfYXDW1L1IkvTlrfNHQdV00qpWXy2yMr7Ivzqm2MmUiqTO5euIDTZ5k9VcaDccgnGKDwtCzpBr8INY1a501XfYXFqiK2fHoKWMplgHpEt2EefKvhyqOXL4JYslL9X8qCIhQ3dDPM8In6xHN2VNqPOs1CSb2fgoziJaXTQDFHSMIrZ4JQAIMG65FStArWr9pEQA\");\n            yield return (HashHigh: 0x11fffd97f017a713UL, HashLow: 0x7dd53baa8a3ba4caUL, Seed: 0x0000000000001497L,\n                Ascii: \"BMLA6WSGL5XzfLmZLxIhOVXEFbbnkzF6gdgBkYI2DDOSVrl03TfCLPKINF1G21TBUcWtSd21llrsskrvmxW4R3uX8nd45IebrxeiwEFRgnTg4iMNDibzHnUKqoitQTXPX9wHfVVLF3az5zHKPOY8Uoe2vdvLtAdKmXI6bfQNjFj5s4MO3QPOGBh6JpHvgWVEaeh7vd2Pi\");\n            yield return (HashHigh: 0x6f1eea0e31bc14a0UL, HashLow: 0x72175fdc15f3690bUL, Seed: 0x00000000000006f8L,\n                Ascii: \"D3BRDro1Gex78qmI3VE9RPAlgYIISaOXtIADxQ3T4K69WkIvXs3ohlE70uQ1Hyg3Pwf2c5tUCdy6ERnwtdQyZEBwLCoDhdTJ4guMEQxjlskIBRqiHPjijCH0pOnZcdkMMoHqeCLakLu4LZTvODHQmy9e2MD0gkpaf215cDvaL5kHTzPFK57yu489jjJmBYXcqjZ7DruRk\");\n            yield return (HashHigh: 0x621cd36faba9990aUL, HashLow: 0x9183c4055827a563UL, Seed: 0x0000000000001bfdL,\n                Ascii: \"quTQG0dSEVNxGVWXbiSO1E4liYRLRJFVHEWjeXheBmgMTNqeUT4jRpb5KjsOB79xgHxWAAY7Aae8lzcBwvDP7WOtrhFAyMX7sfjqRcqWLALY25Qplxjla7H4XcC2byr5IzvEebp9g5pZcRRWAWWruRq60dIy5d5GArn3iuJ59KB2I4gnXGamTVObJfp9o9BJkT3sQcyxPa\");\n            yield return (HashHigh: 0x292dd6d4c9151e40UL, HashLow: 0x771b6fbca83d29cdUL, Seed: 0x0000000000000020L,\n                Ascii: \"44pAhedm716O8ozBEHOPHNzDvNXZg7bV27TZ2GwIAAm1qO8cSB2yY3ickIycyWxuJSjQb7561pLhMXnxyLvGQhtdSyaCoqld9e1xN88mMPpBTnk155HMcBiBiQxsWKDNLBfiZgv4xlvWYJIaqSfARp2ldGdR6k74GHqbwwUPz0jgbzNEk5oixnWmrC82SKxIm1kKp7MAJM\");\n            yield return (HashHigh: 0x264c7789459ae772UL, HashLow: 0x0e2b371ea14491b7UL, Seed: 0x000000000000006bL,\n                Ascii: \"Dam42yTDJxhGrApDgPFKv3n88kjSe9fKNB2M8MDOVQ2qFK4PM2wxwO1Eaa4ccnsdokM8Crx0u6pF4HdUt0bNld3eNZ3mIxw2JoeMFPM7xzUBVeKX8s5Dy4hYbUsqggVUn8geKzEHLnB0lxAkJH50lkjWnSluE5yYfZy0aJsV9BQdy0MpXON8lm5FFI3QDPYUjiSfpHzH2D\");\n            yield return (HashHigh: 0xb5003afea35e4f7fUL, HashLow: 0x3becc1573cfb6078UL, Seed: 0x6dc8185ac1bfab6bL,\n                Ascii: \"XMiqWzsuc4z7YaloyqlKs8vUVGd63MRjice3xtKUElzpdai4dtxqw2ji2vKYtR9qXYTGF5yATxO3C0ZJ67LXbuvgiR82hLgM3Fed2u4ak57qzPbIaZYRGP2zcJ6gzgCjSn9jEFlW0jdCXlhi8fxUAYbfIVZM489lRfYE40s6WDj0bN8UOrKQROzgmp1sjwqIbh0tdFgmJ2\");\n            yield return (HashHigh: 0x68b01827f4f7e838UL, HashLow: 0xc262473653102a4fUL, Seed: 0x0000000000001febL,\n                Ascii: \"qwHb3J6hfCjldQULb2ziSsUpSBN5byCXfHa1Gj2OVQSw3qjnD24bTXYgJFbGEpPMXqrjguJ859Wi4DHQHxNROKFrq4tHbutxdKcgjIEwrPmhSSyNkJ61wTrjC3EFzM6aLdpnHkiOwy1kziYvQu0P9gKfnFw7d0iKxREUDZX2rKppgzQIvX2dAbtV0zgFIJtqBxxiV3nCUDW\");\n            yield return (HashHigh: 0xe23675cec8c70639UL, HashLow: 0x899bf435b566a0d1UL, Seed: 0x0000000000000000L,\n                Ascii: \"RtaMs90IiMkoFim8fC9ffiV9Wxq6kdyBztVIAZwg5Yo7SAaqvAeUNnV12gGDJ7FDpP2PnCuqP4mSnKdlDAonWCnWEtek3tvXpvcZvsOLdD15Q4UNXkcc0u2XZMVIukxWn6XXAGpfAW50iUxkRpxqzmQkdO67NN6JDRDLsDNmhnqB22dzfS60qEj2h4q46E9xitSLUvNP9yF\");\n            yield return (HashHigh: 0x148d77e4199d5df3UL, HashLow: 0x0a501bddccc490c3UL, Seed: 0x00000000000020edL,\n                Ascii: \"g7swABpjAHpeWeXxNzgoctMEw5GRPQV9NscbfeS93kOS2Puld6Ao9ZtOTHxiZJJK5UHxcxCMccpusRDjkOgkW8KggS0BA3dzN6TZyRoiGffvHLOUuArfNXapI5XWvxGfslvbtkbwNQSAd1w6luvIpBBV10Le9dKU32UfO0kaEsuCIHSnZBD113IC1Bu2P99wbnv4tNzmodR\");\n            yield return (HashHigh: 0x3a2c68dc00fa2e90UL, HashLow: 0x48eab1854370b089UL, Seed: 0x0000000000002162L,\n                Ascii: \"l3oVf4xHK4lGNoBzZY4r8Az54QI4TE1SRkWGBpTwcBQvZTxDikyKjk5DUjIdypZdQim114pyZoIgfogQfPSKjUtp5JRfh43YgMAK1SHydH9dqWe46t5htTcFdpB8rw4aXxMntkLXfj56KbTfy2ZwlVvFAIq3A0FGQHuxhbuM35JUOXjzBLdU9hzq5v6VReuw9NjxyDVoS0Ti\");\n            yield return (HashHigh: 0x8b7f7c665e5d6e98UL, HashLow: 0xdf1e27cb971384fbUL, Seed: 0x0000000000000ff6L,\n                Ascii: \"BseKYldGrJmCBb9BIoiyKirniQwAk3arxPhWgiv7DZSA3RQLZsZGtRIbPn0w8Ql6Tph4kXbux4y8HWUTkQF6mbYMUDpZOIfg1KIbdg5xBkZ7LRAgIGJ0qa83A1Dc6qI9I5Xo56JiqIiB86hnla0M44FJICRxIhIQnKL3iQpF86WrsYphZ7zIOEocnrRr4YlHzY3kf2WQmK6O\");\n            yield return (HashHigh: 0x4230960da9a7698fUL, HashLow: 0xd519f33cfc970895UL, Seed: 0x0000000000000000L,\n                Ascii: \"kE4ylCzKHAkVdJjliNIUitJhfmiGZkKwZS5yH32uUGbzSIMQnq8sy5ZgPGeYkR75RZkXoc3z2r7gfQe45eQLpq3ZhTDTQvjKnNYG6aLmLMp4VknmdFdrPVi1xz2QmHuSlX9ix5AdDr2D2SGxde61EJgLD6PZI45PxA2oiGyVTO2MNnCt6e1gLmd0O1HPeKTCr5eS7ZFKAW4W\");\n            yield return (HashHigh: 0x559d70ec41355841UL, HashLow: 0x3a3133b9c19fbeddUL, Seed: 0x0000000000000000L,\n                Ascii: \"6y5XD36CB0vckoWi5CI30UrvnzasdfUlE6cL2GnIZMktF2LOcZY1xLcwYh4owhjefTq6vhzMcVhnaBoUOla0rF0f69g9gkOdDM75tSaEuEVDH3QrdO4RKKJPOomEGKg6KJbr96T0TRn7Kv9T4GR9rhooOVcrUY4qb2q4ivf6iDFqjRHCPonujUrin6Z3njm4rBeTtYxcvcAE\");\n            yield return (HashHigh: 0x9f5d9465d7ad1839UL, HashLow: 0xff1317c5a7f84ad0UL, Seed: 0x5ec61bc65ad53a22L,\n                Ascii: \"3uySfjNQ0zfwIUgov465LnZFIORkQKzY35QZq3KvBZtARcW2WcUCiqgnfFW6Oy7DpvdGOv7eyQgIUWO2zwGyuN40wJE8FfyawCNJQOb0gFfY3YxWESPm0ySzcfBLqtGbQF4xYh3iuiDtadAgJhQYVDSxeBNPBXeuElbH3uz70YVP221D8Yh5dfdLQzINOKMZWUKaHxsxCutbb\");\n            yield return (HashHigh: 0x002976652cabadf3UL, HashLow: 0x0280d170033eae14UL, Seed: 0x0000000000000000L,\n                Ascii: \"qg5wjwRmiVRejyh71UouGPimOCCXJULeY24IamrLLSdzBnehynHY9SOMW1ME2Otvfi4Zg98XjpNeTvXRy6qGImq02Fgsx1TBnA94EhidIx1edpu01NOSJ1MtqqnaNeNapoLkcqsYWKaso36ExpO8dZ3McTfMEOaYJFeg03fx0GBvMc56kAO3uRDXsXQvy4xgzs81HQxVXoWDu\");\n            yield return (HashHigh: 0x3efcd7991ba24627UL, HashLow: 0x19a6366d750dd702UL, Seed: 0x000000000000266aL,\n                Ascii: \"UOmbwzUUvwpnkCO5iSCT619bxqlBAaoK4zp57bEEiWz2jzVT6tgw5CFF9k8GeJjLiVaeW4EVckbjQ8CAChDBST9jdf9rYHfZdZuVqK8LKBgn3FoazV0mPK33ktH2FLDR5ySe0cNYZZBeb8c0WptKwUzcpZ2g16oa4D05tH8pdmAOaSOFEOZeFHCS6d4wsnl7tj6m95GJP6g8i\");\n            yield return (HashHigh: 0x82d14d147a7e0edbUL, HashLow: 0x548470ddccb70303UL, Seed: 0x0000000000000174L,\n                Ascii: \"8c94zFZDCvTGUQ5TzF9N5cuFHcvgnbGvqEF4cEIH7iThoTf6UFWkKZCRkW7Z5QanapN2v5WOK55wq8UDvvhIQMZJaEit3LftlHkS5kiDrctm5a9iADx5H0N907urfepAcqQTvAMMijIMoAICao6gmm1r6FbiLANoV9KlHGfjsTAXZKz1SEqGq3LXHzgJwM7y7LSOBHN3Irr2LK\");\n            yield return (HashHigh: 0xcbf944231f0a207cUL, HashLow: 0x9f63d233df85f142UL, Seed: 0x0000000000002707L,\n                Ascii: \"mX1PRUJrik1WmNpZI6Jtxmv9uGNI3sZtblIy5nk889Pi4Z4QVQBgy0zLoywAelB0AUAXgqKrGNlmuakSLGbYyvE1PpZFARPEmugjI2hCShCLKtAZrmpwfISacGQ5NY9UoW0YUXKzknxjwhIwrDtGMsaStLEpMjDUngoKCectL1rJWKMlxXZd4s0jfRQEFuClCALF7beEqJBHd4\");\n            yield return (HashHigh: 0x5ad4b7cfe6da1cdbUL, HashLow: 0xbd42184be21051f1UL, Seed: 0x2e52512cc58aa935L,\n                Ascii: \"4ztdsJPql9TZC7rzDG91MxZjNO8ypBpxScJtI9c7NPkwNVK5idy4FWneFiKUl0kFcPl01oMV1lRU1ix1fUxPqfsIdGyWNROz0antbMTftAzRXc62KYUjGQ5vIVcKY96J9XIuMO9ObRku8xalFx5MW6PRjet7JqjsRyLDFDva6Gyfr5rxIczIwQtbqJ78rqbCvWaJVTvTmPudph\");\n            yield return (HashHigh: 0x6fd47ff27b6b3501UL, HashLow: 0xaf95d8843740717dUL, Seed: 0x0000000000002591L,\n                Ascii: \"D0oqONFjsOhHnY2DTEA2ybfWknu3lb7mbrOqtkITu7BAw95U9lGAcRInCSrbDL0TPwwkMsgQnPd50LronyOjZ1ShT1CKx7MnYmFxFg3cajqwJQ33AIiT5ZmlQJBXhi16UCORA94bRzDWdiupox665G9CWRBKAJZNbfgdjVI5tEm54hBuwLM6QUXIz7FabRGAUJFaqu3tSA3O4W\");\n            yield return (HashHigh: 0xe5b4f03fc446e2b1UL, HashLow: 0x391ad12eadd57c56UL, Seed: 0x0000000000000368L,\n                Ascii: \"03cTK7C1gkwEQVwXlWcXh0ESkvbCrckJ7E6WoYuEDGCShmZ2xRCmlx2iQ48WcLseyvnP9wDbckI1O5VH5NIHT28ArVU7oby6xijPbXweKup3dpxUoI9LnXkr4TQaFLrWPXwuGgZDevkgtkBapBVYxuMlAnqf5tNb6U9RyXo1VFqAtMugNbUSxpGIzbJ2NQRO1k6ZpWsf6elRxMr\");\n            yield return (HashHigh: 0xea149c8374140053UL, HashLow: 0x0a52f4eea9f8ef1cUL, Seed: 0x000000000000080dL,\n                Ascii: \"iPH0IO7cO678mdTWSaBwwVgJv3ttUh6aKXLsHdIAyjAw8smIujFRccrU1Es3uheBpwsjOAkwPUpJLkHpT1ffuAbURkMpCv3NmYkvQRw77EpHjp099t0iq8O6CBUF6yigFigCRV0gITw23SZOtfOPJuC2f9nPH19hvE8eeBy84nFHQkGhB6rSKnqivvszMFSO6qd4qRSibU3jS94\");\n            yield return (HashHigh: 0x6ee146ebf3e805fcUL, HashLow: 0x00330c645129febbUL, Seed: 0x0000000000000112L,\n                Ascii: \"hW16QQ7Pv5H9UZK6FbXlLgBkAIBqO8YxOqamPOPBQ9SErhI9keLHzhRMVeL2kRpWTO2Jp7bKDZPgbZ60VImXtyplriAdLiLFTIyMWYDv3TTI0Zhr3bFsqrOoTqoiIdp1TdaeChOkb6fhjgeJmOnEQVxFHQVQE2Q7fRXucnTPIWRAs8L4PIQL6m5DlDtXKzv4zs0P7n4knxLj7pi\");\n            yield return (HashHigh: 0x20c75f753a84e616UL, HashLow: 0x0a09fc82b525e063UL, Seed: 0x00000000000019a7L,\n                Ascii: \"IXfuXoGOjZYCriurKgpliUAfWM0obqz7Z7WT1Iedk93lZhNtoyjbY9gij743SAAK4q9Cvr7pAsndmTQVwZip1aUc81kZ4ZKFNU8EURL46wAdlTgD97ZEEmYwKuRDzNGOctDGYwLovP3YE4Uaj6Xj24egfhyhr9dSoWYOxyq9Xex2TLDeiuzkb2T7fxgwCQPcvHPUuTG1khSobRtI\");\n            yield return (HashHigh: 0x8793ffbc57f0056fUL, HashLow: 0x8871175a6ad75119UL, Seed: 0x0000000000000adfL,\n                Ascii: \"n5jaccam8c7bd2y6zvSxJCEcLJxeQ7gRVcOsTtU5TMHTEINp2DayB2imv8ubvJLOjQ9XHej1haK5KXqoZysIsrGz0aYYTIU9ObfOgkzpED6kLPwI1PyjpMKCcOCD6TLHDZQsxs4e0ii2YQaNmRJpT7tZ7thOwdRv3KEk8SU52eAGGXyPc6IdC6OBhM6lfjRFxpUhuD0LNMjZztoP\");\n            yield return (HashHigh: 0xed277518761d2400UL, HashLow: 0x6e98cea9d0f353d2UL, Seed: 0x0000000000000000L,\n                Ascii: \"0B1Ow3HA7F7eGGzheBNspjxVM9vMWCdlU3WLZlePxFSsGP8X7vwDv6RaFxQXqdxsu1P6LpblAM6e0NAnYQKEa4Aao0HI2EpnXhj2rk61XKXBBnMg4fSC9uTedcfw8rOk9Rryy7mnEdp0Vb05Uj5cGVEtLVJtWsWriK4uYUmnjCxdb3EqYYMEiAebJf3Z5OevqvPThgbgLnYRDiXp\");\n            yield return (HashHigh: 0xe65fe3529f3aec6aUL, HashLow: 0x1bcd7610ed115cc8UL, Seed: 0x00000000000020c4L,\n                Ascii: \"Y3qZo3vgY78iDqSAKtuYPdV5PSv83nq9ZbDgEmq1DXv4T88joZP7k1Cx717NvuHTaQmQcJKM9S7G2EMoFtTRCJMEahuNF3DAvZ64LJhupjwmLo3wy1DluDKZUPglYtNVA5qhjwkmE7ZTr7qWqjpXxeLRvcJMHUCtXblGhf55beQa4MDGiEztUmxmCMahOBHIBzzRPD2DuGlU8bk1\");\n            yield return (HashHigh: 0x7d7b5325457a383cUL, HashLow: 0x5b6f263ed3c74d3dUL, Seed: 0x30b52b853f3c90a8L,\n                Ascii: \"POkjcvdYJtZG5hdudDILMGlYffvT7puFwieMGzzFSo1cCmnFTQCxfZFKH5TEKdl003mluc7zjytqOD9VQtp0T1oa7wZKxdsJylmBmYlGTRUT3ltQNy65lyoFsHG2ElZe2ryiC8Og7SHdc7pgtL5PnrI6vgofq6WubtpCowKw640dbenk54ZXJxYmOKOS7NHMHUqXrlM8tguWNqwew\");\n            yield return (HashHigh: 0xffb33f00093c3d3fUL, HashLow: 0x7c1141aeda8b9578UL, Seed: 0x0000000000000728L,\n                Ascii: \"HdUWxTmWLMYxDvlS3g6lvPs6zdL6Z7759ymLuPG08UbKXWDfsvMuTVEprrR7HbCas48BmoQpgWtLEabIcApEE1c2pWmtuqanbA93PDjOW86R11YcCobMNJBrWHJqNpZjH0LlvIhS0C92t0D8Ej5uyJN7JHgzwwyTNLQncnGUkSMIBNTQ3YzCtBSPhKoHSfUBKEzk2fzy68pZGSi4X\");\n            yield return (HashHigh: 0x0a1a33a9f41976d7UL, HashLow: 0x4b54dfa63ebb3ccfUL, Seed: 0x0000000000001c2aL,\n                Ascii: \"dAN1SdBmr2gMNyALQrdDXfQ55t6DvouZbZu9cFXibXwHweIdgdFifK6CjnNnlvzlFCnNQDjSR56Qvj7f3QQbBMdaLN2hAh4SayCDBLlfFjU97lzoIHem1n2cOU627S3KMhFKDz7QnicmqKgEeYKAWCMZLh1i18jQDk9SvY9wz85clcFrwBJvULVEJYCIZQKy6qurTDitVFFnnzIvh\");\n            yield return (HashHigh: 0x66fa22c9eec5fb5cUL, HashLow: 0xb70e79c506a105f0UL, Seed: 0x0000000000000389L,\n                Ascii: \"s4vBkb0vmkbjzA1CIzLGyOtb8Ers2LzuSbXvmPNjNulNzPG2OaGfU67UnMq3i1ubVydnzBdit01OxJ1JJTcxPjvxhkkCdRGIwxE9AvXzcrtPHwnJvCtwnJeJvO24yY6DnUCZ6P4in7fjyvZLEjJbf4lxSOzazHOxDKHKZitF2yQKFWAYc7mc6wov7DnwVYuhudXbdLsOWOIw1btvtj\");\n            yield return (HashHigh: 0x47c690897547920bUL, HashLow: 0x8482dfc09c16d8d2UL, Seed: 0x000000000000196aL,\n                Ascii: \"c4jJohV3gr10UmzwfQhRtE8dIdtPx9SGpNE1aSq0ZCQLDQzkUQAefMagUxE7uOdNIr6IWA9aXjapnUgDjWagND4CNHYgkk8FPYgSIiU239nI7qO4CkrxrffMJUVAh1EsS51pm6lmeAPixzx6ROCX6JUebS5SOQynqDvFxTh4ZALMiBZadkgC2achNnbA7KEnel85MGrsCYD8996Jul\");\n            yield return (HashHigh: 0xc6314b859faa8853UL, HashLow: 0xe99724e47261171bUL, Seed: 0x0000000000000acfL,\n                Ascii: \"Cljyh41sippSYGQXUXTCELfcslOnjQgtAbhdENTD9h81WKugXpFsQVom21pW58m3SImLqlmKlR20RtvA6sSiPg2Ids0VkSzrHsiv5d6E4XtwQO2RMiJdbrjMShNAiEv12f7pWh1UZwZr0qOqoFsWvpuTLNiziwUXXJIyy2EYprN7E65MVXoXPmrrd9RwdfR7G7SDyis9XJDavdIQip\");\n            yield return (HashHigh: 0x2f153f57c056c664UL, HashLow: 0x60634c9f2e3382c6UL, Seed: 0x0000000000000000L,\n                Ascii: \"OJFu10AE0lILXYVyS0SnWq8bomiymsqnFXR9RBK2vfdQHBtxI4jzL2dQjEyP8Kow9Bm8shOTckKeisDHBPkF9bOa3WDKz5I2szl20rD77vmFepzzVCfnAuCMGxRXRHoWUmRCjDYN6b9HsRAs9xNPLeichB0rnSQ5mQWObL0j1Wz6eCnXHVfPNWw7jd4kFjSpCgoI7qT7DLQz75HjzV\");\n            yield return (HashHigh: 0x1ba637efef510642UL, HashLow: 0xeab67d06fa529b4eUL, Seed: 0x0000000000002386L,\n                Ascii: \"l9JXwaCxFbWwpmYCQHjcNUarJSQknk5wuWJrhnG2yqJOwbxG19Ut90ivq6paYtcaUC4BQ4NaeG98g8ixNTlqTuN6v7x1cG7FTf91lctBOqWkUdQKi7x0h4iKFTK0uqrYOAGV98g0mPQZlMPnYMWYqwlO2fIMfC9BDmRId2xpOH2td0ydnOFbw7QU7Ee99C5gZdW5zgRgZ1CAsuE8OQ2\");\n            yield return (HashHigh: 0x954e74ed75833687UL, HashLow: 0xf4c6a2fb81bf1c99UL, Seed: 0x0000000000000f22L,\n                Ascii: \"hFHhF4ptvamaEUcRYAVs7TkHdDkCYKyLzzQQdwwyHuiBmzaTw2yatG4OivT5zoBUozXNwizWKMybP7GciEQ70EikxxaZxLDEzL1dA54ncIhyROBQp9DXGCNds7ajaLZ5IjE3QGWlkqivvo8aOW3EBojz205favpRd8J5kihp16jsAY7FVOFpPm7m23hXchZTHyE2vxtQz1PWrbAhCPx\");\n            yield return (HashHigh: 0x8b68f8b50cc18a3cUL, HashLow: 0xee7aa02fc6b950f9UL, Seed: 0x0000000000001cdeL,\n                Ascii: \"THBuisT25JtpMf9WHebygRp7y3glzDksekJZTodZdrE0AlyjmKWigQRZXy0ysS2hzuXvAMecSQR758gncHc8uknFWyCBcKj9YVhPobrSrgmxeRkPPwDYFD2Jq15UKdKX0D3Vt50QJYPdTYyKAeNdBB9QHHh7zd0gno2BSNgY4Pph62SY3wtrURyTDWG1IrYd1C1LbVK42GppAUP2vBC\");\n            yield return (HashHigh: 0xffb380e0c7e0344bUL, HashLow: 0xfbc1808b36b6185fUL, Seed: 0x0000000000000000L,\n                Ascii: \"7aBu9nr9J4LDM72H7w6971aIssorqHAUeKcc5y1GwosXqTsCNnYAnm4rooC8takVhZPSQvJWMF8asKhjEz1tULAsMmrdnUGmKmOBWknWrbpVlWhAsuxPFmoi3YO3zWPxTkFhUYzTN2uPto7LbfHFpxrH6acx9NIvC7BqzMzWoEpxyw1LkZF1UwMqYANJbeTsQh3MBQVRjbys2JJP6Vhu\");\n            yield return (HashHigh: 0x58a0b75fed72a784UL, HashLow: 0x47ba4a49a835f815UL, Seed: 0x00000000000007e1L,\n                Ascii: \"5KBL51l4hNuRo0ySKbXnecgOY2O6cf8ncMfEN3rfEjsNOUpJ9NIP26L9x1ci97r8StvvGQeIXDSHvQGVJH6JMCCPdKDpcfKbupt8PbqacoiPLK0vo8wFOyqVz7E2N4sr4DoNVbtqXVjgeDHiF5F2qwsHI7qsUTNQjeEwqZtSJ5de2XnjJNcKl3f3uWac6XgyrsZjNInpn6xzK0Ph2slI\");\n            yield return (HashHigh: 0x7a61eb658a274ba8UL, HashLow: 0x84246e0e531d5581UL, Seed: 0x0000000000001f1cL,\n                Ascii: \"Vpk9ceAicxUFUIS1highaulRcOoXA9XNESNyzocWCRjpVYFhp2BDj1dt3CKPziHJ9LiPl4pSr7DtKSROKJkoOFD2Bi1Ig5pjUqCOR0NUalZoVjytBukvD2l4v1366bPbo2CIPZ8E2tSB6AgSJY1nGvqHFojrHZJFQe9QQNjlvKyjmTzgSr39t7dcQn47AH4FgWtjIeQdsvKqafqFN470\");\n            yield return (HashHigh: 0xbc8a5a36ebf3b9d2UL, HashLow: 0x29c892378d82340aUL, Seed: 0x0000000000001485L,\n                Ascii: \"WsozAtXaFmiAIlDmKBH6QnjJqPQ3Y1yQCYOgWGf7mKA2U3LE45DGb0O1YDk6mSRP3doCSjqCRGPIjtarjFp9CMRnkmGPD2ezubhN1JXXbImNCuOYwWmxgiXPqm2ueVgPrN6WmRQFDKAzp4y5qnkFgtavCTWYjNS1VQI7o5X95rVm4ZhyNNZIpqki5wgcYBRCMQ0tJDx8hnxBEtUyWaVl\");\n            yield return (HashHigh: 0xb9dc20dccafe3e8fUL, HashLow: 0x4bb3a39c5f5298c2UL, Seed: 0x000000000000010eL,\n                Ascii: \"aVKyR92AaCBW0Lk0WjMia61RVhrECMDfG5luUnLSiyLoPEoockTbFllYK7LnEvEBWqjTNBLOAk16OdmzmKhZCEivvPI1RZQejG54M5kys6mR4ZZ3uBnAgscmFd0k8YTmmneyaNUSdvsLKGuZI46gqLnkn5CKIMQORwvmBseoQ1uzfTjzXGohAkepgzsWrv8CHeImc7052iYWnZ8NalBW6\");\n            yield return (HashHigh: 0x5e7e4892aa088536UL, HashLow: 0x4d045b24bff27927UL, Seed: 0x0000000000000000L,\n                Ascii: \"leqYs9WeGmmwoxgeZUplpxGTrNqHomntsxO4zdDuwSacUUi2d06ybw3xJZTxH2QEn6lagba0Dr0qQ0AulJOHUigJxGT2kxjWiRZuqVUrIJ76DpuYVORujv5pwsr072YHhXrX70V29wZVHfeZYf5Bz4AyzY64bixdXoAfJ9HMceEzvHxQNcFJsj4xLVOvzR2HIlYII7BBQyG0ik788LwUT\");\n            yield return (HashHigh: 0x22314cc967309151UL, HashLow: 0xb87e4dc3e43e7058UL, Seed: 0x000000000000097fL,\n                Ascii: \"d70Snry8sIxRblM5EjJNu7QPmYLNq3GV6UGHlKpIQNBi1vvbuFDJYj9uIkmCyuAG6ZTh6eXfMZnR6BfClgq5z0i0hXipMnHW95Fn6zs1mCPVao4egkbkruY93D6OgkAeA67BL2R5s92HMmm0lOs0idIeGoD8RRR7ImbD16QTOYPLaPeghCAH6AjS99bJoIH0SPuGXZZNqrv8B55StJghF\");\n            yield return (HashHigh: 0x807eb9bfeb1aee2dUL, HashLow: 0x4635b073d84964dcUL, Seed: 0x00000000000023a9L,\n                Ascii:\n                \"gfOM0utqVsQRzcQ2aIyaXVtHFq7LG3fkEPedKgZEwIovPUEyZCbfyRuWAZPZ1Jo7g0IGkeslhR3XT0GyBFQL6X3YcCcad7fwTePhFSm6KVxDEiLpHh1dA9UWQ9x2xJh9Ky3F6RTMxeQEh9zM5GaHjK7vmqjvk3oE0CwUNXGXd3CxeYd6ULFlYRiS9QbHfGiBxWbvSRj2ymtHIxS8886lwJ\");\n            yield return (HashHigh: 0x23a22f40dcefafb5UL, HashLow: 0xc4d19df58245ab26UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"lcBa3QpwhYbZq4HRypc8k5ULkpzue48yKXd6NzBSYTnWrakJGMW8GJEjbOFtqkp9IWKLBieoXgLwibggsY9E4J8OJVGdKS9BlpzxNPHWRwcGLP3B7UK2VOR3uvtCnW7YZSk6gqhJuNOy6zlurxRDt927OMzoWwGC7cyh0WlmCQpn0meRxe7Vha6ocNeA8yHlXPqgd6omqaph25XU9hKrn9\");\n            yield return (HashHigh: 0xd12975aa89e90225UL, HashLow: 0x0805534b4207665cUL, Seed: 0x0000000000002255L,\n                Ascii:\n                \"IjKVZoeHMlj9TRfbtrnSlFOiQvxLC8uz0gSpycAxRbywjWo97Xgzq1WGB6Ktn2B4zf4iBZEbo7FGVLRAhATBolA5nRqqgQEqycVY2yBmAdKQ7qkSQ0JRhsnBhYcNPZBb7nhtVPPubxKRyRPSAg2GDGgweoxFhRF0WImnAyxne0OvHhj3EBpwcVUZ4P7wu9wEQhW7VJugFmhA4iVeMAOUh3\");\n            yield return (HashHigh: 0x4fcd47932b5011d9UL, HashLow: 0xeb26b7438e5ac29bUL, Seed: 0x0000000000002468L,\n                Ascii:\n                \"z4eqekhdv34U2YYfDBGkSR85HW6IprKH1Lky7LKuGwGVARNNUDCVZ6kXXUagNdmRS2a4clYUs7GVHJ7wQ3dbNkyl4H0tq6TqCkDVSu5pLBbUhwrdx3xPfNfPMWv82bH0vPZNzYPt2Fei8C7OU3KbUm5KHOn9EfcaWgTbpqLsa5JgQm9o2sVilrPKNIhbK8KGy8hsiSgurUfmS0DHgBpv9D\");\n            yield return (HashHigh: 0x25bd7fa9f571fa68UL, HashLow: 0x911dd64b71fa03daUL, Seed: 0x0000000000001e3bL,\n                Ascii:\n                \"rtCUv9vqzMDXQMtMTQcCAynQMczuLHldkkc6R9O06nIGIiI4q3ehCmHLHv9hNRbH02bo3TlzI5G8VUaW4PYzHqLj2dn7KuPF6PlRh0rSWEXfhHbjaWtMrJc7jPeGFTCl0kGIqADkw6Dw7LZ1vznTTITBX4yeIbS5NVqA3TnnlpRmeKR8JGxZpqzjOtR5ZdNESzlqZBiYmRqpCPykkjX0tBe\");\n            yield return (HashHigh: 0x088637860322c4cdUL, HashLow: 0xc60e7b4e5a2fc706UL, Seed: 0x00000000000009d7L,\n                Ascii:\n                \"L6fREVHqM4d8B9Wy76v7yGbjCzpfhXvh2tNiwmMNFjKwr8rBPpwg74JrghKyBI7dr3SlCs5sH1NhePoZJEd0hkmcEfB8f20k9WWYmNpCtqUCWkOrWPywUT9KASvYUhGIYfJr39d3tuipvRt7cjbOdl1P37xKHrmWissbXfNsiGSEaUhRr1KjBP5PcUMLSY6VSZXrSQE65qwLOT4XLXCgWdz\");\n            yield return (HashHigh: 0x0bfe2786eccc643fUL, HashLow: 0x35615ce1371f2979UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"MWxfcALWJHfUT1laJANXHfshrogEiBVSsr1Mt73oaxVXdtBOZvw3lm9TqDgPn8U6sIro5oJiYDPaObAXJzZ6U1aqmM96jT6XuarIg24ME3iQJWofn1Unv3I59iquisA3958OuWYbXQldCbMQkt2pJShpS3eY1p5GTObknktBzgucOJJg2Wa1Mx1zUiC519aTgRm03s98RiWb759DApHlUtj\");\n            yield return (HashHigh: 0x85f86d5cd1de913eUL, HashLow: 0x774b240b2ef420dbUL, Seed: 0x00000000000013e6L,\n                Ascii:\n                \"v43KCmTFfV4m8izbNRwsKKvSCvb7eo0QyEZHDMN24W1bsocSGHegt5HmnqjtB0UebT2xvFkp7VFgCUkMT2797wwIpK3ovYXDtBfSTDNLjyRBkKDf8F1OmfPsrxU3bfuMLNvn67pFn81iY1aPh3LWM9DEwte7UpiTyu9cjZg3lWPkIdgijUfjSAaFw2wvpxolxp9XP3RgbaM3g6xSm5XoHGRP\");\n            yield return (HashHigh: 0xe706d5ccfb0059a4UL, HashLow: 0x7bbf01ede90844c7UL, Seed: 0x0000000000000520L,\n                Ascii:\n                \"Cv4acz39tU14kWL7FXMG6l3LdCdhZiNMsNctdM9O20zcWaYqZZbO3byAQA3LORByXU5K0HKsfpHwUVZ2FqdpaZNph9qbBjDtMt4oTztSAMO2XkUUBga3iwwrCsBDxRWWjfiRZSAwQ9UMtucNoPguHagnjgtLDExdjRnbbTqVxmlVJRs7QTCiv36YUGvJpPcMf0GH3WTM3950ACaasdI5lKSe\");\n            yield return (HashHigh: 0xdfe6f18b71ddb080UL, HashLow: 0x857115e3b50b936fUL, Seed: 0x0000000000000542L,\n                Ascii:\n                \"2MVJdGUpZDznM8g2TVKVDhJCMQxwR2DVRNHP73F7w5WEHtcxxtMTZxAVdnGtEiXv3tg3fs3nqcuqvmIUQcgqb719xFxznuZXeSF66kfnpPuC7NELb3eOdcbDvgIscxslXN4kEEYnXAPcfBw5lMms8fEbGwD7YqAZCYyv7wYvom5h1duRsBPCMULDoVeqUTVOyo7jdq2TQqO5ZjIVcrZ6vfS4\");\n            yield return (HashHigh: 0x49f01fd3ae387ab9UL, HashLow: 0xf7216d3ec902f94cUL, Seed: 0x00000000000015ddL,\n                Ascii:\n                \"eaKj2Wxvp03jvf8wxE4StW9KSzC7PWN9O9FqwHv7agGho9p91Nzkx84NNiskHnFzaAwOed93zlLH9aRSuO2MnggSm3EliYmRgYK795xdeb9FrtIRYqBBZSU23J9IhOMHIy3hitU4EvxrieJEuqp6xozpCxmTivsHwMva6K71wewc9HdSYiDoq4xv2x4JJeCyRNlRYAYyP0mqm1CTHKrgKqcV\");\n            yield return (HashHigh: 0x6231be7078c06e63UL, HashLow: 0x614924e04835ccb1UL, Seed: 0x0000000000000e15L,\n                Ascii:\n                \"NZTFL4A3q60uKDcIdOkRSV8HZkziOyUuPBrfooNFrV2MA6JscKmA2MBGUsz275Gl8BbTVmrbnnK2fM0zpCXqxZSDXKDvOW0erPGjkUuW6ZWQLZAXSuSPlq3yDRJzPgTIB4VnTCQQyl13wQJ5DfnYdf4ScYXjxJup3BFhbEt0Hnq5v0X6kKbmPSkzuNenzlNBKfTu8hb7rncjDS6tgefyS3mOv\");\n            yield return (HashHigh: 0x4b9896b948a3cbcaUL, HashLow: 0x834e88b055a1425aUL, Seed: 0x0000000000000991L,\n                Ascii:\n                \"HqKZwK91tBYpPOl8o342vzvpM05Sgw5bGQDSR0jZMWuEGp2bzjN00wjn9fsF474WwXKtySnONtiqTKCn0tAVK6iXMfnPSeYNugcmVGelM6pymFoJPQxvZsrJjG0oAFQzwh5L8XZiD8UC4FndZuYpPOrffG43WebqwnEmFlJ1zZyN4sBSBflBDeCufIV3lcWDBUJD3ILsaepi4MUaV1zOmAHy6\");\n            yield return (HashHigh: 0x010618b21543f69dUL, HashLow: 0x7ec8734ce44a1e78UL, Seed: 0x000000000000140eL,\n                Ascii:\n                \"1pTZnHAKgnUPv6pYmmhRFuyy2fXjAndgADY4ehcYAcHrkmKH1UVQObV0vFx33NdIbA9D2hP2FBXNJHzrfwXDOEHc6CLETKUxRxqZc3N0RhBWjibXXiChsLZ3XmTAQF0Q1Rz9YJXgiXHwgzNO5cWtvmNB5eq3xNbN6n9F3IarH7bwxnioCBj5uNQMahPgLu03TA6t6e00sSlFQEwgFwMNLPWWt\");\n            yield return (HashHigh: 0xbc24ba13fae92218UL, HashLow: 0x3879e964518a1221UL, Seed: 0x00000000000021c5L,\n                Ascii:\n                \"4DC3Y6FtuATiCbFMTkXH4zWjn4tf8dahGDINMHJk8cw6E23iCe5WrocnMeEi0ka0YZt3LrNGUvWTaAMk6RoFtkspNRedvRHZuxCH48By38b94fTpMun56GBQg7OJiA39e7LY1prxJdzCb8vDTgzn3rPI0OUM3NNJ56A2WbXaQNkzgkEJuUodlCFxUniOmvuZBOWAY8N7MMqTnPUgR2O6qiQQnb\");\n            yield return (HashHigh: 0x74754a8e20358c51UL, HashLow: 0x3fdffae6ed883539UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"UoQAMlKisK1Dd2QUq8O6rbseXSJAehbR0pRyo5wnH1sSMtmFOAgMH4dome2gORSovkCiifjYbVymxmK7pqedP5AzH5gYK8gAQPATdP7wEXt4EYn4X6RpJBkzvAVXaRLTTgBClXsW6VtqUtHQJUADgd0V267esMM1HbqoaISEsahDb3dbYyV59FpmCbClJc2GzK7DcMpj4Y3uF4cQU0I0nqBEQm\");\n            yield return (HashHigh: 0xddbfd58b5eda3c49UL, HashLow: 0x28f38c2eb19c0acaUL, Seed: 0x000000000000143fL,\n                Ascii:\n                \"627hgrPLCV1AHFX07JV3BY9dpY4q1gSUKGAau8oqxi4vDsUigISmsL0jm4arxli9YdJCN37sjExSRuLIJ7HpKI5JACKCi2Q7dYgP4BwvpwEQDmvF2t6mPT79S6FVmeHt6827kFh3vkVD4SmbviFIfhHb97p6JbuLNb2ilCrNDuuoCadTFkp1Rx882SKaVrzAPma5Lgir5ccGVWw7dqBwnzO4Y4\");\n            yield return (HashHigh: 0x595c616be6fb17ddUL, HashLow: 0xe16cddd7822d16b7UL, Seed: 0x479cc0ad776c4358L,\n                Ascii:\n                \"roOfMBk01by3B3I87XgQBfha9NDfpLe4QDYiB8pupi9Kv6AqIC8FYpVmhcLWWMTliUsE5ZWhQ5BRN79vqEHlJUwC1hD3A1CBgxbUctJmposwuZ6gJiwaN8HOxOzYzHvd73fUgdnvxcT4PIRT9N15qrkvfBN1LegelSQOZkPdI0QAux8rj0FZ9yh4vqb1e0ulO7FqFLFFiwkhawEZK8kidyGETK\");\n            yield return (HashHigh: 0xaaca3d8adc98bcd8UL, HashLow: 0xb04802a97e0ad4c8UL, Seed: 0x5836ea31e9bc3892L,\n                Ascii:\n                \"bRhk9VWj3SVYdenBUrI9wPN67VTIhO8ZOtut63LlNhY9xw5igHP4HnCdFimHkhhbEmxwpLJKCygXyT22y3afMymVyXm1Wc5akyK9sHW3DAOLY3oVCi3YGkkNEJHDBLOXoYCPlLOG00VOk4ue92dAs6DfZpqtblUTlJlF7CL2GNFg0SCzS3LFbuZz90jz55AuTTdY1dLJOWwrqm4U3zwQerBSJ92\");\n            yield return (HashHigh: 0xbdce848657fd93f3UL, HashLow: 0xa79fa38e868e84c4UL, Seed: 0x0000000000000728L,\n                Ascii:\n                \"ZO5IkvVUUjpHBSm1D5xsnZ1IA8uCxaxr7j1CLxBbs65qCt2SxtJxwVzzDMKvKgxJgEKF4IsHD5jAkGqlBPweJ9tWX08KnlLPn6KSvtYmcWGWeY5fsmTsozhyRWLEH0pxVUWFqlgDhPt6B6zJ3lYZDKNUIdJgetOs51Z1Zbcz7n6wQGrym4MdovHNs7AZTxMoNDORopMbJz9ZeoOGMUE1X0ZlP3V\");\n            yield return (HashHigh: 0x478b8dd9f9f83c94UL, HashLow: 0xbd5af4d77f06e61aUL, Seed: 0x0000000000001bbbL,\n                Ascii:\n                \"lExmEnuj4PbJuial7hsE3h15damh0vWA0nKDm6YzGX5vtZjpefvYA5fJciZ1wRlAOTxXNORsvoNfAvHFmGMevPGJY8OHLbNCN2hQFgGj8C8iYT3feJpAmJdiGMGzrQBps3CDCYK7Y2mjnSxmloPKarj7qWGWw9DsE3ObNqSQ2fOksIkMD5xOKF2WtoVvVCrVdszkEsmfyzxCh62yvAoiDjq7meH\");\n            yield return (HashHigh: 0x41b87801f5429c4eUL, HashLow: 0x9a9ec0e302eca6c4UL, Seed: 0x0000000000000c19L,\n                Ascii:\n                \"0XUrhozMrVQwExvzSvjTfSuPEqIwrxvmAO8TTcpaON3Yl1Ru21M8u6sFyBtyf6wCOuQQvic4b1kQjBlGuuJpaFM5Cnejw5viTM2VdFQNJIrup72Xb2CkvPk7R2CpOGc0SLdeLjtRjHV4LqskpX4ge3w27Q8rtX6k2MN3703vaOXe2axJXD7HW1btH3q9CuROgdfuU1iLW1crT1GpbLRsvosS0y8x\");\n            yield return (HashHigh: 0x5e213ff038c64f55UL, HashLow: 0x0a7619e69ef778ddUL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"iK5YjBQqLtYY57nUaCwhUYOMgg2sZHjCn9Bbx1U5xIleBfIwxfHS4DC8VCXUgvuhIs2Fx0sJq7YZXC3NwNC6cBRX0tKTPP9RJeIhg77yPXETHOogEf78ZQTBisbfRwtBbM9KI3ibTyeTkjRP5aJ1GV3g1c5jVez1jQcZ87Gws5cLO1zrEacglwdmDU22MVAPNGC8BHyZseVj6pfWkUS3kEJ2Fd1I\");\n            yield return (HashHigh: 0xb298680297d19007UL, HashLow: 0xbc46d16914d04220UL, Seed: 0x0000000000001bf2L,\n                Ascii:\n                \"nD7cdBdnA0smbnr9ACDFAA1be4tpxONfBuNVsVTwYnzPhfCdpzibBjLHtHFfthHMiiRnaGusXRHOGn5OLff8Mr8Xkt29s2CezETI6Cqns7mVKopNdBSICuifMVFrzzQqaMyrYch28i5jNmfmKeX28yhAafViX1dYshTws0lpCbHR7EvpDJ2PH0NOsMFAODKDaofZ6Pbiv3pwejsfDW2DtwEIdIJ9\");\n            yield return (HashHigh: 0xeb686c408f9bbb78UL, HashLow: 0xe397002ee1eb67c1UL, Seed: 0x0000000000000b51L,\n                Ascii:\n                \"u7VtIagZe18tpDCAKDmCpW5WC4vqvVGH3goGq3qc0yGp4w9uYysET9XpF6MmNdSEfu4b6A1n36OupgQNTOtOVvihJHsMIjbpiEQoOFhvWA0fh1IG2XGudHHzSbcCB8NU6iJYrED0C8RgOwgkJ9ofgHwhZlk9sarsNkAoINnnFogd6DyYarOt3O6Q6TaY1nWQhnxNhOJjdZCAA4X2nx0CYGaqyGI8\");\n            yield return (HashHigh: 0x0c9881eb2566d48cUL, HashLow: 0x868a3c7b0190436dUL, Seed: 0x0000000000002319L,\n                Ascii:\n                \"pcW30Qxc5kKUnQnSKaiJ4BDaPbwUv6SIQg6XOzlw4mfglLy9m6MX5wQBoAXmz9363YKLM1MdaRCDDWOlCGO2sQbBUK6sZmWb8o3RJsNMRGEaTYrKDbgiwAecsrsCgeS3SupxFHeEGLgnMDPHEPm921IFpQY1JNNW1glWtmghuXoyMzWikot2m1ujaQ2yJA4D0TwBj95b16pgvrHugdS62DM9GL46X\");\n            yield return (HashHigh: 0x311f1e89964d87a6UL, HashLow: 0xb115adb0075ba3ecUL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"F03wfhRNki4vgSPfDdFSZeNy8oyUMQwioqrRv3xsJk8Y4SqqLhE1YI2enghydmhIWttp4uLPwvq17OYcXcHMuBDyCwHaIpJLuSlSLP09nZOTWhJls3YJPP4kRyvTWONsEy6AaHIlNUIVH2mLSk5uPmJHK5js9V6OGxGG6XFMThIA4uSQyQSNXLeFuXvQ0QuQ5GWcxh21zQMu6UPEhOA0nDWRxa3QK\");\n            yield return (HashHigh: 0x533680f5d4810efcUL, HashLow: 0x6fd1aa103b4cb87fUL, Seed: 0x0000000000000fc4L,\n                Ascii:\n                \"BTxzhZqt5gg2Edi11DsiA7woNQXjS9FMm0Snii2pWcGUmVKHoHtu7YMJVjs5g20rhG5m5956dMOyqhSL1IKhdeogZWwASviEatgfrbC1xoqTzOUmKoYQY7etIvDS5jq6BV0DGICCHvAXexxtf9n6jv2IMOnVXopDgXaRGTVmr0TRVeeCLsCE0lU0IGPuXQsG701jUMoiaRkdIEak05Qk2Lh0o2VJC\");\n            yield return (HashHigh: 0xc5d8c9bf4fc9e603UL, HashLow: 0xd90549d20367443dUL, Seed: 0x00000000000018cbL,\n                Ascii:\n                \"oRYALytkrlDyGh86DFGGYPTJGNsSyhBn4fjkl60WSUebIptUTqbqXeCxX2tyRPHRtClA0gCqq8ufa8yqcFRjBqnGJ1hEm99xidjKlyQI9Efx6lW29IE3SaP6PlYuM4IlvtZnsXldLo42jbrvKR9OcGYjlQk2rsJHDgvQLz8Cvx3Ei8q8ISDUiFYlpA8sjh93JD6WCel57jNiXB14RtRtgDN8c2W4ua\");\n            yield return (HashHigh: 0x579dee60932c84a1UL, HashLow: 0x3b3d141e0a37b106UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"S9cbotxZR4B15Hjl2hKUdzIJkakuWMyGbFHGqgIB9PR8xocs1BRzi7MQ44lmFdmQDAmCgOqLWFR9LlGbaN0OQQGgBa6lEnmoqBukT7sIkoCJjHUi2HgfLRiKfeWD8sEE2a5RTVKvbNDmiuUgkUsxwuh6QiOjc0Pc2Du8euDHDzS8krhxePFW5ReIWtxlxxdqfbV0tANKpifFJXb5gZ6k26qkTDJv9X\");\n            yield return (HashHigh: 0x422962643711816dUL, HashLow: 0x1f87e1488ec1593dUL, Seed: 0x5329a3b70d0f4a59L,\n                Ascii:\n                \"9TK6ReBZeZ1K6IO9C4EYZuemID5jadSyEGvmxZZEWp7d6kWLCQIeieGMFRGUloj4Uont0qznglqe41GO3hh3U96nzYdpWFdiuehvL7q45L62sj3IYoQWCZk5SBNyVkmCGyJzRILWUzUiWJJVlK0ppbrcUVLUV4Jepw9ejLKucNU3P7hifLxvoNOYaXftmEKZH6KISwD3WdxKIE9OSWrcZp3fzatrU9\");\n            yield return (HashHigh: 0x215c0af71e12d4cdUL, HashLow: 0x97b70500e33fea28UL, Seed: 0x0000000000000b0eL,\n                Ascii:\n                \"jufg2umT1RqPEeANom8xVhHAC5L42tMYhCpNXve8wUDhfrhWN4H422MskP6tBY2EmEqePlccygB9ZQVTpHQqiP9Ka5mQYyAGx77GUs2NMnU0euVywIO5CBx9ei6de9oCeDMZc7k3wXvSx64x5eZJGUDITcyTTlyDLR0Nw1YRxzxdRdKCzM02wsfJ62SlnYbTk8MPKpOnox0Yf1LyHGIdInWUVj3fyb\");\n            yield return (HashHigh: 0x1b003552eba777eeUL, HashLow: 0x04514f8106a66ebcUL, Seed: 0x00000000000006acL,\n                Ascii:\n                \"GV1MgnpqvoSDspt8vNJkG6EhDYNzvaAO7tOH0PZvGGoXtmMjW7bi9bjis2s4rWHtfX2bza2xfKKI6LFpkjQLQK4uiVzUZrW0qChLjsmpWIZRdGVIGCtG6ioxs0WR6EPDYFrTNoj7o1VKJEmW8VV6BG2hcO0mwrIUnTCd39CfBPKIkTm60R5uiYU9XUhsf9spgu6w4wH1eHFzoVGsxkapM8xmcqWEDHU\");\n            yield return (HashHigh: 0xeb1dd3aebda8aa13UL, HashLow: 0x3cf14839ddc28fa8UL, Seed: 0x000000000000266eL,\n                Ascii:\n                \"WGhakvdr5URzegxBalPiDzXEY1viANvoS4m0bZGAtcpjafxDA2fcud3OPkRiq2otDcndRgBMA5vKwxuaUdwIcy0SwhnQPvonKbIiH6ihAE0PDNP5wnNVoGwPhLxuC5M7rRqnm7jqnIevjTR5ZCc0NDMfeZWoEl94XZcixZurJgI8Gtq2ILUdqgrwL2iuoa4aPwh0YnZpkotBse8mUERANTf2EJfZrIZ\");\n            yield return (HashHigh: 0x508db609e87ef946UL, HashLow: 0x2f5aa206eedef609UL, Seed: 0x0000000000000530L,\n                Ascii:\n                \"U3jiPo6HiD1tYHnCbrkOo0rZismuXvf2r2hKvELc7llbPvCJKDR7ekfiXWzImRBuViE97og5YCPzAXNEq7Ib81PaCxmN4vm6iBZkghhPUvjfcU2f0xUlkzu9G2UkhT99QOO2rFyCnN1qwuY8utUmmKrJf2W7FCdBm17b8yG9jegKTpKLbobuKWwLcmkotRcguOOv8qq4nNaE4EMMtMPssm5YzHXflJB\");\n            yield return (HashHigh: 0x8b65e1b9edc06346UL, HashLow: 0xcc172952208517efUL, Seed: 0x000000000000134bL,\n                Ascii:\n                \"hrrLz2buLvxWkERcKPsq7YpYcyRzmV8GHdXV2ujmzVtrt4epM0wZclAhkSzP2yA2qokCFjp9FDJnwk3ev0K5qWwsMkulMNCs23x8KSChg73HeC9kjPDfvkFG98rF9lS9jPaTQp9t2ALqVV6AIFS4gHEroFKXVaHtgacNOpOYwaORIces1ENbq2AeYcIcmomXs3XyPGqaHmxizYRjchXEpHWvK5qv2l21\");\n            yield return (HashHigh: 0x0cf53509250abd97UL, HashLow: 0xd70f8bd24a91d4fdUL, Seed: 0x00000000000012d6L,\n                Ascii:\n                \"33wNhFAj3b00HKKB93gYphsoEczhprR73uEMR4fR8rdMe9t11pI4Xjm1XK8YHWJoPtIDhwWhJThCvahs2gYEyAg3w8hFAwD49Din0hcv7D59FzlvMhLzeGwaicTUYXitXx2R6T160RkmDrVeNEFa4mSiWU5kPbYUO07l7nJbaduDA9Dg7YDIUZUmOjY36v7dnO8LRuHWVMxdiILVGMH7TqN732NuGBQv\");\n            yield return (HashHigh: 0x00a2ad522b46e891UL, HashLow: 0xc47c20017825d300UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"HOQiALDlp6Q6srIQ8q02p9sZtYbDmMErff2Y7hw4gBBvWwcvEwkIY6UQeaGsRvG12x4S0PL6Q3xJmYiddO1SNcsDAhAz32wXQxBvisdQWkL8ifYJSL2gTqawFbWz5X8UqzSXb4zLEThzVT3iURoaebCdXC57jO2Vuy9FAZmc41I9l2YjMels27noGfwOsicYpKdkxR848Dys54b21T1evrtLHQF2pp5R\");\n            yield return (HashHigh: 0xe2bcdb64a38b5e1fUL, HashLow: 0x162f9615f2970563UL, Seed: 0x68cad26577bb3e37L,\n                Ascii:\n                \"qXz5F7z9e2ctXtxxVFhUkJ2mgXPcQ3NXnkRxatRX6THQZTE7sdORZDZF3MQYYKc5XlQTVi0BeEeopicACLB0KokWNEF6F5AFzpB0rLLaDrCo4f2zssslxq7rTvkvE8VWcD0uBLppope0HmdjgXQCorCpihOeZNgEiMtwtjRABeVq71d040ZRcnsmtxDCMeK8w3GiTInjF7AHXjb9oAxoymrbpPP89hGd\");\n            yield return (HashHigh: 0xe19e0f2f0c74f86eUL, HashLow: 0x146140b7d4c68ac1UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"wDoaPoLLrmMPQVHhPuKys5igkxzDoVPKfdC5jAbIN2lzEFDTLdmKdXcvFHi3xKWsG2VUbFDV8G8K3l6GDKNGTpaH3pXOaXVFUp0eMtunD152PWSI0lDCAbo8sg9CMDdkjVOd90krfDXuK0QsZTRp5q3viK2XIcOcQazhlvgPpzR7EkZZt8ANXkECIICpaXE8AnLD3Du9GBNSaQq5u1ZBBqisCNz36cswY\");\n            yield return (HashHigh: 0x2192847c67d247d9UL, HashLow: 0xc7f8c15398a92f66UL, Seed: 0x0000000000001a6fL,\n                Ascii:\n                \"0cowtHJveA5UlcfWWMaT0BlBwa6jb1zLYEtDo7tpwtuFQ0o5HHKepNwQbWKKnaf2Pm9tFUBXA5Z1JKDMew6IkLiESY1HFCbvnyeicMF5htD5azvoPZzM49yfn8gxtxdZ196R3z8Sf3fOi0o1OMWbxRSEzkfA7Co73Mh1YdbKW2LWzrligAGxhkKb4PlLi3NMWjZSKQShgLIf6EWd2usvqYAV9sy2tzSxU\");\n            yield return (HashHigh: 0x5155d4c3e5f411f0UL, HashLow: 0x5ba86cc3283534d5UL, Seed: 0x0000000000000d2eL,\n                Ascii:\n                \"gGr2S5o2nUvizSEiswmATeFJhu7Eq48wyK2H2fScS76BeL9Bxy803jsJaiLCoQn7WtZaURcgLRwh3lREBvFaqHkjG9xc70QDx5IJ4kgn9iKOwlEJzqAgke2Z4QHfwbG3i6058MjKDnVT7adVWRxapgq0HvgnxxvQC0IUW5QRa1jnF6NNfaaq5mXIwS4c6NPzy9ao3LVScS2nzXBknCwoyHRsUFTJFxRgA\");\n            yield return (HashHigh: 0xb28ecaa618d95c62UL, HashLow: 0x0c62112c99980982UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"Mg2Aa578qi3oKeFQ0XdDZV1Cyef1uIn25WwxmN0F9XaPms6fRuOZJ9YAitOMw0eBpbEBtNeYeCB98kWYHlvLVSJUc8vY6c1DxlEF5i4Os6GsXj1W6MBWP1W0zsxSewIWw4OhQEXOW6Yc1p0ox5euNviAtnhGeKSJRO5qBGDiBfYK0ZEQwu4tTFf6QRHEzz5UbzMjWTHTVjP5LrXGQ89WbquVcGv1akXFla\");\n            yield return (HashHigh: 0x895e6f292e5b2e73UL, HashLow: 0xc2ab4e9915eae14fUL, Seed: 0x00000000000019e9L,\n                Ascii:\n                \"90dXdie6aN17ABy652EGCdRAgJ3GyK87YkkL56gs8ts582dCH44SDG1zAQbL1B0Aygbg6PIehPzo7ftrIVaAyVPXqmy0FqzcGooZ4RcVgxgUApEzQbYwv6mfG0Z5DjX2uMalHMQAum3khSwxmxy5NrjnasUOaWp3Pgvtsdnk96za6ZhTiElU8ukznJRidGnLWQwuk0fFF3vr0JyVentetezX2kCTGgnkVK\");\n            yield return (HashHigh: 0xe37d0c58641d7fa6UL, HashLow: 0xdc5182d362ea7f41UL, Seed: 0x000000000000103dL,\n                Ascii:\n                \"KoLiG5gWNCyjrekQ5dPdUm66ofTKFKMh2hxGQf3Jb4OBHZ8Jqyz3IU7lBKrFpzokB5kkQb4tCs1NeLvJGZCgWXU0iPlRVv3NOlLLbyfcWyG4HBcMGyNaYZjoOfLUwjsF5gV6ltLrEEr9ZhDN7UQbvRKUCwL7MKgqSug1D4DetkXVfXsiYFoCXQoxCswyqns3pnIqSn4rrnHreSRF76fjikfA1uSIWN0bz2\");\n            yield return (HashHigh: 0xa80fa19ae264686fUL, HashLow: 0x915d2bdb92285b39UL, Seed: 0x000000000000066fL,\n                Ascii:\n                \"oysBKVVZRJbhE5n0hyTfIO1IN1ssqnLBrfWge4bT8JhW9oxpl63nCtzliNCPe4OWwFlBo8B3bjbgW1PrNprj2J4FvRCTTmsyIRNqReKJZNs4bbzIXLpgExQNmQfVk8ohGkuFxUpEuBw70M5faz7XWHPNo2xWg4GNWaVndgG0d4Z3sE4c9Mx3jdgXHR2MoL05GvFInzQkgXFHekvYc5Iletzi3VEYJHn3ZN\");\n            yield return (HashHigh: 0x46411c593e71dec2UL, HashLow: 0xcead3a004eef09c0UL, Seed: 0x0000000000001b12L,\n                Ascii:\n                \"iqArWz0yyJSkrpEuRw827vrJUn8bdV63OFFF08kPfy0L0BXNtXU0X5KMbLmQR4SLh5nBETIsk0KNdV6MJl4tL6CJJuSr0MayRY9Aoe7VO7Lp8Aj7SDemgZ6CmqS9aUWy1UlKWIt2nNFYp1Hec3QiMLu1aXsDJfLhrLUxZXUcmPy11RPAP9z3whKL0FtLXrA0QZ6GgdgfYPEv0uzbzzlpYqj4kmSSCz1SLa6\");\n            yield return (HashHigh: 0xfbf24128ee1152feUL, HashLow: 0x69e6dc310be2267eUL, Seed: 0x0000000000000248L,\n                Ascii:\n                \"bQG0CwxjjRELQAdre7vEAPYgs0ZvlU9fgqLDOArJB4A9HNYmSMY4bbH8EiguwX31seg7sRxBnfHHk1jrfuL4IAwlOKhYpWX2eMKmJDrAOPSLpT3oev2c7WYB1lrL1XH9o2D2yZPOnYWW0RzmCMMnB0yUUuNWEgPFENSwotfD90kZtC3sGPPHAKikVHiZO11W6J2z3W7P8YmdQp6MENhsVjXsdHrzlAoklM3\");\n            yield return (HashHigh: 0x3f476109e8953cb3UL, HashLow: 0x059fe85a5d818609UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"0nZfUPdj3ewov9qOUFEai4Rz8U8KL5MfpqnxHnBG7eKYVLpYuCqlFBQ51pZ60QSg6w5AQsLxqThQWq8yF7GjG4eoJfEf7cFycOx72vLSc8lOPcufrmbeHpE5Bl8tvGVxWIuCXhVVmkqUpKhTQu0roVylcMK4V1jUBmGjAdyRnSedPxAzwT6F5tk1U0OZGxmgvZVpH0vP8KcXWTCSHSaOTA2mZnvvFVeVYuL\");\n            yield return (HashHigh: 0x99457054a98bc910UL, HashLow: 0x0b51939414aa0873UL, Seed: 0x0000000000000ad8L,\n                Ascii:\n                \"ZVIRu9Rob0qOuJSdtT6diIt8vfTaV20KZTNxiLiYdKfnvEVsYS3f5hMqYpWxz13FsksZgvg2z1YM4GmjRkzRXrUZFKvCf0R5JFqBflGQ0K7oriGjCZYgoSxhJSld3ke8APgGVcBnPBGghYoKPBBoF7mp7Z8HCciEj9V4fYUPpgc9mjAaaXChW0QeZFbHdAMdAlhFdQjQGTWgoW0EFJ7w41aGD6QTyUvmjv1I\");\n            yield return (HashHigh: 0xaf93eab63b55ec0eUL, HashLow: 0x2e4991729b41aa82UL, Seed: 0x000000000000107fL,\n                Ascii:\n                \"geRSNrQuZqWr5zPtwTnv8aNuLuJnDufynqqQmFH67hy7hTn0zyeX0VZrisMHm9gMkW5smugA0hjHtaSbriDB4G20IKrYyezXVN7pL0Zd3VNAPrU7t7SNJ5Jg9jlDRS69F5WLEEanb1AMXQZyuUla81lFSm5Bgugudly9JbF82NwpbZW8ZsN611xGzBVfHUqCXBH6VQh5yCr6GrQ5kWUmGTVYn76veuMpR4OO\");\n            yield return (HashHigh: 0x006751a9a91f4c9eUL, HashLow: 0xe901c20aa3fcc1f4UL, Seed: 0x000000000000075aL,\n                Ascii:\n                \"QmY5yiBfM5iKcOcKBh1FhXXZcnHMXfHWWUQHJo97trTjWEqgHjr8Y1QYR3u6gaZKydIPUXXlGybBNnML7ia5FHB0E53K1VriIrGr0usuZyrP3d1zHkKKPCEdKxhWxs1bhzgwbUYdsKzUPiMVyVNlHKIYtQMF1ufn0EY9yt7crX70FRjafZ9xBI1PR0NEuHLv8khRtAMaimR5Sxb0xKZLASuc51jF31rmOYNW\");\n            yield return (HashHigh: 0xcb1ce11ee014da02UL, HashLow: 0x210e30cf8d7402ffUL, Seed: 0x0000000000000120L,\n                Ascii:\n                \"ENUbVCQu3gZc63rKyJ9rF5h0pmk0K5fzfNCobpUnZCrSRwBhAGFUCPAEepGxVILklkEjyxSmla89sveifPgoqaSGDn94g0L4qgGbKfSQhE7qKncbGgaM9m5cSdxumPRkDrcBA7wJ41CoynKaYDP2f9Qdfbc6rtzPG17vPtKWeyRl3lnnzlMKF7B2jU9cAzDMTeZrdLA38LZPqFHazN0xsAI6QU79ty1cAR4B\");\n            yield return (HashHigh: 0x6682c9728a22f4feUL, HashLow: 0x8be14a7a1ae50211UL, Seed: 0x00000000000015b3L,\n                Ascii:\n                \"32fNLnH4iMH1yWxQjJ2HPAn0rGSYzU4hZlKsCsVZKYyFbQd5uM4exCun2TW3IkNPUHyQP3msMXPFegpssk2tBFbitkOaTEX6jKiDfHCjJ1BCbJOR8eetVs3VpNnf2kFzTPdNvZRpIXD1BnCUqwgi2IMEYLoLUwKibUY11cL7fLEeKKFwrot9x3DnUOvL69Mr3Ubmb4EkKtRUB4J08Y9VynHCQ6F1tFxJqhQnb\");\n            yield return (HashHigh: 0x9b6ea90e01908c00UL, HashLow: 0x708b4a3fd703a62bUL, Seed: 0x0000000000000496L,\n                Ascii:\n                \"D3ItgWHDnRAYV18wCoBGjf3Ay7ensCZODX45bdKZ24lBI5F9JrEJoVTY8bk7J5izL4zrG1QjwJBnisdNVrAT5Q0SlHGROnGNMChG4lhbyCOwGDRKb4LarSDlRSI0vmTkGdCQ0oma6ijguL2g3QGGYPiMbom7Qb3MQbGo3u4GkTqnNWiPZKfxj7CV6BedzRA9WEfaTBkvSo3FNnc4Bo0ubeZabTfcesiO2zJ6G\");\n            yield return (HashHigh: 0x9901fddc33003147UL, HashLow: 0xd19d88194457e39bUL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"fBecYKgD7Wzw6TVIsxoegWUON8UlPGtDbx8evocil8TUN8JenRPZK07JStDLbp2eAhJfds0knxc1JdEYlhNM696ol0mKyeAimErejkrrJehHzqANEIt5LIvHXw8oC68SGBEGLcaRhstoDmdh5D4ulam0rUc0Z9KiesBCu0neindQwOLRA0Ej0vfeYBdhyNEiki6FYzCRaLWsrpPEOZALpZZmz5Y2is4ChSBTr\");\n            yield return (HashHigh: 0x52d17504be201e34UL, HashLow: 0x8d113c8011acfbd6UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"6h5WS7LLG1EOdfPLy5v5cgJvKHlmi7yZqzTGZeDECOpm7X1Ofy96jzIGPBbQqzl5qFE8JO4tNKrv9OFoJGBN6xWvVyHvPKq8lHCFkAFTKWcNM0KaUTrDmGp3fHyR9moZ0Jj050nBMfGr82jIMNlT3RFHjbhQ4Rmf4HG2ZW7cPKJvNDfGeJSIooX82A6L3fEdm219N4KYzbIHC7nZRzJjPtx4DJeLwGvpipwOWm\");\n            yield return (HashHigh: 0x5e59331857b62770UL, HashLow: 0xa46887d66d485fdeUL, Seed: 0x0000000000002702L,\n                Ascii:\n                \"O21hsDzuNkt0terpCdAFFQJITRnVZInheD46IZZCMrsJrLnA9j9LWC0rBlWfApMWjHyFn3xlWLkUTQjaSAY1Fkk5Z3FXP6qJLNjR1IsPoZF5H67KK8w0Bp40rSkguilH3AYp9YpV3TI3GRlk0CaQAUc2dj8avN7a2bgB0OXh0T35oEnk2BO8ydKR5Qu9DJfPZsuF5lQUsdzyk8NTJECabDtb0ikuPhW1ZnzQmd\");\n            yield return (HashHigh: 0x742f1d9f43d44f76UL, HashLow: 0x7e57a13b70f1f16eUL, Seed: 0x000000000000196fL,\n                Ascii:\n                \"4NUz3yRrnE44DpvKA43wNKC00KkXFLxPwlhqz3Sn946nwjqKc3N1Z8Gl2qqV5EtBvZ6LCrty17v1Kn5aCI8j154J753wRiREtyGfAeYNHE2ulSBKKiLUpvtHJzQIhEjPwpz1rtP4rZi6H7yoz1mfG6dGqV6BhszaAYywJUwXrqhAoKWT5vOaxa9fvIeuKt3IGWdAd0b2XAEtljeVv1qXIPrYkRiFpWtstdCYU1\");\n            yield return (HashHigh: 0x242f85f3945b55aaUL, HashLow: 0x4ec922557f772e1aUL, Seed: 0x0000000000000112L,\n                Ascii:\n                \"7oZ5NgmZh9J557vhCTsDJtgce835yhalytjn3NPcWpfg9EEKrzhXQhU6A91m2D5pPlLL0hr60wORRLrjpsZTFIEReKrqJ3RTpk7jTB8M1nBZy0LvFF6j8pILYS6IvpgtxSMn6yzySWv7u3oYYNUiCiq29wKNYDR29R46AwkAg4fLBkuriCYhbBkDbwQ4r1Xtrcx5fseAM9GhO7HrUsBhsGj10JAlew9vRXpphP\");\n            yield return (HashHigh: 0x1ec5875533a5935bUL, HashLow: 0xf1931a8854a28de1UL, Seed: 0x0000000000001fd9L,\n                Ascii:\n                \"isND9RcrdR1ITMnEIUV5wTjQ4lbFdThVBcxEvC4zp78k5JHPjPFwIfyQeNYU0oF9lZ9lZyDGU59C19YUA8PAsfiTIivWB9qvyntquc3GoPiNQzAxNaqUw7gRIINzQK3YNXmwzoBVNZW562u7DQk6h0KjaRZIQyEdJPUgvCsGTSNFAPTdgc4ChuO4YJihrdY9qrQkIAcJiU4OnaFFSDIsQ34abJ0kYy5LrHqk5HZ\");\n            yield return (HashHigh: 0x01edc0a0ef305c93UL, HashLow: 0x39d295c23bf2c7dfUL, Seed: 0x000000000000174eL,\n                Ascii:\n                \"j5hGuIZzpHZXY8V2jANqt5KqQVe5fjiOI5GLkM5PNpxeUvYnZDUdf8OPaYKWxsrs8Z01Zham5ChDz8sCutlDqCU0Vru567AMpwbSbnbiNGS0UuZ4AWNrXtwp7bShtQEjMuJlxYv3gy6V5B09OAhx0eyNKgxdMMX4FMEvsCWVg7Q56XTHOVHsRlbptSakG243LwopneNyNd9QOcszLOzp9lxg1AFJOgPoozvNOYR\");\n            yield return (HashHigh: 0xc267af4655bef716UL, HashLow: 0x04e847100d0bf256UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"vyeHqoDe8ia5SXHl1CRqcr9cn52bCCM2jN0h0d8WXC62Y2hbhk25ig3UVynISL8H62zHnTtvl6MjhgIwBROKT1AUVlUq0UNLYHmgpgZ4AR2DnhWwscyJiUCJlG5gE8su4FsaFQteM5DW3qlyPQ9u7xvOaJk9YNaoR7IIvMbbGeqqvltPE408wCJQSZQ4ay5KQV0tOmylxj8jznPgSSy7xPf0M0wM9H91m8fUAnI\");\n            yield return (HashHigh: 0x6900aeaa8d9204b9UL, HashLow: 0xebfb682540d182d5UL, Seed: 0x0000000000000390L,\n                Ascii:\n                \"7AKcE2gF94Hq9ygXiit8Y2wwWDQsygmCh3nPWwTDlexJyM6geusUORNjCGoqagQsDI1kSrY0pV2ftX86dTdRHjTNOcqXcHq4yUwlLvVYfJcVG7J8WttHQe8igkwO497yiGSHKkrpqLR94iteEs7ANQMRfM9SxRB0vxlTEPEocnFh0YROxPPBZ0KdT6eXtdxnbUBt76wG7W8A4kiul6Nidx6hvoAfEs4ff8hrOUPB\");\n            yield return (HashHigh: 0xf942630094b2c371UL, HashLow: 0x056f97be8930cddfUL, Seed: 0x000000000000072eL,\n                Ascii:\n                \"myXEIWnV1uW5B2AyOD6E6hs9YJnfHkQIwBnNM26Jd7AQVqWu1QEzJbJ2x2ZiUjaPS74RFwBpi15wsl9I1MkGUJj1xJJjIpmsMIQOGb9diyvvTRo8RmhYn280Uhu2gEWVtb4ZbD1Fz7QkdeRptgBISxS1XrI60tuDWxvBLssPNxKcneLVWw2Oop6M9Lcb13XLw5g1tiLNQR8gmmesML3L9YXLrjRAyHA2JQ4QF84e\");\n            yield return (HashHigh: 0x651078b8c0773341UL, HashLow: 0x02250ec6295a6512UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"7AnVvxpxeUBaAeyTIk02DR7KLyfM03bxx1ENtgncWrLyLkiYbvOb9REGHXlc88iQ4v95JdLYVL6DLcnVqn6TsMM3HW4mmIfeDdHQNJTPXKiiRBt1hxx3N0T38sytGxwgjjNRHMeSt3sdEfkFm2ZGUg7UJCrsPtXC5zogxEH2M1NUeHNM3l2xFbEWG8Oy31f8FiMqKHHbnprqgk6B4ScNVu52D1A4ByWBJTnQOb4Z\");\n            yield return (HashHigh: 0xae05052816226a7fUL, HashLow: 0x9a997c8bc8a7de6dUL, Seed: 0x00000000000019d9L,\n                Ascii:\n                \"xlbYnRAxf1QoDVc3WawSh7UOF98XvXnMUpW2UBedxdXMoOxwyN8ya5zAPXEsRi3YXmu22XqCIgaUe2WfpDBwNJf9ZOLfp67GY5Y9SzwZowZTjeiHz3OSop2nDNZ2TVybzLA9A904j5FVF3rPXZMAqRkrrh648gB88y0NH19Unzze5ogiXOjvGHHW51UAiCzUvx3TqZer53wCbtjVdxikS71q1s4QrYR7anJhmoPu\");\n            yield return (HashHigh: 0x24f3bc8f707d6ea3UL, HashLow: 0x6ec5a5c31c4b4ba7UL, Seed: 0x00000000000014deL,\n                Ascii:\n                \"9ZZ0jTByvCFhgV4REwj0BX99tRoHRe4GwvI8qkZ6W9au2OPhP4anea7LuFOELlE01MC2ZALviOpZg27Y6jJnneLSVPGjgswjWkqxQZPIykGeuXZPYwetdEX4hqzVobvYw47NiGsqpCVaru552qOOQR2Uvs4Vls7DNyZVLo85bgmvjowJKRejb6Ju3IGl0kBAU2JRJ8ViVkuDxUpP5JIBrzSzmAUz5pqjSCD8dIUXo\");\n            yield return (HashHigh: 0xe05f3cedcbf7d929UL, HashLow: 0x5269659736a7f64aUL, Seed: 0x00000000000008e3L,\n                Ascii:\n                \"rUkprWbCHMids1dz2b17N3tHHvMd4B7QjuzzOnnuui52tXq8Zp2cWfRbuRp8eZexIDSIZOnpnJgvrt84ebnQKYbvG8omiLiGopIVnQDNRpd5Sa8vtqK9hlE4U31pEFrJOReK8qEY78XpDrbZMp2EvmKLqDtaTM3uJkULmPkYjXC2HgRfWtBrM5jbCpK8Cevt8rJKb3W4VcUxYpu5hhEGc4Zp5tr1vwm36axDHKefR\");\n            yield return (HashHigh: 0x6c644bc692b7b7f0UL, HashLow: 0x3fe0fa26c17797d4UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"vVshxkFpwcssocHgztFkbNSbxwCqBOKVuDQV2zmvnKHTCcgrwgiGcRqJu1F1RwVLcFzqSOs6RFsEeyPnMdxtOoexeu879rPBczE2sMbw7hSLj54YPsUUDRBbpkrEZ3CufODNiwMX5oxpqFDT959Nbb9odz3NrRkvEuiylVb4G6KkCH2Go4aPoPpgqd6cG9Waw89w7LtqcZf6kzIXn11WG4pBNAHWU1Oqrfex6kviZ\");\n            yield return (HashHigh: 0x64ed6d63ec85f758UL, HashLow: 0x61862e3429844789UL, Seed: 0x00000000000011d3L,\n                Ascii:\n                \"C4tWTBxJfptCCTMchfrhMAs9rjMpFuOZvkmIxHG23FLHrg1rkY8jwEnOqrK7EWxDUHWnjZcfr7tnNwUq9Jaf3A1qqYAihQYQGyZlLkzLaOuiU1j438TlTnLlp6t3vYPeHIcZwgRIc7eyIp73gQaoBgAeHbTEuONTKJ0iUTQQuiTvMN82T7SpIwjGMFKPcCKQqWtPilyM5N5VfreyLFW6DibHnx8snGKldAmVTDVzEp\");\n            yield return (HashHigh: 0x8b1e3472e1ac9a66UL, HashLow: 0x8f628af6a1908b28UL, Seed: 0x0000000000002121L,\n                Ascii:\n                \"88zsKqhN7uandbNaTDhAKTnA5SajgVnACX2p3Vu2IekQIA2miHwCfmmjCjyy8lDq4qIC80exb0q6zbLaOMTzYGNqo5AvtEafsPmS8Ge9YDIq6hHwUS11pwjdf147SBFbdLuzBEZ7HW1doMgFsSPn4v4dANqVRZOxxrSbUUkPVhJpBbiI4QQLw0CtjAQFJHKWMiRWKKpnnmHxtXc1cbLZgJfbexucbUHUmZ6IgPbsnL\");\n            yield return (HashHigh: 0xb065e744cb607cbfUL, HashLow: 0xf7d4922ef773e054UL, Seed: 0x0000000000001a91L,\n                Ascii:\n                \"46oflCJXgfz8y1xwJy564zxDu29wdODudwT4lHMUCPExhMtoyLIupLwpw7J8dxRwrzsf0dLG12D3Rh7J3kpenSXQLLsAC4UKvuC3P9NAoIjRNFlXOmjYblIzIviA03qpzmIWvl4qJkzJsVbjFUCEWVKOtL5SlMXNc40tw4M76LbCn4oV2qpbN68wBLX4JBoV86x2VQcuiP3kC55gTtRdU9ekfdbCpaaZtgspSegSSl\");\n            yield return (HashHigh: 0x79e567a8ef8790b8UL, HashLow: 0x8ec56151d5475a2eUL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"8gvtplYsrLdFspMwUKfZeIJTtb5WXL4STd47kufbMfMWyb8B1PqhlWGnbhOYObNOhdpWaMggYiuBL6tjH2qabB52NbVwm0TJJ4zDUqVPVw1NFmsFftl1DJpnh9wFB1107wtPWdWSRlbf12eLabbGV8APtmRrVHT3DZADyW3h6z4S6YRoIeaU209Y9MA5YWpX5VpTyJ4BaEXPpATE4EX43gswKBUTfpMbis2tUQB2Gz\");\n            yield return (HashHigh: 0xd43bfd3229218adeUL, HashLow: 0xfcb12b7a4140fa92UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"cNYvYuZsq06i7H7WLyfFupM0LMSPAl0YG9GIQlb2j1MpUEOHTJMNhSixgozom286SIRoWESHtQpqmpxQqL3M5gnNpbLetqfKr5XTrS0kZ85t4dnxHzRhnQ227DuqoTUlwPbHlsC68fSOUgR72IUSPH4tVAza8LKjYXDR32AyU6xosyqJjUOiGWTfCZvBoOgOxQtLKWcu0zbiGo9wuB5fuKQQhm9mHPQ1qUPr97UTvGC\");\n            yield return (HashHigh: 0x9b1a6cc32abe529aUL, HashLow: 0x4f0851b91a94b9b1UL, Seed: 0x39f52b1b0c535141L,\n                Ascii:\n                \"Fg5rgyd7wAL8cmS5FUJ9DopvpyB0hbrMEq8KCrbVYWoZ5oGCc5zAZ01ICohJ7xxE39O9RIZU5IHns7A9WaoLatO1M8am7ymYr8yy6YslbcpdR1T7xMhN7uRHbF0TjTvtRGPzLv5vd4nRA6XrCXPAj4ctcXE7l7GpY3sfOK5m7ZpfYsL0NA917z1zR3Ljfx3qspHMnAP7LSCyw4Eb8EOBwdZ1fN9bRL8NOBkerIC7mha\");\n            yield return (HashHigh: 0x0eafb11616ea0e8fUL, HashLow: 0xb9d805f92225fc11UL, Seed: 0x0000000000001163L,\n                Ascii:\n                \"0gY41Jalya9vYJjOXT5D0Cv1RCFCUzdzKYlttwov2v4ZJ5Q0qfKAvuQNYeTtsOKqMpbgStqsEiCaSTyPZ5rveLC8vxnHiiALJEFKwEyatTXJPs0onHxUFWCGN8cKIEE180cHtTlBQjDPmNGhH41lfK9smaVf4AKYWMRpNpI5KF5GNlkHIqDvh15GUdcb7oSdRr8Y4uvyCYDIIlNjA2hLmPmL2WPyIiVxzZLS2hF2F5g\");\n            yield return (HashHigh: 0xc63a05f2b32557d4UL, HashLow: 0xb1a867e5db639b70UL, Seed: 0x000000000000083cL,\n                Ascii:\n                \"lcweVocSaVB1nJiuE6h4ebmEKbN5OqNy6krCy1t9u0sYEVoP4pWOQis7qUf0BZYispUnrt09uVOPDmGFTIBNmF3lwWFhro0nRfuuhenbwibHy0KNy5LFMksHnC6r6wCf5JjfILEsZA6kIAjqxpUcs2i7tQyQM9wLWbVDwVNjxy03NlRrSKmjObfuYlxGlaCWARB41OmDS5kMJG4oyNmqMbAT1usQN8g5cSxN06XuUAd0\");\n            yield return (HashHigh: 0x8fe9cdbe949d8d77UL, HashLow: 0x5680f16726367131UL, Seed: 0x0000000000000c86L,\n                Ascii:\n                \"Uhwt7Dz1vwYRowKUmx3n7eURaEJyDk9OFxdSp3NzqEG1g9BpBCwrEIVg8bXz9cZfPfkigdJN5W6i0F0vXclcpBxzcBdbj5hs5sEnOkLnYGsKQkKOXpD1ktgX5h2ByhukExqP0cXWyMpJYtOPJLOBkModEGOexc2gSlzDs13cEiG1jBD3069e2Y9dUxArwDjHQTTHadymOzp3TuynpFN9hcUT7IM2lYJor9SArYgvEJoZ\");\n            yield return (HashHigh: 0x775baba3e7abaceaUL, HashLow: 0xc588b66b3247e72dUL, Seed: 0x0000000000001986L,\n                Ascii:\n                \"T1CPelBwyTr1stvMqH5JLWhpnlnA8EZVoylEZ0IfCp2brdRRul0m5V79DjDVMO0iz33FHQ3zeIFf1GZzbSbW1W2dWgXgh6d9joqLWx0Al3DHhosynGNgzgvnOnIydpS3Jr6M3bmErEtKGCzldILfBwAmJEI3nBpFZGfYH8lWGq2uoBqJpNFqdY8EeC5YUI1CV9N2wQd9V8fo6FLUJ58jcUDTxFUly0TjoYoY9zjc5RrM\");\n            yield return (HashHigh: 0xef146adbfa40e8e8UL, HashLow: 0xc3d0325bbe4f38bbUL, Seed: 0x0000000000001bc2L,\n                Ascii:\n                \"lbA1aER8HIbsbNTyXgYw2QdKrLJMOWv3Ns0SBIpBMCvWfsUUrFTmz3pTKQmWWbnrx2sjo3aZXAYoctJcXc5AjudoORKZefO7rTlv4PSJEoLLEtPsKDi7I3AiNjmAx5YCLaS7TWqPonVMe6ht3s1cEq91i8hsUTtbBqvHfoC6O0aZXlUYxG8QQyMhCXqlX3W1iV3HpLa8AwGHB72eVw3LQB6YECAlRz91rgUTmRgLSVyq\");\n            yield return (HashHigh: 0xa88c7bfa03243ca0UL, HashLow: 0x1e6049840ca9627eUL, Seed: 0x5ba05907e31eb021L,\n                Ascii:\n                \"SuOT6LZK4c1gthmKUbRPawWdadQQ9GOR0vKQqlq6YYZTFIvdrZZyqEeeW7ZZ4WOL1sqydeehtV7AxM6uv90X0CnBwnasBFo7oYC9OT4ux9GSNmSbvhdvaBnEJQbhtsz9jfDYpKCFrnjMGTgHTRcIRf5KBEONkJCnBWFiOQOkfBh3MmNXPri6kmS1EmZRdMfPdiLXPN0fKSeEBrpLRTKfJOO1xd2I4PwJR10EeN7K3PxBs\");\n            yield return (HashHigh: 0x720f95ac2546fe35UL, HashLow: 0x4a99be91113637c7UL, Seed: 0x00000000000008e9L,\n                Ascii:\n                \"0YOh4gh7ncDM7FmOF0mK53DkVfcO6LlAjbbxOAQEHHXzbwbDcc5pFiws4g0S9G2a0Y80hFjfEtryoByiebv75jVjlGQPtwZx67pefBo0AyJCZUbQb7TmBKAcOKGhgaC7pmF2dZPGzBrAiJpfMGd48B2UDTKZMNLXZZRc4rmvHCC2z6P9IZoOWymNoB3e3TK70oFRgpHiqG45aKxHatoGRq6jxYwjYMwQg7nZFRHrNGT9y\");\n            yield return (HashHigh: 0x28ea84a1bfd4bdadUL, HashLow: 0x11457b654bdee031UL, Seed: 0x000000000000065cL,\n                Ascii:\n                \"wKalrN29JvUsm53gnqKjg8th3UVwiwrUNeSKwDuKpWJLUhJJi51Tm2vhU9fA5iKeyJIIGlvnPACouqplAyr91f7vD9wG8GCNtvveTkq75MfXgI68psQ8Cu8VNjsnNmctg81mrPnNUf2x9jsEWgAl7pnUMN0gEvhpSpkzHHAwLXuXKGAzFpTeiNkoToKJbXLesQq7vUieskQ9yB6uVq7nTzNyRjvwlzLkv7j8fPNQCBKEK\");\n            yield return (HashHigh: 0x78fb51b420756317UL, HashLow: 0x5bfdf75995ecac84UL, Seed: 0x0000000000001245L,\n                Ascii:\n                \"Rpp36ahhyCIgSWfeA7zHAAC1DzXYQZdSToI6F1WRlPDNotVy6AvrYYIu8Oki319xGhl3aSjQd5EmEUO2HgOh72Dv24wzulbiSo45qS73BxAYcZRZenk5oq0T1O4draIIGNChbyLpaVXk2oIEku7CixuAoKltwu14cfTikr3rWhNSGYgRLoS6OhRRsyqZyB8PQ6NqMc2yzidYXhlMoiyjwYY86oMSCJQPYYfJ7x2M3Tujow\");\n            yield return (HashHigh: 0xd2470c9fc8d59d8aUL, HashLow: 0xbf740401007c3642UL, Seed: 0x0000000000001894L,\n                Ascii:\n                \"BxapM6Bj9U8ybZ7qGTDaBrVajPOUhCkFCrPyo1SjkcIJu9Nf9EbdVnwxLxqMuzfLAFI5FCmr2M6kf2lLn1QxNFWuGWI5zjCXklSWj6xUhAMSmfk92AKpTnTVgaAGvzkSQlcT7vGSpyFny8AeiNncSoc3PjuDbdqsWjLD6Sob8WCGO4faIuwohfhTec0yUALddr8oVgf2yDtIOxtsP2JyFOLLCOngEZbZqy8SL81DsXVfWa\");\n            yield return (HashHigh: 0x55636bfa715705cbUL, HashLow: 0x1a6773f4c2a08547UL, Seed: 0x0000000000000223L,\n                Ascii:\n                \"ECtOyFI3zjPsJ3SjpmDSVV0oPkCmRB3CtYK1HIx7o6qDI5J7GXaZPr4YQ8UNILkLppiguZdiS0YmDTgDF8s2GUGLyYrpTfM2SOjCz4qBnnbnEbFuh7y6POH00gShC9p0FosAy7l3P8vYqCkeZQ1KjaRFGLnVw3Q0UkLeKWCbbI3fSSxU6apg2X4wSlTDPb6gzZrA5NGS3r3L68u8MhfgR1mnXVm1wOER3KOHf7iRYO0GQw\");\n            yield return (HashHigh: 0x4de37425afac5f8dUL, HashLow: 0x8f8e10a543b493f6UL, Seed: 0x0000000000001a92L,\n                Ascii:\n                \"mma8l32S3LRF6fm7dYd9bhZsh9bO2FtCmBs2a8wOaNDVitVEuTiR3WTcwYMb6IvVIyb4RTT9IbW8R7rLTveJa2ZJrQfk2V5TZlsU7gULcs50QIkZst7dncj70d5HbjvNQGsW6NzrdcYmHDh2UL2C3ntic1iMv6Rnm83CfiuRkQQgUcdlMHbrXLHzn9FwBsc5j7HcCRBFfEgVAvSaLzvpVwFOUUONYNXrxQpig1ZbPbFh5Q\");\n            yield return (HashHigh: 0xb4261f0d1490b308UL, HashLow: 0x5c50073d0ffb7eb7UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"1QzdPiIjLZsdR7JxhNnDCq79jAnpyHI4QtN03F6fMIfpkamA9dvnXsloBCAHt5SuhoLFYmEnpJa6rBA5PCemq6i4gpUdA5ROGVHlcoe7tSM94yrc4scqTZY8lXzSwF7FrfmfLVaW86qKCB82Ppj00TvStbgr3ZiWEUMdoJzNWfdUgAlUKWFwPV0g40G80aWDtbKNeB1dSO5tYOSVfNTFpIbWS44MOKKegPWQbXsqj2bqHJc\");\n            yield return (HashHigh: 0xb5243d1271b67cc0UL, HashLow: 0x720501fb39b87169UL, Seed: 0x0000000000001215L,\n                Ascii:\n                \"UEVrGej4bdByOasGirKZMXe5lnOb1AjCjIrsS2gAw8OFOszvMM9zgFNYeiEEY99AUe46oWIMf98bsXX9UMiCLNF886dPtvzwpkz6k6DdW8UBYHLQdjKETvNZUAjw7ArGlv1uHJcPA4xZPoSCXdmDvUDqf2mZ5CUJ7cmXySCafuzUFq0eK996DoNM5L5DaTBM95QHXYaR34vsDFLE7KhfmBgoD03S9U8oizxHJkylOZavxVA\");\n            yield return (HashHigh: 0x0397d7ff16335f25UL, HashLow: 0x030577636cb6882aUL, Seed: 0x5612008dc6ed9806L,\n                Ascii:\n                \"dsVmJjeoqmmID9IkVicCbJnEIZA1hxpj0wPlyCg7dCN4HFkeUmlF4n5GahSPdzKuC3VWvqUdYQcnymvqdHsvBvpgeAy6h4KUhlaQ3iM9EMKhWhH1DUzg4ZlDT9zYMBopdhgNjQsHxDbPDc5Bl3SD5wGeH3A38WyRU6x9QzeJc4fyjFD9uL8qJVbn3sSneFJQ6grobyzqLIZ4sLh6OjVcXbOWMWKzHGQ7K7HJarw787aB7hw\");\n            yield return (HashHigh: 0xea1c00cb841d0f4fUL, HashLow: 0x879884a1e65a2459UL, Seed: 0x00000000000016bdL,\n                Ascii:\n                \"FdKNc9fjo7dTluFwLxwuOTXSzmzMgj9ItywHo7T6HQ5Fg39kHSVqullshpruTdP0BrEEcx652xt5USD0wkSzC8FQFxX8OHJKgBle5w450uePgZOP4hfAvzh0sNXzMVyyW9wUL1JUsG59Y0KvahNyZxO2hXNRVslyhy1LP0BDgA7dd1KUqM4ACALQOLUHDiAHyKMfONwEgX1G0zlJU5D4vTzTvNyqYGbytrcO4znn4SntVStm\");\n            yield return (HashHigh: 0xa282e3d70c5f254bUL, HashLow: 0x09de9f66182cdb3aUL, Seed: 0x0000000000001c75L,\n                Ascii:\n                \"x3TbzUpexub17sbjFpLsvGvyMLRjSF1gN0tiPUfFwyfEH1MQCKARAA4RPvI3WvbzUkfu97LNuon6kMlgdJE89UesIF8IoiADhKhovTybJsDaTK88RsV4VjYvI1a9HDP0eNTfFzCJhZ2mEKArqgXyjLIOIkQRCPI1a95p1HQxdbFlmwgubyli3WJFzdls07676LeCLKod7ZmsxqJhuRJ7khw6eWJzIpT0fLl25g0kyku8NUlj\");\n            yield return (HashHigh: 0xcaca634dc4a96947UL, HashLow: 0x7c75bc55a5d25519UL, Seed: 0x0000000000000e2cL,\n                Ascii:\n                \"mvOuW5Er55j43BJSdhWYGEPxIBc8XLthVAFLhy60A4s3DZ98dlpnPWPA4JsDQCv7cgV8Z2Hyzaz1hErmHCWowCvxllLqdFSxQ2lQKMWaMTAAnUwcqxZdu5SzOzikRgf3X5zWUqvJPJXgsT8jsdJNJIYmaJqDVZCIpnBilqZiNoImlgM7LPMr9Wy5GLYrBdlNsHdHRbsk4k32UXUQUeiuxKlL2lZZhVZJnPA6O5xyV9iOpGfx\");\n            yield return (HashHigh: 0x71a8f9355f01256aUL, HashLow: 0xc80dbc9e7ca8c151UL, Seed: 0x0000000000002521L,\n                Ascii:\n                \"KQ0ok3bAflZ1shhiIlX98i3I44BKFr4kqZmNITmCKCWnDn6sa8SEStoPYmFhAuFJJjdcgIVKa1gfUTq8GArzFpA43NaCTcXYRvH5jO5PNPXCTwGfd2J2tmtWGC0vIMR4sfCAIXrUHtEsLVEu5w0CeHRfBJZpGjSMgAD3WmIJgeTGrmnrWIJpiAgG46vKVz2tRaEmUpzbBFPiGR6JNlfNOVOo2u32NWRpYrlpQP1acQVbOE1d\");\n            yield return (HashHigh: 0x381ddc601f6ab794UL, HashLow: 0x2f37d7c5257055c5UL, Seed: 0x000000000000021fL,\n                Ascii:\n                \"a2WBB5GKMkHnAySB7uXFtoT8z1GgX0MPgzX4Zu4QWjZ5sfUPXZq3UXFUbG74Fw8Jk55geWbT9PB35YSVEbtIizEgLcpOll09vmDXlLcR6MxmGl6apvXEAodsve1dgw4eq9Lsx8LLdd5kJY1HlJL7Sd4fckloMiVNR1n8UdOzUdyZa0T0iKRc9wYvpG6py0QWwevVqXlZjwEyYmSQsHoXEtwzjUaRL5Fx15E21ANuyugJVKk7Sgmi8CVrQYFQZbeF6e2POv5ZFzf1OgjLnYHp0xpfWDD8uOKH4zE882uBMshXjVSjFRY9Yv5rKdymxkR4VMTZTNPNgiuPJSKQlt0XU2NdzVdH7iTNZ3Hxt1vIyFEtqCqHjFGxXPNaPGJbioubL3hGCs5lqEOVPHHNQNxjhmzmyS3O2DsZrvXkFbD1HpLisgz6T4S3mEJ3tDhzWpAkC3UnitHpgaoJnyBa0EchtNbtekxnSBQ6yShQN3CktaPjfTfGWMmUzkYOZFoG2dYZ\");\n            yield return (HashHigh: 0x6f5bbac339994527UL, HashLow: 0xda2ff091f3590e72UL, Seed: 0x0000000000001865L,\n                Ascii:\n                \"USxLu2Huv2su0RCa7ZAFf0cMpMLk7oYmPAUhnDBXAQyRMWT8Eoryj3FWiuo6LaGF60OFmx5lUXL6jvD741QrSZ54Ik312oxZurB9bBdCwQVzfnM65KgPdW3Adl5EQCf2zY8v9KZmkSjp6hIBc0iBhJtB1Pj2keW35tvQQhTfMWhmIHM2ZpB4AwK8aPrax3EmoGvs2sjcaijbVZOBQu1SNff8QmAWK4k6FldD3a7oz0OYk1rxaTccT2qoouqwBbgNvYXcsRlkH8s0F9FLRTAXYmYKro224xjli6ZdsoegrhrJjoPsNERGh5xm9mBGdadQRo4ZHLPoEpGWRq2u8gX9bM9jcellAeT7jJDIjXfsc9CfdPzF454x7H8D2Duh6TdRVnE56strIx1urtfbfqK4uH23JUgzsD3S9zasTsyatKv2DdbNSBs1zqBTGIDxwRyOF6Y7Z1UIjP2U7oLLzI7IwdaOzZmdnTJWTGqGO1y6xjjv7o0dzjRCtkfN0HFWF6C4AWQkj15GfEopfbw3nohIo9d9LdAZ9beW3Wt0mMTkg3UqgtpcQad3uRQj3Qwo2hXfxSF4OI4o7CF353coopSScASXKxSgSOTKSp0txdPBHpEGjlBjfyaLWbb4KF3lfAyzcFOdHhIXw4X5OXKfP9CzvWsBX30dJYPUM0iqMo4LPKyK6SSVakfTnMhfnWCkyt0q9FI2yn0hVkTs9qQuqSkH9INxYNhnn1OTDScudPq1d01hYCry4RtaxAbGYfvyGCcaua6MyGo5NDkrr8o6mXROvpDtX5LSqRLE8ArgGDmYkWeQx6whRPK7l5JRhN9NLOpglAUmOF8mstzQEcVhV8hK9xfXs0AdQZMMUrEQXgk2Qg1x02FNqKYbScPr5HWxxUc40fUHPhdllmC0f0CnrRE0xM8x9D1bgoVLkNBYQ34hATXuRd1wwKMXoOZ5Uw6lWAnUtpVB6e8Ns9XPYrJblJ61UD5RwHGczt4uv4Gla4SQ8zLLLq5rhRB2toDA3MiZc6wK\");\n            yield return (HashHigh: 0x42113bfd29cfadecUL, HashLow: 0x80eb9cc47d75ef79UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"TI6XYevJji9MGqpXH8Wa3hChji5jt91W8MyhwuKrpPUEBwp9sqWdebdVvoOEfJ2vGg1lNZIvuLwmVDKd8Vou3qGCT5VcqI8goIxXDF0jZF0XDLAQXCFikOvcx0CvZZYJjBVqiY49rbSIAqw4CdR2ex3guwaubHERWWU1WL4AwBYvqM40BZVP52jArDymVhTEg7kjsEgOPQbYxHCOiE0OVgDxvOfvLfnOvbVHAbJtACeFR7EuTQhnYI7WrEPTjmbSLxdV62FAi1DYVdHLSmJm0gmyGTYI7oKrbv90hbIJgv4D5hUGi2S43rmLixssqtosdSUBhsH25qJvJx1FZ6rIhtYrajtDpaCNPS1pH5aAe4NtujDG9mqqmm9IFSqw19cAE6dGCTd8FgLlWCKt8Vdoqn5Wy39E15wkCzV4ZtpTd1tMfdiQtIf7LIZKOmPQUjkj62i1pLbam8EHradR8iF9ZskMU2u3W7e7e4IWdGFzubnoH266VZSTZPn9RcLhwN0yrE3AvNk9WjKW6vwRV6C0nl1n96ir7VKTD08l4Nh1RXopC2ASGF2P72byEwdue5n8KjCvkoYSJdbif9QNiLeZoGMUB64ufVknWPjMGqxBRzUXuhhoXlsh2clxhSVycHYFc2WvldpGt11R4wgobPmtcrgQG6zjvGNKzVDQDnHxGN68c7Ij7CrghizJu14vZwfElUxoaPsdU1u0Uz8Re8XSR6O4NE7Rd3uo3EOSr3CVTjXTlKYMyheNzTTA3UsywfQJhK6W6aB2QZLrpwb27FBciHiXGsTGzJya3YeG1mCTRpCTNK0RY1EqBzzU6HI2rvHQhR6GLaVMVb4GXKqfi4NaSaj7h4kuFNc2M2Mu2VrznLBmBZ53Le6YeKpET1U40DROIhFWetZjD7kswu5xduEB6CCQDhHz2ZQWzivVHu5970LFcMI5oxwdUuOoIpgBAit3QNlqaHcvRKK8dR2TNl84AkLlxFnGx6HQHA4hPsFvfPJbAoHycCL7YcJIQGgZlGKB\" +\n                \"ByZdEP6ZSs0vp5MNmIjRxJU7fxuTfgGUj1uMX7AnHZOktctLuT0dqJZ4uLwX55RxnibG7N9KsBMW2ic4h9bCEUVh9NsWYK6SuWzm6q7xBL4tcLtTkdVotWlmEGfUHd5RBuUZW7HaizfB5obQMgkRt6M7U9zMhruYY1RYsQOCHpCrefvcYrMCu2oass3T3l08fMudGelG6E0wAnDhHlBzJ9ACn0zjS6bxxV8IGPW5DtUCxfq1sTMs9T05DLAWVIP2ldLoRSaShmjZ3WP0iA97qgBVcSReu53OLYmmcnCUz5WBvmUpbLdf5mcCoshyJUprc1NXMhVJtrrt7FUMrEsXjMyusQapvduAo1eIYF7YGHVgN63lnZ7xPNaDERPHaIgtF3inQSKDLg3SF1sBR5y7FcYUS5cq1HefxvgWyx55uNCyRHIq6a5QHLLZqnuMcM0BvRrrsQchEn6uTfBvsnhycJNhKAUNbanKOKF95gNUEFIro7PHKB1sehxxAoa64oF3OctnFnSn5LintZDACNenvgwq3x2bCyE32zA7QHESF5f2TOmMzT0xKJOXShS2PcOThuFnsX5YIeS6N8BxX2C3wmld5Ka17I89K5msFZZnmhdk5y1iOyoeY3hP8bQgo5fNSaRgp6FIGpiU3z5sKTvEBJ8c6VmaS79PyDHYMHtNqv8FWRWmrY2cHlA3AFu9kyLwZpqIAWmiseRwZFRzFqF5rUtzPfwu0rxrxyJCVIbno4mrgjD5WP5CFXgAMrb9IxvvAteyEGmgs8Lvf5rLAqvyxASEA6FboVWVTPbwSCCx4SaknSMQlpIueBfbQFPQAnvZWiqFTi5A8CER6hdngTvNDXs2HjlCpJYphlkT7DRwwA6LUP2BwtKHBVAo3gR7wwexkoy0oRbA5cHwZtt1peKLp7gj2L2R3lcgtecll4lpcDo1GvBrwJAgkhDXwNZCRbVaCypqszwzET6XMv9ehWsLM5XvIaRFG6Oxmx12YzsggT22tPZP3dz6hzflpGsS7GgD\");\n            yield return (HashHigh: 0x586d70310b7b0495UL, HashLow: 0x58793064f61ffc57UL, Seed: 0x104dff97b01e2965L,\n                Ascii:\n                \"OeWmLYqrzy5uyrJpXEdAKKylrcZqYQ3vcpqZ5qMNlhCR2cSVfKIImaObd0qLjRPXXtHA3Ql0vBXbWRKXcCTxLpVAiPRx39Rgc8F6tMTBhLKh3rIq3ZU8r21tsdsnsnmHfxFgdcRTjdacf3Ml8eQIH8eelifyq3po08CvFbR1WF4DCDuRNCBd8THV6eTVMumdzRG2L9Vr2qVDsRkSzaDKAghjfLrnhxbDxtcXJKA8Lw9aIFJSNozCtGDot21N92AXwf3kZvikQGhV5QZMDJ39WrI1SdjfCOlQZrPRjX85HM3tJIoaBwRw57w8nYCIxehAMCQ1fAWMgdb2AfLhE9soOJaiLpbf0XurnnQXqb3Uy5DVhBUFQ4MLxdwHEzhQRwcnjeOo5iDW81WPtqQCYp7OueHrRWifcINoafhfqS0A7QenNkMsKwCjsJmYRfcyqzu6P1FzBdr7QTIyINomxHE5uD6pgtGF0HoM3TnaVwsTOaEnniG7CiOsV1knedfzG65NDXYk4zauhOdr5kBORn1dkPwYXr1fZJ0FciuyauTpN7pSWmpvihiUaiuNZsprWmENYhri5NT7GlrIdlMLyM2jztAiZI0ZCGV4It1WSv691Nlfc9TPBWFxaPK9Qibx16VY7JDheIxrDxw31F3NetfAytzINetjw28OYm8iiulIAqTrhZOoebesbnT2c2BkkWgCVVJpxmtR9RGDaiMag9fzQ6QTZK3Rh8vuKdJc8Gi7Nh1sK3DAqTcTzkW5LNNrQXSyLEbkxxEEvl3lm4RSoZ3GMXfjbwkKI22PMce4YXeLP9KtKopHvbgQpJ5JLw5X5QKDyhB64f8tbbnNMDdTYPka7ywOoVEsNzYhnT9mYfwNR8sYrzqCFxWuwE8USYoXdzkvjzomC9lxLKO9N1s0cg2Dk0yUilnBHxmk49STdIaohJO3eA3Pja3Zrw0Ua2ZriE6rvIgBv2cZEb6JSalwDyYhCOSwYPN5SqQArXtG8MoQXfO0nhGzh3AMDuS4Go3BaEXH\" +\n                \"I6fcziqxna6gz3TOFO4a8XOFokCrDcPBArj6zlfAqfuAwD4wbjnmTUlTA8boOHPyZ0LFaKek5DOftarl7HO7XIzVZ23X0KgKNhxOHh3S439t6HpkUqxWb8nAf6jLSVDHKbPXVGHorGnMbSyZb49BQKGidNnHZQoxT2DOmQuhOJHs31cbriBIrQKAQZaAvsVLa2vn8YbjguekDWBFqk3Q4V26Xmrm4McUUuIwHG6pCUXDyGeYANgcy6r2Ngw6DrueDQo3tTJn2xO1258T82KQbmK73LKo1ZDdCt7S6plQ1tEsJYL9bDcr0e0DhZH51NGnEZcLhnG0z83NQmfoaj7eeijY0MehsOCfWKIZu9lemMwmblrVZrTlsWA8kvHRFgLWrKGjzjVaN30dEZFpp3nN5B3WQ54oqjqCRLMDJUUBW6oTa15sBBq8zljziyJRFlNlQJyVKViGB2ZJEZC4l3Td0LLsimO2XyQKqq4rFZe7B6QVeG8xly84d3QfYatQqVqN1IkD9u2SUzfhs15Qmg9vGmtWLbbaTbjmYwTm58geEcBIQwTyUkl6HUdBGs1oaKL7kFevkXEGWjt1yOXLyUOwA0mi2XKOp3sXDZXZFeQYMC23UuA4RDvL4cyBNel9pTNOlw1UzR1kD5Mn36Mcmsm42i5lZrk1CoLpXanfS1aNuiK40ZcXyDvnszDQ3fOGCbRND8seacADmdpKFczhKe0f6dIJcMVNrWYUAuOjz29uyZfeALqc2OamzLV4LdpSbaebG4qDEcE5N4SQLRSvvdJvBkbmdllZ1IEWE64Ol8Ti22jlWTsrT6BWyXhm4D08K3v5UDVCwVbRwLLeGdBvoG31AU3KOfJWmDWthtlLdIigz1hatt0TWSB4vmfp7H6gVzFjK4e9HhofapuVpbE7duSsMcHVGZsQeS2DucQdjogVEHOFJ4XqTsIK8v4qvRyeGnQf5LHXlp49tKfffvGSRlmQaniYIjKXEVKYOs3QNwCDmRMOUb1kRngiKwnWkmz5EveB\" +\n                \"idPy67bwr05B7MQxSVsh3eXfjIrWw2AiiYC33Lthhrs07S9ALFGlfDhv3L2tejbBQ7NjBe0AT8NV4U1Q80quhJwCbybUWcLbf7GklusePDCzLURqrbn253MXP9vfgAedNniqRj4hks9XFoTd5pijUw6H1sxtYQsFXe4DcJyvRiS0tWOGxVJQrnZq6TEZPHo0Wj8xjIKtauJQihtOlU8ZRTdOdqiIcJf7f5erUBc3TDkKixLoxhh1fFYnLp9fPrc7I1ylCthBI3e3WFJGRZurCNwzBzCrhPQ0wLl7Z3fVz3cCfST4oaVsro55KRZ2RHgBx8JXMmaqLTFFp40d4JlPAE88HCzjX5TViHO1RNIVE2ajcGCVYB81pc4fgb9Dw3i8vIUpMYG06P2UDegFKVmsOR8gcfPwQOObdHDPSjBGK8uPgUd1NhbsgSGSV9KWlXciINbE5lqY0tticBerp7oS5lSag2UrAXizgVu1GaKSm9h98k5GZubwDDQbmSQ9jNyqg9u7CF6dpUoiF5rGVqps25Tg7B6vYYkydoaynDtvFf27XGw8N9XQUr5L7jxmYi50xCdQZhjxPpE76Wm5haYbTmrcqw2rm1tSFBk8x87f3cRrFjngfTA2aMD7bOENJyfPmHeFG9CpweDZSbzCb6Xasr0sGUmtDcb2gPoOV38BBOGkudVaK0jDgUXSy9a8sLJUHSM3hRxlcAX8VKhcd827830yRK7uUj39Xwwhl7WwPcX9vyt1QH7IpcqqvSSsXuGQWheBmIRjjpViU7q5rGSJtn339cYmtwiHFOHN5m60Qx3rcu6nyAl8uTjBHcGxum4oNz7f168MPvtxvmY57WVzNkekJYMyDQIeZEvNJtyogE6V0Uq2wbJwjwwQ0lOveOj2Jm0qDltUU9yOsYzBT6Vl417IZ3ib9JfeaVep4A94PoiP5jhuKqTDSH7j87UcMBToMe3X1CB7u1XrSjdYe1YckTdVvWXAAr3JqzdxkCdLWaSTV2Dgzyna6BmPCnBvpYuW\" +\n                \"eRdmqLDlMDY3CMnJzHxu7Dte0qm5K0o0gVEkfjcgQ2MUpf1KQQCpsR6vsbFezLcJcMOH0dmFmujKY1KLbkcCY7MofrD1jafg3Tdt9JiQCi7aiutMXBpAOow9WgUXqnPIm0mE4ypiyMLiMpzjPoM9KAQoOeEIfkRRuvberQhtmFPJXD0hvQ0amYuEICOJ7P7iAt7jW14yGO7zemL2MGJlgMf0Zxzj18d4mWgaBLGXyFIBbaCpItwvL9pNQmIJugOWYvqYZ7mTROxSAfKaFvWPLOiQrp5WqzJ8g7Qyv71aNpDhFNxUnwfBWXlVNHKPSfLbTvmPhUpOrypMjE8x4Sk9V9sJpJ08DEg3nC5bLvmG0yMeoIWXQTOcQRyfCehc36HHvdoE7QYYlJ0YQrq9aDLTweLvpIpPBUOaEpWcaDmZV9xnOr4H9x12L7qevGx9KswaxATacXKvkR77FbeapXpEvvNqWEtP4zGbJ9UjbkgqM9s01SUCiiocFOkrZrvWaZrUxnhW9yenrI5P4px77cWAkqtFG1EbkcTNewS49UFnBEW3BTbgO5n9uWdfVS4L7eo8yyzdOSjWxXqXaxjHwrNEKz8TMTiwSe9a8j3Qtea0DiiYkkmhem38E73c9pBqP1Yd95pRrHKQ4tILPgT1WdwAU2EmgdBNbqC8ypDWvvYB12CZwEuckDcx1D7uT3vCkNx2LBDKNFTe2TX0XmX2ei78dAlBmNbhPEHZD4TLkwg7OlzYHvd7RxcR9bMuz7kuonBLuvzR2UqxBWwXvtlX3t6XNFqAHRkvZLry7i6xFowXTEJzYnq97RaHvtc8Cs4qznIjONLsKMvtYDek3awCQoQVBeDdHUIxGtT7gmUXHKF3B87g3ZKHHhXTY4RGLwcGsIFEOUhSPCGhyiiN3SnBaeHCkcKSVs6RWh6zzC7pclGpGemjZ7mcYT4xZihIpdgpoGEBWcggLrWvVVm2HNszMSdxNIHremngBAl9JD7oV1d2BqZfw8sHUg2QHp3zLMdBQLtQ\");\n            yield return (HashHigh: 0xfd77d5586ef464e7UL, HashLow: 0xc05b765025561928UL, Seed: 0x0000000000000000L,\n                Ascii:\n                \"iyWHI6mdPnxxYq6y3OF9nYbygTqAT8PWWoFZtq7PntXBgqqwIhA6vYF4SLIQwN9to5YH2CYIXqJ6ZmTxbw1GJwnUfdOYDtUQgX3ZioRMKDlHdIwjlYPD4wEvPGu3aRl5R0sW9ppujWlpFO7I2CrNVXb4mBxCAgjbRCoONwDStGDirdQeU1Ug5KfwfWYDSUYr2rUfeBV3O4HcH36SgY7LlIqIvKBEBgBnUa9gUMeD5dAyNAlqvRXYrN4IYq0Bmi4X7F5KZIrEcA7lwnQJe1MkYMDWVbChE5XyKqgTdKZey5vURvlboJMpZ1510Ltctp83CiUezqTVwxcZpHtvA05qHaueeMCCvjOsu8qLpvN2WRG7MrRPCZ5v8JlMsqLZ8MYbQxriqUV2K8BSFpJlYZfd86wMDaxDxRzUgDTn1KeLZFbbJtcVDsr87pPxgwl92xAosI1hbfc7iaeVGSqCJjmxnAGeevjcB14u7pjNhLUTT20N973vVGxevjPY9Nr8hUrXhHNpHIavdgdtIQSbOqa9If5rRY1maIHkO7idmUO3fqiu6R5RxWTtTWs0pPwydmqEuqQzHcjvV7y8wrxjbgb5cHbqYTy549sT639zopUGjSMMwqjJzeVqME9n7XIrdQ23zlbq1LNCQ810XHJDx4FFuhpS70m1PclYztHdvOlkuHvI2JwUZgD4TnHwXj1IsGbFXW5ut4MujNZ1tha8nc5T6LmaYsu179wFCX5I1lqZqB4z2Y7nqFS0rkX4SJFBF5PQ0GLnmN3KJYztXC6KlhjFTkKW5HRJiyF9L7dbZQaSfxqVjAm6RzL142sSqlD1eKLfJcpfxTqxoLRnT2sp0adhLTO8jNHS0JPvlTxrWIG0sl7tSc5n0TfhLQJIK8NDZp7nklRVayNRvfSRc0DB0JBPrOMTxmVUkzbKgB9xIgudR17EkhJZlkEGCIxVTPs526N8ULNqv8bqm2MM7CH3eyXUujaxXBHKVbMaUDIkbNVLzDt0k3NixMuRGLDAKujqFzNy\" +\n                \"re5IyNTbMqrG2PpuozrNAJUc2b6Qzvd3vqdNoG7vL89OjF6nRJY5E5kSGzNJbJOMzshVkT2KJYtRFe9kvLsLTlaTGb0sAYqeUMYpVF1cAS89xvBnO4bAMsiYXapLxOkw6EEyhd6nJWnnVX9bKzZYcHcbJwH4lPRzFWa7VMb24lOGws9GCse0IFJ2zU2SszGEFMSjriAfcpSncVrscM5WFedYRtZNXwfGSl6xjcnq3e09ukHC2gtJ5r6l5tqNVAiZE7aolL1DaeXUsxAar9DaRErJ3IttkB2qa4pWNEnA9TKn5xMkx0UUBu7InIedxRlS2t3H6dDUxcOcdIOQ8ocWCNA1LyD84rt3PefPYcVQQuCgMSWcCxdkDr0oEAzhHo930FdF9xwEG4wKHq3h6hnBGlALvCO3Uy70KtpisTRgioIx2emw7EopNbMHKxzgzkyNewh2w9Z30Vm06joWe1qvzCm66SFrmx6nPTHb2X3NU0M7ZW9wJ60agW3fj5NcuErPV8vtZzcPMWEtE8Kj0FX2OUq741UziApFgi8SIl3uw9NzvRxMNv8LZJjmqrWRcs2scrnnxqw9wohmPLYqOAbDRYr5Vqy7LynWwJR2usdgNOGvlc4rTXDYM4TggscpaBGGYgfnBC3JT5EcNa3M13JvQ8HVXt7CSbdZBdyQbrQwblsWEXan7JMNrkl0LZgE04ItpXtBP9Motv5ZpIpKdE0UbL3jQmhksPsARPQsqQ84F63dTc5x6pSnQDlDlWH6TSshc6N8Czc4i2QpPY8HkGt5Xq0kxN0mQBy26cSmKceIKKAKh2tXYWRQS9usNZHYYn2u8wojmvcPFjE58xE43Gz9NgxiDjW5XVVvWxCsdDoGcPFh2KZtbCyosRJ7aJJr5dD2XqmhbAX6UG8QEsgcZQyTsfbzBC3zDfl5blXbyx1hhvra7MvNuK4uy4cnrj9qdL9YgQTyYZkZxQtuf6qPtwQKMbXvyBKD88Fpbzb0vXNItW1O23Y38DsPgB1L7UoNAc80\" +\n                \"EKuAJUaaj6tMVQeGgXQUQDYnTOkJXZPlrDtnrXLFUjYZdhw23ZFlTZNPkiCzQpg0ZarlBYrVELyoXsFLbBO3HV6MHAISFNDpTsjN0FrgaGabTZzRVSr4KRuvT8Q8lZ1j0xft4narUuu8i8SiJK0f9qVxcQZDuUQSB5tvZPj1J4F0L1bJ44S775tGpjx5mUgI3xKyfBBUipgwPSW3X2rcQ20uljePYE4XuzjNLRKmbA7RhD4E8v5wJqiqGDqtEXOEFJFLHD8JAbjAbysd2SSuO4aEufjfyZjLfJ47kL4XvhrCD39X8buY5poRKqWdbHP8OmPEGsjypBijSd1fhaPGegkUAt8friWlEfEHtATfIa8kkF33WrTRpcVH2P64uQtSItVxtL4m6mWeFQIhPe5h2sftSJPKRboiqOx2tkjmXFQxhccBHRkmt90Qpyj4vRR1Eh1UoMbyhhjwaC0j14307KTiz6us73rNotyDi6OjNhEPdID3ysSOJEIAAdrn8rBVGLBLKp16Cxqni49aHb9F5LlWfNjSggUt8RsqTPwSBM78xju6WVsQK8brbA1C7GtvnqYgt1zXRGAuYmHeEz6BhmYNNQVYql2vK4Z2LuYh66hjC4SWbOnk9LnohyyNyohvwF2Er61ZlqpGcsLuQGp5Xxf4JOJbQFnelM0Bk5iGeF4qbXpIN18yxWVoZXxtvehXmiQE4fgEK5L5cIjl5r5wLGc6QtI1oddpLx5Rkpm9pxYstzO50psCEEAUU7KUSKpoapi2KUXoENi1g6PvnDpv6ItiH2MlIVUm514bd6wGO9A5yXZNTjeiDzgbCRI1nuXGapZ9yekZpqONJkKJxfuun2IKPzzD850m7YI87M5PQtU8qQNxYapk5aFlfWh49vHiTQDbEjnn4HveprIfcCMainMT4T4znAtToODoH12Hmu5UydcsoKLNNJAUiUAOIUmlEjYmXEgGEMLEF6kxkoCpncxf5aYo22BImbjAy5TGIo9wEfMuDes8L5EB7GiwSjkl\" +\n                \"eDErSdaakXXBOhCMT8Pb5EhQSlpSgERDUlCbV20E1GRa8xkGNWU3HiyMuXGrhBnlZGBd6t80DpOlptqhHnAYEsMPnDOSY0JrtsaS8SoaFDOjnFL3aLgKgvXnxDK7qALssTObpAz0LLrJ7UhSa7bqMJVFscMTWE5JpSUbQ343fhiKX6fAJWOBasJUOK2xKROH0MToYdYbY7W6NTeELi7S0d7tqPMAVCs4WJcKzUvK7PluHXifcxBsVLo46W0FIatYe5S1fQwUvi2Y4VwXfla84DxrwtFmknNLAq86Fxv5NqVsV1yCMduHbgtI6XoeQ8ioUIx5jLiworGEh9jlnUJgN8cBYZyVgKjBgbE72AJFgSxKlp6tgmSSTkXxjBuY2t3fFJ6Aa8DuUHMwg6ZXPcgnMSNpszvXQyfig06rbvNKm0PhwAIYRrQ9kbNVx201Z5U9jYIuI8dgAG2wOibcKTkPmcWnUB2ijcm0xE6gXHihNPHmJexO9UeTV4m3MgQsSlE54bSL4tDE06nQJ2GsZDJPFAOlHKz2NyrMLg04MNzUfj89Un09afgqOLXoAa49deoqXGgTTT6iM8Fn2TDVMCFMO1t0zhy3mMKyilDSzPdGkSfQ29JotOGboQ3UOUXlYpQTXyrZ36lvhSKqji3jE5TujbViQvOXsnARKvgxDLSXeSdapsx2DXm6KobxrpGKdbMzzIYtfFpxYFy6BUQrkCXDYnVp50WhVtIzJEuDiM0ZYEwRYFhPsormPVNEE90rw6nhL1cznDcKjxDdC3sxh6i4lhG7jdPMpG9RqLYdRsnseCCkJKHUdq55YMEneZpOYjfxdteK8ML8Z24RmMODn3H23ga7QtmboOPAJBG5ahMNQ6DWyGaHqMRz3IUvKfi5nU0Nfpm4j0TdZRh6a9Hu8BtySKHH5Y6NgFToSa6aeGulTIpcik0KixeJgzeVRGpQ0KLHKS5WPfbNTXIUG0iGurgWWo3OSBgPowY50M9yrndhRjjZLLVOTJRZTn8rgdKz4v4c\" +\n                \"wpkOVXr35VWwsGmFKDqa4xv7d2eIHpGPz0d7Ix3NkDe4lVM3ye8qpvzTjdiFMNgDXrEDGYXf8pGigqSxfU0V5PV68gmTl3xyWE4ulMYgmrBPmTCbp7svSLOL9VFp60AAJFzLmrjfaYJikwhh6UkxDH91cLDs9VFFWBcxs9qQSKIoM5bn99HdG4sJovNAfJQIDxaG4DjSeC9RCrtvA7VYUdhiPV4E06sWCMe1hl0pasyhCtgxUqRNA482aq1E2O6GTKrSxSh59HLcOIkKhFvEWmji8YoAQjqMm5rojIjwD2pnLIuSbwc9nOMdIHgRDQlmQhSQykduChqALN5D7lanlUnsR06IRLZrI5IqZTxERYFsnognsBauwdYjraY32mAoBe4cVZn259BDBfcQgxqAH2xoq11rd2hkbNuGozNIAuXu3DfCCEBJrQ7vdYiKKtd9yzk3mx3l3C8yPLLidJksnACUiaFWVke2rVHwULIZ2gH9IsqJIEbrjadgeC4AzC3EmsIGEDB56FOQfwiYxiZl4V7COQ2mvA2s7BW4kXeOYz4N1Tk892b9WgKEZf4ZSUIrc1luqwiMkqjHW3KjvCyPSgsPyk2E8hivCNsX11x3Igu1xJsEBFMIqngYW9Hf44RVzZ9QC737yfKhZ8NIqFjdjXkdUC9nkORpsVGEwEtHDl4kex3mQfRU8XNQj7RpHfNLGuPKryQVX3RIob18ZBxIZzJc9myKAj5q7OMyNGNzwJI51E92weX72GKzfM3mqOe0Nzx6KznLuf4s2ltjSYEWNaezKQaggz7mxchYFXUHkJvoMB482oUTXfRuiIWfCYQw9D1FCQhwI3BHVvIi4y4R55jVThswFcY8JAJ98wRELFaqlICRC15pwfgdlDCdBDFSLpFLuNEXLIQPvncycPYzttF2wMks4YZU1oF5T210MmO7PiOarXeWoTpzFQWOfwEl390den99HoSrVy0egVTXP1jomOeBjpDeYqVyqp2LnXdc0TTvhkMJQmpTSzMSj6o1\" +\n                \"hGWoQDi4BAU5vfstgQcdgt4JvWU9wu0XtHfOtOmXRLkGIOoaR6JteOJ9EnTBt8dF6iMXFDb8V9v1Dtej07gSZA35GMesSOX6X2acTiUeS2LhGeWTGByPJwJMqe7u43noxXLZ4RFCQxv3OcOjvBrTQrt3HUITud2RefPVVVHpdXF2DN3kwBjFnonceJP6pk6MbkVv42oV0tgI9JHGWDOF5CU4mBYYZbKNv4QFgmvZYif7fAiFpuPKa8hW6jsiqVcWGRoUnJXrMYZp9zykNHGS76BcIzCgfSlF1jnZqeZcL2unmjoeyonwyic24B9n7YkSiWSEUmIgLXrqzGp82VXrcq9SRX9BAcn53U9jDQD8L9rksklY158asKiVJwGhj3EQuWpNqTipySKrr8R3xWLebpNCAnAlXckYTJqLZcrl2evBj3YmpfJWgOWkKMfGsluotOAnyLhr6psIe1PVNcYGUrilH1M6H9mF8LcWEuXvigL90roK4Kki3IDarCDSnc1mRzPf0I3v1ROuNNlgqbZNoMbL0TyMZDUq3wFzOf83emI8EHwhXagAd6LsfizcrSnVRraaOEYACDzqFBOjgtz1as0FKlaBSA67teTCKuoAp9XN4WBI0OsVPuY8NaiEkdvq3oPGahfqEHT988koGBqKJiv6GUeoTCQ3FsxOEXkVBlo46fimCNxIoqHKQKXoOoxfkJThKhGDrEK3R8iD4AyP5i3Whjakt0pmiLNTOoIrV0r7aqbvK7KA8NIZl8dXVjGQOtu1VyoLFfZ0nnWKMthJrroPqm83XcmulLWYxcG8lVGOLoilby0sxemMRDWveRqmrWx305h4n9y7wU5fYClZNlcsAC3xPPgDj5Mvf8bDEG4EIpZkvWGyUStN9vdkshPmm4vVMS9Fj25BTvPEix6ZL7MlRXYnQCOB1knysMTJsNPp7GN1YysFIFWRNvE4csYrJGkoeBKwMZVXvhLKgl2hqPyUfRJGGxBdTyuHItBHnQ2eXUtWuCqOXNktMOPReClF\" +\n                \"rP52DQlgQG3BDVHE0BZKc7qD7XTSAdpQmqkzWfT21xfHpwcWecFHDxacJPX97ULpeVAmiP0I3Z1dcI7KqjSbr1shDzyjPspnHgulEvDDzT1a81B3JHADw4jv6rlwn2lFfy3AN2T8nZu5R4hnJcd0PjxV8ylVYStP0aEqQmR5haflXffyH2DHc3w5BjFq59jdZ0aN8D4yapVuOJUPHJIJmFvIhXiZZmoWjGFnF3dKPgUz2AZlnbTINRNbSCSUq2J9q0ZKo3IwdtqyonEH02yrFTn2WGoL1nfepY3vxdXX6FMFKaeLiFs22rXfZ6RkIv5tEZCtJTisJNT055bKWdCcLLCn9jY0s2j3YJs8dHLepjhxe7uAFMytTVq8Y0SE65nhUV832leIZR9JrMmNsmdfI59ABGEh2f6CBJ3ZJFameh0co9BzYBtEtcsajgM6PCOElRJHO9d8xmBRIlmNhBhcGC4BH2oEtFo6tbRnC3FRPsTLsv2yiDNL9UJ3S6lBJfMhkbLdUXCgBjaEXz5TkbNQDaaujQWQkHAVMHIdQ0deOtlvMsYvBCszf9181qAoTDF2ahmDQAnTarUxEn9GN3MHumhjI8Eki3h0hLZzgtoo4ovZwCCZLBeeAX8ycud9oBnn2b6f17peUNURveHuFeAuFz7ZUtXez1BcoflaqyKoq6vh6MGVxnNthBArU4sBP352OLhXIFoEggIP2MGBGpj2LxsXSZhbHrHMRflHSAgrTDqkHKqfjRdSxdEHfXxMkdj4f0FVhZEgOf99IN00YXwXfet2gHQWHfRjsvjzkDTzLoZSy6HQPXYrKnIcgsoAtt4OGkO0LxKXoAZT8Lm9cF1eJHdsAWEMmssd73oV0WXA111iAhf2IOfQW65htyEvP2ljlN9BmA2PLXZGaq2EG0ozV6XqiZ1pgEyyQ2qxRdEoKv8VJQuoWSvK8j6at7V5RjChJVVwL96LdVgvxnSeinlRWWcf5jYljn7SvLPMV9F9fXGNhZGvvnQVfhU0cZtny8k7\" +\n                \"a1MO3gpnke0l1w03ZPgXVOMQH7DcIIy6IJSUNN5FqcubUATqdGWneXEi3HLYlcyO4CflRtGXO4vRSiAJSBla186vSiiJTe6L5t36t0G28hIIMkURDrAFjeB2VhLqVdqsmbDBxq4xxxrAi9KatciNCExmDk9JeHSrFeyjVkbw1SSb96Z4fSxtTyhpI7IiSP5vw9xqGBLUbpfewUaIfmXrwsAoLjurbE5W159x2bkL0b6XF9K0BMLsh7FJpl8Uh84XlDxYVUGYxL1jw9Cc29WAuy5uiCF6ThNw4p0NDlMslMMI6XJN4yz2bd7BJs4wlYFUwKqmwTVJAXoJIghgAX44ix9UxBcMjNWUqkIZa8Xaweh9pOrd7dhdWO2RMS25LD8yKSfan32deCGzcafjv6ZSy7MkiwYuviXpjlK4IJYd6wyitXts86MaP3ATXw472SHnnjLYJP9yBKuwBjdG5HfCUHGQwq5W6UQyoI7U5eszG62rJdr0YGkMuYbs0ayjWDf4gJxDz2UDwdkPH1fDOBIuQSiPcX8PRIELHfgwYseBhppC0PBDU6QAXjjxqRXz6iGHkNOOif67LS3tYOGif4jBPHEQLtbphuCCl2rXnKiRkxQb2LwEeSZVbPnzqlh5cN28bSLiFYpae03M7Cl7zC7oDz3XvthwgqfdZX224veXJzaEjsVOdXZKtNWaI8pf1J55Mq6FH5VRsHgpry86wXMVRrkty9UepTvrvkkHHprBAWuGQAanubxH2TRQrO8FukHKH0XfxxySbvN124hMBBNHysfWUyOhSoHl52AzkoARYTOkMS22MIGpLhuc8i7C2UVUraAZ5C3AhQITe2iVK6tEPHEy7tLFqHxrKpuZGKrc60pdkScSbRXsyF1kIWbc2JNDk4qv2QySbWPIIIz5aL9Pp8kT97QUiLFtdK8O2ghcHTFB8PqMKsg59Ex0Zlh2epGNCXqaqjkXjeMZxgLbqyrmfDMpNzOcgj4d66jhS0JwrFdoPAQOp1ODzJcLLP9eMhDl\");\n        }\n\n        #endregion XxHash128TestData\n    }\n}"
  },
  {
    "path": "test/BloomFilterTest/ImportExportTest.cs",
    "content": "﻿using BloomFilter;\nusing System;\nusing System.Collections;\nusing Xunit;\nusing BloomFilter.Configurations;\nusing System.Collections.Generic;\nusing System.Security.Cryptography;\n\nnamespace BloomFilterTest\n{\n    public class ImportExportTest\n    {\n\n        [Fact]\n        public void ExportToBytes_And_Import()\n        {\n            var bf = (FilterMemory)FilterBuilder.Build(10000, 0.01);\n\n            bf.Add(\"ExportToBytes_And_Import\");\n\n            var bucketBytes = bf.ExportToBytes();\n\n            var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions\n            {\n                BucketBytes = bucketBytes,\n                ExpectedElements = 10000,\n                ErrorRate = 0.01\n            });\n\n\n            Assert.True(bf2.Contains(\"ExportToBytes_And_Import\"));\n        }\n\n        [Fact]\n        public void Export_BitArray_And_Import()\n        {\n            var bf = (FilterMemory)FilterBuilder.Build(10000, 0.01);\n\n            bf.Add(\"Export_BitArray_And_Import\");\n\n            var buckets = bf.Export();\n\n            var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions\n            {\n                Buckets = buckets,\n                ExpectedElements = 10000,\n                ErrorRate = 0.01\n            });\n\n\n            Assert.True(bf2.Contains(\"Export_BitArray_And_Import\"));\n        }\n\n        ////Make sure your local memory is large enough\n        [Theory]\n        [InlineData(4_000)]\n        [InlineData(100_000_000)]\n        //[InlineData(1024 * 1024 * 1024)]\n        //[InlineData(2147483640)]\n        //[InlineData(2147483641)]\n        //[InlineData(2147483647)]\n        //[InlineData(2147483649)]\n        //[InlineData(2147483630)]\n        public void Fill_Export_And_Import_Contains(long expectedElements)\n        {\n            double errorRate = 0.1;\n            var hashMethod = HashMethod.XXHash128;\n\n            var bf = (FilterMemory)FilterBuilder.Build(expectedElements, errorRate, hashMethod);\n\n            var rng = RandomNumberGenerator.Create();\n\n            var len = 1000;\n            var list = new List<byte[]>(len);\n            for (int i = 0; i < len; i++)\n            {\n                var data = new byte[1024];\n                rng.GetBytes(data);\n                list.Add(data);\n            }\n\n            //fill\n            Assert.All(bf.Add(list), r => Assert.True(r));\n\n            var bytes = bf.ExportToBytes();\n\n            var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions()\n            {\n                Method = hashMethod,\n                ExpectedElements = expectedElements,\n                ErrorRate = errorRate,\n                BucketBytes = bytes\n            });\n        \n            //contains\n            Assert.All(bf2.Contains(list), r => Assert.True(r));\n\n            Assert.True(bf2.All(list));\n        }\n\n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/IssuesTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Threading.Tasks;\nusing BloomFilter;\nusing BloomFilter.Configurations;\nusing Xunit;\n\nnamespace BloomFilterTest\n{\n    public class IssuesTest\n    {\n        //Make sure your local memory is large enough\n        [Theory]\n        [InlineData(100_000_000)]\n        //[InlineData(1024 * 1024 * 1024)]\n        //[InlineData(2147483640)]\n        //[InlineData(2147483647)]\n        //[InlineData(2147483641)]\n        //[InlineData(2147483649)]\n        //[InlineData(2147483630)]\n        public void Issues_16(long expectedElements)\n        {\n            double errorRate = 0.0000001;\n            var hashMethod = HashMethod.XXHash128;\n\n            var bf = (FilterMemory)FilterBuilder.Build(expectedElements, errorRate, hashMethod);\n            var bytes = bf.ExportToBytes();\n\n            var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions()\n            {\n                Method = hashMethod,\n                ExpectedElements = expectedElements,\n                ErrorRate = errorRate,\n                BucketBytes = bytes\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/SerializerTest.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Threading.Tasks;\nusing BloomFilter;\nusing BloomFilter.Configurations;\nusing Xunit;\n\nnamespace BloomFilterTest\n{\n    public class SerializerTest\n    {\n        [Theory]\n        [InlineData(10_000)]\n        [InlineData(500_000)]\n        public async Task Serialize(long expectedElements)\n        {\n            double errorRate = 0.0000001;\n            var bf = (FilterMemory)FilterBuilder.Build(expectedElements, errorRate);\n\n            bf.Add(\"ExportToBytes_And_Import\");\n\n            using var ms = new MemoryStream();\n\n            await bf.SerializeAsync(ms);\n\n            ms.Position = 0;\n\n            var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions\n            {\n                ExpectedElements = 10000,\n                ErrorRate = 0.01\n            });\n\n            await bf2.DeserializeAsync(ms);\n\n            Assert.True(bf2.Contains(\"ExportToBytes_And_Import\"));\n            Assert.False(bf2.Contains(\"ExportToBytes_And_Import2\"));\n\n            Assert.Equal(bf.ExpectedElements, bf2.ExpectedElements);\n            Assert.Equal(bf.ErrorRate, bf2.ErrorRate);\n\n            // Check if the length of the stream is equal to the expected length\n            using var ms2 = new MemoryStream();\n\n            await bf2.SerializeAsync(ms2);\n\n            Assert.Equal(ms.Length, ms2.Length);\n\n        }\n\n        //Make sure your local memory is large enough\n        [Theory]\n        [InlineData(100_000_000)]\n        //[InlineData(1024 * 1024 * 1024)]\n        //[InlineData(2147483640)]\n        //[InlineData(2147483647)]\n        //[InlineData(2147483641)]\n        //[InlineData(2147483649)]\n        //[InlineData(2147483630)]\n        public async Task SerializeLarge(long expectedElements)\n        {\n            double errorRate = 0.0000001;\n            var bf = (FilterMemory)FilterBuilder.Build(expectedElements, errorRate);\n\n            bf.Add(\"ExportToBytes_And_Import\");\n\n            using var ms = new MemoryStream();\n\n            await bf.SerializeAsync(ms);\n\n            ms.Position = 0;\n\n            var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions\n            {\n                ExpectedElements = 10000,\n                ErrorRate = 0.01\n            });\n\n            await bf2.DeserializeAsync(ms);\n\n            Assert.True(bf2.Contains(\"ExportToBytes_And_Import\"));\n            Assert.False(bf2.Contains(\"ExportToBytes_And_Import2\"));\n        }\n\n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/Utilitiy.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Security.Cryptography;\nusing System.Text;\n\nnamespace BloomFilterTest\n{\n    static class Utilitiy\n    {\n        private static readonly RandomNumberGenerator Rng = RandomNumberGenerator.Create();\n        private const string Base62 = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n        public static string GenerateString(int length)\n        {\n            if (length < 0) throw new ArgumentOutOfRangeException($\"{nameof(length)} is {length}.\");\n\n            var random = new Random(Guid.NewGuid().GetHashCode());\n            return new string(\n                Enumerable.Repeat(Base62, length)\n                          .Select(s => s[random.Next(s.Length)])\n                          .ToArray());\n        }\n\n        public static byte[] GenerateBytes(int size = 4)\n        {\n            if (size < 0) throw new ArgumentOutOfRangeException($\"{nameof(size)} is {size}.\");\n\n            var buff = new byte[size];\n            Rng.GetBytes(buff);\n            return buff;\n        }\n\n        public static byte[] ToUtf8Bytes(this string s)\n        {\n            return Encoding.UTF8.GetBytes(s);\n        }\n\n        public static byte[] FromHex(this string s)\n        {\n            return Convert.FromHexString(s);\n        }\n\n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/ValueTypeTest.cs",
    "content": "﻿using BloomFilter;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Xunit;\n\nnamespace BloomFilterTest\n{\n    public class ValueTypeTest\n    {\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void Int32(HashMethod hashMethod)\n        {\n            var bf = FilterBuilder.Build(100000, 0.01, hashMethod);\n            var len = 100;\n            var list = new List<int>(len);\n            for (int i = 0; i < len; i++)\n            {\n                list.Add(i);\n            }\n\n            Assert.All(bf.Add(list), r => Assert.True(r));\n            Assert.All(bf.Contains(list), r => Assert.True(r));\n            Assert.True(bf.Contains(list[0]));\n            Assert.True(bf.All(list));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(list), r => Assert.False(r));\n            Assert.False(bf.Contains(list[0]));\n            Assert.False(bf.All(list));\n        }\n\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void Int16(HashMethod hashMethod)\n        {\n            var bf = FilterBuilder.Build(100000, 0.01, hashMethod);\n            var len = 100;\n            var list = new List<short>(len);\n            for (short i = 0; i < len; i++)\n            {\n                list.Add(i);\n            }\n\n            Assert.All(bf.Add(list), r => Assert.True(r));\n            Assert.All(bf.Contains(list), r => Assert.True(r));\n            Assert.True(bf.Contains(list[0]));\n            Assert.True(bf.All(list));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(list), r => Assert.False(r));\n            Assert.False(bf.Contains(list[0]));\n            Assert.False(bf.All(list));\n        }\n\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void Int64(HashMethod hashMethod)\n        {\n            var bf = FilterBuilder.Build(100000, 0.01, hashMethod);\n            var len = 100;\n            var list = new List<long>(len);\n            for (long i = 0; i < len; i++)\n            {\n                list.Add(i);\n            }\n\n            Assert.All(bf.Add(list), r => Assert.True(r));\n            Assert.All(bf.Contains(list), r => Assert.True(r));\n            Assert.True(bf.Contains(list[0]));\n            Assert.True(bf.All(list));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(list), r => Assert.False(r));\n            Assert.False(bf.Contains(list[0]));\n            Assert.False(bf.All(list));\n        }\n\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void Double(HashMethod hashMethod)\n        {\n            var bf = FilterBuilder.Build(100000, 0.01, hashMethod);\n            var len = 100;\n            var list = new List<double>(len);\n            for (var i = 0; i < len; i++)\n            {\n                list.Add(i * 99.99D);\n            }\n\n            Assert.All(bf.Add(list), r => Assert.True(r));\n            Assert.All(bf.Contains(list), r => Assert.True(r));\n            Assert.True(bf.Contains(list[0]));\n            Assert.True(bf.All(list));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(list), r => Assert.False(r));\n            Assert.False(bf.Contains(list[0]));\n            Assert.False(bf.All(list));\n        }\n\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void Float(HashMethod hashMethod)\n        {\n            var bf = FilterBuilder.Build(100000, 0.01, hashMethod);\n            var len = 100;\n            var list = new List<float>(len);\n            for (var i = 0; i < len; i++)\n            {\n                list.Add(i * 99.99F);\n            }\n\n            Assert.All(bf.Add(list), r => Assert.True(r));\n            Assert.All(bf.Contains(list), r => Assert.True(r));\n            Assert.True(bf.Contains(list[0]));\n            Assert.True(bf.All(list));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(list), r => Assert.False(r));\n            Assert.False(bf.Contains(list[0]));\n            Assert.False(bf.All(list));\n        }\n\n\n        [Theory]\n        [InlineData(HashMethod.LCGWithFNV1)]\n        [InlineData(HashMethod.LCGWithFNV1a)]\n        [InlineData(HashMethod.LCGModifiedFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1)]\n        [InlineData(HashMethod.RNGWithFNV1a)]\n        [InlineData(HashMethod.RNGModifiedFNV1)]\n        [InlineData(HashMethod.CRC32)]\n        [InlineData(HashMethod.CRC64)]\n        [InlineData(HashMethod.Adler32)]\n        [InlineData(HashMethod.Murmur3)]\n        [InlineData(HashMethod.Murmur128BitsX64)]\n        [InlineData(HashMethod.Murmur128BitsX86)]\n        [InlineData(HashMethod.SHA1)]\n        [InlineData(HashMethod.SHA256)]\n        [InlineData(HashMethod.SHA384)]\n        [InlineData(HashMethod.SHA512)]\n        [InlineData(HashMethod.XXHash32)]\n        [InlineData(HashMethod.XXHash64)]\n        [InlineData(HashMethod.XXHash3)]\n        [InlineData(HashMethod.XXHash128)]\n        public void Date(HashMethod hashMethod)\n        {\n            var bf = FilterBuilder.Build(100000, 0.01, hashMethod);\n            var len = 100;\n            var list = new List<DateTime>(len);\n            var now = DateTime.Now;\n            for (var i = 0; i < len; i++)\n            {\n                list.Add(now.AddSeconds(i));\n            }\n\n            Assert.All(bf.Add(list), r => Assert.True(r));\n            Assert.All(bf.Contains(list), r => Assert.True(r));\n            Assert.True(bf.Contains(list[0]));\n            Assert.True(bf.All(list));\n\n            bf.Clear();\n\n            Assert.All(bf.Contains(list), r => Assert.False(r));\n            Assert.False(bf.Contains(list[0]));\n            Assert.False(bf.All(list));\n        }\n\n    }\n}\n"
  },
  {
    "path": "test/BloomFilterTest/xunit.runner.json",
    "content": "{\n  \"parallelAlgorithm\": \"aggressive\",\n  \"parallelizeAssembly\": true,\n  \"parallelizeTestCollections\": true,\n  \"stopOnFail\": true,\n  \"showLiveOutput\": true,\n  \"maxParallelThreads\": \"0.5x\"\n}"
  },
  {
    "path": "test/Demo/BloomFilterMemory.cs",
    "content": "﻿using BloomFilter;\nusing System;\n\nnamespace Demo\n{\n    public class BloomFilterMemory\n    {\n        [Test(\"Sample In Memory\")]\n        public void SampleInMem()\n        {\n\n            var names = Enum.GetNames(typeof(HashMethod));\n            foreach (var name in names)\n            {\n                if (Enum.TryParse<HashMethod>(name, out var hm))\n                {\n                    var bf = FilterBuilder.Build(10000000, 0.01, hm);\n                    Sample(bf);\n                }\n            }\n        }\n\n       \n        private void Sample(IBloomFilter bf)\n        {\n\n            bf.Add(\"CAR_CAR_LOG1ssd3\");\n            Console.WriteLine(bf.Contains(\"CAR_CAR_LOG1ssd3\"));\n\n            bf.Clear();\n            Console.WriteLine(bf.Contains(\"CAR_CAR_LOG1ssd3\"));\n\n            bf.Add(\"CAR_CAR_LOG1ssd3\");\n            Console.WriteLine(bf.Contains(\"CAR_CAR_LOG1ssd3\"));\n        }\n    }\n}"
  },
  {
    "path": "test/Demo/BloomFilterRedis.cs",
    "content": "﻿using BloomFilter.Redis;\nusing BloomFilter;\nusing System;\n\nnamespace Demo\n{\n    public class BloomFilterRedis\n    {\n        [Test(\"Sample In Redis\")]\n        public void SampleInRedis()\n        {\n\n            var names = Enum.GetNames(typeof(HashMethod));\n            foreach (var name in names)\n            {\n                if (Enum.TryParse<HashMethod>(name, out var hm))\n                {\n                    var bf = FilterRedisBuilder.Build(\"localhost\", \"bftest\", 5000000, 0.001, hm);\n                    Sample(bf);\n                    bf.Dispose();\n                }\n            }\n        }\n\n\n        private void Sample(IBloomFilter bf)\n        {\n\n            bf.Add(\"CAR_CAR_LOG1ssd3\");\n            Console.WriteLine(bf.Contains(\"CAR_CAR_LOG1ssd3\"));\n\n            bf.Clear();\n            Console.WriteLine(bf.Contains(\"CAR_CAR_LOG1ssd3\"));\n\n            bf.Add(\"CAR_CAR_LOG1ssd3\");\n            Console.WriteLine(bf.Contains(\"CAR_CAR_LOG1ssd3\"));\n        }\n    }\n}"
  },
  {
    "path": "test/Demo/Demo.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGroup>\n\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter.Redis\\BloomFilter.Redis.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter\\BloomFilter.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "test/Demo/Program.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace Demo\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);\n            TestExcute.Excute(typeof(Program));\n\n        }\n    }\n}\n"
  },
  {
    "path": "test/Demo/TestExcute.cs",
    "content": "﻿// ==++==\n//\n//  Copyright (c) . All rights reserved.\n//\n// ==--==\n/* ---------------------------------------------------------------------------\n *\n * Author\t\t\t: v.la\n * Email\t\t\t: v.la@live.cn\n * Created\t\t\t: 2015-08-27\n * Class\t\t\t: TestExcute.cs\n *\n * ---------------------------------------------------------------------------\n * */\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\n\n/// <summary>\n/// Class TestAttribute.\n/// </summary>\npublic class TestAttribute : Attribute\n{\n    /// <summary>\n    /// Description\n    /// </summary>\n    public string Description { get; set; }\n\n    /// <summary>\n    /// Code\n    /// </summary>\n    public string Code { get; set; }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TestAttribute\"/> class.\n    /// </summary>\n    public TestAttribute()\n    {\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TestAttribute\"/> class.\n    /// </summary>\n    /// <param name=\"description\">The description.</param>\n    public TestAttribute(string description, string code = \"\")\n    {\n        Description = description;\n        Code = code;\n    }\n}\n\n/// <summary>\n/// Class TestExcute.\n/// </summary>\npublic static class TestExcute\n{\n    /// <summary>\n    /// Excutes the specified test assembly.\n    /// </summary>\n    /// <param name=\"t\">The t.</param>\n    public static void Excute(Type t)\n    {\n#if NETFULL\n        var dataAccess = Assembly.GetAssembly(t);\n#else\n        var dataAccess = t.GetTypeInfo().Assembly;\n#endif\n\n        IList<ExecuteFunc> list = new List<ExecuteFunc>();\n\n\n        foreach (var type in dataAccess.GetTypes())\n        {\n            var clazz = type.GetConstructor(Type.EmptyTypes);\n            if (clazz == null) continue;\n            foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance))\n            {\n                if (method.GetCustomAttributes(typeof(TestAttribute), false).FirstOrDefault() is TestAttribute attr)\n                {\n                    object instance = Activator.CreateInstance(type);\n                    ExecuteFunc func = new ExecuteFunc(instance, method, attr.Description, attr.Code);\n\n                    list.Add(func);\n                }\n            }\n        }\n\n        if (list.Count > 0)\n        {\n            StringBuilder text = new StringBuilder();\n\n            LrTag(\"Select the use-case\", \"-\", 20);\n\n            for (int i = 0; i < list.Count; i++)\n            {\n                if (string.IsNullOrWhiteSpace(list[i]._code))\n                {\n                    text.AppendFormat(\"[number:{0}] {1}{2}\", i + 1, list[i], Environment.NewLine);\n                }\n                else\n                {\n                    text.AppendFormat(\"[serial:{0},number:{1}] {2}{3}\", i + 1, list[i]._code, list[i], Environment.NewLine);\n                }\n            }\n\n            text.AppendLine(\"\\r\\n[0] \\texit. \");\n            string _display = text.ToString();\n\n            Console.Out.WriteLine(ConsoleColor.Green, _display);\n            Console.Out.Write(\"select>\");\n            string input = Console.ReadLine();\n            while (input != \"0\" && input != \"quit\" && input != \"q\" && input != \"exit\")\n            {\n                if (input.Equals(\"cls\", StringComparison.OrdinalIgnoreCase))\n                {\n                    Console.Clear();\n                }\n\n\n                var findCode = list.FirstOrDefault(w => !string.IsNullOrWhiteSpace(w._code) && w._code == input);\n\n                if (findCode != null)\n                {\n                    Console.Clear();\n                    Console.Out.WriteLine(ConsoleColor.DarkCyan, findCode + \" Running...\");\n                    findCode.Execute();\n                    Console.Out.WriteLine(ConsoleColor.DarkCyan, findCode + \" Complete...\");\n                }\n                else\n                {\n                    if (int.TryParse(input, out int idx))\n                    {\n                        if (idx > 0 && idx <= list.Count)\n                        {\n                            Console.Clear();\n                            Console.Out.WriteLine(ConsoleColor.DarkCyan, list[idx - 1] + \" Running...\");\n                            list[idx - 1].Execute();\n                            Console.Out.WriteLine(ConsoleColor.DarkCyan, list[idx - 1] + \" Complete...\");\n                        }\n                    }\n                }\n                Console.Out.WriteLine();\n                LrTag(\"Select the use -case\", \" -\", 20);\n                Console.Out.WriteLine(ConsoleColor.Green, _display);\n                Console.Out.Write(\"select>\");\n                input = Console.ReadLine();\n            }\n        }\n    }\n\n    /// <summary>\n    /// The space\n    /// </summary>\n    private static readonly string SPACE = \"  \";\n\n    /// <summary>\n    /// Lrs the tag.\n    /// </summary>\n    /// <param name=\"view\">The view.</param>\n    /// <param name=\"tag\">The tag.</param>\n    /// <param name=\"size\">The size.</param>\n    private static void LrTag(string view, string tag, int size)\n    {\n        StringBuilder sb = new StringBuilder();\n\n        for (int i = 0; i < size; i++)\n        {\n            sb.Append(tag);\n        }\n\n        Console.Out.WriteLine(ConsoleColor.Yellow, sb + SPACE + view + SPACE + sb);\n    }\n\n    /// <summary>\n    /// Writes the line.\n    /// </summary>\n    /// <param name=\"writer\">The writer.</param>\n    /// <param name=\"color\">The color.</param>\n    /// <param name=\"format\">The format.</param>\n    /// <param name=\"args\">The arguments.</param>\n    private static void WriteLine(this TextWriter writer,\n        ConsoleColor color,\n        string format,\n        params object[] args)\n    {\n        Console.ForegroundColor = color;\n        writer.WriteLine(format, args);\n        Console.ResetColor();\n    }\n\n    /// <summary>\n    /// Class ExecuteFunc.\n    /// </summary>\n    private class ExecuteFunc\n    {\n        private object _instance;\n\n        private MethodInfo _method;\n\n        private string _description;\n\n        public string _code;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ExecuteFunc\"/> class.\n        /// </summary>\n        /// <param name=\"instance\">The instance.</param>\n        /// <param name=\"method\">The method.</param>\n        /// <param name=\"description\">The description.</param>\n        public ExecuteFunc(object instance, MethodInfo method, string description = \"\", string code = \"\")\n        {\n            _instance = instance;\n            _method = method;\n            _code = code;\n\n            if (string.IsNullOrEmpty(description))\n            {\n                _description = string.Concat(\"\\t\", instance.GetType().FullName, \".\", method.Name);\n            }\n            else\n            {\n                _description = string.Concat(\"\\t\", instance.GetType().FullName, \".\" + method.Name,\n                     \"\\t\", description);\n            }\n        }\n\n        /// <summary>\n        /// Executes this instance.\n        /// </summary>\n        public void Execute()\n        {\n            if (_method.Invoke(_instance, null) is Task task)\n            {\n                task.Wait();\n            }\n        }\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\" /> that represents this instance.\n        /// </summary>\n        /// <returns>A <see cref=\"System.String\" /> that represents this instance.</returns>\n        public override string ToString()\n        {\n            return _description;\n        }\n    }\n}"
  },
  {
    "path": "test/PerformanceTest/GeneralPerformance.cs",
    "content": "﻿using BloomFilter;\nusing BloomFilter.FreeRedis;\nusing BloomFilter.Redis;\nusing FreeRedis;\nusing StackExchange.Redis;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace PerformanceTest\n{\n    public class GeneralPerformance\n    {\n        [Test(\"RedisPerformance\")]\n        public void RedisPerformance()\n        {\n            uint n = 30000;\n            var errRate = 0.01;\n\n            var hashData = Helper.GenerateData(n);\n\n            var redisClient = new RedisClient(\"localhost\");\n\n            var warm_up = new FilterFreeRedis(\"RedisClient\", redisClient, \"RedisPerformance\", n, errRate, HashFunction.Functions[HashMethod.Murmur3]);\n            warm_up.Clear();\n            Console.WriteLine($\"=================== warm_up Performance =================== \");\n            Performance(hashData, warm_up);\n\n            var names = Enum.GetNames(typeof(HashMethod));\n            foreach (var name in names)\n            {\n                if (Enum.TryParse<HashMethod>(name, out var hm))\n                {\n                    redisClient = new RedisClient(\"localhost\");\n                    var bf = new FilterFreeRedis(\"RedisClient\", redisClient, \"RedisPerformance\", n, errRate, HashFunction.Functions[hm]);\n                    bf.Clear();\n                    Console.WriteLine($\"=================== {name} Performance =================== \");\n                    Performance(hashData, bf);\n                }\n            }\n        }\n\n        [Test(\"RedisClusterPerformance\")]\n        public void RedisClusterPerformance()\n        {\n            uint n = 30000;\n            var errRate = 0.01;\n\n            var hashData = Helper.GenerateData(n);\n\n            var configuration = \"127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005\";\n\n            var conn = ConnectionMultiplexer.Connect(configuration);\n            foreach (var entry in conn.GetEndPoints())\n            {\n                var server = conn.GetServer(entry);\n                Console.WriteLine(server.EndPoint + \" \" + server.ServerType);\n            }\n            conn.Dispose();\n\n            var names = Enum.GetNames(typeof(HashMethod));\n            foreach (var name in names)\n            {\n                if (Enum.TryParse<HashMethod>(name, out var hm))\n                {\n                    var bf = FilterRedisBuilder.Build(configuration, \"bftest\", n, errRate, hm);\n                    bf.Clear();\n                    Console.WriteLine($\"=================== {name} Performance =================== \");\n                    Performance(hashData, bf);\n                    bf.Dispose();\n                }\n            }\n        }\n\n        [Test(\"MemoryPerformance\")]\n        public void MemoryPerformance()\n        {\n            uint n = 300000;\n            var errRate = 0.01;\n\n            var hashData = Helper.GenerateData(n);\n\n            var names = Enum.GetNames(typeof(HashMethod));\n            foreach (var name in names)\n            {\n                if (Enum.TryParse<HashMethod>(name, out var hm))\n                {\n                    var bf = FilterBuilder.Build(n, errRate, hm);\n                    Console.WriteLine($\"=================== {name} Performance =================== \");\n                    Performance(hashData, bf);\n                }\n            }\n        }\n\n        private void Performance(IList<byte[]> hashData, IBloomFilter bf)\n        {\n            Stopwatch sw = Stopwatch.StartNew();\n\n            int index = 0;\n            int count = hashData.Count;\n\n            Parallel.ForEach(hashData, (data) =>\n            {\n                bf.Add(data);\n                Interlocked.Increment(ref index);\n            });\n\n            while (index < count) { }\n\n            sw.Stop();\n\n            Console.WriteLine($\"Added Speed {sw.ElapsedMilliseconds}ms\");\n\n            sw.Restart();\n\n            bool hasErr = false;\n\n            int index2 = 0;\n\n            var ret = Parallel.ForEach(hashData, (data) =>\n            {\n                var hasDta = bf.Contains(data);\n                Interlocked.Increment(ref index2);\n                if (!hasDta)\n                {\n                    if (hasErr)\n                        return;\n                    hasErr = true;\n                    Console.WriteLine(\"Error Match!\");\n                }\n            });\n\n            while (index2 < count) { }\n\n            sw.Stop();\n            Console.WriteLine($\"Contains Speed {sw.ElapsedMilliseconds}ms\");\n\n            bf.Dispose();\n        }\n    }\n}"
  },
  {
    "path": "test/PerformanceTest/HashErrRate.cs",
    "content": "﻿using BloomFilter;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Text;\n\nnamespace PerformanceTest\n{\n    public class HashErrRate\n    {\n        [Test(\"Bloom Filter Hash ErrRate\")]\n        public void ErrRateTest()\n        {\n            long n = 100000;\n            double errRate = 0.01;\n\n            var hashData = Helper.GenerateData(n);\n            var probeData = Helper.GenerateData(n * 3);\n\n            Filter bf = FilterBuilder.Build(n, errRate) as Filter;\n            Console.WriteLine($\"Count:{n} Capacity:{bf.Capacity},Hashes:{bf.Hashes},ExpectedElements:{bf.ExpectedElements},ErrorRate:{bf.ErrorRate}\");\n            Console.WriteLine(\"---\");\n\n            var names = Enum.GetNames(typeof(HashMethod));\n            foreach (var name in names)\n            {\n                if (Enum.TryParse<HashMethod>(name, out var hm))\n                {\n                    ErrRateTest(hm, hashData, probeData, n, errRate);\n                }\n            }\n        }\n\n        private void ErrRateTest(HashMethod hashMethod, IList<byte[]> hashData, IList<byte[]> probeData, long n, double p)\n        {\n\n            var bf = FilterBuilder.Build(n, p, hashMethod);\n\n            int inserts = hashData.Count;\n            int errRates = 0;\n            var set = new HashSet<byte[]>();\n\n            Stopwatch sw = Stopwatch.StartNew();\n            foreach (var data in hashData)\n            {\n                if (bf.Contains(data) && !set.Contains(data))\n                {\n                    errRates++;\n                }\n                bf.Add(data);\n                set.Add(data);\n            }\n            sw.Stop();\n\n            int totalErrRates = 0;\n            int probed = 0;\n            foreach (var data in probeData)\n            {\n                if (probed >= inserts)\n                    break;\n                if (!set.Contains(data))\n                {\n                    probed++;\n                    if (bf.Contains(data))\n                    {\n                        totalErrRates++;\n                    }\n                }\n            }\n\n            double errorRate = 100.0 * errRates / inserts;\n            double totalErrorRate = 100.0 * totalErrRates / inserts;\n\n            Console.WriteLine($\"{hashMethod}\");\n            Console.WriteLine($\" Speed:{sw.Elapsed.TotalMilliseconds}ms ErrRate:{errorRate:F3}% ErrTotal:{errRates} Final ErrRate:{totalErrorRate:F3}%\");\n        }\n    }\n}\n"
  },
  {
    "path": "test/PerformanceTest/HashSpeed.cs",
    "content": "﻿using BloomFilter;\nusing BloomFilter.HashAlgorithms;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace PerformanceTest\n{\n    public class HashSpeed\n    {\n        [Test(\"HashPerformance\")]\n        public void Performance()\n        {\n            HashPerformance(new Crc32());\n            HashPerformance(new Crc64());\n            HashPerformance(new Adler32());\n\n            HashPerformance(new HashCryptoSHA1());\n            HashPerformance(new HashCryptoSHA256());\n            HashPerformance(new HashCryptoSHA384());\n            HashPerformance(new HashCryptoSHA512());\n\n            HashPerformance(new LCGWithFNV());\n            HashPerformance(new LCGWithFNV1a());\n            HashPerformance(new LCGModifiedFNV1());\n\n            HashPerformance(new RNGWithFNV1());\n            HashPerformance(new RNGWithFNV1a());\n            HashPerformance(new RNGModifiedFNV1());\n\n\n            HashPerformance(new Murmur32BitsX86());\n            HashPerformance(new Murmur128BitsX64());\n            HashPerformance(new Murmur128BitsX86());\n\n            HashPerformance(new XXHash32());\n            HashPerformance(new XXHash64());\n            HashPerformance(new XXHash3());\n            HashPerformance(new XXHash128());\n        }\n\n        private void HashPerformance(HashFunction hashFunction)\n        {\n            string name = hashFunction.GetType().Name;\n            long m = 1000;\n            int k = 10;\n\n            int count = 100000;\n\n            var bf = new FilterMemory(BloomFilterConstValue.DefaultInMemoryName, m, k, hashFunction, new DefaultFilterMemorySerializer());\n\n            var array = new List<byte[]>();\n\n            for (int i = 0; i < 1000; i++)\n            {\n                array.Add(Helper.GenerateBytes(16));\n            }\n\n            bf.Add(Helper.GenerateString(20));\n\n            Console.WriteLine(name + \":\" + bf);\n\n            int arrayCount = array.Count;\n\n            Helper.Time(name, (n) =>\n            {\n                bf.ComputeHash(array[n % arrayCount]);\n            }, count);\n\n\n            Helper.TimeWithThread($\"{name} {Environment.ProcessorCount} Thread\", (t, n) =>\n            {\n                bf.ComputeHash(array[n % arrayCount]);\n            }, Environment.ProcessorCount, count);\n\n            Helper.TimeWithParallel($\"{name} Parallel\", (n) =>\n            {\n                bf.ComputeHash(array[n % arrayCount]);\n            }, count);\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "test/PerformanceTest/Helper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Security.Cryptography;\nusing System.Threading.Tasks;\n\nnamespace PerformanceTest\n{\n    internal class Helper\n    {\n        private static readonly RandomNumberGenerator Rng = RandomNumberGenerator.Create();\n        private const string Base62 = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n        public static string GenerateString(int length)\n        {\n            if (length < 0) throw new ArgumentOutOfRangeException($\"{nameof(length)} is {length}.\");\n\n            var random = new Random(Guid.NewGuid().GetHashCode());\n            return new string(\n                Enumerable.Repeat(Base62, length)\n                          .Select(s => s[random.Next(s.Length)])\n                          .ToArray());\n        }\n\n        public static byte[] GenerateBytes(int size = 4)\n        {\n            if (size < 0) throw new ArgumentOutOfRangeException($\"{nameof(size)} is {size}.\");\n\n            var buff = new byte[size];\n            Rng.GetBytes(buff);\n            return buff;\n        }\n\n        public static IList<byte[]> GenerateData(long n)\n        {\n            return GenerateData((int)n);\n        }\n\n        public static IList<byte[]> GenerateData(int n)\n        {\n            var random = new Random(Guid.NewGuid().GetHashCode());\n            var set = new HashSet<byte[]>(n);\n            var list = new List<byte[]>(n);\n            for (int i = 0; i < n; i++)\n            {\n                var data = GenerateBytes(random.Next(32, 512));\n                if (!set.Contains(data))\n                {\n                    list.Add(data);\n                }\n                set.Add(data);\n            }\n            return list;\n        }\n\n\n        public static void Time(string name, Action<int> action, int iteration = 1)\n        {\n            TimeExecute(name, () =>\n            {\n                for (int i = 0; i < iteration; i++)\n                {\n                    action(i);\n                }\n            }, iteration);\n        }\n\n        public static void TimeWithThread(string name, Action<int, int> action, int task = 1, int iteration = 1)\n        {\n            TimeExecute(name, () =>\n            {\n                var tasks = new Task[task];\n                var taskCount = iteration / tasks.Length;\n\n                for (int i = 0; i < tasks.Length; i++)\n                {\n                    int t = i;\n                    tasks[i] = Task.Run(() =>\n                    {\n                        for (int x = 0; x < taskCount; x++)\n                        {\n                            action(t, x);\n                        }\n                    });\n                };\n\n                Task.WaitAll(tasks);\n            }, iteration);\n        }\n\n        public static void TimeWithParallel(string name, Action<int> action, int iteration = 1)\n        {\n            TimeExecute(name, () =>\n            {\n                Parallel.For(0, iteration, l =>\n                {\n                    int num = l;\n                    action(num);\n                });\n            }, iteration);\n        }\n\n        private static void TimeExecute(string name, Action action, int iteration = 1)\n        {\n            ConsoleColor currentForeColor = Console.ForegroundColor;\n            Console.ForegroundColor = ConsoleColor.Yellow;\n            Console.WriteLine(name);\n\n            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);\n            int[] gcCounts = new int[GC.MaxGeneration + 1];\n            for (int i = 0; i <= GC.MaxGeneration; i++)\n            {\n                gcCounts[i] = GC.CollectionCount(i);\n            }\n\n            Stopwatch watch = new Stopwatch();\n\n            ulong cycleCount = GetCycleCount();\n            watch.Start();\n\n            action();\n\n            watch.Stop();\n            ulong cpuCycles = GetCycleCount() - cycleCount;\n\n            Console.ForegroundColor = currentForeColor;\n            Console.WriteLine(\"\\tIterations:\\t\" + iteration);\n            Console.WriteLine(\"\\tTime Elapsed:\\t\" + watch.Elapsed.TotalMilliseconds + \"ms\");\n            Console.WriteLine(\"\\tPer Second:\\t\" + (iteration / watch.Elapsed.TotalSeconds).ToString(\"N0\"));\n            Console.WriteLine(\"\\tCPU Cycles:\\t\" + cpuCycles.ToString(\"N0\"));\n            Console.WriteLine(\"\\tMemory:\\t\\t\" + FormatBytesToString(Process.GetCurrentProcess().WorkingSet64));\n\n            for (int i = 0; i <= GC.MaxGeneration; i++)\n            {\n                int count = GC.CollectionCount(i) - gcCounts[i];\n                Console.WriteLine(\"\\tGen \" + i + \": \\t\\t\" + count);\n            }\n\n            Console.WriteLine();\n        }\n\n        private static ulong GetCycleCount()\n        {\n            ulong cycleCount = 0;\n            QueryThreadCycleTime(GetCurrentThread(), ref cycleCount);\n            return cycleCount;\n        }\n\n        [DllImport(\"kernel32.dll\")]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        internal static extern bool QueryThreadCycleTime(IntPtr threadHandle, ref ulong cycleTime);\n\n        [DllImport(\"kernel32.dll\")]\n        internal static extern IntPtr GetCurrentThread();\n\n        public static void PrintMem()\n        {\n            Console.WriteLine(\"Memory:\" + FormatBytesToString(Process.GetCurrentProcess().WorkingSet64));\n        }\n\n        public static string FormatBytesToString(double bytes)\n        {\n            const ulong\n              KB = 1UL << 10,\n              MB = 1UL << 20,\n              GB = 1UL << 30,\n              TB = 1UL << 40,\n              PB = 1UL << 50,\n              EB = 1UL << 60;\n\n            if (bytes > EB)\n                return string.Format(\"{0}EB\", (bytes / EB).ToString(\"F2\"));\n            if (bytes > PB)\n                return string.Format(\"{0}PB\", (bytes / PB).ToString(\"F2\"));\n            if (bytes > TB)\n                return string.Format(\"{0}TB\", (bytes / TB).ToString(\"F2\"));\n            if (bytes > GB)\n                return string.Format(\"{0}GB\", (bytes / GB).ToString(\"F2\"));\n            if (bytes > MB)\n                return string.Format(\"{0}MB\", (bytes / MB).ToString(\"F2\"));\n            if (bytes > KB)\n                return string.Format(\"{0}KB\", (bytes / KB).ToString(\"F2\"));\n            return bytes + \"Byte\";\n        }\n    }\n}"
  },
  {
    "path": "test/PerformanceTest/Issues_2.cs",
    "content": "﻿using BloomFilter;\nusing BloomFilter.Redis;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace PerformanceTest\n{\n    public class Issues_2\n    {\n        [Test(\"Redis Performance\")]\n        public async Task Performance()\n        {\n            var bf = FilterRedisBuilder.Build(\"localhost\", \"bftest\", 100000, 0.01);\n\n            var items = new List<string>();\n\n            var count = 50;\n\n            var rndNum = new Random(Guid.NewGuid().GetHashCode());\n\n            for (int i = 0; i < count; i++)\n            {\n                items.Add(Helper.GenerateString(rndNum.Next(5, 30)));\n            }\n\n            await bf.AddAsync(items);\n\n            var sw = Stopwatch.StartNew();\n\n            await bf.ContainsAsync(items);\n\n            Console.WriteLine(sw.Elapsed);\n        }\n    }\n}"
  },
  {
    "path": "test/PerformanceTest/PerformanceTest.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGroup>\n\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter.FreeRedis\\BloomFilter.FreeRedis.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter.Redis\\BloomFilter.Redis.csproj\" />\n    <ProjectReference Include=\"..\\..\\src\\BloomFilter\\BloomFilter.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "test/PerformanceTest/Program.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace PerformanceTest\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);\n            TestExcute.Excute(typeof(Program));\n        }\n    }\n}\n"
  },
  {
    "path": "test/PerformanceTest/TestExcute.cs",
    "content": "﻿// ==++==\n//\n//  Copyright (c) . All rights reserved.\n//\n// ==--==\n/* ---------------------------------------------------------------------------\n *\n * Author\t\t\t: v.la\n * Email\t\t\t: v.la@live.cn\n * Created\t\t\t: 2015-08-27\n * Class\t\t\t: TestExcute.cs\n *\n * ---------------------------------------------------------------------------\n * */\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\n\n/// <summary>\n/// Class TestAttribute.\n/// </summary>\npublic class TestAttribute : Attribute\n{\n    /// <summary>\n    /// Description\n    /// </summary>\n    public string Description { get; set; }\n\n    /// <summary>\n    /// Code\n    /// </summary>\n    public string Code { get; set; }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TestAttribute\"/> class.\n    /// </summary>\n    public TestAttribute()\n    {\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TestAttribute\"/> class.\n    /// </summary>\n    /// <param name=\"description\">The description.</param>\n    public TestAttribute(string description, string code = \"\")\n    {\n        Description = description;\n        Code = code;\n    }\n}\n\n/// <summary>\n/// Class TestExcute.\n/// </summary>\npublic static class TestExcute\n{\n    /// <summary>\n    /// Excutes the specified test assembly.\n    /// </summary>\n    /// <param name=\"t\">The t.</param>\n    public static void Excute(Type t)\n    {\n#if NETFULL\n        var dataAccess = Assembly.GetAssembly(t);\n#else\n        var dataAccess = t.GetTypeInfo().Assembly;\n#endif\n\n        IList<ExecuteFunc> list = new List<ExecuteFunc>();\n\n\n        foreach (var type in dataAccess.GetTypes())\n        {\n            var clazz = type.GetConstructor(Type.EmptyTypes);\n            if (clazz == null) continue;\n            foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance))\n            {\n                if (method.GetCustomAttributes(typeof(TestAttribute), false).FirstOrDefault() is TestAttribute attr)\n                {\n                    object instance = Activator.CreateInstance(type);\n                    ExecuteFunc func = new ExecuteFunc(instance, method, attr.Description, attr.Code);\n\n                    list.Add(func);\n                }\n            }\n        }\n\n        if (list.Count > 0)\n        {\n            StringBuilder text = new StringBuilder();\n\n            LrTag(\"Select the use-case\", \"-\", 20);\n\n            for (int i = 0; i < list.Count; i++)\n            {\n                if (string.IsNullOrWhiteSpace(list[i]._code))\n                {\n                    text.AppendFormat(\"[number:{0}] {1}{2}\", i + 1, list[i], Environment.NewLine);\n                }\n                else\n                {\n                    text.AppendFormat(\"[serial:{0},number:{1}] {2}{3}\", i + 1, list[i]._code, list[i], Environment.NewLine);\n                }\n            }\n\n            text.AppendLine(\"\\r\\n[0] \\texit. \");\n            string _display = text.ToString();\n\n            Console.Out.WriteLine(ConsoleColor.Green, _display);\n            Console.Out.Write(\"select>\");\n            string input = Console.ReadLine();\n            while (input != \"0\" && input != \"quit\" && input != \"q\" && input != \"exit\")\n            {\n                if (input.Equals(\"cls\", StringComparison.OrdinalIgnoreCase))\n                {\n                    Console.Clear();\n                }\n\n\n                var findCode = list.FirstOrDefault(w => !string.IsNullOrWhiteSpace(w._code) && w._code == input);\n\n                if (findCode != null)\n                {\n                    Console.Clear();\n                    Console.Out.WriteLine(ConsoleColor.DarkCyan, findCode + \" Running...\");\n                    findCode.Execute();\n                    Console.Out.WriteLine(ConsoleColor.DarkCyan, findCode + \" Complete...\");\n                }\n                else\n                {\n                    if (int.TryParse(input, out int idx))\n                    {\n                        if (idx > 0 && idx <= list.Count)\n                        {\n                            Console.Clear();\n                            Console.Out.WriteLine(ConsoleColor.DarkCyan, list[idx - 1] + \" Running...\");\n                            list[idx - 1].Execute();\n                            Console.Out.WriteLine(ConsoleColor.DarkCyan, list[idx - 1] + \" Complete...\");\n                        }\n                    }\n                }\n                Console.Out.WriteLine();\n                LrTag(\"Select the use -case\", \" -\", 20);\n                Console.Out.WriteLine(ConsoleColor.Green, _display);\n                Console.Out.Write(\"select>\");\n                input = Console.ReadLine();\n            }\n        }\n    }\n\n    /// <summary>\n    /// The space\n    /// </summary>\n    private static readonly string SPACE = \"  \";\n\n    /// <summary>\n    /// Lrs the tag.\n    /// </summary>\n    /// <param name=\"view\">The view.</param>\n    /// <param name=\"tag\">The tag.</param>\n    /// <param name=\"size\">The size.</param>\n    private static void LrTag(string view, string tag, int size)\n    {\n        StringBuilder sb = new StringBuilder();\n\n        for (int i = 0; i < size; i++)\n        {\n            sb.Append(tag);\n        }\n\n        Console.Out.WriteLine(ConsoleColor.Yellow, sb + SPACE + view + SPACE + sb);\n    }\n\n    /// <summary>\n    /// Writes the line.\n    /// </summary>\n    /// <param name=\"writer\">The writer.</param>\n    /// <param name=\"color\">The color.</param>\n    /// <param name=\"format\">The format.</param>\n    /// <param name=\"args\">The arguments.</param>\n    private static void WriteLine(this TextWriter writer,\n        ConsoleColor color,\n        string format,\n        params object[] args)\n    {\n        Console.ForegroundColor = color;\n        writer.WriteLine(format, args);\n        Console.ResetColor();\n    }\n\n    /// <summary>\n    /// Class ExecuteFunc.\n    /// </summary>\n    private class ExecuteFunc\n    {\n        private object _instance;\n\n        private MethodInfo _method;\n\n        private string _description;\n\n        public string _code;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ExecuteFunc\"/> class.\n        /// </summary>\n        /// <param name=\"instance\">The instance.</param>\n        /// <param name=\"method\">The method.</param>\n        /// <param name=\"description\">The description.</param>\n        public ExecuteFunc(object instance, MethodInfo method, string description = \"\", string code = \"\")\n        {\n            _instance = instance;\n            _method = method;\n            _code = code;\n\n            if (string.IsNullOrEmpty(description))\n            {\n                _description = string.Concat(\"\\t\", instance.GetType().FullName, \".\", method.Name);\n            }\n            else\n            {\n                _description = string.Concat(\"\\t\", instance.GetType().FullName, \".\" + method.Name,\n                     \"\\t\", description);\n            }\n        }\n\n        /// <summary>\n        /// Executes this instance.\n        /// </summary>\n        public void Execute()\n        {\n            if (_method.Invoke(_instance, null) is Task task)\n            {\n                task.Wait();\n            }\n        }\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\" /> that represents this instance.\n        /// </summary>\n        /// <returns>A <see cref=\"System.String\" /> that represents this instance.</returns>\n        public override string ToString()\n        {\n            return _description;\n        }\n    }\n}"
  }
]