Changing the logic for how we deal with RegexOptions.IgnoreCase matching. (#67184)
authorJose Perez Rodriguez <joperezr@microsoft.com>
Wed, 6 Apr 2022 02:25:24 +0000 (19:25 -0700)
committerGitHub <noreply@github.com>
Wed, 6 Apr 2022 02:25:24 +0000 (22:25 -0400)
* Changing the logic for how we deal with RegexOptions.IgnoreCase
matching.

* Addressing first round of feedback

* Addressing more feedback.

* - Ensure that Backreferences use the same case behavior that the casing table does when using IgnoreCase.
- Addressing more feedback.

* Apply suggestions from code review

Co-authored-by: Stephen Toub <stoub@microsoft.com>
* Address more feedback

* Fix allocation regression for patterns with a lot of ascii letters

* Skip few tests in Browser and .NET Framework

* Skip one more test that shouldn't be ran on wasm

* Address more PR Feedback

* More feedback

* Skip tests that are failing in NLS-globalization queues

Co-authored-by: Stephen Toub <stoub@microsoft.com>
44 files changed:
src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md
src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs
src/libraries/System.Text.RegularExpressions/gen/System.Text.RegularExpressions.Generator.csproj
src/libraries/System.Text.RegularExpressions/src/System.Text.RegularExpressions.csproj
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunner.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunnerFactory.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Debug.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseBehavior.cs [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.Data.cs [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.cs [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.MappingTable.cs [deleted file]
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexFindOptimizations.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexInterpreter.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexLWCGCompiler.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexNode.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexParser.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexPrefixAnalyzer.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexTree.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexWriter.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVector64Algebra.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVectorAlgebra.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/CharSetSolver.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/ICharAlgebra.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/RegexNodeConverter.cs
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/GeneratorHelper.cs [deleted file]
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelation.cs [deleted file]
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelationGenerator.cs [deleted file]
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseTransformer.cs [deleted file]
src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/UnicodeCategoryRangesGenerator.cs
src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexCultureTests.cs
src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexIgnoreCaseTests.cs [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/System.Text.RegularExpressions.Tests.csproj
src/libraries/System.Text.RegularExpressions/tests/UnitTests/RegexFindOptimizationsTests.cs
src/libraries/System.Text.RegularExpressions/tests/UnitTests/System.Text.RegularExpressions.Unit.Tests.csproj
src/libraries/System.Text.RegularExpressions/tools/DataTable.cs [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/tools/Directory.Build.props [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/tools/Directory.Build.targets [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/tools/GenerateRegexCasingTable.csproj [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/tools/Program.cs [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/tools/Readme.md [new file with mode: 0644]
src/libraries/System.Text.RegularExpressions/tools/UnicodeDataCasingParser.cs [new file with mode: 0644]

index fa2e7e6..c7817d1 100644 (file)
@@ -1,6 +1,7 @@
 # Instructions for updating Unicode version in dotnet/runtime
 
 ## Table of Contents
+
 - [Instructions for updating Unicode version in dotnet/runtime](#instructions-for-updating-unicode-version-in-dotnetruntime)
   - [Table of Contents](#table-of-contents)
   - [Overview](#overview)
@@ -24,8 +25,7 @@ This repository has several places that need to be updated when we are ingesting
     - extracted/DerivedBidiClass.txt
     - extracted/DerivedName.txt
 
-2. Once you have downloaded all those files, create a fork of the repo https://github.com/dotnet/runtime-assets and send a PR which creates a folder at `src/System.Private.Runtime.UnicodeData/<YourUnicodeVersion>` and places all of the downloaded files from step 1 there. You can look at a sample PR that did this for Unicode 14.0.0 here: https://github.com/dotnet/runtime-assets/pull/179
-
+2. Once you have downloaded all those files, create a fork of the repo <https://github.com/dotnet/runtime-assets> and send a PR which creates a folder at `src/System.Private.Runtime.UnicodeData/<YourUnicodeVersion>` and places all of the downloaded files from step 1 there. You can look at a sample PR that did this for Unicode 14.0.0 here: <https://github.com/dotnet/runtime-assets/pull/179>
 
 ## Ingest the created package into dotnet/runtime repo
 
@@ -42,6 +42,6 @@ This should be done automatically by dependency-flow, so in theory there shouldn
    - System.Globalization.Nls.Tests.csproj
    - System.Text.Encodings.Web.Tests.csproj
 4. If the new Unicode data contains casing changes/updates, then we will also need to update `src/coreclr/pal/src/locale/unicodedata.cpp` file. This file is used by most of the reflection stack whenever you specify the `BindingFlags.IgnoreCase`. In order to regenerate the contents of the `unicdedata.cpp` file, you need to run the Program located at `src/coreclr/pal/src/locale/unicodedata.cs` and give a full path to the new UnicodeData.txt as a parameter.
-5. If the new Unicode data made changes on what character class a specific character belongs to, or added new characters, you may need to update the serialized Unicode character classes data in `System.Text.RegularExpressions` for the `NonBacktracking` engine. The telling sign that will show you if you need to do this, is if any tests are failing in the `System.Text.RegularExpressions.Tests` test project. In case some tests do fail (which means you need to update the serialized mappings), you will need to edit the file `src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexExperiment.cs` and set the `Enabled` bool to `true`, and re-run the RegexTests. This will generate a couple of files in your `%temp%` directory: `IgnoreCaseRelation.cs` and `UnicodeCategoryRanges.cs`. These files will need to be copied (and overwrite the existing ones) to the folder `src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/`
+5. Update the Regex casing equivalence table using the UnicodeData.txt file from the new Unicode version. You can find the instructions on how to do this [here](../../../System.Text.RegularExpressions/tools/Readme.md).
 6. Finally, last step is to update the license for the Unicode data into our [Third party notices](../../../../../THIRD-PARTY-NOTICES.TXT) by copying the contents located in `https://www.unicode.org/license.html` to the section that has the Unicode license in our notices.
 7. That's it, now commit all of the changed files, and send a PR into dotnet/runtime with the updates. If there were any special things you had to do that are not noted on this document, PLEASE UPDATE THESE INSTRUCTIONS to facilitate future updates.
index 0d42d4c..c65e518 100644 (file)
@@ -161,6 +161,27 @@ namespace System.Text.RegularExpressions.Generator
             writer.WriteLine($"        // Description:");
             DescribeExpression(writer, rm.Tree.Root.Child(0), "        // ", analysis); // skip implicit root capture
             writer.WriteLine();
+            if (rm.Tree.Culture != null)
+            {
+                // If the RegexTree has Culture set, then we need to emit the _textInfo field that should be used at match time for casing operations.
+                // Instead of just using the culture set on the tree, we use it to check which behavior corresponds to the culture, and based on that we
+                // create a TextInfo based on a well-known culture that has the same behavior. This is done in order to ensure that the culture being used at
+                // runtime will be supported no matter where the code ends up running.
+                writer.WriteLine($"        /// <summary>TextInfo that will be used for Backreference case comparisons.</summary>");
+                switch (RegexCaseEquivalences.GetRegexBehavior(rm.Tree.Culture))
+                {
+                    case RegexCaseBehavior.Invariant:
+                        writer.WriteLine($"        private readonly TextInfo _textInfo = CultureInfo.InvariantCulture.TextInfo;");
+                        break;
+                    case RegexCaseBehavior.NonTurkish:
+                        writer.WriteLine($"        private readonly TextInfo _textInfo = CultureInfo.GetCultureInfo(\"en-US\").TextInfo;");
+                        break;
+                    case RegexCaseBehavior.Turkish:
+                        writer.WriteLine($"        private readonly TextInfo _textInfo = CultureInfo.GetCultureInfo(\"tr-TR\").TextInfo;");
+                        break;
+                }
+                writer.WriteLine();
+            }
             writer.WriteLine($"        /// <summary>Scan the <paramref name=\"inputSpan\"/> starting from base.runtextstart for the next match.</summary>");
             writer.WriteLine($"        /// <param name=\"inputSpan\">The text being scanned by the regular expression.</param>");
             writer.WriteLine($"        protected override void Scan(ReadOnlySpan<char> inputSpan)");
@@ -385,7 +406,6 @@ namespace System.Text.RegularExpressions.Generator
         {
             RegexOptions options = (RegexOptions)rm.Options;
             RegexTree regexTree = rm.Tree;
-            bool hasTextInfo = false;
             bool rtl = (options & RegexOptions.RightToLeft) != 0;
 
             // In some cases, we need to emit declarations at the beginning of the method, but we only discover we need them later.
@@ -429,39 +449,31 @@ namespace System.Text.RegularExpressions.Generator
                 {
                     // Either anchors weren't specified, or they don't completely root all matches to a specific location.
 
-                    // If whatever search operation we need to perform entails case-insensitive operations
-                    // that weren't already handled via creation of sets, we need to get an store the
-                    // TextInfo object to use (unless RegexOptions.CultureInvariant was specified).
-                    EmitTextInfo(writer, ref hasTextInfo, rm);
-
                     // Emit the code for whatever find mode has been determined.
                     switch (regexTree.FindOptimizations.FindMode)
                     {
-                        case FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive:
-                            Debug.Assert(!string.IsNullOrEmpty(regexTree.FindOptimizations.LeadingCaseSensitivePrefix));
-                            EmitIndexOf_LeftToRight(regexTree.FindOptimizations.LeadingCaseSensitivePrefix);
+                        case FindNextStartingPositionMode.LeadingPrefix_LeftToRight:
+                            Debug.Assert(!string.IsNullOrEmpty(regexTree.FindOptimizations.LeadingPrefix));
+                            EmitIndexOf_LeftToRight(regexTree.FindOptimizations.LeadingPrefix);
                             break;
 
-                        case FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive:
-                            Debug.Assert(!string.IsNullOrEmpty(regexTree.FindOptimizations.LeadingCaseSensitivePrefix));
-                            EmitIndexOf_RightToLeft(regexTree.FindOptimizations.LeadingCaseSensitivePrefix);
+                        case FindNextStartingPositionMode.LeadingPrefix_RightToLeft:
+                            Debug.Assert(!string.IsNullOrEmpty(regexTree.FindOptimizations.LeadingPrefix));
+                            EmitIndexOf_RightToLeft(regexTree.FindOptimizations.LeadingPrefix);
                             break;
 
-                        case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive:
-                        case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive:
-                        case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseSensitive:
-                        case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive:
+                        case FindNextStartingPositionMode.LeadingSet_LeftToRight:
+                        case FindNextStartingPositionMode.FixedSets_LeftToRight:
                             Debug.Assert(regexTree.FindOptimizations.FixedDistanceSets is { Count: > 0 });
                             EmitFixedSet_LeftToRight();
                             break;
 
-                        case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive:
-                        case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseInsensitive:
+                        case FindNextStartingPositionMode.LeadingSet_RightToLeft:
                             Debug.Assert(regexTree.FindOptimizations.FixedDistanceSets is { Count: > 0 });
                             EmitFixedSet_RightToLeft();
                             break;
 
-                        case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive:
+                        case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight:
                             Debug.Assert(regexTree.FindOptimizations.LiteralAfterLoop is not null);
                             EmitLiteralAfterAtomicLoop();
                             break;
@@ -692,8 +704,8 @@ namespace System.Text.RegularExpressions.Generator
             // and potentially other sets at other fixed positions in the pattern.
             void EmitFixedSet_LeftToRight()
             {
-                List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? sets = regexTree.FindOptimizations.FixedDistanceSets;
-                (char[]? Chars, string Set, int Distance, bool CaseInsensitive) primarySet = sets![0];
+                List<(char[]? Chars, string Set, int Distance)>? sets = regexTree.FindOptimizations.FixedDistanceSets;
+                (char[]? Chars, string Set, int Distance) primarySet = sets![0];
                 const int MaxSets = 4;
                 int setsToUse = Math.Min(sets.Count, MaxSets);
 
@@ -705,7 +717,7 @@ namespace System.Text.RegularExpressions.Generator
                 // If we can use IndexOf{Any}, try to accelerate the skip loop via vectorization to match the first prefix.
                 // We can use it if this is a case-sensitive class with a small number of characters in the class.
                 int setIndex = 0;
-                bool canUseIndexOf = !primarySet.CaseInsensitive && primarySet.Chars is not null;
+                bool canUseIndexOf = primarySet.Chars is not null;
                 bool needLoop = !canUseIndexOf || setsToUse > 1;
 
                 FinishEmitBlock loopBlock = default;
@@ -785,7 +797,7 @@ namespace System.Text.RegularExpressions.Generator
                         for (; setIndex < setsToUse; setIndex++)
                         {
                             string spanIndex = $"span[i{(sets[setIndex].Distance > 0 ? $" + {sets[setIndex].Distance}" : "")}]";
-                            string charInClassExpr = MatchCharacterClass(hasTextInfo, options, spanIndex, sets[setIndex].Set, sets[setIndex].CaseInsensitive, negate: false, additionalDeclarations, requiredHelpers);
+                            string charInClassExpr = MatchCharacterClass(options, spanIndex, sets[setIndex].Set, negate: false, additionalDeclarations, requiredHelpers);
 
                             if (setIndex == start)
                             {
@@ -815,13 +827,13 @@ namespace System.Text.RegularExpressions.Generator
             // (Currently that position will always be a distance of 0, meaning the start of the pattern itself.)
             void EmitFixedSet_RightToLeft()
             {
-                (char[]? Chars, string Set, int Distance, bool CaseInsensitive) set = regexTree.FindOptimizations.FixedDistanceSets![0];
+                (char[]? Chars, string Set, int Distance) set = regexTree.FindOptimizations.FixedDistanceSets![0];
                 Debug.Assert(set.Distance == 0);
 
                 writer.WriteLine($"// The pattern begins with {DescribeSet(set.Set)}.");
                 writer.WriteLine($"// Find the next occurrence. If it can't be found, there's no match.");
 
-                if (set.Chars is { Length: 1 } && !set.CaseInsensitive)
+                if (set.Chars is { Length: 1 })
                 {
                     writer.WriteLine($"pos = inputSpan.Slice(0, pos).LastIndexOf({Literal(set.Chars[0])});");
                     using (EmitBlock(writer, "if (pos >= 0)"))
@@ -834,7 +846,7 @@ namespace System.Text.RegularExpressions.Generator
                 {
                     using (EmitBlock(writer, "while ((uint)--pos < (uint)inputSpan.Length)"))
                     {
-                        using (EmitBlock(writer, $"if ({MatchCharacterClass(hasTextInfo, options, "inputSpan[pos]", set.Set, set.CaseInsensitive, negate: false, additionalDeclarations, requiredHelpers)})"))
+                        using (EmitBlock(writer, $"if ({MatchCharacterClass(options, "inputSpan[pos]", set.Set, negate: false, additionalDeclarations, requiredHelpers)})"))
                         {
                             writer.WriteLine("base.runtextpos = pos + 1;");
                             writer.WriteLine("return true;");
@@ -900,7 +912,7 @@ namespace System.Text.RegularExpressions.Generator
 
                     // We found the literal.  Walk backwards from it finding as many matches as we can against the loop.
                     writer.WriteLine("int prev = i - 1;");
-                    using (EmitBlock(writer, $"while ((uint)prev < (uint)slice.Length && {MatchCharacterClass(hasTextInfo, options, "slice[prev]", target.LoopNode.Str!, caseInsensitive: false, negate: false, additionalDeclarations, requiredHelpers)})"))
+                    using (EmitBlock(writer, $"while ((uint)prev < (uint)slice.Length && {MatchCharacterClass(options, "slice[prev]", target.LoopNode.Str!, negate: false, additionalDeclarations, requiredHelpers)})"))
                     {
                         writer.WriteLine("prev--;");
                     }
@@ -928,31 +940,6 @@ namespace System.Text.RegularExpressions.Generator
                     indexOfFoundBlock.Dispose();
                 }
             }
-
-            // If a TextInfo is needed to perform ToLower operations, emits a local initialized to the TextInfo to use.
-            static void EmitTextInfo(IndentedTextWriter writer, ref bool hasTextInfo, RegexMethod rm)
-            {
-                // Emit local to store current culture if needed
-                if ((rm.Options & RegexOptions.CultureInvariant) == 0)
-                {
-                    bool needsCulture = rm.Tree.FindOptimizations.FindMode switch
-                    {
-                        FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseInsensitive or
-                        FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive or
-                        FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive => true,
-
-                        _ when rm.Tree.FindOptimizations.FixedDistanceSets is List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> sets => sets.Exists(set => set.CaseInsensitive),
-
-                        _ => false,
-                    };
-
-                    if (needsCulture)
-                    {
-                        hasTextInfo = true;
-                        writer.WriteLine("TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;");
-                    }
-                }
-            }
         }
 
         /// <summary>Emits the body of the TryMatchAtCurrentPosition.</summary>
@@ -1007,7 +994,6 @@ namespace System.Text.RegularExpressions.Generator
             writer.WriteLine("int pos = base.runtextpos;");
             writer.WriteLine($"int matchStart = pos;");
             bool hasTimeout = EmitLoopTimeoutCounterIfNeeded(writer, rm);
-            bool hasTextInfo = EmitInitializeCultureForTryMatchAtCurrentPositionIfNecessary(writer, rm, analysis);
             writer.Flush();
             int additionalDeclarationsPosition = ((StringWriter)writer.InnerWriter).GetStringBuilder().Length;
             int additionalDeclarationsIndent = writer.Indent;
@@ -1112,12 +1098,6 @@ namespace System.Text.RegularExpressions.Generator
                 writer.Indent--;
             }
 
-            // Whether the node has RegexOptions.IgnoreCase set.
-            // TODO: https://github.com/dotnet/runtime/issues/61048. We should be able to delete this and all usage sites once
-            // IgnoreCase is erradicated from the tree.  The only place it should possibly be left after that work is in a Backreference,
-            // and that can do this check directly as needed.
-            static bool IsCaseInsensitive(RegexNode node) => (node.Options & RegexOptions.IgnoreCase) != 0;
-
             // Slices the inputSpan starting at pos until end and stores it into slice.
             void SliceInputSpan(bool defineLocal = false)
             {
@@ -1220,9 +1200,7 @@ namespace System.Text.RegularExpressions.Generator
                     for (int i = 0; i < childCount && useSwitchedBranches; i++)
                     {
                         // If it's not a One, Multi, or Set, we can't apply this optimization.
-                        // If it's IgnoreCase (and wasn't reduced to a non-IgnoreCase set), also ignore it to keep the logic simple.
-                        if (node.Child(i).FindBranchOneMultiOrSetStart() is not RegexNode oneMultiOrSet ||
-                            IsCaseInsensitive(oneMultiOrSet))
+                        if (node.Child(i).FindBranchOneMultiOrSetStart() is not RegexNode oneMultiOrSet)
                         {
                             useSwitchedBranches = false;
                             break;
@@ -1303,7 +1281,6 @@ namespace System.Text.RegularExpressions.Generator
 
                             RegexNode? childStart = child.FindBranchOneMultiOrSetStart();
                             Debug.Assert(childStart is not null, "Unexpectedly couldn't find the branch starting node.");
-                            Debug.Assert(!IsCaseInsensitive(childStart), "Expected only to find non-IgnoreCase branch starts");
 
                             if (childStart.Kind is RegexNodeKind.Set)
                             {
@@ -1572,7 +1549,7 @@ namespace System.Text.RegularExpressions.Generator
                     additionalDeclarations.Add("int matchLength = 0;");
                     writer.WriteLine($"matchLength = base.MatchLength({capnum});");
 
-                    bool caseInsensitive = IsCaseInsensitive(node);
+                    bool caseInsensitive = (node.Options & RegexOptions.IgnoreCase) != 0;
 
                     if ((node.Options & RegexOptions.RightToLeft) == 0)
                     {
@@ -1599,7 +1576,7 @@ namespace System.Text.RegularExpressions.Generator
                             writer.WriteLine($"matchIndex = base.MatchIndex({capnum});");
                             using (EmitBlock(writer, $"for (int i = 0; i < matchLength; i++)"))
                             {
-                                using (EmitBlock(writer, $"if ({ToLower(hasTextInfo, options, $"inputSpan[matchIndex + i]")} != {ToLower(hasTextInfo, options, $"{sliceSpan}[i]")})"))
+                                using (EmitBlock(writer, $"if (_textInfo.ToLower(inputSpan[matchIndex + i]) != _textInfo.ToLower({sliceSpan}[i]))"))
                                 {
                                     Goto(doneLabel);
                                 }
@@ -1622,7 +1599,9 @@ namespace System.Text.RegularExpressions.Generator
                         writer.WriteLine($"matchIndex = base.MatchIndex({capnum});");
                         using (EmitBlock(writer, $"for (int i = 0; i < matchLength; i++)"))
                         {
-                            using (EmitBlock(writer, $"if ({ToLowerIfNeeded(hasTextInfo, options, $"inputSpan[matchIndex + i]", caseInsensitive)} != {ToLowerIfNeeded(hasTextInfo, options, $"inputSpan[pos - matchLength + i]", caseInsensitive)})"))
+                            using (EmitBlock(writer, caseInsensitive ?
+                                $"if (_textInfo.ToLower(inputSpan[matchIndex + i]) != _textInfo.ToLower(inputSpan[pos - matchLength + i]))" :
+                                $"if (inputSpan[matchIndex + i] != inputSpan[pos - matchLength + i])"))
                             {
                                 Goto(doneLabel);
                             }
@@ -2132,7 +2111,7 @@ namespace System.Text.RegularExpressions.Generator
             {
                 // Before we handle general-purpose matching logic for nodes, handle any special-casing.
                 // -
-                if (rm.Tree.FindOptimizations.FindMode == FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive &&
+                if (rm.Tree.FindOptimizations.FindMode == FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight &&
                     rm.Tree.FindOptimizations.LiteralAfterLoop?.LoopNode == node)
                 {
                     Debug.Assert(sliceStaticPos == 0, "This should be the first node and thus static position shouldn't have advanced.");
@@ -2212,7 +2191,7 @@ namespace System.Text.RegularExpressions.Generator
                         EmitSingleChar(node, emitLengthChecksIfRequired);
                         return;
 
-                    case RegexNodeKind.Multi when !IsCaseInsensitive(node) && (node.Options & RegexOptions.RightToLeft) == 0:
+                    case RegexNodeKind.Multi when (node.Options & RegexOptions.RightToLeft) == 0:
                         EmitMultiChar(node, emitLengthChecksIfRequired);
                         return;
 
@@ -2388,10 +2367,10 @@ namespace System.Text.RegularExpressions.Generator
                                     sliceStaticPos += caseInsensitiveString.Length;
                                     i += nodesConsumed - 1;
                                 }
-                                else if (child.Kind is RegexNodeKind.Multi && !IsCaseInsensitive(child))
+                                else if (child.Kind is RegexNodeKind.Multi)
                                 {
                                     WritePrefix();
-                                    EmitMultiCharString(child.Str!, caseInsensitive: false, emitLengthCheck: false, clauseOnly: true, rightToLeft: false);
+                                    EmitMultiCharString(child.Str!, emitLengthCheck: false, clauseOnly: true, rightToLeft: false);
                                     prevDescription = DescribeNode(child, analysis);
                                     wroteClauses = true;
                                 }
@@ -2482,11 +2461,10 @@ namespace System.Text.RegularExpressions.Generator
 
                 if (node.IsSetFamily)
                 {
-                    expr = $"{MatchCharacterClass(hasTextInfo, options, expr, node.Str!, IsCaseInsensitive(node), negate: true, additionalDeclarations, requiredHelpers)}";
+                    expr = MatchCharacterClass(options, expr, node.Str!, negate: true, additionalDeclarations, requiredHelpers);
                 }
                 else
                 {
-                    expr = ToLowerIfNeeded(hasTextInfo, options, expr, IsCaseInsensitive(node));
                     expr = $"{expr} {(node.IsOneFamily ? "!=" : "==")} {Literal(node.Ch)}";
                 }
 
@@ -2615,13 +2593,13 @@ namespace System.Text.RegularExpressions.Generator
             {
                 Debug.Assert(node.Kind is RegexNodeKind.Multi, $"Unexpected type: {node.Kind}");
                 Debug.Assert(node.Str is not null);
-                EmitMultiCharString(node.Str, IsCaseInsensitive(node), emitLengthCheck, clauseOnly: false, (node.Options & RegexOptions.RightToLeft) != 0);
+                EmitMultiCharString(node.Str, emitLengthCheck, clauseOnly: false, (node.Options & RegexOptions.RightToLeft) != 0);
             }
 
-            void EmitMultiCharString(string str, bool caseInsensitive, bool emitLengthCheck, bool clauseOnly, bool rightToLeft)
+            void EmitMultiCharString(string str, bool emitLengthCheck, bool clauseOnly, bool rightToLeft)
             {
                 Debug.Assert(str.Length >= 2);
-                Debug.Assert(!clauseOnly || (!emitLengthCheck && !caseInsensitive && !rightToLeft));
+                Debug.Assert(!clauseOnly || (!emitLengthCheck && !rightToLeft));
 
                 if (rightToLeft)
                 {
@@ -2634,7 +2612,7 @@ namespace System.Text.RegularExpressions.Generator
 
                     using (EmitBlock(writer, $"for (int i = 0; i < {str.Length}; i++)"))
                     {
-                        using (EmitBlock(writer, $"if ({ToLowerIfNeeded(hasTextInfo, options, "inputSpan[--pos]", caseInsensitive)} != {Literal(str)}[{str.Length - 1} - i])"))
+                        using (EmitBlock(writer, $"if (inputSpan[--pos] != {Literal(str)}[{str.Length - 1} - i])"))
                         {
                             Goto(doneLabel);
                         }
@@ -2643,38 +2621,17 @@ namespace System.Text.RegularExpressions.Generator
                     return;
                 }
 
-                if (caseInsensitive) // StartsWith(..., XxIgnoreCase) won't necessarily be the same as char-by-char comparison
+                string sourceSpan = sliceStaticPos > 0 ? $"{sliceSpan}.Slice({sliceStaticPos})" : sliceSpan;
+                string clause = $"!{sourceSpan}.StartsWith({Literal(str)})";
+                if (clauseOnly)
                 {
-                    // This case should be relatively rare.  It will only occur with IgnoreCase and a series of non-ASCII characters.
-
-                    if (emitLengthCheck)
-                    {
-                        EmitSpanLengthCheck(str.Length);
-                    }
-
-                    using (EmitBlock(writer, $"for (int i = 0; i < {Literal(str)}.Length; i++)"))
-                    {
-                        string textSpanIndex = sliceStaticPos > 0 ? $"i + {sliceStaticPos}" : "i";
-                        using (EmitBlock(writer, $"if ({ToLower(hasTextInfo, options, $"{sliceSpan}[{textSpanIndex}]")} != {Literal(str)}[i])"))
-                        {
-                            Goto(doneLabel);
-                        }
-                    }
+                    writer.Write(clause);
                 }
                 else
                 {
-                    string sourceSpan = sliceStaticPos > 0 ? $"{sliceSpan}.Slice({sliceStaticPos})" : sliceSpan;
-                    string clause = $"!{sourceSpan}.StartsWith({Literal(str)})";
-                    if (clauseOnly)
-                    {
-                        writer.Write(clause);
-                    }
-                    else
+                    using (EmitBlock(writer, $"if ({clause})"))
                     {
-                        using (EmitBlock(writer, $"if ({clause})"))
-                        {
-                            Goto(doneLabel);
-                        }
+                        Goto(doneLabel);
                     }
                 }
 
@@ -2883,7 +2840,6 @@ namespace System.Text.RegularExpressions.Generator
                 {
                     if (iterationCount is null &&
                         node.Kind is RegexNodeKind.Notonelazy &&
-                        !IsCaseInsensitive(node) &&
                         subsequent?.FindStartingLiteral(4) is ValueTuple<char, string?, string?> literal && // 5 == max optimized by IndexOfAny, and we need to reserve 1 for node.Ch
                         (literal.Item3 is not null ? !literal.Item3.Contains(node.Ch) : (literal.Item2?[0] ?? literal.Item1) != node.Ch)) // no overlap between node.Ch and the start of the literal
                     {
@@ -3196,10 +3152,10 @@ namespace System.Text.RegularExpressions.Generator
                         EmitSingleChar(node, emitLengthCheck);
                         return;
 
-                    case <= RegexNode.MultiVsRepeaterLimit when node.IsOneFamily && !IsCaseInsensitive(node):
+                    case <= RegexNode.MultiVsRepeaterLimit when node.IsOneFamily:
                         // This is a repeated case-sensitive character; emit it as a multi in order to get all the optimizations
                         // afforded to a multi, e.g. unrolling the loop with multi-char reads/comparisons at a time.
-                        EmitMultiCharString(new string(node.Ch, iterations), caseInsensitive: false, emitLengthCheck, clauseOnly: false, rtl);
+                        EmitMultiCharString(new string(node.Ch, iterations), emitLengthCheck, clauseOnly: false, rtl);
                         return;
                 }
 
@@ -3301,11 +3257,10 @@ namespace System.Text.RegularExpressions.Generator
                     string expr = $"inputSpan[pos - {iterationLocal} - 1]";
                     if (node.IsSetFamily)
                     {
-                        expr = MatchCharacterClass(hasTextInfo, options, expr, node.Str!, IsCaseInsensitive(node), negate: false, additionalDeclarations, requiredHelpers);
+                        expr = MatchCharacterClass(options, expr, node.Str!, negate: false, additionalDeclarations, requiredHelpers);
                     }
                     else
                     {
-                        expr = ToLowerIfNeeded(hasTextInfo, options, expr, IsCaseInsensitive(node));
                         expr = $"{expr} {(node.IsOneFamily ? "==" : "!=")} {Literal(node.Ch)}";
                     }
 
@@ -3319,9 +3274,7 @@ namespace System.Text.RegularExpressions.Generator
                     }
                     writer.WriteLine();
                 }
-                else if (node.IsNotoneFamily &&
-                    maxIterations == int.MaxValue &&
-                    (!IsCaseInsensitive(node)))
+                else if (node.IsNotoneFamily && maxIterations == int.MaxValue)
                 {
                     // For Notone, we're looking for a specific character, as everything until we find
                     // it is consumed by the loop.  If we're unbounded, such as with ".*" and if we're case-sensitive,
@@ -3346,7 +3299,6 @@ namespace System.Text.RegularExpressions.Generator
                 }
                 else if (node.IsSetFamily &&
                     maxIterations == int.MaxValue &&
-                    !IsCaseInsensitive(node) &&
                     (numSetChars = RegexCharClass.GetSetChars(node.Str!, setChars)) != 0 &&
                     RegexCharClass.IsNegated(node.Str!))
                 {
@@ -3389,11 +3341,10 @@ namespace System.Text.RegularExpressions.Generator
                     string expr = $"{sliceSpan}[{iterationLocal}]";
                     if (node.IsSetFamily)
                     {
-                        expr = MatchCharacterClass(hasTextInfo, options, expr, node.Str!, IsCaseInsensitive(node), negate: false, additionalDeclarations, requiredHelpers);
+                        expr = MatchCharacterClass(options, expr, node.Str!, negate: false, additionalDeclarations, requiredHelpers);
                     }
                     else
                     {
-                        expr = ToLowerIfNeeded(hasTextInfo, options, expr, IsCaseInsensitive(node));
                         expr = $"{expr} {(node.IsOneFamily ? "==" : "!=")} {Literal(node.Ch)}";
                     }
 
@@ -3459,11 +3410,10 @@ namespace System.Text.RegularExpressions.Generator
 
                 if (node.IsSetFamily)
                 {
-                    expr = MatchCharacterClass(hasTextInfo, options, expr, node.Str!, IsCaseInsensitive(node), negate: false, additionalDeclarations, requiredHelpers);
+                    expr = MatchCharacterClass(options, expr, node.Str!, negate: false, additionalDeclarations, requiredHelpers);
                 }
                 else
                 {
-                    expr = ToLowerIfNeeded(hasTextInfo, options, expr, IsCaseInsensitive(node));
                     expr = $"{expr} {(node.IsOneFamily ? "==" : "!=")} {Literal(node.Ch)}";
                 }
 
@@ -3820,24 +3770,7 @@ namespace System.Text.RegularExpressions.Generator
             }
         }
 
-        private static bool EmitInitializeCultureForTryMatchAtCurrentPositionIfNecessary(IndentedTextWriter writer, RegexMethod rm, AnalysisResults analysis)
-        {
-            if (analysis.HasIgnoreCase && ((RegexOptions)rm.Options & RegexOptions.CultureInvariant) == 0)
-            {
-                writer.WriteLine("TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;");
-                return true;
-            }
-
-            return false;
-        }
-
-        private static bool UseToLowerInvariant(bool hasTextInfo, RegexOptions options) => !hasTextInfo || (options & RegexOptions.CultureInvariant) != 0;
-
-        private static string ToLower(bool hasTextInfo, RegexOptions options, string expression) => UseToLowerInvariant(hasTextInfo, options) ? $"char.ToLowerInvariant({expression})" : $"textInfo.ToLower({expression})";
-
-        private static string ToLowerIfNeeded(bool hasTextInfo, RegexOptions options, string expression, bool toLower) => toLower ? ToLower(hasTextInfo, options, expression) : expression;
-
-        private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options, string chExpr, string charClass, bool caseInsensitive, bool negate, HashSet<string> additionalDeclarations, Dictionary<string, string[]> requiredHelpers)
+        private static string MatchCharacterClass(RegexOptions options, string chExpr, string charClass, bool negate, HashSet<string> additionalDeclarations, Dictionary<string, string[]> requiredHelpers)
         {
             // We need to perform the equivalent of calling RegexRunner.CharInClass(ch, charClass),
             // but that call is relatively expensive.  Before we fall back to it, we try to optimize
@@ -3845,8 +3778,7 @@ namespace System.Text.RegularExpressions.Generator
             // for which we can call a dedicated method, or a fast-path for ASCII using a lookup table.
 
             // First, see if the char class is a built-in one for which there's a better function
-            // we can just call directly.  Everything in this section must work correctly for both
-            // case-sensitive and case-insensitive modes, regardless of culture.
+            // we can just call directly.
             switch (charClass)
             {
                 case RegexCharClass.AnyClass:
@@ -3870,24 +3802,8 @@ namespace System.Text.RegularExpressions.Generator
                     return $"{(negate ? "!" : "")}{HelpersTypeName}.IsWordChar({chExpr})";
             }
 
-            // If we're meant to be doing a case-insensitive lookup, and if we're not using the invariant culture,
-            // lowercase the input.  If we're using the invariant culture, we may still end up calling ToLower later
-            // on, but we may also be able to avoid it, in particular in the case of our lookup table, where we can
-            // generate the lookup table already factoring in the invariant case sensitivity.  There are multiple
-            // special-code paths between here and the lookup table, but we only take those if invariant is false;
-            // if it were true, they'd need to use CallToLower().
-            bool invariant = false;
-            if (caseInsensitive)
-            {
-                invariant = UseToLowerInvariant(hasTextInfo, options);
-                if (!invariant)
-                {
-                    chExpr = ToLower(hasTextInfo, options, chExpr);
-                }
-            }
-
             // Next, handle simple sets of one range, e.g. [A-Z], [0-9], etc.  This includes some built-in classes, like ECMADigitClass.
-            if (!invariant && RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive))
+            if (RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive))
             {
                 negate ^= RegexCharClass.IsNegated(charClass);
                 return lowInclusive == highInclusive ?
@@ -3898,7 +3814,7 @@ namespace System.Text.RegularExpressions.Generator
             // Next if the character class contains nothing but a single Unicode category, we can calle char.GetUnicodeCategory and
             // compare against it.  It has a fast-lookup path for ASCII, so is as good or better than any lookup we'd generate (plus
             // we get smaller code), and it's what we'd do for the fallback (which we get to avoid generating) as part of CharInClass.
-            if (!invariant && RegexCharClass.TryGetSingleUnicodeCategory(charClass, out UnicodeCategory category, out bool negated))
+            if (RegexCharClass.TryGetSingleUnicodeCategory(charClass, out UnicodeCategory category, out bool negated))
             {
                 negate ^= negated;
                 return $"(char.GetUnicodeCategory({chExpr}) {(negate ? "!=" : "==")} UnicodeCategory.{category})";
@@ -3908,7 +3824,7 @@ namespace System.Text.RegularExpressions.Generator
             // it may be cheaper and smaller to compare against each than it is to use a lookup table.  We can also special-case
             // the very common case with case insensitivity of two characters next to each other being the upper and lowercase
             // ASCII variants of each other, in which case we can use bit manipulation to avoid a comparison.
-            if (!invariant && !RegexCharClass.IsNegated(charClass))
+            if (!RegexCharClass.IsNegated(charClass))
             {
                 Span<char> setChars = stackalloc char[3];
                 int mask;
@@ -3942,29 +3858,26 @@ namespace System.Text.RegularExpressions.Generator
             // Analyze the character set more to determine what code to generate.
             RegexCharClass.CharClassAnalysisResults analysis = RegexCharClass.Analyze(charClass);
 
-            if (!invariant) // if we're being asked to do a case insensitive, invariant comparison, use the lookup table
+            if (analysis.ContainsNoAscii)
             {
-                if (analysis.ContainsNoAscii)
-                {
-                    // We determined that the character class contains only non-ASCII,
-                    // for example if the class were [\p{IsGreek}\p{IsGreekExtended}], which is
-                    // the same as [\u0370-\u03FF\u1F00-1FFF]. (In the future, we could possibly
-                    // extend the analysis to produce a known lower-bound and compare against
-                    // that rather than always using 128 as the pivot point.)
-                    return negate ?
-                        $"((ch = {chExpr}) < 128 || !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" :
-                        $"((ch = {chExpr}) >= 128 && RegexRunner.CharInClass((char)ch, {Literal(charClass)}))";
-                }
+                // We determined that the character class contains only non-ASCII,
+                // for example if the class were [\p{IsGreek}\p{IsGreekExtended}], which is
+                // the same as [\u0370-\u03FF\u1F00-1FFF]. (In the future, we could possibly
+                // extend the analysis to produce a known lower-bound and compare against
+                // that rather than always using 128 as the pivot point.)
+                return negate ?
+                    $"((ch = {chExpr}) < 128 || !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" :
+                    $"((ch = {chExpr}) >= 128 && RegexRunner.CharInClass((char)ch, {Literal(charClass)}))";
+            }
 
-                if (analysis.AllAsciiContained)
-                {
-                    // We determined that every ASCII character is in the class, for example
-                    // if the class were the negated example from case 1 above:
-                    // [^\p{IsGreek}\p{IsGreekExtended}].
-                    return negate ?
-                        $"((ch = {chExpr}) >= 128 && !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" :
-                        $"((ch = {chExpr}) < 128 || RegexRunner.CharInClass((char)ch, {Literal(charClass)}))";
-                }
+            if (analysis.AllAsciiContained)
+            {
+                // We determined that every ASCII character is in the class, for example
+                // if the class were the negated example from case 1 above:
+                // [^\p{IsGreek}\p{IsGreekExtended}].
+                return negate ?
+                    $"((ch = {chExpr}) >= 128 && !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" :
+                    $"((ch = {chExpr}) < 128 || RegexRunner.CharInClass((char)ch, {Literal(charClass)}))";
             }
 
             // Now, our big hammer is to generate a lookup table that lets us quickly index by character into a yes/no
@@ -3982,15 +3895,12 @@ namespace System.Text.RegularExpressions.Generator
 
             // Generate the lookup table to store 128 answers as bits. We use a const string instead of a byte[] / static
             // data property because it lets IL emit handle all the details for us.
-            string bitVectorString = StringExtensions.Create(8, (charClass, invariant), static (dest, state) => // String length is 8 chars == 16 bytes == 128 bits.
+            string bitVectorString = StringExtensions.Create(8, charClass, static (dest, charClass) => // String length is 8 chars == 16 bytes == 128 bits.
             {
                 for (int i = 0; i < 128; i++)
                 {
                     char c = (char)i;
-                    bool isSet = state.invariant ?
-                        RegexCharClass.CharInClass(char.ToLowerInvariant(c), state.charClass) :
-                        RegexCharClass.CharInClass(c, state.charClass);
-                    if (isSet)
+                    if (RegexCharClass.CharInClass(c, charClass))
                     {
                         dest[i >> 4] |= (char)(1 << (i & 0xF));
                     }
@@ -4023,13 +3933,9 @@ namespace System.Text.RegularExpressions.Generator
             // We know that the whole class wasn't ASCII, and we don't know anything about the non-ASCII
             // characters other than that some might be included, for example if the character class
             // were [\w\d], so since ch >= 128, we need to fall back to calling CharInClass.
-            return (negate, invariant) switch
-            {
-                (false, false) => $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) != 0 : RegexRunner.CharInClass((char)ch, {Literal(charClass)}))",
-                (true,  false) => $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) == 0 : !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))",
-                (false, true)  => $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) != 0 : RegexRunner.CharInClass(char.ToLowerInvariant((char)ch), {Literal(charClass)}))",
-                (true,  true)  => $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) == 0 : !RegexRunner.CharInClass(char.ToLowerInvariant((char)ch), {Literal(charClass)}))",
-            };
+            return negate ?
+                $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) == 0 : !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" :
+                $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) != 0 : RegexRunner.CharInClass((char)ch, {Literal(charClass)}))";
         }
 
         /// <summary>
index ad11361..049e7c5 100644 (file)
     <Compile Include="$(CoreLibSharedDir)System\Collections\Generic\ValueListBuilder.cs" Link="Production\ValueListBuilder.cs" />
     <Compile Include="..\src\System\Collections\Generic\ValueListBuilder.Pop.cs" Link="Production\ValueListBuilder.Pop.cs" />
     <Compile Include="..\src\System\Threading\StackHelper.cs" Link="Production\StackHelper.cs" />
+    <Compile Include="..\src\System\Text\RegularExpressions\RegexCaseEquivalences.Data.cs" Link="Production\RegexCaseEquivalences.Data.cs" />
+    <Compile Include="..\src\System\Text\RegularExpressions\RegexCaseEquivalences.cs" Link="Production\RegexCaseEquivalences.cs" />
+    <Compile Include="..\src\System\Text\RegularExpressions\RegexCaseBehavior.cs" Link="Production\RegexCaseBehavior.cs" />
     <Compile Include="..\src\System\Text\RegularExpressions\RegexCharClass.cs" Link="Production\RegexCharClass.cs" />
-    <Compile Include="..\src\System\Text\RegularExpressions\RegexCharClass.MappingTable.cs" Link="Production\RegexCharClass.MappingTable.cs" />
     <Compile Include="..\src\System\Text\RegularExpressions\RegexFindOptimizations.cs" Link="Production\RegexFindOptimizations.cs" />
     <Compile Include="..\src\System\Text\RegularExpressions\RegexNode.cs" Link="Production\RegexNode.cs" />
     <Compile Include="..\src\System\Text\RegularExpressions\RegexNodeKind.cs" Link="Production\RegexNodeKind.cs" />
index 4fc9888..d3d916d 100644 (file)
     <Compile Include="System\Text\RegularExpressions\Regex.Replace.cs" />
     <Compile Include="System\Text\RegularExpressions\Regex.Split.cs" />
     <Compile Include="System\Text\RegularExpressions\Regex.Timeout.cs" />
+    <Compile Include="System\Text\RegularExpressions\RegexCaseBehavior.cs" />
+    <Compile Include="System\Text\RegularExpressions\RegexCaseEquivalences.Data.cs" />
+    <Compile Include="System\Text\RegularExpressions\RegexCaseEquivalences.cs" />
     <Compile Include="System\Text\RegularExpressions\RegexCharClass.cs" />
-    <Compile Include="System\Text\RegularExpressions\RegexCharClass.MappingTable.cs" />
     <Compile Include="System\Text\RegularExpressions\RegexCompilationInfo.cs" />
     <Compile Include="System\Text\RegularExpressions\RegexFindOptimizations.cs" />
     <Compile Include="System\Text\RegularExpressions\RegexGeneratorAttribute.cs" />
     <Compile Include="System\Text\RegularExpressions\Symbolic\SymbolicRegexSet.cs" />
     <Compile Include="System\Text\RegularExpressions\Symbolic\TransitionRegex.cs" />
     <Compile Include="System\Text\RegularExpressions\Symbolic\TransitionRegexKind.cs" />
-    <Compile Include="System\Text\RegularExpressions\Symbolic\Unicode\GeneratorHelper.cs" />
-    <Compile Include="System\Text\RegularExpressions\Symbolic\Unicode\IgnoreCaseRelation.cs" />
-    <Compile Include="System\Text\RegularExpressions\Symbolic\Unicode\IgnoreCaseRelationGenerator.cs" />
-    <Compile Include="System\Text\RegularExpressions\Symbolic\Unicode\IgnoreCaseTransformer.cs" />
     <Compile Include="System\Text\RegularExpressions\Symbolic\Unicode\UnicodeCategoryRanges.cs" />
     <Compile Include="System\Text\RegularExpressions\Symbolic\Unicode\UnicodeCategoryRangesGenerator.cs" />
     <Compile Include="System\Text\RegularExpressions\Symbolic\Unicode\UnicodeCategoryTheory.cs" />
index 459ca6e..5117029 100644 (file)
@@ -1,17 +1,22 @@
 // Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
+using System.Globalization;
+
 namespace System.Text.RegularExpressions
 {
     internal sealed class CompiledRegexRunner : RegexRunner
     {
         private readonly ScanDelegate _scanMethod;
+        /// <summary>This field will only be set if the pattern contains backreferences and has RegexOptions.IgnoreCase</summary>
+        private readonly TextInfo? _textInfo;
 
         internal delegate void ScanDelegate(RegexRunner runner, ReadOnlySpan<char> text);
 
-        public CompiledRegexRunner(ScanDelegate scan)
+        public CompiledRegexRunner(ScanDelegate scan, CultureInfo? culture)
         {
             _scanMethod = scan;
+            _textInfo = culture?.TextInfo;
         }
 
         protected internal override void Scan(ReadOnlySpan<char> text)
index 4a9147e..b7ec852 100644 (file)
@@ -1,6 +1,7 @@
 // Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
+using System.Globalization;
 using System.Reflection.Emit;
 
 namespace System.Text.RegularExpressions
@@ -8,17 +9,20 @@ namespace System.Text.RegularExpressions
     internal sealed class CompiledRegexRunnerFactory : RegexRunnerFactory
     {
         private readonly DynamicMethod _scanMethod;
+        /// <summary>This field will only be set if the pattern has backreferences and uses RegexOptions.IgnoreCase</summary>
+        private readonly CultureInfo? _culture;
 
         // Delegate is lazily created to avoid forcing JIT'ing until the regex is actually executed.
         private CompiledRegexRunner.ScanDelegate? _scan;
 
-        public CompiledRegexRunnerFactory(DynamicMethod scanMethod)
+        public CompiledRegexRunnerFactory(DynamicMethod scanMethod, CultureInfo? culture)
         {
             _scanMethod = scanMethod;
+            _culture = culture;
         }
 
         protected internal override RegexRunner CreateInstance() =>
             new CompiledRegexRunner(
-                _scan ??= _scanMethod.CreateDelegate<CompiledRegexRunner.ScanDelegate>());
+                _scan ??= _scanMethod.CreateDelegate<CompiledRegexRunner.ScanDelegate>(), _culture);
     }
 }
index 572a47b..dd6f9c6 100644 (file)
@@ -44,13 +44,12 @@ namespace System.Text.RegularExpressions
         }
 
         /// <summary>
-        /// Generates two files IgnoreCaseRelation.cs and UnicodeCategoryRanges.cs for the namespace System.Text.RegularExpressions.Symbolic.Unicode
+        /// Generates UnicodeCategoryRanges.cs for the namespace System.Text.RegularExpressions.Symbolic.Unicode
         /// in the given directory path. Only avaliable in DEBUG mode.
         /// </summary>
         [ExcludeFromCodeCoverage(Justification = "Debug only")]
         internal static void GenerateUnicodeTables(string path)
         {
-            IgnoreCaseRelationGenerator.Generate("System.Text.RegularExpressions.Symbolic.Unicode", "IgnoreCaseRelation", path);
             UnicodeCategoryRangesGenerator.Generate("System.Text.RegularExpressions.Symbolic.Unicode", "UnicodeCategoryRanges", path);
         }
 
index 07b435a..b9bcb98 100644 (file)
@@ -67,7 +67,7 @@ namespace System.Text.RegularExpressions
             RegexTree tree = Init(pattern, RegexOptions.None, s_defaultMatchTimeout, ref culture);
 
             // Create the interpreter factory.
-            factory = new RegexInterpreterFactory(tree, culture);
+            factory = new RegexInterpreterFactory(tree);
 
             // NOTE: This overload _does not_ delegate to the one that takes options, in order
             // to avoid unnecessarily rooting the support for RegexOptions.NonBacktracking/Compiler
@@ -101,7 +101,7 @@ namespace System.Text.RegularExpressions
                 }
 
                 // If no factory was created, fall back to creating one for the interpreter.
-                factory ??= new RegexInterpreterFactory(tree, culture);
+                factory ??= new RegexInterpreterFactory(tree);
             }
         }
 
diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseBehavior.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseBehavior.cs
new file mode 100644 (file)
index 0000000..a02e2b1
--- /dev/null
@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+
+namespace System.Text.RegularExpressions
+{
+    /// <summary>
+    /// When a regular expression specifies the option <see cref="RegexOptions.IgnoreCase"/> then comparisons between the input and the
+    /// pattern will made case-insensitively. In order to support this, we need to define which case mappings shall be  used for the comparisons.
+    /// A case mapping exists whenever you have two characters 'A' and 'B', where either 'A' is the ToLower() representation of 'B' or both 'A' and 'B' lowercase to the
+    /// same character. Note that we don't consider a mapping when the only relationship between 'A' and 'B' is that one is the ToUpper() representation of the other. This
+    /// is for backwards compatibility since, in Regex, we have only consider ToLower() for case insensitive comparisons. Given the case mappings vary depending on the culture,
+    /// Regex supports 3 main different behaviors or mappings: Invariant, NonTurkish, and Turkish. This is in order to match the behavior of all .NET supported cultures
+    /// current behavior for ToLower(). As a side note, there should be no cases where 'A'.ToLower() == 'B' but 'A'.ToLower() != 'B'.ToLower(). This aspect is important since
+    /// for backreferences we make use a.ToLower() == b.ToLower() for comparisons so if there was such a case then it would lead to inconsistencies between how we handle
+    /// backreferences vs how we handle other case insensitive comparisons.
+    /// </summary>
+    internal enum RegexCaseBehavior
+    {
+        /// <summary>
+        /// Invariant case-mappings are used. This includes all of the common mappings across cultures. This behavior is used when either the  user
+        /// specified <see cref="RegexOptions.CultureInvariant"/> or when the CurrentCulture is <see cref="CultureInfo.InvariantCulture"/>.
+        /// </summary>
+        Invariant,
+
+        /// <summary>
+        /// These are all the same mappings used by Invariant behavior, with an additional one: \u0130 => \u0069
+        /// This mode will be used when CurrentCulture is not Invariant or any of the tr/az cultures.
+        /// </summary>
+        NonTurkish,
+
+        /// <summary>
+        /// These are all the same mappings used by non-Turkish behavior, with the exception of: \u0049 => \u0069 which mapping doesn't exist
+        /// on this behavior and with the additional mapping of: \u0069 => \u0131. This mode will be used when CurrentCulture is any of the tr/az cultures.
+        /// </summary>
+        Turkish
+    }
+}
diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.Data.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.Data.cs
new file mode 100644 (file)
index 0000000..888d23f
--- /dev/null
@@ -0,0 +1,814 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace System.Text.RegularExpressions
+{
+    internal static partial class RegexCaseEquivalences
+    {
+        // THE FOLLOWING DATA IS AUTO GENERATED BY GenerateRegexCasingTable program UNDER THE TOOLS FOLDER
+        // PLEASE DON'T MODIFY BY HAND
+        // IF YOU NEED TO UPDATE UNICODE VERSION FOLLOW THE GUIDE AT src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md
+
+        private static char[] EquivalenceCasingValues { get; } = new char[2336]
+        {
+            '\u0041', '\u0061', '\u0042', '\u0062', '\u0043', '\u0063', '\u0044', '\u0064', '\u0045', '\u0065', '\u0046', '\u0066', '\u0047', '\u0067', '\u0048', '\u0068',
+            '\u0049', '\u0069', '\u004A', '\u006A', '\u004B', '\u006B', '\u212A', '\u004C', '\u006C', '\u004D', '\u006D', '\u004E', '\u006E', '\u004F', '\u006F', '\u0050',
+            '\u0070', '\u0051', '\u0071', '\u0052', '\u0072', '\u0053', '\u0073', '\u0054', '\u0074', '\u0055', '\u0075', '\u0056', '\u0076', '\u0057', '\u0077', '\u0058',
+            '\u0078', '\u0059', '\u0079', '\u005A', '\u007A', '\u00C0', '\u00E0', '\u00C1', '\u00E1', '\u00C2', '\u00E2', '\u00C3', '\u00E3', '\u00C4', '\u00E4', '\u00C5',
+            '\u00E5', '\u212B', '\u00C6', '\u00E6', '\u00C7', '\u00E7', '\u00C8', '\u00E8', '\u00C9', '\u00E9', '\u00CA', '\u00EA', '\u00CB', '\u00EB', '\u00CC', '\u00EC',
+            '\u00CD', '\u00ED', '\u00CE', '\u00EE', '\u00CF', '\u00EF', '\u00D0', '\u00F0', '\u00D1', '\u00F1', '\u00D2', '\u00F2', '\u00D3', '\u00F3', '\u00D4', '\u00F4',
+            '\u00D5', '\u00F5', '\u00D6', '\u00F6', '\u00D8', '\u00F8', '\u00D9', '\u00F9', '\u00DA', '\u00FA', '\u00DB', '\u00FB', '\u00DC', '\u00FC', '\u00DD', '\u00FD',
+            '\u00DE', '\u00FE', '\u0100', '\u0101', '\u0102', '\u0103', '\u0104', '\u0105', '\u0106', '\u0107', '\u0108', '\u0109', '\u010A', '\u010B', '\u010C', '\u010D',
+            '\u010E', '\u010F', '\u0110', '\u0111', '\u0112', '\u0113', '\u0114', '\u0115', '\u0116', '\u0117', '\u0118', '\u0119', '\u011A', '\u011B', '\u011C', '\u011D',
+            '\u011E', '\u011F', '\u0120', '\u0121', '\u0122', '\u0123', '\u0124', '\u0125', '\u0126', '\u0127', '\u0128', '\u0129', '\u012A', '\u012B', '\u012C', '\u012D',
+            '\u012E', '\u012F', '\u0132', '\u0133', '\u0134', '\u0135', '\u0136', '\u0137', '\u0139', '\u013A', '\u013B', '\u013C', '\u013D', '\u013E', '\u013F', '\u0140',
+            '\u0141', '\u0142', '\u0143', '\u0144', '\u0145', '\u0146', '\u0147', '\u0148', '\u014A', '\u014B', '\u014C', '\u014D', '\u014E', '\u014F', '\u0150', '\u0151',
+            '\u0152', '\u0153', '\u0154', '\u0155', '\u0156', '\u0157', '\u0158', '\u0159', '\u015A', '\u015B', '\u015C', '\u015D', '\u015E', '\u015F', '\u0160', '\u0161',
+            '\u0162', '\u0163', '\u0164', '\u0165', '\u0166', '\u0167', '\u0168', '\u0169', '\u016A', '\u016B', '\u016C', '\u016D', '\u016E', '\u016F', '\u0170', '\u0171',
+            '\u0172', '\u0173', '\u0174', '\u0175', '\u0176', '\u0177', '\u00FF', '\u0178', '\u0179', '\u017A', '\u017B', '\u017C', '\u017D', '\u017E', '\u0181', '\u0253',
+            '\u0182', '\u0183', '\u0184', '\u0185', '\u0186', '\u0254', '\u0187', '\u0188', '\u0189', '\u0256', '\u018A', '\u0257', '\u018B', '\u018C', '\u018E', '\u01DD',
+            '\u018F', '\u0259', '\u0190', '\u025B', '\u0191', '\u0192', '\u0193', '\u0260', '\u0194', '\u0263', '\u0196', '\u0269', '\u0197', '\u0268', '\u0198', '\u0199',
+            '\u019C', '\u026F', '\u019D', '\u0272', '\u019F', '\u0275', '\u01A0', '\u01A1', '\u01A2', '\u01A3', '\u01A4', '\u01A5', '\u01A6', '\u0280', '\u01A7', '\u01A8',
+            '\u01A9', '\u0283', '\u01AC', '\u01AD', '\u01AE', '\u0288', '\u01AF', '\u01B0', '\u01B1', '\u028A', '\u01B2', '\u028B', '\u01B3', '\u01B4', '\u01B5', '\u01B6',
+            '\u01B7', '\u0292', '\u01B8', '\u01B9', '\u01BC', '\u01BD', '\u01C4', '\u01C5', '\u01C6', '\u01C7', '\u01C8', '\u01C9', '\u01CA', '\u01CB', '\u01CC', '\u01CD',
+            '\u01CE', '\u01CF', '\u01D0', '\u01D1', '\u01D2', '\u01D3', '\u01D4', '\u01D5', '\u01D6', '\u01D7', '\u01D8', '\u01D9', '\u01DA', '\u01DB', '\u01DC', '\u01DE',
+            '\u01DF', '\u01E0', '\u01E1', '\u01E2', '\u01E3', '\u01E4', '\u01E5', '\u01E6', '\u01E7', '\u01E8', '\u01E9', '\u01EA', '\u01EB', '\u01EC', '\u01ED', '\u01EE',
+            '\u01EF', '\u01F1', '\u01F2', '\u01F3', '\u01F4', '\u01F5', '\u0195', '\u01F6', '\u01BF', '\u01F7', '\u01F8', '\u01F9', '\u01FA', '\u01FB', '\u01FC', '\u01FD',
+            '\u01FE', '\u01FF', '\u0200', '\u0201', '\u0202', '\u0203', '\u0204', '\u0205', '\u0206', '\u0207', '\u0208', '\u0209', '\u020A', '\u020B', '\u020C', '\u020D',
+            '\u020E', '\u020F', '\u0210', '\u0211', '\u0212', '\u0213', '\u0214', '\u0215', '\u0216', '\u0217', '\u0218', '\u0219', '\u021A', '\u021B', '\u021C', '\u021D',
+            '\u021E', '\u021F', '\u019E', '\u0220', '\u0222', '\u0223', '\u0224', '\u0225', '\u0226', '\u0227', '\u0228', '\u0229', '\u022A', '\u022B', '\u022C', '\u022D',
+            '\u022E', '\u022F', '\u0230', '\u0231', '\u0232', '\u0233', '\u023A', '\u2C65', '\u023B', '\u023C', '\u019A', '\u023D', '\u023E', '\u2C66', '\u0241', '\u0242',
+            '\u0180', '\u0243', '\u0244', '\u0289', '\u0245', '\u028C', '\u0246', '\u0247', '\u0248', '\u0249', '\u024A', '\u024B', '\u024C', '\u024D', '\u024E', '\u024F',
+            '\u0370', '\u0371', '\u0372', '\u0373', '\u0376', '\u0377', '\u037F', '\u03F3', '\u0386', '\u03AC', '\u0388', '\u03AD', '\u0389', '\u03AE', '\u038A', '\u03AF',
+            '\u038C', '\u03CC', '\u038E', '\u03CD', '\u038F', '\u03CE', '\u0391', '\u03B1', '\u0392', '\u03B2', '\u0393', '\u03B3', '\u0394', '\u03B4', '\u0395', '\u03B5',
+            '\u0396', '\u03B6', '\u0397', '\u03B7', '\u0398', '\u03B8', '\u03F4', '\u0399', '\u03B9', '\u039A', '\u03BA', '\u039B', '\u03BB', '\u039C', '\u03BC', '\u039D',
+            '\u03BD', '\u039E', '\u03BE', '\u039F', '\u03BF', '\u03A0', '\u03C0', '\u03A1', '\u03C1', '\u03A3', '\u03C3', '\u03A4', '\u03C4', '\u03A5', '\u03C5', '\u03A6',
+            '\u03C6', '\u03A7', '\u03C7', '\u03A8', '\u03C8', '\u03A9', '\u03C9', '\u2126', '\u03AA', '\u03CA', '\u03AB', '\u03CB', '\u03CF', '\u03D7', '\u03D8', '\u03D9',
+            '\u03DA', '\u03DB', '\u03DC', '\u03DD', '\u03DE', '\u03DF', '\u03E0', '\u03E1', '\u03E2', '\u03E3', '\u03E4', '\u03E5', '\u03E6', '\u03E7', '\u03E8', '\u03E9',
+            '\u03EA', '\u03EB', '\u03EC', '\u03ED', '\u03EE', '\u03EF', '\u03F7', '\u03F8', '\u03F2', '\u03F9', '\u03FA', '\u03FB', '\u037B', '\u03FD', '\u037C', '\u03FE',
+            '\u037D', '\u03FF', '\u0400', '\u0450', '\u0401', '\u0451', '\u0402', '\u0452', '\u0403', '\u0453', '\u0404', '\u0454', '\u0405', '\u0455', '\u0406', '\u0456',
+            '\u0407', '\u0457', '\u0408', '\u0458', '\u0409', '\u0459', '\u040A', '\u045A', '\u040B', '\u045B', '\u040C', '\u045C', '\u040D', '\u045D', '\u040E', '\u045E',
+            '\u040F', '\u045F', '\u0410', '\u0430', '\u0411', '\u0431', '\u0412', '\u0432', '\u0413', '\u0433', '\u0414', '\u0434', '\u0415', '\u0435', '\u0416', '\u0436',
+            '\u0417', '\u0437', '\u0418', '\u0438', '\u0419', '\u0439', '\u041A', '\u043A', '\u041B', '\u043B', '\u041C', '\u043C', '\u041D', '\u043D', '\u041E', '\u043E',
+            '\u041F', '\u043F', '\u0420', '\u0440', '\u0421', '\u0441', '\u0422', '\u0442', '\u0423', '\u0443', '\u0424', '\u0444', '\u0425', '\u0445', '\u0426', '\u0446',
+            '\u0427', '\u0447', '\u0428', '\u0448', '\u0429', '\u0449', '\u042A', '\u044A', '\u042B', '\u044B', '\u042C', '\u044C', '\u042D', '\u044D', '\u042E', '\u044E',
+            '\u042F', '\u044F', '\u0460', '\u0461', '\u0462', '\u0463', '\u0464', '\u0465', '\u0466', '\u0467', '\u0468', '\u0469', '\u046A', '\u046B', '\u046C', '\u046D',
+            '\u046E', '\u046F', '\u0470', '\u0471', '\u0472', '\u0473', '\u0474', '\u0475', '\u0476', '\u0477', '\u0478', '\u0479', '\u047A', '\u047B', '\u047C', '\u047D',
+            '\u047E', '\u047F', '\u0480', '\u0481', '\u048A', '\u048B', '\u048C', '\u048D', '\u048E', '\u048F', '\u0490', '\u0491', '\u0492', '\u0493', '\u0494', '\u0495',
+            '\u0496', '\u0497', '\u0498', '\u0499', '\u049A', '\u049B', '\u049C', '\u049D', '\u049E', '\u049F', '\u04A0', '\u04A1', '\u04A2', '\u04A3', '\u04A4', '\u04A5',
+            '\u04A6', '\u04A7', '\u04A8', '\u04A9', '\u04AA', '\u04AB', '\u04AC', '\u04AD', '\u04AE', '\u04AF', '\u04B0', '\u04B1', '\u04B2', '\u04B3', '\u04B4', '\u04B5',
+            '\u04B6', '\u04B7', '\u04B8', '\u04B9', '\u04BA', '\u04BB', '\u04BC', '\u04BD', '\u04BE', '\u04BF', '\u04C0', '\u04CF', '\u04C1', '\u04C2', '\u04C3', '\u04C4',
+            '\u04C5', '\u04C6', '\u04C7', '\u04C8', '\u04C9', '\u04CA', '\u04CB', '\u04CC', '\u04CD', '\u04CE', '\u04D0', '\u04D1', '\u04D2', '\u04D3', '\u04D4', '\u04D5',
+            '\u04D6', '\u04D7', '\u04D8', '\u04D9', '\u04DA', '\u04DB', '\u04DC', '\u04DD', '\u04DE', '\u04DF', '\u04E0', '\u04E1', '\u04E2', '\u04E3', '\u04E4', '\u04E5',
+            '\u04E6', '\u04E7', '\u04E8', '\u04E9', '\u04EA', '\u04EB', '\u04EC', '\u04ED', '\u04EE', '\u04EF', '\u04F0', '\u04F1', '\u04F2', '\u04F3', '\u04F4', '\u04F5',
+            '\u04F6', '\u04F7', '\u04F8', '\u04F9', '\u04FA', '\u04FB', '\u04FC', '\u04FD', '\u04FE', '\u04FF', '\u0500', '\u0501', '\u0502', '\u0503', '\u0504', '\u0505',
+            '\u0506', '\u0507', '\u0508', '\u0509', '\u050A', '\u050B', '\u050C', '\u050D', '\u050E', '\u050F', '\u0510', '\u0511', '\u0512', '\u0513', '\u0514', '\u0515',
+            '\u0516', '\u0517', '\u0518', '\u0519', '\u051A', '\u051B', '\u051C', '\u051D', '\u051E', '\u051F', '\u0520', '\u0521', '\u0522', '\u0523', '\u0524', '\u0525',
+            '\u0526', '\u0527', '\u0528', '\u0529', '\u052A', '\u052B', '\u052C', '\u052D', '\u052E', '\u052F', '\u0531', '\u0561', '\u0532', '\u0562', '\u0533', '\u0563',
+            '\u0534', '\u0564', '\u0535', '\u0565', '\u0536', '\u0566', '\u0537', '\u0567', '\u0538', '\u0568', '\u0539', '\u0569', '\u053A', '\u056A', '\u053B', '\u056B',
+            '\u053C', '\u056C', '\u053D', '\u056D', '\u053E', '\u056E', '\u053F', '\u056F', '\u0540', '\u0570', '\u0541', '\u0571', '\u0542', '\u0572', '\u0543', '\u0573',
+            '\u0544', '\u0574', '\u0545', '\u0575', '\u0546', '\u0576', '\u0547', '\u0577', '\u0548', '\u0578', '\u0549', '\u0579', '\u054A', '\u057A', '\u054B', '\u057B',
+            '\u054C', '\u057C', '\u054D', '\u057D', '\u054E', '\u057E', '\u054F', '\u057F', '\u0550', '\u0580', '\u0551', '\u0581', '\u0552', '\u0582', '\u0553', '\u0583',
+            '\u0554', '\u0584', '\u0555', '\u0585', '\u0556', '\u0586', '\u10A0', '\u2D00', '\u10A1', '\u2D01', '\u10A2', '\u2D02', '\u10A3', '\u2D03', '\u10A4', '\u2D04',
+            '\u10A5', '\u2D05', '\u10A6', '\u2D06', '\u10A7', '\u2D07', '\u10A8', '\u2D08', '\u10A9', '\u2D09', '\u10AA', '\u2D0A', '\u10AB', '\u2D0B', '\u10AC', '\u2D0C',
+            '\u10AD', '\u2D0D', '\u10AE', '\u2D0E', '\u10AF', '\u2D0F', '\u10B0', '\u2D10', '\u10B1', '\u2D11', '\u10B2', '\u2D12', '\u10B3', '\u2D13', '\u10B4', '\u2D14',
+            '\u10B5', '\u2D15', '\u10B6', '\u2D16', '\u10B7', '\u2D17', '\u10B8', '\u2D18', '\u10B9', '\u2D19', '\u10BA', '\u2D1A', '\u10BB', '\u2D1B', '\u10BC', '\u2D1C',
+            '\u10BD', '\u2D1D', '\u10BE', '\u2D1E', '\u10BF', '\u2D1F', '\u10C0', '\u2D20', '\u10C1', '\u2D21', '\u10C2', '\u2D22', '\u10C3', '\u2D23', '\u10C4', '\u2D24',
+            '\u10C5', '\u2D25', '\u10C7', '\u2D27', '\u10CD', '\u2D2D', '\u13A0', '\uAB70', '\u13A1', '\uAB71', '\u13A2', '\uAB72', '\u13A3', '\uAB73', '\u13A4', '\uAB74',
+            '\u13A5', '\uAB75', '\u13A6', '\uAB76', '\u13A7', '\uAB77', '\u13A8', '\uAB78', '\u13A9', '\uAB79', '\u13AA', '\uAB7A', '\u13AB', '\uAB7B', '\u13AC', '\uAB7C',
+            '\u13AD', '\uAB7D', '\u13AE', '\uAB7E', '\u13AF', '\uAB7F', '\u13B0', '\uAB80', '\u13B1', '\uAB81', '\u13B2', '\uAB82', '\u13B3', '\uAB83', '\u13B4', '\uAB84',
+            '\u13B5', '\uAB85', '\u13B6', '\uAB86', '\u13B7', '\uAB87', '\u13B8', '\uAB88', '\u13B9', '\uAB89', '\u13BA', '\uAB8A', '\u13BB', '\uAB8B', '\u13BC', '\uAB8C',
+            '\u13BD', '\uAB8D', '\u13BE', '\uAB8E', '\u13BF', '\uAB8F', '\u13C0', '\uAB90', '\u13C1', '\uAB91', '\u13C2', '\uAB92', '\u13C3', '\uAB93', '\u13C4', '\uAB94',
+            '\u13C5', '\uAB95', '\u13C6', '\uAB96', '\u13C7', '\uAB97', '\u13C8', '\uAB98', '\u13C9', '\uAB99', '\u13CA', '\uAB9A', '\u13CB', '\uAB9B', '\u13CC', '\uAB9C',
+            '\u13CD', '\uAB9D', '\u13CE', '\uAB9E', '\u13CF', '\uAB9F', '\u13D0', '\uABA0', '\u13D1', '\uABA1', '\u13D2', '\uABA2', '\u13D3', '\uABA3', '\u13D4', '\uABA4',
+            '\u13D5', '\uABA5', '\u13D6', '\uABA6', '\u13D7', '\uABA7', '\u13D8', '\uABA8', '\u13D9', '\uABA9', '\u13DA', '\uABAA', '\u13DB', '\uABAB', '\u13DC', '\uABAC',
+            '\u13DD', '\uABAD', '\u13DE', '\uABAE', '\u13DF', '\uABAF', '\u13E0', '\uABB0', '\u13E1', '\uABB1', '\u13E2', '\uABB2', '\u13E3', '\uABB3', '\u13E4', '\uABB4',
+            '\u13E5', '\uABB5', '\u13E6', '\uABB6', '\u13E7', '\uABB7', '\u13E8', '\uABB8', '\u13E9', '\uABB9', '\u13EA', '\uABBA', '\u13EB', '\uABBB', '\u13EC', '\uABBC',
+            '\u13ED', '\uABBD', '\u13EE', '\uABBE', '\u13EF', '\uABBF', '\u13F0', '\u13F8', '\u13F1', '\u13F9', '\u13F2', '\u13FA', '\u13F3', '\u13FB', '\u13F4', '\u13FC',
+            '\u13F5', '\u13FD', '\u10D0', '\u1C90', '\u10D1', '\u1C91', '\u10D2', '\u1C92', '\u10D3', '\u1C93', '\u10D4', '\u1C94', '\u10D5', '\u1C95', '\u10D6', '\u1C96',
+            '\u10D7', '\u1C97', '\u10D8', '\u1C98', '\u10D9', '\u1C99', '\u10DA', '\u1C9A', '\u10DB', '\u1C9B', '\u10DC', '\u1C9C', '\u10DD', '\u1C9D', '\u10DE', '\u1C9E',
+            '\u10DF', '\u1C9F', '\u10E0', '\u1CA0', '\u10E1', '\u1CA1', '\u10E2', '\u1CA2', '\u10E3', '\u1CA3', '\u10E4', '\u1CA4', '\u10E5', '\u1CA5', '\u10E6', '\u1CA6',
+            '\u10E7', '\u1CA7', '\u10E8', '\u1CA8', '\u10E9', '\u1CA9', '\u10EA', '\u1CAA', '\u10EB', '\u1CAB', '\u10EC', '\u1CAC', '\u10ED', '\u1CAD', '\u10EE', '\u1CAE',
+            '\u10EF', '\u1CAF', '\u10F0', '\u1CB0', '\u10F1', '\u1CB1', '\u10F2', '\u1CB2', '\u10F3', '\u1CB3', '\u10F4', '\u1CB4', '\u10F5', '\u1CB5', '\u10F6', '\u1CB6',
+            '\u10F7', '\u1CB7', '\u10F8', '\u1CB8', '\u10F9', '\u1CB9', '\u10FA', '\u1CBA', '\u10FD', '\u1CBD', '\u10FE', '\u1CBE', '\u10FF', '\u1CBF', '\u1E00', '\u1E01',
+            '\u1E02', '\u1E03', '\u1E04', '\u1E05', '\u1E06', '\u1E07', '\u1E08', '\u1E09', '\u1E0A', '\u1E0B', '\u1E0C', '\u1E0D', '\u1E0E', '\u1E0F', '\u1E10', '\u1E11',
+            '\u1E12', '\u1E13', '\u1E14', '\u1E15', '\u1E16', '\u1E17', '\u1E18', '\u1E19', '\u1E1A', '\u1E1B', '\u1E1C', '\u1E1D', '\u1E1E', '\u1E1F', '\u1E20', '\u1E21',
+            '\u1E22', '\u1E23', '\u1E24', '\u1E25', '\u1E26', '\u1E27', '\u1E28', '\u1E29', '\u1E2A', '\u1E2B', '\u1E2C', '\u1E2D', '\u1E2E', '\u1E2F', '\u1E30', '\u1E31',
+            '\u1E32', '\u1E33', '\u1E34', '\u1E35', '\u1E36', '\u1E37', '\u1E38', '\u1E39', '\u1E3A', '\u1E3B', '\u1E3C', '\u1E3D', '\u1E3E', '\u1E3F', '\u1E40', '\u1E41',
+            '\u1E42', '\u1E43', '\u1E44', '\u1E45', '\u1E46', '\u1E47', '\u1E48', '\u1E49', '\u1E4A', '\u1E4B', '\u1E4C', '\u1E4D', '\u1E4E', '\u1E4F', '\u1E50', '\u1E51',
+            '\u1E52', '\u1E53', '\u1E54', '\u1E55', '\u1E56', '\u1E57', '\u1E58', '\u1E59', '\u1E5A', '\u1E5B', '\u1E5C', '\u1E5D', '\u1E5E', '\u1E5F', '\u1E60', '\u1E61',
+            '\u1E62', '\u1E63', '\u1E64', '\u1E65', '\u1E66', '\u1E67', '\u1E68', '\u1E69', '\u1E6A', '\u1E6B', '\u1E6C', '\u1E6D', '\u1E6E', '\u1E6F', '\u1E70', '\u1E71',
+            '\u1E72', '\u1E73', '\u1E74', '\u1E75', '\u1E76', '\u1E77', '\u1E78', '\u1E79', '\u1E7A', '\u1E7B', '\u1E7C', '\u1E7D', '\u1E7E', '\u1E7F', '\u1E80', '\u1E81',
+            '\u1E82', '\u1E83', '\u1E84', '\u1E85', '\u1E86', '\u1E87', '\u1E88', '\u1E89', '\u1E8A', '\u1E8B', '\u1E8C', '\u1E8D', '\u1E8E', '\u1E8F', '\u1E90', '\u1E91',
+            '\u1E92', '\u1E93', '\u1E94', '\u1E95', '\u00DF', '\u1E9E', '\u1EA0', '\u1EA1', '\u1EA2', '\u1EA3', '\u1EA4', '\u1EA5', '\u1EA6', '\u1EA7', '\u1EA8', '\u1EA9',
+            '\u1EAA', '\u1EAB', '\u1EAC', '\u1EAD', '\u1EAE', '\u1EAF', '\u1EB0', '\u1EB1', '\u1EB2', '\u1EB3', '\u1EB4', '\u1EB5', '\u1EB6', '\u1EB7', '\u1EB8', '\u1EB9',
+            '\u1EBA', '\u1EBB', '\u1EBC', '\u1EBD', '\u1EBE', '\u1EBF', '\u1EC0', '\u1EC1', '\u1EC2', '\u1EC3', '\u1EC4', '\u1EC5', '\u1EC6', '\u1EC7', '\u1EC8', '\u1EC9',
+            '\u1ECA', '\u1ECB', '\u1ECC', '\u1ECD', '\u1ECE', '\u1ECF', '\u1ED0', '\u1ED1', '\u1ED2', '\u1ED3', '\u1ED4', '\u1ED5', '\u1ED6', '\u1ED7', '\u1ED8', '\u1ED9',
+            '\u1EDA', '\u1EDB', '\u1EDC', '\u1EDD', '\u1EDE', '\u1EDF', '\u1EE0', '\u1EE1', '\u1EE2', '\u1EE3', '\u1EE4', '\u1EE5', '\u1EE6', '\u1EE7', '\u1EE8', '\u1EE9',
+            '\u1EEA', '\u1EEB', '\u1EEC', '\u1EED', '\u1EEE', '\u1EEF', '\u1EF0', '\u1EF1', '\u1EF2', '\u1EF3', '\u1EF4', '\u1EF5', '\u1EF6', '\u1EF7', '\u1EF8', '\u1EF9',
+            '\u1EFA', '\u1EFB', '\u1EFC', '\u1EFD', '\u1EFE', '\u1EFF', '\u1F00', '\u1F08', '\u1F01', '\u1F09', '\u1F02', '\u1F0A', '\u1F03', '\u1F0B', '\u1F04', '\u1F0C',
+            '\u1F05', '\u1F0D', '\u1F06', '\u1F0E', '\u1F07', '\u1F0F', '\u1F10', '\u1F18', '\u1F11', '\u1F19', '\u1F12', '\u1F1A', '\u1F13', '\u1F1B', '\u1F14', '\u1F1C',
+            '\u1F15', '\u1F1D', '\u1F20', '\u1F28', '\u1F21', '\u1F29', '\u1F22', '\u1F2A', '\u1F23', '\u1F2B', '\u1F24', '\u1F2C', '\u1F25', '\u1F2D', '\u1F26', '\u1F2E',
+            '\u1F27', '\u1F2F', '\u1F30', '\u1F38', '\u1F31', '\u1F39', '\u1F32', '\u1F3A', '\u1F33', '\u1F3B', '\u1F34', '\u1F3C', '\u1F35', '\u1F3D', '\u1F36', '\u1F3E',
+            '\u1F37', '\u1F3F', '\u1F40', '\u1F48', '\u1F41', '\u1F49', '\u1F42', '\u1F4A', '\u1F43', '\u1F4B', '\u1F44', '\u1F4C', '\u1F45', '\u1F4D', '\u1F51', '\u1F59',
+            '\u1F53', '\u1F5B', '\u1F55', '\u1F5D', '\u1F57', '\u1F5F', '\u1F60', '\u1F68', '\u1F61', '\u1F69', '\u1F62', '\u1F6A', '\u1F63', '\u1F6B', '\u1F64', '\u1F6C',
+            '\u1F65', '\u1F6D', '\u1F66', '\u1F6E', '\u1F67', '\u1F6F', '\u1F80', '\u1F88', '\u1F81', '\u1F89', '\u1F82', '\u1F8A', '\u1F83', '\u1F8B', '\u1F84', '\u1F8C',
+            '\u1F85', '\u1F8D', '\u1F86', '\u1F8E', '\u1F87', '\u1F8F', '\u1F90', '\u1F98', '\u1F91', '\u1F99', '\u1F92', '\u1F9A', '\u1F93', '\u1F9B', '\u1F94', '\u1F9C',
+            '\u1F95', '\u1F9D', '\u1F96', '\u1F9E', '\u1F97', '\u1F9F', '\u1FA0', '\u1FA8', '\u1FA1', '\u1FA9', '\u1FA2', '\u1FAA', '\u1FA3', '\u1FAB', '\u1FA4', '\u1FAC',
+            '\u1FA5', '\u1FAD', '\u1FA6', '\u1FAE', '\u1FA7', '\u1FAF', '\u1FB0', '\u1FB8', '\u1FB1', '\u1FB9', '\u1F70', '\u1FBA', '\u1F71', '\u1FBB', '\u1FB3', '\u1FBC',
+            '\u1F72', '\u1FC8', '\u1F73', '\u1FC9', '\u1F74', '\u1FCA', '\u1F75', '\u1FCB', '\u1FC3', '\u1FCC', '\u1FD0', '\u1FD8', '\u1FD1', '\u1FD9', '\u1F76', '\u1FDA',
+            '\u1F77', '\u1FDB', '\u1FE0', '\u1FE8', '\u1FE1', '\u1FE9', '\u1F7A', '\u1FEA', '\u1F7B', '\u1FEB', '\u1FE5', '\u1FEC', '\u1F78', '\u1FF8', '\u1F79', '\u1FF9',
+            '\u1F7C', '\u1FFA', '\u1F7D', '\u1FFB', '\u1FF3', '\u1FFC', '\u2132', '\u214E', '\u2160', '\u2170', '\u2161', '\u2171', '\u2162', '\u2172', '\u2163', '\u2173',
+            '\u2164', '\u2174', '\u2165', '\u2175', '\u2166', '\u2176', '\u2167', '\u2177', '\u2168', '\u2178', '\u2169', '\u2179', '\u216A', '\u217A', '\u216B', '\u217B',
+            '\u216C', '\u217C', '\u216D', '\u217D', '\u216E', '\u217E', '\u216F', '\u217F', '\u2183', '\u2184', '\u24B6', '\u24D0', '\u24B7', '\u24D1', '\u24B8', '\u24D2',
+            '\u24B9', '\u24D3', '\u24BA', '\u24D4', '\u24BB', '\u24D5', '\u24BC', '\u24D6', '\u24BD', '\u24D7', '\u24BE', '\u24D8', '\u24BF', '\u24D9', '\u24C0', '\u24DA',
+            '\u24C1', '\u24DB', '\u24C2', '\u24DC', '\u24C3', '\u24DD', '\u24C4', '\u24DE', '\u24C5', '\u24DF', '\u24C6', '\u24E0', '\u24C7', '\u24E1', '\u24C8', '\u24E2',
+            '\u24C9', '\u24E3', '\u24CA', '\u24E4', '\u24CB', '\u24E5', '\u24CC', '\u24E6', '\u24CD', '\u24E7', '\u24CE', '\u24E8', '\u24CF', '\u24E9', '\u2C00', '\u2C30',
+            '\u2C01', '\u2C31', '\u2C02', '\u2C32', '\u2C03', '\u2C33', '\u2C04', '\u2C34', '\u2C05', '\u2C35', '\u2C06', '\u2C36', '\u2C07', '\u2C37', '\u2C08', '\u2C38',
+            '\u2C09', '\u2C39', '\u2C0A', '\u2C3A', '\u2C0B', '\u2C3B', '\u2C0C', '\u2C3C', '\u2C0D', '\u2C3D', '\u2C0E', '\u2C3E', '\u2C0F', '\u2C3F', '\u2C10', '\u2C40',
+            '\u2C11', '\u2C41', '\u2C12', '\u2C42', '\u2C13', '\u2C43', '\u2C14', '\u2C44', '\u2C15', '\u2C45', '\u2C16', '\u2C46', '\u2C17', '\u2C47', '\u2C18', '\u2C48',
+            '\u2C19', '\u2C49', '\u2C1A', '\u2C4A', '\u2C1B', '\u2C4B', '\u2C1C', '\u2C4C', '\u2C1D', '\u2C4D', '\u2C1E', '\u2C4E', '\u2C1F', '\u2C4F', '\u2C20', '\u2C50',
+            '\u2C21', '\u2C51', '\u2C22', '\u2C52', '\u2C23', '\u2C53', '\u2C24', '\u2C54', '\u2C25', '\u2C55', '\u2C26', '\u2C56', '\u2C27', '\u2C57', '\u2C28', '\u2C58',
+            '\u2C29', '\u2C59', '\u2C2A', '\u2C5A', '\u2C2B', '\u2C5B', '\u2C2C', '\u2C5C', '\u2C2D', '\u2C5D', '\u2C2E', '\u2C5E', '\u2C2F', '\u2C5F', '\u2C60', '\u2C61',
+            '\u026B', '\u2C62', '\u1D7D', '\u2C63', '\u027D', '\u2C64', '\u2C67', '\u2C68', '\u2C69', '\u2C6A', '\u2C6B', '\u2C6C', '\u0251', '\u2C6D', '\u0271', '\u2C6E',
+            '\u0250', '\u2C6F', '\u0252', '\u2C70', '\u2C72', '\u2C73', '\u2C75', '\u2C76', '\u023F', '\u2C7E', '\u0240', '\u2C7F', '\u2C80', '\u2C81', '\u2C82', '\u2C83',
+            '\u2C84', '\u2C85', '\u2C86', '\u2C87', '\u2C88', '\u2C89', '\u2C8A', '\u2C8B', '\u2C8C', '\u2C8D', '\u2C8E', '\u2C8F', '\u2C90', '\u2C91', '\u2C92', '\u2C93',
+            '\u2C94', '\u2C95', '\u2C96', '\u2C97', '\u2C98', '\u2C99', '\u2C9A', '\u2C9B', '\u2C9C', '\u2C9D', '\u2C9E', '\u2C9F', '\u2CA0', '\u2CA1', '\u2CA2', '\u2CA3',
+            '\u2CA4', '\u2CA5', '\u2CA6', '\u2CA7', '\u2CA8', '\u2CA9', '\u2CAA', '\u2CAB', '\u2CAC', '\u2CAD', '\u2CAE', '\u2CAF', '\u2CB0', '\u2CB1', '\u2CB2', '\u2CB3',
+            '\u2CB4', '\u2CB5', '\u2CB6', '\u2CB7', '\u2CB8', '\u2CB9', '\u2CBA', '\u2CBB', '\u2CBC', '\u2CBD', '\u2CBE', '\u2CBF', '\u2CC0', '\u2CC1', '\u2CC2', '\u2CC3',
+            '\u2CC4', '\u2CC5', '\u2CC6', '\u2CC7', '\u2CC8', '\u2CC9', '\u2CCA', '\u2CCB', '\u2CCC', '\u2CCD', '\u2CCE', '\u2CCF', '\u2CD0', '\u2CD1', '\u2CD2', '\u2CD3',
+            '\u2CD4', '\u2CD5', '\u2CD6', '\u2CD7', '\u2CD8', '\u2CD9', '\u2CDA', '\u2CDB', '\u2CDC', '\u2CDD', '\u2CDE', '\u2CDF', '\u2CE0', '\u2CE1', '\u2CE2', '\u2CE3',
+            '\u2CEB', '\u2CEC', '\u2CED', '\u2CEE', '\u2CF2', '\u2CF3', '\uA640', '\uA641', '\uA642', '\uA643', '\uA644', '\uA645', '\uA646', '\uA647', '\uA648', '\uA649',
+            '\uA64A', '\uA64B', '\uA64C', '\uA64D', '\uA64E', '\uA64F', '\uA650', '\uA651', '\uA652', '\uA653', '\uA654', '\uA655', '\uA656', '\uA657', '\uA658', '\uA659',
+            '\uA65A', '\uA65B', '\uA65C', '\uA65D', '\uA65E', '\uA65F', '\uA660', '\uA661', '\uA662', '\uA663', '\uA664', '\uA665', '\uA666', '\uA667', '\uA668', '\uA669',
+            '\uA66A', '\uA66B', '\uA66C', '\uA66D', '\uA680', '\uA681', '\uA682', '\uA683', '\uA684', '\uA685', '\uA686', '\uA687', '\uA688', '\uA689', '\uA68A', '\uA68B',
+            '\uA68C', '\uA68D', '\uA68E', '\uA68F', '\uA690', '\uA691', '\uA692', '\uA693', '\uA694', '\uA695', '\uA696', '\uA697', '\uA698', '\uA699', '\uA69A', '\uA69B',
+            '\uA722', '\uA723', '\uA724', '\uA725', '\uA726', '\uA727', '\uA728', '\uA729', '\uA72A', '\uA72B', '\uA72C', '\uA72D', '\uA72E', '\uA72F', '\uA732', '\uA733',
+            '\uA734', '\uA735', '\uA736', '\uA737', '\uA738', '\uA739', '\uA73A', '\uA73B', '\uA73C', '\uA73D', '\uA73E', '\uA73F', '\uA740', '\uA741', '\uA742', '\uA743',
+            '\uA744', '\uA745', '\uA746', '\uA747', '\uA748', '\uA749', '\uA74A', '\uA74B', '\uA74C', '\uA74D', '\uA74E', '\uA74F', '\uA750', '\uA751', '\uA752', '\uA753',
+            '\uA754', '\uA755', '\uA756', '\uA757', '\uA758', '\uA759', '\uA75A', '\uA75B', '\uA75C', '\uA75D', '\uA75E', '\uA75F', '\uA760', '\uA761', '\uA762', '\uA763',
+            '\uA764', '\uA765', '\uA766', '\uA767', '\uA768', '\uA769', '\uA76A', '\uA76B', '\uA76C', '\uA76D', '\uA76E', '\uA76F', '\uA779', '\uA77A', '\uA77B', '\uA77C',
+            '\u1D79', '\uA77D', '\uA77E', '\uA77F', '\uA780', '\uA781', '\uA782', '\uA783', '\uA784', '\uA785', '\uA786', '\uA787', '\uA78B', '\uA78C', '\u0265', '\uA78D',
+            '\uA790', '\uA791', '\uA792', '\uA793', '\uA796', '\uA797', '\uA798', '\uA799', '\uA79A', '\uA79B', '\uA79C', '\uA79D', '\uA79E', '\uA79F', '\uA7A0', '\uA7A1',
+            '\uA7A2', '\uA7A3', '\uA7A4', '\uA7A5', '\uA7A6', '\uA7A7', '\uA7A8', '\uA7A9', '\u0266', '\uA7AA', '\u025C', '\uA7AB', '\u0261', '\uA7AC', '\u026C', '\uA7AD',
+            '\u026A', '\uA7AE', '\u029E', '\uA7B0', '\u0287', '\uA7B1', '\u029D', '\uA7B2', '\uA7B3', '\uAB53', '\uA7B4', '\uA7B5', '\uA7B6', '\uA7B7', '\uA7B8', '\uA7B9',
+            '\uA7BA', '\uA7BB', '\uA7BC', '\uA7BD', '\uA7BE', '\uA7BF', '\uA7C0', '\uA7C1', '\uA7C2', '\uA7C3', '\uA794', '\uA7C4', '\u0282', '\uA7C5', '\u1D8E', '\uA7C6',
+            '\uA7C7', '\uA7C8', '\uA7C9', '\uA7CA', '\uA7D0', '\uA7D1', '\uA7D6', '\uA7D7', '\uA7D8', '\uA7D9', '\uA7F5', '\uA7F6', '\uFF21', '\uFF41', '\uFF22', '\uFF42',
+            '\uFF23', '\uFF43', '\uFF24', '\uFF44', '\uFF25', '\uFF45', '\uFF26', '\uFF46', '\uFF27', '\uFF47', '\uFF28', '\uFF48', '\uFF29', '\uFF49', '\uFF2A', '\uFF4A',
+            '\uFF2B', '\uFF4B', '\uFF2C', '\uFF4C', '\uFF2D', '\uFF4D', '\uFF2E', '\uFF4E', '\uFF2F', '\uFF4F', '\uFF30', '\uFF50', '\uFF31', '\uFF51', '\uFF32', '\uFF52',
+            '\uFF33', '\uFF53', '\uFF34', '\uFF54', '\uFF35', '\uFF55', '\uFF36', '\uFF56', '\uFF37', '\uFF57', '\uFF38', '\uFF58', '\uFF39', '\uFF59', '\uFF3A', '\uFF5A'
+        };
+
+        private static ushort[] EquivalenceFirstLevelLookup { get; } = new ushort[64]
+        {
+            0x0000, 0x0400, 0xffff, 0xffff, 0x0800, 0xffff, 0xffff, 0x0c00, 0x1000, 0x1400, 0xffff, 0x1800, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1c00, 0x2000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x2400
+        };
+
+        private static ushort[] EquivalenceCasingMap { get; } = new ushort[10240]
+        {
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0x4000, 0x4002, 0x4004, 0x4006, 0x4008, 0x400a, 0x400c, 0x400e, 0x4010, 0x4012, 0x6014, 0x4017, 0x4019, 0x401b, 0x401d,
+            0x401f, 0x4021, 0x4023, 0x4025, 0x4027, 0x4029, 0x402b, 0x402d, 0x402f, 0x4031, 0x4033, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0x4000, 0x4002, 0x4004, 0x4006, 0x4008, 0x400a, 0x400c, 0x400e, 0x4010, 0x4012, 0x6014, 0x4017, 0x4019, 0x401b, 0x401d,
+            0x401f, 0x4021, 0x4023, 0x4025, 0x4027, 0x4029, 0x402b, 0x402d, 0x402f, 0x4031, 0x4033, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x4035, 0x4037, 0x4039, 0x403b, 0x403d, 0x603f, 0x4042, 0x4044, 0x4046, 0x4048, 0x404a, 0x404c, 0x404e, 0x4050, 0x4052, 0x4054,
+            0x4056, 0x4058, 0x405a, 0x405c, 0x405e, 0x4060, 0x4062, 0xffff, 0x4064, 0x4066, 0x4068, 0x406a, 0x406c, 0x406e, 0x4070, 0x4594,
+            0x4035, 0x4037, 0x4039, 0x403b, 0x403d, 0x603f, 0x4042, 0x4044, 0x4046, 0x4048, 0x404a, 0x404c, 0x404e, 0x4050, 0x4052, 0x4054,
+            0x4056, 0x4058, 0x405a, 0x405c, 0x405e, 0x4060, 0x4062, 0xffff, 0x4064, 0x4066, 0x4068, 0x406a, 0x406c, 0x406e, 0x4070, 0x40e6,
+            0x4072, 0x4072, 0x4074, 0x4074, 0x4076, 0x4076, 0x4078, 0x4078, 0x407a, 0x407a, 0x407c, 0x407c, 0x407e, 0x407e, 0x4080, 0x4080,
+            0x4082, 0x4082, 0x4084, 0x4084, 0x4086, 0x4086, 0x4088, 0x4088, 0x408a, 0x408a, 0x408c, 0x408c, 0x408e, 0x408e, 0x4090, 0x4090,
+            0x4092, 0x4092, 0x4094, 0x4094, 0x4096, 0x4096, 0x4098, 0x4098, 0x409a, 0x409a, 0x409c, 0x409c, 0x409e, 0x409e, 0x40a0, 0x40a0,
+            0xffff, 0xffff, 0x40a2, 0x40a2, 0x40a4, 0x40a4, 0x40a6, 0x40a6, 0xffff, 0x40a8, 0x40a8, 0x40aa, 0x40aa, 0x40ac, 0x40ac, 0x40ae,
+            0x40ae, 0x40b0, 0x40b0, 0x40b2, 0x40b2, 0x40b4, 0x40b4, 0x40b6, 0x40b6, 0xffff, 0x40b8, 0x40b8, 0x40ba, 0x40ba, 0x40bc, 0x40bc,
+            0x40be, 0x40be, 0x40c0, 0x40c0, 0x40c2, 0x40c2, 0x40c4, 0x40c4, 0x40c6, 0x40c6, 0x40c8, 0x40c8, 0x40ca, 0x40ca, 0x40cc, 0x40cc,
+            0x40ce, 0x40ce, 0x40d0, 0x40d0, 0x40d2, 0x40d2, 0x40d4, 0x40d4, 0x40d6, 0x40d6, 0x40d8, 0x40d8, 0x40da, 0x40da, 0x40dc, 0x40dc,
+            0x40de, 0x40de, 0x40e0, 0x40e0, 0x40e2, 0x40e2, 0x40e4, 0x40e4, 0x40e6, 0x40e8, 0x40e8, 0x40ea, 0x40ea, 0x40ec, 0x40ec, 0xffff,
+            0x41b0, 0x40ee, 0x40f0, 0x40f0, 0x40f2, 0x40f2, 0x40f4, 0x40f6, 0x40f6, 0x40f8, 0x40fa, 0x40fc, 0x40fc, 0xffff, 0x40fe, 0x4100,
+            0x4102, 0x4104, 0x4104, 0x4106, 0x4108, 0x4166, 0x410a, 0x410c, 0x410e, 0x410e, 0x41aa, 0xffff, 0x4110, 0x4112, 0x4192, 0x4114,
+            0x4116, 0x4116, 0x4118, 0x4118, 0x411a, 0x411a, 0x411c, 0x411e, 0x411e, 0x4120, 0xffff, 0xffff, 0x4122, 0x4122, 0x4124, 0x4126,
+            0x4126, 0x4128, 0x412a, 0x412c, 0x412c, 0x412e, 0x412e, 0x4130, 0x4132, 0x4132, 0xffff, 0xffff, 0x4134, 0x4134, 0xffff, 0x4168,
+            0xffff, 0xffff, 0xffff, 0xffff, 0x6136, 0x6136, 0x6136, 0x6139, 0x6139, 0x6139, 0x613c, 0x613c, 0x613c, 0x413f, 0x413f, 0x4141,
+            0x4141, 0x4143, 0x4143, 0x4145, 0x4145, 0x4147, 0x4147, 0x4149, 0x4149, 0x414b, 0x414b, 0x414d, 0x414d, 0x40fe, 0x414f, 0x414f,
+            0x4151, 0x4151, 0x4153, 0x4153, 0x4155, 0x4155, 0x4157, 0x4157, 0x4159, 0x4159, 0x415b, 0x415b, 0x415d, 0x415d, 0x415f, 0x415f,
+            0xffff, 0x6161, 0x6161, 0x6161, 0x4164, 0x4164, 0x4166, 0x4168, 0x416a, 0x416a, 0x416c, 0x416c, 0x416e, 0x416e, 0x4170, 0x4170,
+            0x4172, 0x4172, 0x4174, 0x4174, 0x4176, 0x4176, 0x4178, 0x4178, 0x417a, 0x417a, 0x417c, 0x417c, 0x417e, 0x417e, 0x4180, 0x4180,
+            0x4182, 0x4182, 0x4184, 0x4184, 0x4186, 0x4186, 0x4188, 0x4188, 0x418a, 0x418a, 0x418c, 0x418c, 0x418e, 0x418e, 0x4190, 0x4190,
+            0x4192, 0xffff, 0x4194, 0x4194, 0x4196, 0x4196, 0x4198, 0x4198, 0x419a, 0x419a, 0x419c, 0x419c, 0x419e, 0x419e, 0x41a0, 0x41a0,
+            0x41a2, 0x41a2, 0x41a4, 0x41a4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x41a6, 0x41a8, 0x41a8, 0x41aa, 0x41ac, 0x4788,
+            0x478a, 0x41ae, 0x41ae, 0x41b0, 0x41b2, 0x41b4, 0x41b6, 0x41b6, 0x41b8, 0x41b8, 0x41ba, 0x41ba, 0x41bc, 0x41bc, 0x41be, 0x41be,
+            0x4780, 0x477c, 0x4782, 0x40ee, 0x40f4, 0xffff, 0x40f8, 0x40fa, 0xffff, 0x4100, 0xffff, 0x4102, 0x48ba, 0xffff, 0xffff, 0xffff,
+            0x4106, 0x48bc, 0xffff, 0x4108, 0xffff, 0x489e, 0x48b8, 0xffff, 0x410c, 0x410a, 0x48c0, 0x4770, 0x48be, 0xffff, 0xffff, 0x4110,
+            0xffff, 0x477e, 0x4112, 0xffff, 0xffff, 0x4114, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4774, 0xffff, 0xffff,
+            0x411c, 0xffff, 0x48dc, 0x4120, 0xffff, 0xffff, 0xffff, 0x48c4, 0x4124, 0x41b2, 0x4128, 0x412a, 0x41b4, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0x4130, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x48c6, 0x48c2, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x41c0, 0x41c0, 0x41c2, 0x41c2, 0xffff, 0xffff, 0x41c4, 0x41c4, 0xffff, 0xffff, 0xffff, 0x422c, 0x422e, 0x4230, 0xffff, 0x41c6,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x41c8, 0xffff, 0x41ca, 0x41cc, 0x41ce, 0xffff, 0x41d0, 0xffff, 0x41d2, 0x41d4,
+            0xffff, 0x41d6, 0x41d8, 0x41da, 0x41dc, 0x41de, 0x41e0, 0x41e2, 0x61e4, 0x41e7, 0x41e9, 0x41eb, 0x41ed, 0x41ef, 0x41f1, 0x41f3,
+            0x41f5, 0x41f7, 0xffff, 0x41f9, 0x41fb, 0x41fd, 0x41ff, 0x4201, 0x4203, 0x6205, 0x4208, 0x420a, 0x41c8, 0x41ca, 0x41cc, 0x41ce,
+            0xffff, 0x41d6, 0x41d8, 0x41da, 0x41dc, 0x41de, 0x41e0, 0x41e2, 0x61e4, 0x41e7, 0x41e9, 0x41eb, 0x41ed, 0x41ef, 0x41f1, 0x41f3,
+            0x41f5, 0x41f7, 0xffff, 0x41f9, 0x41fb, 0x41fd, 0x41ff, 0x4201, 0x4203, 0x6205, 0x4208, 0x420a, 0x41d0, 0x41d2, 0x41d4, 0x420c,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x420c, 0x420e, 0x420e, 0x4210, 0x4210, 0x4212, 0x4212, 0x4214, 0x4214,
+            0x4216, 0x4216, 0x4218, 0x4218, 0x421a, 0x421a, 0x421c, 0x421c, 0x421e, 0x421e, 0x4220, 0x4220, 0x4222, 0x4222, 0x4224, 0x4224,
+            0xffff, 0xffff, 0x4228, 0x41c6, 0x61e4, 0xffff, 0xffff, 0x4226, 0x4226, 0x4228, 0x422a, 0x422a, 0xffff, 0x422c, 0x422e, 0x4230,
+            0x4232, 0x4234, 0x4236, 0x4238, 0x423a, 0x423c, 0x423e, 0x4240, 0x4242, 0x4244, 0x4246, 0x4248, 0x424a, 0x424c, 0x424e, 0x4250,
+            0x4252, 0x4254, 0x4256, 0x4258, 0x425a, 0x425c, 0x425e, 0x4260, 0x4262, 0x4264, 0x4266, 0x4268, 0x426a, 0x426c, 0x426e, 0x4270,
+            0x4272, 0x4274, 0x4276, 0x4278, 0x427a, 0x427c, 0x427e, 0x4280, 0x4282, 0x4284, 0x4286, 0x4288, 0x428a, 0x428c, 0x428e, 0x4290,
+            0x4252, 0x4254, 0x4256, 0x4258, 0x425a, 0x425c, 0x425e, 0x4260, 0x4262, 0x4264, 0x4266, 0x4268, 0x426a, 0x426c, 0x426e, 0x4270,
+            0x4272, 0x4274, 0x4276, 0x4278, 0x427a, 0x427c, 0x427e, 0x4280, 0x4282, 0x4284, 0x4286, 0x4288, 0x428a, 0x428c, 0x428e, 0x4290,
+            0x4232, 0x4234, 0x4236, 0x4238, 0x423a, 0x423c, 0x423e, 0x4240, 0x4242, 0x4244, 0x4246, 0x4248, 0x424a, 0x424c, 0x424e, 0x4250,
+            0x4292, 0x4292, 0x4294, 0x4294, 0x4296, 0x4296, 0x4298, 0x4298, 0x429a, 0x429a, 0x429c, 0x429c, 0x429e, 0x429e, 0x42a0, 0x42a0,
+            0x42a2, 0x42a2, 0x42a4, 0x42a4, 0x42a6, 0x42a6, 0x42a8, 0x42a8, 0x42aa, 0x42aa, 0x42ac, 0x42ac, 0x42ae, 0x42ae, 0x42b0, 0x42b0,
+            0x42b2, 0x42b2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x42b4, 0x42b4, 0x42b6, 0x42b6, 0x42b8, 0x42b8,
+            0x42ba, 0x42ba, 0x42bc, 0x42bc, 0x42be, 0x42be, 0x42c0, 0x42c0, 0x42c2, 0x42c2, 0x42c4, 0x42c4, 0x42c6, 0x42c6, 0x42c8, 0x42c8,
+            0x42ca, 0x42ca, 0x42cc, 0x42cc, 0x42ce, 0x42ce, 0x42d0, 0x42d0, 0x42d2, 0x42d2, 0x42d4, 0x42d4, 0x42d6, 0x42d6, 0x42d8, 0x42d8,
+            0x42da, 0x42da, 0x42dc, 0x42dc, 0x42de, 0x42de, 0x42e0, 0x42e0, 0x42e2, 0x42e2, 0x42e4, 0x42e4, 0x42e6, 0x42e6, 0x42e8, 0x42e8,
+            0x42ea, 0x42ec, 0x42ec, 0x42ee, 0x42ee, 0x42f0, 0x42f0, 0x42f2, 0x42f2, 0x42f4, 0x42f4, 0x42f6, 0x42f6, 0x42f8, 0x42f8, 0x42ea,
+            0x42fa, 0x42fa, 0x42fc, 0x42fc, 0x42fe, 0x42fe, 0x4300, 0x4300, 0x4302, 0x4302, 0x4304, 0x4304, 0x4306, 0x4306, 0x4308, 0x4308,
+            0x430a, 0x430a, 0x430c, 0x430c, 0x430e, 0x430e, 0x4310, 0x4310, 0x4312, 0x4312, 0x4314, 0x4314, 0x4316, 0x4316, 0x4318, 0x4318,
+            0x431a, 0x431a, 0x431c, 0x431c, 0x431e, 0x431e, 0x4320, 0x4320, 0x4322, 0x4322, 0x4324, 0x4324, 0x4326, 0x4326, 0x4328, 0x4328,
+            0x432a, 0x432a, 0x432c, 0x432c, 0x432e, 0x432e, 0x4330, 0x4330, 0x4332, 0x4332, 0x4334, 0x4334, 0x4336, 0x4336, 0x4338, 0x4338,
+            0x433a, 0x433a, 0x433c, 0x433c, 0x433e, 0x433e, 0x4340, 0x4340, 0x4342, 0x4342, 0x4344, 0x4344, 0x4346, 0x4346, 0x4348, 0x4348,
+            0x434a, 0x434a, 0x434c, 0x434c, 0x434e, 0x434e, 0x4350, 0x4350, 0x4352, 0x4352, 0x4354, 0x4354, 0x4356, 0x4356, 0x4358, 0x4358,
+            0xffff, 0x435a, 0x435c, 0x435e, 0x4360, 0x4362, 0x4364, 0x4366, 0x4368, 0x436a, 0x436c, 0x436e, 0x4370, 0x4372, 0x4374, 0x4376,
+            0x4378, 0x437a, 0x437c, 0x437e, 0x4380, 0x4382, 0x4384, 0x4386, 0x4388, 0x438a, 0x438c, 0x438e, 0x4390, 0x4392, 0x4394, 0x4396,
+            0x4398, 0x439a, 0x439c, 0x439e, 0x43a0, 0x43a2, 0x43a4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0x435a, 0x435c, 0x435e, 0x4360, 0x4362, 0x4364, 0x4366, 0x4368, 0x436a, 0x436c, 0x436e, 0x4370, 0x4372, 0x4374, 0x4376,
+            0x4378, 0x437a, 0x437c, 0x437e, 0x4380, 0x4382, 0x4384, 0x4386, 0x4388, 0x438a, 0x438c, 0x438e, 0x4390, 0x4392, 0x4394, 0x4396,
+            0x4398, 0x439a, 0x439c, 0x439e, 0x43a0, 0x43a2, 0x43a4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x43a6, 0x43a8, 0x43aa, 0x43ac, 0x43ae, 0x43b0, 0x43b2, 0x43b4, 0x43b6, 0x43b8, 0x43ba, 0x43bc, 0x43be, 0x43c0, 0x43c2, 0x43c4,
+            0x43c6, 0x43c8, 0x43ca, 0x43cc, 0x43ce, 0x43d0, 0x43d2, 0x43d4, 0x43d6, 0x43d8, 0x43da, 0x43dc, 0x43de, 0x43e0, 0x43e2, 0x43e4,
+            0x43e6, 0x43e8, 0x43ea, 0x43ec, 0x43ee, 0x43f0, 0xffff, 0x43f2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x43f4, 0xffff, 0xffff,
+            0x44a2, 0x44a4, 0x44a6, 0x44a8, 0x44aa, 0x44ac, 0x44ae, 0x44b0, 0x44b2, 0x44b4, 0x44b6, 0x44b8, 0x44ba, 0x44bc, 0x44be, 0x44c0,
+            0x44c2, 0x44c4, 0x44c6, 0x44c8, 0x44ca, 0x44cc, 0x44ce, 0x44d0, 0x44d2, 0x44d4, 0x44d6, 0x44d8, 0x44da, 0x44dc, 0x44de, 0x44e0,
+            0x44e2, 0x44e4, 0x44e6, 0x44e8, 0x44ea, 0x44ec, 0x44ee, 0x44f0, 0x44f2, 0x44f4, 0x44f6, 0xffff, 0xffff, 0x44f8, 0x44fa, 0x44fc,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x43f6, 0x43f8, 0x43fa, 0x43fc, 0x43fe, 0x4400, 0x4402, 0x4404, 0x4406, 0x4408, 0x440a, 0x440c, 0x440e, 0x4410, 0x4412, 0x4414,
+            0x4416, 0x4418, 0x441a, 0x441c, 0x441e, 0x4420, 0x4422, 0x4424, 0x4426, 0x4428, 0x442a, 0x442c, 0x442e, 0x4430, 0x4432, 0x4434,
+            0x4436, 0x4438, 0x443a, 0x443c, 0x443e, 0x4440, 0x4442, 0x4444, 0x4446, 0x4448, 0x444a, 0x444c, 0x444e, 0x4450, 0x4452, 0x4454,
+            0x4456, 0x4458, 0x445a, 0x445c, 0x445e, 0x4460, 0x4462, 0x4464, 0x4466, 0x4468, 0x446a, 0x446c, 0x446e, 0x4470, 0x4472, 0x4474,
+            0x4476, 0x4478, 0x447a, 0x447c, 0x447e, 0x4480, 0x4482, 0x4484, 0x4486, 0x4488, 0x448a, 0x448c, 0x448e, 0x4490, 0x4492, 0x4494,
+            0x4496, 0x4498, 0x449a, 0x449c, 0x449e, 0x44a0, 0xffff, 0xffff, 0x4496, 0x4498, 0x449a, 0x449c, 0x449e, 0x44a0, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x44a2, 0x44a4, 0x44a6, 0x44a8, 0x44aa, 0x44ac, 0x44ae, 0x44b0, 0x44b2, 0x44b4, 0x44b6, 0x44b8, 0x44ba, 0x44bc, 0x44be, 0x44c0,
+            0x44c2, 0x44c4, 0x44c6, 0x44c8, 0x44ca, 0x44cc, 0x44ce, 0x44d0, 0x44d2, 0x44d4, 0x44d6, 0x44d8, 0x44da, 0x44dc, 0x44de, 0x44e0,
+            0x44e2, 0x44e4, 0x44e6, 0x44e8, 0x44ea, 0x44ec, 0x44ee, 0x44f0, 0x44f2, 0x44f4, 0x44f6, 0xffff, 0xffff, 0x44f8, 0x44fa, 0x44fc,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4890, 0xffff, 0xffff, 0xffff, 0x4772, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x48de, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x44fe, 0x44fe, 0x4500, 0x4500, 0x4502, 0x4502, 0x4504, 0x4504, 0x4506, 0x4506, 0x4508, 0x4508, 0x450a, 0x450a, 0x450c, 0x450c,
+            0x450e, 0x450e, 0x4510, 0x4510, 0x4512, 0x4512, 0x4514, 0x4514, 0x4516, 0x4516, 0x4518, 0x4518, 0x451a, 0x451a, 0x451c, 0x451c,
+            0x451e, 0x451e, 0x4520, 0x4520, 0x4522, 0x4522, 0x4524, 0x4524, 0x4526, 0x4526, 0x4528, 0x4528, 0x452a, 0x452a, 0x452c, 0x452c,
+            0x452e, 0x452e, 0x4530, 0x4530, 0x4532, 0x4532, 0x4534, 0x4534, 0x4536, 0x4536, 0x4538, 0x4538, 0x453a, 0x453a, 0x453c, 0x453c,
+            0x453e, 0x453e, 0x4540, 0x4540, 0x4542, 0x4542, 0x4544, 0x4544, 0x4546, 0x4546, 0x4548, 0x4548, 0x454a, 0x454a, 0x454c, 0x454c,
+            0x454e, 0x454e, 0x4550, 0x4550, 0x4552, 0x4552, 0x4554, 0x4554, 0x4556, 0x4556, 0x4558, 0x4558, 0x455a, 0x455a, 0x455c, 0x455c,
+            0x455e, 0x455e, 0x4560, 0x4560, 0x4562, 0x4562, 0x4564, 0x4564, 0x4566, 0x4566, 0x4568, 0x4568, 0x456a, 0x456a, 0x456c, 0x456c,
+            0x456e, 0x456e, 0x4570, 0x4570, 0x4572, 0x4572, 0x4574, 0x4574, 0x4576, 0x4576, 0x4578, 0x4578, 0x457a, 0x457a, 0x457c, 0x457c,
+            0x457e, 0x457e, 0x4580, 0x4580, 0x4582, 0x4582, 0x4584, 0x4584, 0x4586, 0x4586, 0x4588, 0x4588, 0x458a, 0x458a, 0x458c, 0x458c,
+            0x458e, 0x458e, 0x4590, 0x4590, 0x4592, 0x4592, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4594, 0xffff,
+            0x4596, 0x4596, 0x4598, 0x4598, 0x459a, 0x459a, 0x459c, 0x459c, 0x459e, 0x459e, 0x45a0, 0x45a0, 0x45a2, 0x45a2, 0x45a4, 0x45a4,
+            0x45a6, 0x45a6, 0x45a8, 0x45a8, 0x45aa, 0x45aa, 0x45ac, 0x45ac, 0x45ae, 0x45ae, 0x45b0, 0x45b0, 0x45b2, 0x45b2, 0x45b4, 0x45b4,
+            0x45b6, 0x45b6, 0x45b8, 0x45b8, 0x45ba, 0x45ba, 0x45bc, 0x45bc, 0x45be, 0x45be, 0x45c0, 0x45c0, 0x45c2, 0x45c2, 0x45c4, 0x45c4,
+            0x45c6, 0x45c6, 0x45c8, 0x45c8, 0x45ca, 0x45ca, 0x45cc, 0x45cc, 0x45ce, 0x45ce, 0x45d0, 0x45d0, 0x45d2, 0x45d2, 0x45d4, 0x45d4,
+            0x45d6, 0x45d6, 0x45d8, 0x45d8, 0x45da, 0x45da, 0x45dc, 0x45dc, 0x45de, 0x45de, 0x45e0, 0x45e0, 0x45e2, 0x45e2, 0x45e4, 0x45e4,
+            0x45e6, 0x45e6, 0x45e8, 0x45e8, 0x45ea, 0x45ea, 0x45ec, 0x45ec, 0x45ee, 0x45ee, 0x45f0, 0x45f0, 0x45f2, 0x45f2, 0x45f4, 0x45f4,
+            0x45f6, 0x45f8, 0x45fa, 0x45fc, 0x45fe, 0x4600, 0x4602, 0x4604, 0x45f6, 0x45f8, 0x45fa, 0x45fc, 0x45fe, 0x4600, 0x4602, 0x4604,
+            0x4606, 0x4608, 0x460a, 0x460c, 0x460e, 0x4610, 0xffff, 0xffff, 0x4606, 0x4608, 0x460a, 0x460c, 0x460e, 0x4610, 0xffff, 0xffff,
+            0x4612, 0x4614, 0x4616, 0x4618, 0x461a, 0x461c, 0x461e, 0x4620, 0x4612, 0x4614, 0x4616, 0x4618, 0x461a, 0x461c, 0x461e, 0x4620,
+            0x4622, 0x4624, 0x4626, 0x4628, 0x462a, 0x462c, 0x462e, 0x4630, 0x4622, 0x4624, 0x4626, 0x4628, 0x462a, 0x462c, 0x462e, 0x4630,
+            0x4632, 0x4634, 0x4636, 0x4638, 0x463a, 0x463c, 0xffff, 0xffff, 0x4632, 0x4634, 0x4636, 0x4638, 0x463a, 0x463c, 0xffff, 0xffff,
+            0xffff, 0x463e, 0xffff, 0x4640, 0xffff, 0x4642, 0xffff, 0x4644, 0xffff, 0x463e, 0xffff, 0x4640, 0xffff, 0x4642, 0xffff, 0x4644,
+            0x4646, 0x4648, 0x464a, 0x464c, 0x464e, 0x4650, 0x4652, 0x4654, 0x4646, 0x4648, 0x464a, 0x464c, 0x464e, 0x4650, 0x4652, 0x4654,
+            0x468a, 0x468c, 0x4690, 0x4692, 0x4694, 0x4696, 0x469e, 0x46a0, 0x46ac, 0x46ae, 0x46a6, 0x46a8, 0x46b0, 0x46b2, 0xffff, 0xffff,
+            0x4656, 0x4658, 0x465a, 0x465c, 0x465e, 0x4660, 0x4662, 0x4664, 0x4656, 0x4658, 0x465a, 0x465c, 0x465e, 0x4660, 0x4662, 0x4664,
+            0x4666, 0x4668, 0x466a, 0x466c, 0x466e, 0x4670, 0x4672, 0x4674, 0x4666, 0x4668, 0x466a, 0x466c, 0x466e, 0x4670, 0x4672, 0x4674,
+            0x4676, 0x4678, 0x467a, 0x467c, 0x467e, 0x4680, 0x4682, 0x4684, 0x4676, 0x4678, 0x467a, 0x467c, 0x467e, 0x4680, 0x4682, 0x4684,
+            0x4686, 0x4688, 0xffff, 0x468e, 0xffff, 0xffff, 0xffff, 0xffff, 0x4686, 0x4688, 0x468a, 0x468c, 0x468e, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0x4698, 0xffff, 0xffff, 0xffff, 0xffff, 0x4690, 0x4692, 0x4694, 0x4696, 0x4698, 0xffff, 0xffff, 0xffff,
+            0x469a, 0x469c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x469a, 0x469c, 0x469e, 0x46a0, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x46a2, 0x46a4, 0xffff, 0xffff, 0xffff, 0x46aa, 0xffff, 0xffff, 0x46a2, 0x46a4, 0x46a6, 0x46a8, 0x46aa, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0x46b4, 0xffff, 0xffff, 0xffff, 0xffff, 0x46ac, 0x46ae, 0x46b0, 0x46b2, 0x46b4, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6205, 0xffff, 0xffff, 0xffff, 0x6014, 0x603f, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0x46b6, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x46b6, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x46b8, 0x46ba, 0x46bc, 0x46be, 0x46c0, 0x46c2, 0x46c4, 0x46c6, 0x46c8, 0x46ca, 0x46cc, 0x46ce, 0x46d0, 0x46d2, 0x46d4, 0x46d6,
+            0x46b8, 0x46ba, 0x46bc, 0x46be, 0x46c0, 0x46c2, 0x46c4, 0x46c6, 0x46c8, 0x46ca, 0x46cc, 0x46ce, 0x46d0, 0x46d2, 0x46d4, 0x46d6,
+            0xffff, 0xffff, 0xffff, 0x46d8, 0x46d8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x46da, 0x46dc, 0x46de, 0x46e0, 0x46e2, 0x46e4, 0x46e6, 0x46e8, 0x46ea, 0x46ec,
+            0x46ee, 0x46f0, 0x46f2, 0x46f4, 0x46f6, 0x46f8, 0x46fa, 0x46fc, 0x46fe, 0x4700, 0x4702, 0x4704, 0x4706, 0x4708, 0x470a, 0x470c,
+            0x46da, 0x46dc, 0x46de, 0x46e0, 0x46e2, 0x46e4, 0x46e6, 0x46e8, 0x46ea, 0x46ec, 0x46ee, 0x46f0, 0x46f2, 0x46f4, 0x46f6, 0x46f8,
+            0x46fa, 0x46fc, 0x46fe, 0x4700, 0x4702, 0x4704, 0x4706, 0x4708, 0x470a, 0x470c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x470e, 0x4710, 0x4712, 0x4714, 0x4716, 0x4718, 0x471a, 0x471c, 0x471e, 0x4720, 0x4722, 0x4724, 0x4726, 0x4728, 0x472a, 0x472c,
+            0x472e, 0x4730, 0x4732, 0x4734, 0x4736, 0x4738, 0x473a, 0x473c, 0x473e, 0x4740, 0x4742, 0x4744, 0x4746, 0x4748, 0x474a, 0x474c,
+            0x474e, 0x4750, 0x4752, 0x4754, 0x4756, 0x4758, 0x475a, 0x475c, 0x475e, 0x4760, 0x4762, 0x4764, 0x4766, 0x4768, 0x476a, 0x476c,
+            0x470e, 0x4710, 0x4712, 0x4714, 0x4716, 0x4718, 0x471a, 0x471c, 0x471e, 0x4720, 0x4722, 0x4724, 0x4726, 0x4728, 0x472a, 0x472c,
+            0x472e, 0x4730, 0x4732, 0x4734, 0x4736, 0x4738, 0x473a, 0x473c, 0x473e, 0x4740, 0x4742, 0x4744, 0x4746, 0x4748, 0x474a, 0x474c,
+            0x474e, 0x4750, 0x4752, 0x4754, 0x4756, 0x4758, 0x475a, 0x475c, 0x475e, 0x4760, 0x4762, 0x4764, 0x4766, 0x4768, 0x476a, 0x476c,
+            0x476e, 0x476e, 0x4770, 0x4772, 0x4774, 0x41a6, 0x41ac, 0x4776, 0x4776, 0x4778, 0x4778, 0x477a, 0x477a, 0x477c, 0x477e, 0x4780,
+            0x4782, 0xffff, 0x4784, 0x4784, 0xffff, 0x4786, 0x4786, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4788, 0x478a,
+            0x478c, 0x478c, 0x478e, 0x478e, 0x4790, 0x4790, 0x4792, 0x4792, 0x4794, 0x4794, 0x4796, 0x4796, 0x4798, 0x4798, 0x479a, 0x479a,
+            0x479c, 0x479c, 0x479e, 0x479e, 0x47a0, 0x47a0, 0x47a2, 0x47a2, 0x47a4, 0x47a4, 0x47a6, 0x47a6, 0x47a8, 0x47a8, 0x47aa, 0x47aa,
+            0x47ac, 0x47ac, 0x47ae, 0x47ae, 0x47b0, 0x47b0, 0x47b2, 0x47b2, 0x47b4, 0x47b4, 0x47b6, 0x47b6, 0x47b8, 0x47b8, 0x47ba, 0x47ba,
+            0x47bc, 0x47bc, 0x47be, 0x47be, 0x47c0, 0x47c0, 0x47c2, 0x47c2, 0x47c4, 0x47c4, 0x47c6, 0x47c6, 0x47c8, 0x47c8, 0x47ca, 0x47ca,
+            0x47cc, 0x47cc, 0x47ce, 0x47ce, 0x47d0, 0x47d0, 0x47d2, 0x47d2, 0x47d4, 0x47d4, 0x47d6, 0x47d6, 0x47d8, 0x47d8, 0x47da, 0x47da,
+            0x47dc, 0x47dc, 0x47de, 0x47de, 0x47e0, 0x47e0, 0x47e2, 0x47e2, 0x47e4, 0x47e4, 0x47e6, 0x47e6, 0x47e8, 0x47e8, 0x47ea, 0x47ea,
+            0x47ec, 0x47ec, 0x47ee, 0x47ee, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x47f0, 0x47f0, 0x47f2, 0x47f2, 0xffff,
+            0xffff, 0xffff, 0x47f4, 0x47f4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x43a6, 0x43a8, 0x43aa, 0x43ac, 0x43ae, 0x43b0, 0x43b2, 0x43b4, 0x43b6, 0x43b8, 0x43ba, 0x43bc, 0x43be, 0x43c0, 0x43c2, 0x43c4,
+            0x43c6, 0x43c8, 0x43ca, 0x43cc, 0x43ce, 0x43d0, 0x43d2, 0x43d4, 0x43d6, 0x43d8, 0x43da, 0x43dc, 0x43de, 0x43e0, 0x43e2, 0x43e4,
+            0x43e6, 0x43e8, 0x43ea, 0x43ec, 0x43ee, 0x43f0, 0xffff, 0x43f2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x43f4, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x47f6, 0x47f6, 0x47f8, 0x47f8, 0x47fa, 0x47fa, 0x47fc, 0x47fc, 0x47fe, 0x47fe, 0x4800, 0x4800, 0x4802, 0x4802, 0x4804, 0x4804,
+            0x4806, 0x4806, 0x4808, 0x4808, 0x480a, 0x480a, 0x480c, 0x480c, 0x480e, 0x480e, 0x4810, 0x4810, 0x4812, 0x4812, 0x4814, 0x4814,
+            0x4816, 0x4816, 0x4818, 0x4818, 0x481a, 0x481a, 0x481c, 0x481c, 0x481e, 0x481e, 0x4820, 0x4820, 0x4822, 0x4822, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x4824, 0x4824, 0x4826, 0x4826, 0x4828, 0x4828, 0x482a, 0x482a, 0x482c, 0x482c, 0x482e, 0x482e, 0x4830, 0x4830, 0x4832, 0x4832,
+            0x4834, 0x4834, 0x4836, 0x4836, 0x4838, 0x4838, 0x483a, 0x483a, 0x483c, 0x483c, 0x483e, 0x483e, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0x4840, 0x4840, 0x4842, 0x4842, 0x4844, 0x4844, 0x4846, 0x4846, 0x4848, 0x4848, 0x484a, 0x484a, 0x484c, 0x484c,
+            0xffff, 0xffff, 0x484e, 0x484e, 0x4850, 0x4850, 0x4852, 0x4852, 0x4854, 0x4854, 0x4856, 0x4856, 0x4858, 0x4858, 0x485a, 0x485a,
+            0x485c, 0x485c, 0x485e, 0x485e, 0x4860, 0x4860, 0x4862, 0x4862, 0x4864, 0x4864, 0x4866, 0x4866, 0x4868, 0x4868, 0x486a, 0x486a,
+            0x486c, 0x486c, 0x486e, 0x486e, 0x4870, 0x4870, 0x4872, 0x4872, 0x4874, 0x4874, 0x4876, 0x4876, 0x4878, 0x4878, 0x487a, 0x487a,
+            0x487c, 0x487c, 0x487e, 0x487e, 0x4880, 0x4880, 0x4882, 0x4882, 0x4884, 0x4884, 0x4886, 0x4886, 0x4888, 0x4888, 0x488a, 0x488a,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x488c, 0x488c, 0x488e, 0x488e, 0x4890, 0x4892, 0x4892,
+            0x4894, 0x4894, 0x4896, 0x4896, 0x4898, 0x4898, 0x489a, 0x489a, 0xffff, 0xffff, 0xffff, 0x489c, 0x489c, 0x489e, 0xffff, 0xffff,
+            0x48a0, 0x48a0, 0x48a2, 0x48a2, 0x48da, 0xffff, 0x48a4, 0x48a4, 0x48a6, 0x48a6, 0x48a8, 0x48a8, 0x48aa, 0x48aa, 0x48ac, 0x48ac,
+            0x48ae, 0x48ae, 0x48b0, 0x48b0, 0x48b2, 0x48b2, 0x48b4, 0x48b4, 0x48b6, 0x48b6, 0x48b8, 0x48ba, 0x48bc, 0x48be, 0x48c0, 0xffff,
+            0x48c2, 0x48c4, 0x48c6, 0x48c8, 0x48ca, 0x48ca, 0x48cc, 0x48cc, 0x48ce, 0x48ce, 0x48d0, 0x48d0, 0x48d2, 0x48d2, 0x48d4, 0x48d4,
+            0x48d6, 0x48d6, 0x48d8, 0x48d8, 0x48da, 0x48dc, 0x48de, 0x48e0, 0x48e0, 0x48e2, 0x48e2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x48e4, 0x48e4, 0xffff, 0xffff, 0xffff, 0xffff, 0x48e6, 0x48e6, 0x48e8, 0x48e8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x48ea, 0x48ea, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0x48c8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0x43f6, 0x43f8, 0x43fa, 0x43fc, 0x43fe, 0x4400, 0x4402, 0x4404, 0x4406, 0x4408, 0x440a, 0x440c, 0x440e, 0x4410, 0x4412, 0x4414,
+            0x4416, 0x4418, 0x441a, 0x441c, 0x441e, 0x4420, 0x4422, 0x4424, 0x4426, 0x4428, 0x442a, 0x442c, 0x442e, 0x4430, 0x4432, 0x4434,
+            0x4436, 0x4438, 0x443a, 0x443c, 0x443e, 0x4440, 0x4442, 0x4444, 0x4446, 0x4448, 0x444a, 0x444c, 0x444e, 0x4450, 0x4452, 0x4454,
+            0x4456, 0x4458, 0x445a, 0x445c, 0x445e, 0x4460, 0x4462, 0x4464, 0x4466, 0x4468, 0x446a, 0x446c, 0x446e, 0x4470, 0x4472, 0x4474,
+            0x4476, 0x4478, 0x447a, 0x447c, 0x447e, 0x4480, 0x4482, 0x4484, 0x4486, 0x4488, 0x448a, 0x448c, 0x448e, 0x4490, 0x4492, 0x4494,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0x48ec, 0x48ee, 0x48f0, 0x48f2, 0x48f4, 0x48f6, 0x48f8, 0x48fa, 0x48fc, 0x48fe, 0x4900, 0x4902, 0x4904, 0x4906, 0x4908,
+            0x490a, 0x490c, 0x490e, 0x4910, 0x4912, 0x4914, 0x4916, 0x4918, 0x491a, 0x491c, 0x491e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0x48ec, 0x48ee, 0x48f0, 0x48f2, 0x48f4, 0x48f6, 0x48f8, 0x48fa, 0x48fc, 0x48fe, 0x4900, 0x4902, 0x4904, 0x4906, 0x4908,
+            0x490a, 0x490c, 0x490e, 0x4910, 0x4912, 0x4914, 0x4916, 0x4918, 0x491a, 0x491c, 0x491e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+            0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+        };
+    }
+}
diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.cs
new file mode 100644 (file)
index 0000000..6dea0fd
--- /dev/null
@@ -0,0 +1,161 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics;
+using System.Globalization;
+using System.Runtime.CompilerServices;
+
+namespace System.Text.RegularExpressions
+{
+    /// <summary>
+    /// This class will perform fast lookups for case-insensitive searches in order to find which characters should
+    /// be considered equivalent. The mappings are generated based on Unicode ToLower() mappings and we generate the table
+    /// using the GenerateRegexCasingTable program located under the Tools folder for this library.
+    /// </summary>
+    internal static partial class RegexCaseEquivalences
+    {
+        public const int CharactersPerRange = 1024;
+
+        private static readonly char[] s_specialCasingSetBehaviors = new char[5]
+        {
+            'I', 'i', '\u0130', 'I', '\u0131'
+        };
+
+        /// <summary>
+        /// Performs a fast lookup which determines if a character is involved in case conversion, as well as
+        /// returns the characters that should be considered equivalent in case it does participate in case conversion.
+        /// This method, in contrast to <see cref="TryFindCaseEquivalencesForChar(char, out ReadOnlySpan{char})"/> does take in
+        /// culture and will also factor in the current culture in order to handle the special cases which are different between cultures.
+        /// </summary>
+        /// <param name="c">The character being analyzed</param>
+        /// <param name="culture">The <see cref="CultureInfo"/> to be used to determine the equivalences.</param>
+        /// <param name="equivalences">If <paramref name="c"/> is involved in case conversion, then equivalences will contain the
+        /// span of character which should be considered equal to <paramref name="c"/> in a case-insensitive comparison.</param>
+        /// <returns><see langword="true"/> if <paramref name="c"/> is involved in case conversion; otherwise, <see langword="false"/></returns>
+        public static bool TryFindCaseEquivalencesForCharWithIBehavior(char c, CultureInfo culture, out ReadOnlySpan<char> equivalences)
+        {
+            if ((c | 0x20) == 'i' || (c | 0x01) == '\u0131')
+            {
+                RegexCaseBehavior mappingBehavior = GetRegexBehavior(culture);
+                equivalences = c switch
+                {
+                    // Invariant mappings
+                    'i' or 'I' when mappingBehavior is RegexCaseBehavior.Invariant => s_specialCasingSetBehaviors.AsSpan(0, 2), // 'I' and 'i'
+
+                    // Non-Turkish mappings
+                    'i' or 'I' or '\u0130' when mappingBehavior is RegexCaseBehavior.NonTurkish => s_specialCasingSetBehaviors.AsSpan(0, 3), // 'I', 'i', and '\u0130'
+
+                    // Turkish mappings
+                    'I' or '\u0131' when mappingBehavior is RegexCaseBehavior.Turkish => s_specialCasingSetBehaviors.AsSpan(3, 2), // 'I' and '\u0131'
+                    'i' or '\u0130' when mappingBehavior is RegexCaseBehavior.Turkish => s_specialCasingSetBehaviors.AsSpan(1, 2), // 'i' and '\u0130'
+
+                    // Default
+                    _ => default
+                };
+                return equivalences != default;
+            }
+            else
+            {
+                return TryFindCaseEquivalencesForChar(c, out equivalences);
+            }
+        }
+
+        /// <summary>
+        /// Returns which <see cref="RegexCaseBehavior"/> should be used based on the passed in <paramref name="culture"/>.
+        /// </summary>
+        /// <param name="culture">The <see cref="CultureInfo"/> to be used to determine the behavior.</param>
+        /// <returns>The <see cref="RegexCaseBehavior"/> that should be used.</returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static RegexCaseBehavior GetRegexBehavior(CultureInfo culture)
+        {
+            return
+                culture.Name.Length == 0 ? RegexCaseBehavior.Invariant :
+                IsTurkishOrAzeri(culture.Name) ? RegexCaseBehavior.Turkish :
+                RegexCaseBehavior.NonTurkish;
+
+            static bool IsTurkishOrAzeri(string cultureName)
+            {
+                if (cultureName.Length >= 2)
+                {
+                    // Assert that the first two characters in culture name are between a-z lowercase
+                    Debug.Assert(cultureName[0] is >= 'a' and <= 'z');
+                    Debug.Assert(cultureName[1] is >= 'a' and <= 'z');
+                    switch (cultureName[0])
+                    {
+                        case 't':
+                            return cultureName[1] == 'r' && (cultureName.Length == 2 || cultureName[2] == '-');
+                        case 'a':
+                            return cultureName[1] == 'z' && (cultureName.Length == 2 || cultureName[2] == '-');
+                    }
+                }
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// Performs a fast lookup which determines if a character is involved in case conversion, as well as
+        /// returns the characters that should be considered equivalent in case it does participate in case conversion.
+        /// </summary>
+        /// <param name="c">The character being analyzed</param>
+        /// <param name="equivalences">If <paramref name="c"/> is involved in case conversion, then equivalences will contain the
+        /// span of character which should be considered equal to <paramref name="c"/> in a case-insensitive comparison.</param>
+        /// <returns><see langword="true"/> if <paramref name="c"/> is involved in case conversion; otherwise, <see langword="false"/></returns>
+        /// <remarks>
+        /// The casing equivalence data is saved in three different lookup tables:
+        ///   EquivalenceFirstLevelLookup => This is a ushort array which contains an index to be used for searching on the next lookup table 'EquivalenceCasingMap'.
+        ///                                  We first grab the passed in <paramref name="c"/>, and divide it by CharactersPerRange and save it to index. We then use this index to
+        ///                                  perform a lookup in 'EquivalenceFirstLevelLookup' table. If the value at index is 0xFFFF, then <paramref name="c"/>
+        ///                                  isn't involved in case conversion so we keep equivalences as default, and return false. If the value at index is not 0xFFFF
+        ///                                  then we use that value to search in 'EquivalenceCasingMap'.
+        ///          EquivalenceCasingMap => This is a ushort array which contains a ushort for each character in a given range. The 3 highest bits of the ushort represent
+        ///                                  the number of characters that are considered equivalent to <paramref name="c"/>. The rest of the 13 bits of the ushort represent
+        ///                                  the index that should be used to get those equivalent characters in the 'EquivalenceCasingValues' table. We first calculate the
+        ///                                  index2 based on the value obtained from the first level lookup table and adding <paramref name="c"/> modulo CharactersPerRange. If the value of
+        ///                                  EquivalenceCasingMap[index2] is 0xFFFF then <paramref name="c"/> isn't involved in case conversion so we return false. Otherwise,
+        ///                                  we decompose the ushort into the highest 3 bits, and the other 13 to compute two different numbers: the number of equivalence characters
+        ///                                  to grab from the third table (highest 3 bits and save it as count), and the index (aka. index3) to grab them from (other 13 bits).
+        ///       EquivalenceCasingValues => The final table contains ushort representing characters. We grab the index3 computed in the previous table, and we use it
+        ///                                  to search on this table and grab the next 'count' items which are the equivalence mappings for <paramref name="c"/>.
+        ///
+        /// Example: using character 'A' (0x0041). We caluclate index by doing `index = 0x0041 / CharactersPerRange` which results in 0. We then look on the first lookup table using the
+        /// calculated index `EquivalenceFirstLevelLookup[index]` which results in the value 0x0000. Because this value is not 0xFFFF, character 'A' may be participating in case
+        /// conversion, so we continue our search by looking into the second lookup table. We calculate index2 by doing `index2 = (0x0041 % CharactersPerRange) + 0x0000` which results in
+        /// index2 = 0x0041. We then use that index to search in the second lookup table `EquivalenceCasingMap[0x0041]` and get a value of 0x4000 back. Because that value isn't
+        /// 0xFFFF then we now know that the character 'A' participates in case conversion. We decompose the value we got from the second table 0x4000 (0b_0100_0000_0000_0000 in binary)
+        /// into the 3 highest bits (0b_010) and the rest of the 13 bits (0b_0_0000_0000_0000) resulting in: count = 2 and index3 = 0. This means that we finally must go into the
+        /// third lookup table EquivalenceFirstLevelLookup at index 0, and grab the next 2 items which gives us 0x0041 ('A') and 0x0061 ('a'), which are the two characters considered
+        /// equivalent in a case comparison for 'A'.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private static bool TryFindCaseEquivalencesForChar(char c, out ReadOnlySpan<char> equivalences)
+        {
+            // Dividing by CharactersPerRange, in order to get the range index for c
+            Debug.Assert((c / CharactersPerRange) < 0xFF);
+            byte index = (byte)((uint)c / CharactersPerRange);
+            ushort firstLevelLookupValue = EquivalenceFirstLevelLookup[index];
+
+            // If character belongs to a range that doesn't participate in casing, then just return false
+            if (firstLevelLookupValue == 0xFFFF)
+            {
+                equivalences = default;
+                return false;
+            }
+
+            // Using mod CharactersPerRange operator to get the offset of c in the range, and add the firstLevelLookupValue
+            Debug.Assert(((c % CharactersPerRange) + firstLevelLookupValue) < 0xFFFF);
+            ushort index2 = (ushort)(((uint)c % CharactersPerRange) + firstLevelLookupValue);
+            ushort mappingValue = EquivalenceCasingMap[index2];
+            if (mappingValue == 0xFFFF)
+            {
+                equivalences = default;
+                return false;
+            }
+
+            byte count = (byte)((mappingValue >> 13) & 0b111);
+            ushort index3 = (ushort)(mappingValue & 0x1FFF);
+            equivalences = EquivalenceCasingValues.AsSpan(index3, count);
+
+            return true;
+        }
+    }
+}
diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.MappingTable.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.MappingTable.cs
deleted file mode 100644 (file)
index 7df6872..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Collections.Generic;
-
-namespace System.Text.RegularExpressions
-{
-    internal sealed partial class RegexCharClass
-    {
-        /**************************************************************************
-            Let U be the set of Unicode character values and let L be the lowercase
-            function, mapping from U to U. To perform case insensitive matching of
-            character sets, we need to be able to map an interval I in U, say
-
-                I = [chMin, chMax] = { ch : chMin <= ch <= chMax }
-
-            to a set A such that A contains L(I) and A is contained in the union of
-            I and L(I).
-
-            The table below partitions U into intervals on which L is non-decreasing.
-            Thus, for any interval J = [a, b] contained in one of these intervals,
-            L(J) is contained in [L(a), L(b)].
-
-            It is also true that for any such J, [L(a), L(b)] is contained in the
-            union of J and L(J). This does not follow from L being non-decreasing on
-            these intervals. It follows from the nature of the L on each interval.
-            On each interval, L has one of the following forms:
-
-                (1) L(ch) = constant            (LowercaseSet)
-                (2) L(ch) = ch + offset         (LowercaseAdd)
-                (3) L(ch) = ch | 1              (LowercaseBor)
-                (4) L(ch) = ch + (ch & 1)       (LowercaseBad)
-
-            It is easy to verify that for any of these forms [L(a), L(b)] is
-            contained in the union of [a, b] and L([a, b]).
-        ***************************************************************************/
-
-        internal const int LowercaseSet = 0;    // Set to arg.
-        internal const int LowercaseAdd = 1;    // Add arg.
-        internal const int LowercaseBor = 2;    // Bitwise or with 1.
-        internal const int LowercaseBad = 3;    // Bitwise and with 1 and add original.
-
-        internal static readonly LowerCaseMapping[] s_lcTable = new LowerCaseMapping[]
-        {
-            new LowerCaseMapping('\u0041', '\u005A', LowercaseAdd, 32),
-            new LowerCaseMapping('\u00C0', '\u00DE', LowercaseAdd, 32),
-            new LowerCaseMapping('\u0100', '\u012E', LowercaseBor, 0),
-            new LowerCaseMapping('\u0130', '\u0130', LowercaseSet, 0x0069),
-            new LowerCaseMapping('\u0132', '\u0136', LowercaseBor, 0),
-            new LowerCaseMapping('\u0139', '\u0147', LowercaseBad, 0),
-            new LowerCaseMapping('\u014A', '\u0176', LowercaseBor, 0),
-            new LowerCaseMapping('\u0178', '\u0178', LowercaseSet, 0x00FF),
-            new LowerCaseMapping('\u0179', '\u017D', LowercaseBad, 0),
-            new LowerCaseMapping('\u0181', '\u0181', LowercaseSet, 0x0253),
-            new LowerCaseMapping('\u0182', '\u0184', LowercaseBor, 0),
-            new LowerCaseMapping('\u0186', '\u0186', LowercaseSet, 0x0254),
-            new LowerCaseMapping('\u0187', '\u0187', LowercaseSet, 0x0188),
-            new LowerCaseMapping('\u0189', '\u018A', LowercaseAdd, 205),
-            new LowerCaseMapping('\u018B', '\u018B', LowercaseSet, 0x018C),
-            new LowerCaseMapping('\u018E', '\u018E', LowercaseSet, 0x01DD),
-            new LowerCaseMapping('\u018F', '\u018F', LowercaseSet, 0x0259),
-            new LowerCaseMapping('\u0190', '\u0190', LowercaseSet, 0x025B),
-            new LowerCaseMapping('\u0191', '\u0191', LowercaseSet, 0x0192),
-            new LowerCaseMapping('\u0193', '\u0193', LowercaseSet, 0x0260),
-            new LowerCaseMapping('\u0194', '\u0194', LowercaseSet, 0x0263),
-            new LowerCaseMapping('\u0196', '\u0196', LowercaseSet, 0x0269),
-            new LowerCaseMapping('\u0197', '\u0197', LowercaseSet, 0x0268),
-            new LowerCaseMapping('\u0198', '\u0198', LowercaseSet, 0x0199),
-            new LowerCaseMapping('\u019C', '\u019C', LowercaseSet, 0x026F),
-            new LowerCaseMapping('\u019D', '\u019D', LowercaseSet, 0x0272),
-            new LowerCaseMapping('\u019F', '\u019F', LowercaseSet, 0x0275),
-            new LowerCaseMapping('\u01A0', '\u01A4', LowercaseBor, 0),
-            new LowerCaseMapping('\u01A7', '\u01A7', LowercaseSet, 0x01A8),
-            new LowerCaseMapping('\u01A9', '\u01A9', LowercaseSet, 0x0283),
-            new LowerCaseMapping('\u01AC', '\u01AC', LowercaseSet, 0x01AD),
-            new LowerCaseMapping('\u01AE', '\u01AE', LowercaseSet, 0x0288),
-            new LowerCaseMapping('\u01AF', '\u01AF', LowercaseSet, 0x01B0),
-            new LowerCaseMapping('\u01B1', '\u01B2', LowercaseAdd, 217),
-            new LowerCaseMapping('\u01B3', '\u01B5', LowercaseBad, 0),
-            new LowerCaseMapping('\u01B7', '\u01B7', LowercaseSet, 0x0292),
-            new LowerCaseMapping('\u01B8', '\u01B8', LowercaseSet, 0x01B9),
-            new LowerCaseMapping('\u01BC', '\u01BC', LowercaseSet, 0x01BD),
-            new LowerCaseMapping('\u01C4', '\u01C5', LowercaseSet, 0x01C6),
-            new LowerCaseMapping('\u01C7', '\u01C8', LowercaseSet, 0x01C9),
-            new LowerCaseMapping('\u01CA', '\u01CB', LowercaseSet, 0x01CC),
-            new LowerCaseMapping('\u01CD', '\u01DB', LowercaseBad, 0),
-            new LowerCaseMapping('\u01DE', '\u01EE', LowercaseBor, 0),
-            new LowerCaseMapping('\u01F1', '\u01F2', LowercaseSet, 0x01F3),
-            new LowerCaseMapping('\u01F4', '\u01F4', LowercaseSet, 0x01F5),
-            new LowerCaseMapping('\u01FA', '\u0216', LowercaseBor, 0),
-            new LowerCaseMapping('\u0386', '\u0386', LowercaseSet, 0x03AC),
-            new LowerCaseMapping('\u0388', '\u038A', LowercaseAdd, 37),
-            new LowerCaseMapping('\u038C', '\u038C', LowercaseSet, 0x03CC),
-            new LowerCaseMapping('\u038E', '\u038F', LowercaseAdd, 63),
-            new LowerCaseMapping('\u0391', '\u03AB', LowercaseAdd, 32),
-            new LowerCaseMapping('\u03E2', '\u03EE', LowercaseBor, 0),
-            new LowerCaseMapping('\u0401', '\u040F', LowercaseAdd, 80),
-            new LowerCaseMapping('\u0410', '\u042F', LowercaseAdd, 32),
-            new LowerCaseMapping('\u0460', '\u0480', LowercaseBor, 0),
-            new LowerCaseMapping('\u0490', '\u04BE', LowercaseBor, 0),
-            new LowerCaseMapping('\u04C1', '\u04C3', LowercaseBad, 0),
-            new LowerCaseMapping('\u04C7', '\u04C7', LowercaseSet, 0x04C8),
-            new LowerCaseMapping('\u04CB', '\u04CB', LowercaseSet, 0x04CC),
-            new LowerCaseMapping('\u04D0', '\u04EA', LowercaseBor, 0),
-            new LowerCaseMapping('\u04EE', '\u04F4', LowercaseBor, 0),
-            new LowerCaseMapping('\u04F8', '\u04F8', LowercaseSet, 0x04F9),
-            new LowerCaseMapping('\u0531', '\u0556', LowercaseAdd, 48),
-            new LowerCaseMapping('\u10A0', '\u10C5', LowercaseAdd, 48),
-            new LowerCaseMapping('\u1E00', '\u1EF8', LowercaseBor, 0),
-            new LowerCaseMapping('\u1F08', '\u1F0F', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1F18', '\u1F1F', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1F28', '\u1F2F', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1F38', '\u1F3F', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1F48', '\u1F4D', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1F59', '\u1F59', LowercaseSet, 0x1F51),
-            new LowerCaseMapping('\u1F5B', '\u1F5B', LowercaseSet, 0x1F53),
-            new LowerCaseMapping('\u1F5D', '\u1F5D', LowercaseSet, 0x1F55),
-            new LowerCaseMapping('\u1F5F', '\u1F5F', LowercaseSet, 0x1F57),
-            new LowerCaseMapping('\u1F68', '\u1F6F', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1F88', '\u1F8F', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1F98', '\u1F9F', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1FA8', '\u1FAF', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1FB8', '\u1FB9', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1FBA', '\u1FBB', LowercaseAdd, -74),
-            new LowerCaseMapping('\u1FBC', '\u1FBC', LowercaseSet, 0x1FB3),
-            new LowerCaseMapping('\u1FC8', '\u1FCB', LowercaseAdd, -86),
-            new LowerCaseMapping('\u1FCC', '\u1FCC', LowercaseSet, 0x1FC3),
-            new LowerCaseMapping('\u1FD8', '\u1FD9', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1FDA', '\u1FDB', LowercaseAdd, -100),
-            new LowerCaseMapping('\u1FE8', '\u1FE9', LowercaseAdd, -8),
-            new LowerCaseMapping('\u1FEA', '\u1FEB', LowercaseAdd, -112),
-            new LowerCaseMapping('\u1FEC', '\u1FEC', LowercaseSet, 0x1FE5),
-            new LowerCaseMapping('\u1FF8', '\u1FF9', LowercaseAdd, -128),
-            new LowerCaseMapping('\u1FFA', '\u1FFB', LowercaseAdd, -126),
-            new LowerCaseMapping('\u1FFC', '\u1FFC', LowercaseSet, 0x1FF3),
-            new LowerCaseMapping('\u2160', '\u216F', LowercaseAdd, 16),
-            new LowerCaseMapping('\u24B6', '\u24D0', LowercaseAdd, 26),
-            new LowerCaseMapping('\uFF21', '\uFF3A', LowercaseAdd, 32),
-        };
-
-        /// <summary>
-        /// Lower case mapping descriptor.
-        /// </summary>
-        internal readonly struct LowerCaseMapping
-        {
-            public readonly char ChMin;
-            public readonly char ChMax;
-            public readonly int LcOp;
-            public readonly int Data;
-
-            internal LowerCaseMapping(char chMin, char chMax, int lcOp, int data)
-            {
-                ChMin = chMin;
-                ChMax = chMax;
-                LcOp = lcOp;
-                Data = data;
-            }
-        }
-    }
-}
index 398f882..219d982 100644 (file)
@@ -417,10 +417,10 @@ namespace System.Text.RegularExpressions
         private void AddCategory(string category) => EnsureCategories().Append(category);
 
         /// <summary>
-        /// Adds to the class any lowercase versions of characters already
+        /// Adds to the class any case-equivalence versions of characters already
         /// in the class. Used for case-insensitivity.
         /// </summary>
-        public void AddLowercase(CultureInfo culture)
+        public void AddCaseEquivalences(CultureInfo culture)
         {
             List<(char First, char Last)>? rangeList = _rangelist;
             if (rangeList != null)
@@ -431,12 +431,17 @@ namespace System.Text.RegularExpressions
                     (char First, char Last) range = rangeList[i];
                     if (range.First == range.Last)
                     {
-                        char lower = culture.TextInfo.ToLower(range.First);
-                        rangeList[i] = (lower, lower);
+                        if (RegexCaseEquivalences.TryFindCaseEquivalencesForCharWithIBehavior(range.First, culture, out ReadOnlySpan<char> equivalences))
+                        {
+                            foreach (char equivalence in equivalences)
+                            {
+                                AddChar(equivalence);
+                            }
+                        }
                     }
                     else
                     {
-                        AddLowercaseRange(range.First, range.Last);
+                        AddCaseEquivalenceRange(range.First, range.Last, culture);
                     }
                 }
             }
@@ -446,69 +451,16 @@ namespace System.Text.RegularExpressions
         /// For a single range that's in the set, adds any additional ranges
         /// necessary to ensure that lowercase equivalents are also included.
         /// </summary>
-        private void AddLowercaseRange(char chMin, char chMax)
+        private void AddCaseEquivalenceRange(char chMin, char chMax, CultureInfo culture)
         {
-            int i = 0;
-
-            for (int iMax = s_lcTable.Length; i < iMax;)
+            for (int i = chMin; i <= chMax; i++)
             {
-                int iMid = (i + iMax) >> 1;
-                if (s_lcTable[iMid].ChMax < chMin)
-                {
-                    i = iMid + 1;
-                }
-                else
-                {
-                    iMax = iMid;
-                }
-            }
-
-            if (i >= s_lcTable.Length)
-            {
-                return;
-            }
-
-            char chMinT, chMaxT;
-            LowerCaseMapping lc;
-
-            for (; i < s_lcTable.Length && (lc = s_lcTable[i]).ChMin <= chMax; i++)
-            {
-                if ((chMinT = lc.ChMin) < chMin)
-                {
-                    chMinT = chMin;
-                }
-
-                if ((chMaxT = lc.ChMax) > chMax)
+                if (RegexCaseEquivalences.TryFindCaseEquivalencesForCharWithIBehavior((char)i, culture, out ReadOnlySpan<char> equivalences))
                 {
-                    chMaxT = chMax;
-                }
-
-                switch (lc.LcOp)
-                {
-                    case LowercaseSet:
-                        chMinT = (char)lc.Data;
-                        chMaxT = (char)lc.Data;
-                        break;
-
-                    case LowercaseAdd:
-                        chMinT += (char)lc.Data;
-                        chMaxT += (char)lc.Data;
-                        break;
-
-                    case LowercaseBor:
-                        chMinT |= (char)1;
-                        chMaxT |= (char)1;
-                        break;
-
-                    case LowercaseBad:
-                        chMinT += (char)(chMinT & 1);
-                        chMaxT += (char)(chMaxT & 1);
-                        break;
-                }
-
-                if (chMinT < chMin || chMaxT > chMax)
-                {
-                    AddRange(chMinT, chMaxT);
+                    foreach (char equivalence in equivalences)
+                    {
+                        AddChar(equivalence);
+                    }
                 }
             }
         }
@@ -1356,158 +1308,13 @@ namespace System.Text.RegularExpressions
             return ranges;
         }
 
-        #region Perf workaround until https://github.com/dotnet/runtime/issues/61048 and https://github.com/dotnet/runtime/issues/59492 are addressed
-        // TODO: https://github.com/dotnet/runtime/issues/61048
-        // The below functionality needs to be removed/replaced/generalized.  The goal is to avoid relying on
-        // ToLower and culture-based operation at match time, and instead be able to compute at construction
-        // time case folding equivalence classes that let us determine up-front the set of characters considered
-        // valid for a match.  For now, we do this just for ASCII, and for anything else fall back to the
-        // pre-existing mechanism whereby a culture is used at construction time to ToLower and then one is
-        // used at match time to ToLower.  We also skip 'i' and 'I', as the casing of those varies across culture
-        // whereas every other ASCII value's casing is stable across culture.  We could hardcode the values for
-        // when an invariant vs tr/az culture vs any other culture is used, and we likely will, but for now doing
-        // so would be a breaking change, as in doing so we'd be relying only on the culture present at the time
-        // of construction rather than the one at the time of match.  That will be resolved with
-        // https://github.com/dotnet/runtime/issues/59492.
-
-        /// <summary>Creates a set string for a single character, optionally factoring in case-insensitivity.</summary>
+        /// <summary>Creates a set string for a single character.</summary>
         /// <param name="c">The character for which to create the set.</param>
-        /// <param name="caseInsensitive">null if case-sensitive; non-null if case-insensitive, in which case it's the culture to use.</param>
-        /// <param name="resultIsCaseInsensitive">false if the caller should strip out RegexOptions.IgnoreCase because it's now fully represented by the set; otherwise, true.</param>
         /// <returns>The create set string.</returns>
-        public static string OneToStringClass(char c, CultureInfo? caseInsensitive, out bool resultIsCaseInsensitive)
-        {
-            var vsb = new ValueStringBuilder(stackalloc char[4]);
+        public static string OneToStringClass(char c)
+            => CharsToStringClass(stackalloc char[1] { c });
 
-            if (caseInsensitive is null)
-            {
-                resultIsCaseInsensitive = false;
-                vsb.Append(c);
-            }
-            else if (c < 128 && (c | 0x20) != 'i')
-            {
-                resultIsCaseInsensitive = false;
-                switch (c)
-                {
-                    // These are the same in all cultures.  As with the rest of this support, we can generalize this
-                    // once we fix the aforementioned casing issues, e.g. by lazily populating an interning cache
-                    // rather than hardcoding the strings for these values, once almost all values will be the same
-                    // regardless of culture.
-                    case 'A': case 'a': return "\0\x0004\0ABab";
-                    case 'B': case 'b': return "\0\x0004\0BCbc";
-                    case 'C': case 'c': return "\0\x0004\0CDcd";
-                    case 'D': case 'd': return "\0\x0004\0DEde";
-                    case 'E': case 'e': return "\0\x0004\0EFef";
-                    case 'F': case 'f': return "\0\x0004\0FGfg";
-                    case 'G': case 'g': return "\0\x0004\0GHgh";
-                    case 'H': case 'h': return "\0\x0004\0HIhi";
-                    // allow 'i' to fall through
-                    case 'J': case 'j': return "\0\x0004\0JKjk";
-                    case 'K': case 'k': return "\0\x0006\0KLkl\u212A\u212B";
-                    case 'L': case 'l': return "\0\x0004\0LMlm";
-                    case 'M': case 'm': return "\0\x0004\0MNmn";
-                    case 'N': case 'n': return "\0\x0004\0NOno";
-                    case 'O': case 'o': return "\0\x0004\0OPop";
-                    case 'P': case 'p': return "\0\x0004\0PQpq";
-                    case 'Q': case 'q': return "\0\x0004\0QRqr";
-                    case 'R': case 'r': return "\0\x0004\0RSrs";
-                    case 'S': case 's': return "\0\x0004\0STst";
-                    case 'T': case 't': return "\0\x0004\0TUtu";
-                    case 'U': case 'u': return "\0\x0004\0UVuv";
-                    case 'V': case 'v': return "\0\x0004\0VWvw";
-                    case 'W': case 'w': return "\0\x0004\0WXwx";
-                    case 'X': case 'x': return "\0\x0004\0XYxy";
-                    case 'Y': case 'y': return "\0\x0004\0YZyz";
-                    case 'Z': case 'z': return "\0\x0004\0Z[z{";
-
-                    // All the ASCII !ParticipatesInCaseConversion
-                    case '\u0000': return "\0\u0002\0\u0000\u0001";
-                    case '\u0001': return "\0\u0002\0\u0001\u0002";
-                    case '\u0002': return "\0\u0002\0\u0002\u0003";
-                    case '\u0003': return "\0\u0002\0\u0003\u0004";
-                    case '\u0004': return "\0\u0002\0\u0004\u0005";
-                    case '\u0005': return "\0\u0002\0\u0005\u0006";
-                    case '\u0006': return "\0\u0002\0\u0006\u0007";
-                    case '\u0007': return "\0\u0002\0\u0007\u0008";
-                    case '\u0008': return "\0\u0002\0\u0008\u0009";
-                    case '\u0009': return "\0\u0002\0\u0009\u000A";
-                    case '\u000A': return "\0\u0002\0\u000A\u000B";
-                    case '\u000B': return "\0\u0002\0\u000B\u000C";
-                    case '\u000C': return "\0\u0002\0\u000C\u000D";
-                    case '\u000D': return "\0\u0002\0\u000D\u000E";
-                    case '\u000E': return "\0\u0002\0\u000E\u000F";
-                    case '\u000F': return "\0\u0002\0\u000F\u0010";
-                    case '\u0010': return "\0\u0002\0\u0010\u0011";
-                    case '\u0011': return "\0\u0002\0\u0011\u0012";
-                    case '\u0012': return "\0\u0002\0\u0012\u0013";
-                    case '\u0013': return "\0\u0002\0\u0013\u0014";
-                    case '\u0014': return "\0\u0002\0\u0014\u0015";
-                    case '\u0015': return "\0\u0002\0\u0015\u0016";
-                    case '\u0016': return "\0\u0002\0\u0016\u0017";
-                    case '\u0017': return "\0\u0002\0\u0017\u0018";
-                    case '\u0018': return "\0\u0002\0\u0018\u0019";
-                    case '\u0019': return "\0\u0002\0\u0019\u001A";
-                    case '\u001A': return "\0\u0002\0\u001A\u001B";
-                    case '\u001B': return "\0\u0002\0\u001B\u001C";
-                    case '\u001C': return "\0\u0002\0\u001C\u001D";
-                    case '\u001D': return "\0\u0002\0\u001D\u001E";
-                    case '\u001E': return "\0\u0002\0\u001E\u001F";
-                    case '\u001F': return "\0\u0002\0\u001F\u0020";
-                    case '\u0020': return "\0\u0002\0\u0020\u0021";
-                    case '\u0021': return "\0\u0002\0\u0021\u0022";
-                    case '\u0022': return "\0\u0002\0\u0022\u0023";
-                    case '\u0023': return "\0\u0002\0\u0023\u0024";
-                    case '\u0025': return "\0\u0002\0\u0025\u0026";
-                    case '\u0026': return "\0\u0002\0\u0026\u0027";
-                    case '\u0027': return "\0\u0002\0\u0027\u0028";
-                    case '\u0028': return "\0\u0002\0\u0028\u0029";
-                    case '\u0029': return "\0\u0002\0\u0029\u002A";
-                    case '\u002A': return "\0\u0002\0\u002A\u002B";
-                    case '\u002C': return "\0\u0002\0\u002C\u002D";
-                    case '\u002D': return "\0\u0002\0\u002D\u002E";
-                    case '\u002E': return "\0\u0002\0\u002E\u002F";
-                    case '\u002F': return "\0\u0002\0\u002F\u0030";
-                    case '\u0030': return "\0\u0002\0\u0030\u0031";
-                    case '\u0031': return "\0\u0002\0\u0031\u0032";
-                    case '\u0032': return "\0\u0002\0\u0032\u0033";
-                    case '\u0033': return "\0\u0002\0\u0033\u0034";
-                    case '\u0034': return "\0\u0002\0\u0034\u0035";
-                    case '\u0035': return "\0\u0002\0\u0035\u0036";
-                    case '\u0036': return "\0\u0002\0\u0036\u0037";
-                    case '\u0037': return "\0\u0002\0\u0037\u0038";
-                    case '\u0038': return "\0\u0002\0\u0038\u0039";
-                    case '\u0039': return "\0\u0002\0\u0039\u003A";
-                    case '\u003A': return "\0\u0002\0\u003A\u003B";
-                    case '\u003B': return "\0\u0002\0\u003B\u003C";
-                    case '\u003F': return "\0\u0002\0\u003F\u0040";
-                    case '\u0040': return "\0\u0002\0\u0040\u0041";
-                    case '\u005B': return "\0\u0002\0\u005B\u005C";
-                    case '\u005C': return "\0\u0002\0\u005C\u005D";
-                    case '\u005D': return "\0\u0002\0\u005D\u005E";
-                    case '\u005F': return "\0\u0002\0\u005F\u0060";
-                    case '\u007B': return "\0\u0002\0\u007B\u007C";
-                    case '\u007D': return "\0\u0002\0\u007D\u007E";
-                    case '\u007F': return "\0\u0002\0\u007F\u0080";
-                }
-                AddAsciiCharIgnoreCaseEquivalence(c, ref vsb, caseInsensitive);
-            }
-            else if (!ParticipatesInCaseConversion(c))
-            {
-                resultIsCaseInsensitive = false;
-                vsb.Append(c);
-            }
-            else
-            {
-                resultIsCaseInsensitive = true;
-                vsb.Append(char.ToLower(c, caseInsensitive));
-            }
-
-            string result = CharsToStringClass(vsb.AsSpan());
-            vsb.Dispose();
-            return result;
-        }
-
-        private static unsafe string CharsToStringClass(ReadOnlySpan<char> chars)
+        internal static unsafe string CharsToStringClass(ReadOnlySpan<char> chars)
         {
 #if DEBUG
             // Make sure they're all sorted with no duplicates
@@ -1523,6 +1330,40 @@ namespace System.Text.RegularExpressions
                 return EmptyClass;
             }
 
+            if (chars.Length == 2)
+            {
+                switch (chars[0], chars[1])
+                {
+                    case ('A', 'a'): case ('a', 'A'): return "\0\x0004\0ABab";
+                    case ('B', 'b'): case ('b', 'B'): return "\0\x0004\0BCbc";
+                    case ('C', 'c'): case ('c', 'C'): return "\0\x0004\0CDcd";
+                    case ('D', 'd'): case ('d', 'D'): return "\0\x0004\0DEde";
+                    case ('E', 'e'): case ('e', 'E'): return "\0\x0004\0EFef";
+                    case ('F', 'f'): case ('f', 'F'): return "\0\x0004\0FGfg";
+                    case ('G', 'g'): case ('g', 'G'): return "\0\x0004\0GHgh";
+                    case ('H', 'h'): case ('h', 'H'): return "\0\x0004\0HIhi";
+                    // 'I' and 'i' are missing since depending on the cultuure they may
+                    // have additional mappings.
+                    case ('J', 'j'): case ('j', 'J'): return "\0\x0004\0JKjk";
+                    // 'K' and 'k' are missing since their mapping also includes Kelvin K.
+                    case ('L', 'l'): case ('l', 'L'): return "\0\x0004\0LMlm";
+                    case ('M', 'm'): case ('m', 'M'): return "\0\x0004\0MNmn";
+                    case ('N', 'n'): case ('n', 'N'): return "\0\x0004\0NOno";
+                    case ('O', 'o'): case ('o', 'O'): return "\0\x0004\0OPop";
+                    case ('P', 'p'): case ('p', 'P'): return "\0\x0004\0PQpq";
+                    case ('Q', 'q'): case ('q', 'Q'): return "\0\x0004\0QRqr";
+                    case ('R', 'r'): case ('r', 'R'): return "\0\x0004\0RSrs";
+                    case ('S', 's'): case ('s', 'S'): return "\0\x0004\0STst";
+                    case ('T', 't'): case ('t', 'T'): return "\0\x0004\0TUtu";
+                    case ('U', 'u'): case ('u', 'U'): return "\0\x0004\0UVuv";
+                    case ('V', 'v'): case ('v', 'V'): return "\0\x0004\0VWvw";
+                    case ('W', 'w'): case ('w', 'W'): return "\0\x0004\0WXwx";
+                    case ('X', 'x'): case ('x', 'X'): return "\0\x0004\0XYxy";
+                    case ('Y', 'y'): case ('y', 'Y'): return "\0\x0004\0YZyz";
+                    case ('Z', 'z'): case ('z', 'Z'): return "\0\x0004\0Z[z{";
+                }
+            }
+
             // Count how many characters there actually are.  All but the very last possible
             // char value will have two characters, one for the inclusive beginning of range
             // and one for the exclusive end of range.
@@ -1563,90 +1404,19 @@ namespace System.Text.RegularExpressions
             }
         }
 
-        /// <summary>Tries to create from a RegexOptions.IgnoreCase set string a new set string that can be used without RegexOptions.IgnoreCase.</summary>
-        /// <param name="set">The original set string from a RegexOptions.IgnoreCase node.</param>
-        /// <param name="culture">The culture in use.</param>
-        /// <returns>A new set string if one could be created.</returns>
-        public static string? MakeCaseSensitiveIfPossible(string set, CultureInfo culture)
-        {
-            if (IsNegated(set))
-            {
-                return null;
-            }
-
-            // We'll eventually need a more robust way to do this for any set.  For now, we iterate through each character
-            // in the set, and to avoid spending lots of time doing so, we limit the number of characters.  This approach also
-            // limits the structure of the sets allowed, e.g. they can't be negated, can't use subtraction, etc.
-            Span<char> setChars = stackalloc char[64]; // arbitary limit chosen to include common groupings like all ASCII letters and digits
-
-            // Try to get the set's characters.
-            int setCharsCount = GetSetChars(set, setChars);
-            if (setCharsCount == 0)
-            {
-                return null;
-            }
-
-            // Enumerate all the characters and add all characters that form their case folding equivalence class.
-            var rcc = new RegexCharClass();
-            var vsb = new ValueStringBuilder(stackalloc char[4]);
-            foreach (char c in setChars.Slice(0, setCharsCount))
-            {
-                if (c >= 128 || c == 'i' || c == 'I')
-                {
-                    return null;
-                }
-
-                vsb.Length = 0;
-                AddAsciiCharIgnoreCaseEquivalence(c, ref vsb, culture);
-                foreach (char v in vsb.AsSpan())
-                {
-                    rcc.AddChar(v);
-                }
-            }
-
-            // Return the constructed class.
-            return rcc.ToStringClass();
-        }
-
-        private static void AddAsciiCharIgnoreCaseEquivalence(char c, ref ValueStringBuilder vsb, CultureInfo culture)
-        {
-            Debug.Assert(c < 128, $"Expected ASCII, got {(int)c}");
-            Debug.Assert(c != 'i' && c != 'I', "'i' currently doesn't work correctly in all cultures");
-
-            char upper = char.ToUpper(c, culture);
-            char lower = char.ToLower(c, culture);
-
-            if (upper < lower)
-            {
-                vsb.Append(upper);
-            }
-            vsb.Append(lower);
-            if (upper > lower)
-            {
-                vsb.Append(upper);
-            }
-
-            if (c == 'k' || c == 'K')
-            {
-                vsb.Append((char)0x212A); // kelvin sign
-            }
-        }
-        #endregion
-
         /// <summary>
         /// Constructs the string representation of the class.
         /// </summary>
-        public string ToStringClass(RegexOptions options = RegexOptions.None)
+        public string ToStringClass()
         {
-            bool isNonBacktracking = (options & RegexOptions.NonBacktracking) != 0;
             var vsb = new ValueStringBuilder(stackalloc char[256]);
-            ToStringClass(isNonBacktracking, ref vsb);
+            ToStringClass(ref vsb);
             return vsb.ToString();
         }
 
-        private void ToStringClass(bool isNonBacktracking, ref ValueStringBuilder vsb)
+        private void ToStringClass(ref ValueStringBuilder vsb)
         {
-            Canonicalize(isNonBacktracking);
+            Canonicalize();
 
             int initialLength = vsb.Length;
             int categoriesLength = _categories?.Length ?? 0;
@@ -1684,13 +1454,13 @@ namespace System.Text.RegularExpressions
             }
 
             // Append a subtractor if there is one.
-            _subtractor?.ToStringClass(isNonBacktracking, ref vsb);
+            _subtractor?.ToStringClass(ref vsb);
         }
 
         /// <summary>
         /// Logic to reduce a character class to a unique, sorted form.
         /// </summary>
-        private void Canonicalize(bool isNonBacktracking)
+        private void Canonicalize()
         {
             List<(char First, char Last)>? rangelist = _rangelist;
             if (rangelist != null)
@@ -1747,13 +1517,7 @@ namespace System.Text.RegularExpressions
                 // If the class now represents a single negated range, but does so by including every
                 // other character, invert it to produce a normalized form with a single range.  This
                 // is valuable for subsequent optimizations in most of the engines.
-                // TODO: https://github.com/dotnet/runtime/issues/61048. The special-casing for NonBacktracking
-                // can be deleted once this issue is addressed.  The special-casing exists because NonBacktracking
-                // is on a different casing plan than the other engines and doesn't use ToLower on each input
-                // character at match time; this in turn can highlight differences between sets and their inverted
-                // versions of themselves, e.g. a difference between [0-AC-\uFFFF] and [^B].
-                if (!isNonBacktracking &&
-                    !_negate &&
+                if (!_negate &&
                     _subtractor is null &&
                     (_categories is null || _categories.Length == 0))
                 {
index a64f098..e6d1e47 100644 (file)
@@ -21,6 +21,7 @@ namespace System.Text.RegularExpressions
         private static readonly FieldInfo s_runtextposField = RegexRunnerField("runtextpos");
         private static readonly FieldInfo s_runtrackposField = RegexRunnerField("runtrackpos");
         private static readonly FieldInfo s_runstackField = RegexRunnerField("runstack");
+        private static readonly FieldInfo s_textInfo = typeof(CompiledRegexRunner).GetField("_textInfo", BindingFlags.Instance | BindingFlags.NonPublic)!;
 
         private static readonly MethodInfo s_captureMethod = RegexRunnerMethod("Capture");
         private static readonly MethodInfo s_transferCaptureMethod = RegexRunnerMethod("TransferCapture");
@@ -38,12 +39,8 @@ namespace System.Text.RegularExpressions
         private static readonly MethodInfo s_charIsDigitMethod = typeof(char).GetMethod("IsDigit", new Type[] { typeof(char) })!;
         private static readonly MethodInfo s_charIsWhiteSpaceMethod = typeof(char).GetMethod("IsWhiteSpace", new Type[] { typeof(char) })!;
         private static readonly MethodInfo s_charGetUnicodeInfo = typeof(char).GetMethod("GetUnicodeCategory", new Type[] { typeof(char) })!;
-        private static readonly MethodInfo s_charToLowerInvariantMethod = typeof(char).GetMethod("ToLowerInvariant", new Type[] { typeof(char) })!;
-        private static readonly MethodInfo s_cultureInfoGetCurrentCultureMethod = typeof(CultureInfo).GetMethod("get_CurrentCulture")!;
-        private static readonly MethodInfo s_cultureInfoGetTextInfoMethod = typeof(CultureInfo).GetMethod("get_TextInfo")!;
         private static readonly MethodInfo s_spanGetItemMethod = typeof(ReadOnlySpan<char>).GetMethod("get_Item", new Type[] { typeof(int) })!;
         private static readonly MethodInfo s_spanGetLengthMethod = typeof(ReadOnlySpan<char>).GetMethod("get_Length")!;
-        private static readonly MethodInfo s_memoryMarshalGetReference = typeof(MemoryMarshal).GetMethod("GetReference", new Type[] { typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)) })!.MakeGenericMethod(typeof(char));
         private static readonly MethodInfo s_spanIndexOfChar = typeof(MemoryExtensions).GetMethod("IndexOf", new Type[] { typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)), Type.MakeGenericMethodParameter(0) })!.MakeGenericMethod(typeof(char));
         private static readonly MethodInfo s_spanIndexOfSpan = typeof(MemoryExtensions).GetMethod("IndexOf", new Type[] { typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)), typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)) })!.MakeGenericMethod(typeof(char));
         private static readonly MethodInfo s_spanIndexOfAnyCharChar = typeof(MemoryExtensions).GetMethod("IndexOfAny", new Type[] { typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)), Type.MakeGenericMethodParameter(0), Type.MakeGenericMethodParameter(0) })!.MakeGenericMethod(typeof(char));
@@ -78,8 +75,6 @@ namespace System.Text.RegularExpressions
         /// <summary>Pool of ReadOnlySpan of char locals.</summary>
         private Stack<LocalBuilder>? _readOnlySpanCharLocalsPool;
 
-        /// <summary>Local representing a cached TextInfo for the culture to use for all case-insensitive operations.</summary>
-        private LocalBuilder? _textInfo;
         /// <summary>Local representing a timeout counter for loops (set loops and node loops).</summary>
         private LocalBuilder? _loopTimeoutCounter;
         /// <summary>A frequency with which the timeout should be validated.</summary>
@@ -337,33 +332,14 @@ namespace System.Text.RegularExpressions
             }
         }
 
-        /// <summary>Sets the culture local to CultureInfo.CurrentCulture.</summary>
-        private void InitLocalCultureInfo()
-        {
-            Debug.Assert(_textInfo != null);
-            Call(s_cultureInfoGetCurrentCultureMethod);
-            Callvirt(s_cultureInfoGetTextInfoMethod);
-            Stloc(_textInfo);
-        }
-
-        /// <summary>Whether ToLower operations should be performed with the invariant culture as opposed to the one in <see cref="_textInfo"/>.</summary>
-        private bool UseToLowerInvariant => _textInfo == null || (_options & RegexOptions.CultureInvariant) != 0;
-
-        /// <summary>Invokes either char.ToLowerInvariant(c) or _textInfo.ToLower(c).</summary>
+        /// <summary>Invokes textInfo.ToLower(c).</summary>
         private void CallToLower()
         {
-            if (UseToLowerInvariant)
-            {
-                Call(s_charToLowerInvariantMethod);
-            }
-            else
-            {
-                using RentedLocalBuilder currentCharLocal = RentInt32Local();
-                Stloc(currentCharLocal);
-                Ldloc(_textInfo!);
-                Ldloc(currentCharLocal);
-                Callvirt(s_textInfoToLowerMethod);
-            }
+            using RentedLocalBuilder currentCharLocal = RentInt32Local();
+            Stloc(currentCharLocal);
+            Ldthisfld(s_textInfo);
+            Ldloc(currentCharLocal);
+            Callvirt(s_textInfoToLowerMethod);
         }
 
         /// <summary>Generates the implementation for TryFindNextPossibleStartingPosition.</summary>
@@ -377,27 +353,6 @@ namespace System.Text.RegularExpressions
             LocalBuilder pos = DeclareInt32();
             bool rtl = (_options & RegexOptions.RightToLeft) != 0;
 
-            _textInfo = null;
-            if ((_options & RegexOptions.CultureInvariant) == 0)
-            {
-                bool needsCulture = _regexTree.FindOptimizations.FindMode switch
-                {
-                    FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseInsensitive or
-                    FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive or
-                    FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive => true,
-
-                    _ when _regexTree.FindOptimizations.FixedDistanceSets is List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> sets => sets.Exists(set => set.CaseInsensitive),
-
-                    _ => false,
-                };
-
-                if (needsCulture)
-                {
-                    _textInfo = DeclareTextInfo();
-                    InitLocalCultureInfo();
-                }
-            }
-
             // Load necessary locals
             // int pos = base.runtextpos;
             // ReadOnlySpan<char> inputSpan = dynamicMethodArg; // TODO: We can reference the arg directly rather than using another local.
@@ -461,31 +416,28 @@ namespace System.Text.RegularExpressions
             // Either anchors weren't specified, or they don't completely root all matches to a specific location.
             switch (_regexTree.FindOptimizations.FindMode)
             {
-                case FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive:
-                    Debug.Assert(!string.IsNullOrEmpty(_regexTree.FindOptimizations.LeadingCaseSensitivePrefix));
-                    EmitIndexOf_LeftToRight(_regexTree.FindOptimizations.LeadingCaseSensitivePrefix);
+                case FindNextStartingPositionMode.LeadingPrefix_LeftToRight:
+                    Debug.Assert(!string.IsNullOrEmpty(_regexTree.FindOptimizations.LeadingPrefix));
+                    EmitIndexOf_LeftToRight(_regexTree.FindOptimizations.LeadingPrefix);
                     break;
 
-                case FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive:
-                    Debug.Assert(!string.IsNullOrEmpty(_regexTree.FindOptimizations.LeadingCaseSensitivePrefix));
-                    EmitIndexOf_RightToLeft(_regexTree.FindOptimizations.LeadingCaseSensitivePrefix);
+                case FindNextStartingPositionMode.LeadingPrefix_RightToLeft:
+                    Debug.Assert(!string.IsNullOrEmpty(_regexTree.FindOptimizations.LeadingPrefix));
+                    EmitIndexOf_RightToLeft(_regexTree.FindOptimizations.LeadingPrefix);
                     break;
 
-                case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive:
-                case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive:
-                case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseSensitive:
-                case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive:
+                case FindNextStartingPositionMode.LeadingSet_LeftToRight:
+                case FindNextStartingPositionMode.FixedSets_LeftToRight:
                     Debug.Assert(_regexTree.FindOptimizations.FixedDistanceSets is { Count: > 0 });
                     EmitFixedSet_LeftToRight();
                     break;
 
-                case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive:
-                case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseInsensitive:
+                case FindNextStartingPositionMode.LeadingSet_RightToLeft:
                     Debug.Assert(_regexTree.FindOptimizations.FixedDistanceSets is { Count: > 0 });
                     EmitFixedSet_RightToLeft();
                     break;
 
-                case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive:
+                case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight:
                     Debug.Assert(_regexTree.FindOptimizations.LiteralAfterLoop is not null);
                     EmitLiteralAfterAtomicLoop();
                     break;
@@ -817,8 +769,8 @@ namespace System.Text.RegularExpressions
             // and potentially other sets at other fixed positions in the pattern.
             void EmitFixedSet_LeftToRight()
             {
-                List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? sets = _regexTree.FindOptimizations.FixedDistanceSets;
-                (char[]? Chars, string Set, int Distance, bool CaseInsensitive) primarySet = sets![0];
+                List<(char[]? Chars, string Set, int Distance)>? sets = _regexTree.FindOptimizations.FixedDistanceSets;
+                (char[]? Chars, string Set, int Distance) primarySet = sets![0];
                 const int MaxSets = 4;
                 int setsToUse = Math.Min(sets.Count, MaxSets);
 
@@ -834,7 +786,7 @@ namespace System.Text.RegularExpressions
                 // If we can use IndexOf{Any}, try to accelerate the skip loop via vectorization to match the first prefix.
                 // We can use it if this is a case-sensitive class with a small number of characters in the class.
                 int setIndex = 0;
-                bool canUseIndexOf = !primarySet.CaseInsensitive && primarySet.Chars is not null;
+                bool canUseIndexOf = primarySet.Chars is not null;
                 bool needLoop = !canUseIndexOf || setsToUse > 1;
 
                 Label checkSpanLengthLabel = default;
@@ -968,7 +920,7 @@ namespace System.Text.RegularExpressions
                     }
                     Call(s_spanGetItemMethod);
                     LdindU2();
-                    EmitMatchCharacterClass(sets[setIndex].Set, sets[setIndex].CaseInsensitive);
+                    EmitMatchCharacterClass(sets[setIndex].Set);
                     BrfalseFar(charNotInClassLabel);
                 }
 
@@ -1014,10 +966,10 @@ namespace System.Text.RegularExpressions
             // (Currently that position will always be a distance of 0, meaning the start of the pattern itself.)
             void EmitFixedSet_RightToLeft()
             {
-                (char[]? Chars, string Set, int Distance, bool CaseInsensitive) set = _regexTree.FindOptimizations.FixedDistanceSets![0];
+                (char[]? Chars, string Set, int Distance) set = _regexTree.FindOptimizations.FixedDistanceSets![0];
                 Debug.Assert(set.Distance == 0);
 
-                if (set.Chars is { Length: 1 } && !set.CaseInsensitive)
+                if (set.Chars is { Length: 1 })
                 {
                     // pos = inputSpan.Slice(0, pos).LastIndexOf(set.Chars[0]);
                     Ldloca(inputSpan);
@@ -1058,12 +1010,12 @@ namespace System.Text.RegularExpressions
                     Call(s_spanGetLengthMethod);
                     BgeUnFar(returnFalse);
 
-                    // if (!MatchCharacterClass(inputSpan[i], set.Set, set.CaseInsensitive)) goto condition;
+                    // if (!MatchCharacterClass(inputSpan[i], set.Set)) goto condition;
                     Ldloca(inputSpan);
                     Ldloc(pos);
                     Call(s_spanGetItemMethod);
                     LdindU2();
-                    EmitMatchCharacterClass(set.Set, set.CaseInsensitive);
+                    EmitMatchCharacterClass(set.Set);
                     Brfalse(condition);
 
                     // base.runtextpos = pos + 1;
@@ -1165,7 +1117,7 @@ namespace System.Text.RegularExpressions
                 Ldloc(prev);
                 Call(s_spanGetItemMethod);
                 LdindU2();
-                EmitMatchCharacterClass(target.LoopNode.Str!, caseInsensitive: false);
+                EmitMatchCharacterClass(target.LoopNode.Str!);
                 BrtrueFar(innerLoopBody);
                 MarkLabel(innerLoopEnd);
 
@@ -1268,7 +1220,7 @@ namespace System.Text.RegularExpressions
             // We can special case these to do essentially nothing in TryMatchAtCurrentPosition other than emit the capture.
             switch (node.Kind)
             {
-                case RegexNodeKind.Multi or RegexNodeKind.Notone or RegexNodeKind.One or RegexNodeKind.Set when !IsCaseInsensitive(node):
+                case RegexNodeKind.Multi or RegexNodeKind.Notone or RegexNodeKind.One or RegexNodeKind.Set:
                     // This is the case for single and multiple characters, though the whole thing is only guaranteed
                     // to have been validated in TryFindNextPossibleStartingPosition when doing case-sensitive comparison.
                     // base.Capture(0, base.runtextpos, base.runtextpos + node.Str.Length);
@@ -1313,9 +1265,6 @@ namespace System.Text.RegularExpressions
                 _loopTimeoutCounter = DeclareInt32();
             }
 
-            // CultureInfo culture = CultureInfo.CurrentCulture; // only if the whole expression or any subportion is ignoring case, and we're not using invariant
-            InitializeCultureForTryMatchAtCurrentPositionIfNecessary(analysis);
-
             // ReadOnlySpan<char> inputSpan = input;
             Ldarg_1();
             Stloc(inputSpan);
@@ -1414,12 +1363,6 @@ namespace System.Text.RegularExpressions
             // Generated code successfully.
             return;
 
-            // Whether the node has RegexOptions.IgnoreCase set.
-            // TODO: https://github.com/dotnet/runtime/issues/61048. We should be able to delete this and all usage sites once
-            // IgnoreCase is erradicated from the tree.  The only place it should possibly be left after that work is in a Backreference,
-            // and that can do this check directly as needed.
-            static bool IsCaseInsensitive(RegexNode node) => (node.Options & RegexOptions.IgnoreCase) != 0;
-
             // Slices the inputSpan starting at pos until end and stores it into slice.
             void SliceInputSpan()
             {
@@ -1460,18 +1403,6 @@ namespace System.Text.RegularExpressions
                 BgeUnFar(doneLabel);
             }
 
-            // Emits code to get ref slice[sliceStaticPos]
-            void EmitTextSpanOffset()
-            {
-                Ldloc(slice);
-                Call(s_memoryMarshalGetReference);
-                if (sliceStaticPos > 0)
-                {
-                    Ldc(sliceStaticPos * sizeof(char));
-                    Add();
-                }
-            }
-
             // Adds the value of sliceStaticPos into the pos local, zeros out sliceStaticPos,
             // and resets slice to be inputSpan.Slice(pos).
             void TransferSliceStaticPosToPos(bool forceSliceReload = false)
@@ -1738,7 +1669,7 @@ namespace System.Text.RegularExpressions
                 Add();
                 Call(s_spanGetItemMethod);
                 LdindU2();
-                if (IsCaseInsensitive(node))
+                if ((node.Options & RegexOptions.IgnoreCase) != 0)
                 {
                     CallToLower();
                 }
@@ -1758,7 +1689,7 @@ namespace System.Text.RegularExpressions
                 }
                 Call(s_spanGetItemMethod);
                 LdindU2();
-                if (IsCaseInsensitive(node))
+                if ((node.Options & RegexOptions.IgnoreCase) != 0)
                 {
                     CallToLower();
                 }
@@ -2358,7 +2289,7 @@ namespace System.Text.RegularExpressions
             {
                 // Before we handle general-purpose matching logic for nodes, handle any special-casing.
                 // -
-                if (_regexTree!.FindOptimizations.FindMode == FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive &&
+                if (_regexTree!.FindOptimizations.FindMode == FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight &&
                     _regexTree!.FindOptimizations.LiteralAfterLoop?.LoopNode == node)
                 {
                     Debug.Assert(sliceStaticPos == 0, "This should be the first node and thus static position shouldn't have advanced.");
@@ -2671,15 +2602,11 @@ namespace System.Text.RegularExpressions
                 // if (loadedChar != ch) goto doneLabel;
                 if (node.IsSetFamily)
                 {
-                    EmitMatchCharacterClass(node.Str!, IsCaseInsensitive(node));
+                    EmitMatchCharacterClass(node.Str!);
                     BrfalseFar(doneLabel);
                 }
                 else
                 {
-                    if (IsCaseInsensitive(node))
-                    {
-                        CallToLower();
-                    }
                     Ldc(node.Ch);
                     if (node.IsOneFamily)
                     {
@@ -2891,10 +2818,10 @@ namespace System.Text.RegularExpressions
             void EmitMultiChar(RegexNode node, bool emitLengthCheck)
             {
                 Debug.Assert(node.Kind is RegexNodeKind.Multi, $"Unexpected type: {node.Kind}");
-                EmitMultiCharString(node.Str!, IsCaseInsensitive(node), emitLengthCheck, (node.Options & RegexOptions.RightToLeft) != 0);
+                EmitMultiCharString(node.Str!, emitLengthCheck, (node.Options & RegexOptions.RightToLeft) != 0);
             }
 
-            void EmitMultiCharString(string str, bool caseInsensitive, bool emitLengthCheck, bool rightToLeft)
+            void EmitMultiCharString(string str, bool emitLengthCheck, bool rightToLeft)
             {
                 Debug.Assert(str.Length >= 2);
 
@@ -2922,10 +2849,6 @@ namespace System.Text.RegularExpressions
                         Ldloc(pos);
                         Call(s_spanGetItemMethod);
                         LdindU2();
-                        if (caseInsensitive)
-                        {
-                            CallToLower();
-                        }
                         Ldc(str[i]);
                         BneFar(doneLabel);
                     }
@@ -2933,38 +2856,14 @@ namespace System.Text.RegularExpressions
                     return;
                 }
 
-                if (caseInsensitive) // StartsWith(..., XxIgnoreCase) won't necessarily be the same as char-by-char comparison
-                {
-                    // This case should be relatively rare.  It will only occur with IgnoreCase and a series of non-ASCII characters.
-
-                    if (emitLengthCheck)
-                    {
-                        EmitSpanLengthCheck(str.Length);
-                    }
-
-                    foreach (char c in str)
-                    {
-                        // if (c != slice[sliceStaticPos++]) goto doneLabel;
-                        EmitTextSpanOffset();
-                        sliceStaticPos++;
-                        LdindU2();
-                        CallToLower();
-                        Ldc(c);
-                        BneFar(doneLabel);
-                    }
-                }
-                else
-                {
-                    // if (!slice.Slice(sliceStaticPos).StartsWith("...") goto doneLabel;
-                    Ldloca(slice);
-                    Ldc(sliceStaticPos);
-                    Call(s_spanSliceIntMethod);
-                    Ldstr(str);
-                    Call(s_stringAsSpanMethod);
-                    Call(s_spanStartsWithSpan);
-                    BrfalseFar(doneLabel);
-                    sliceStaticPos += str.Length;
-                }
+                Ldloca(slice);
+                Ldc(sliceStaticPos);
+                Call(s_spanSliceIntMethod);
+                Ldstr(str);
+                Call(s_stringAsSpanMethod);
+                Call(s_spanStartsWithSpan);
+                BrfalseFar(doneLabel);
+                sliceStaticPos += str.Length;
             }
 
             // Emits the code to handle a backtracking, single-character loop.
@@ -3274,7 +3173,6 @@ namespace System.Text.RegularExpressions
                 if (!rtl &&
                     iterationCount is null &&
                     node.Kind is RegexNodeKind.Notonelazy &&
-                    !IsCaseInsensitive(node) &&
                     subsequent?.FindStartingLiteral(4) is ValueTuple<char, string?, string?> literal && // 5 == max optimized by IndexOfAny, and we need to reserve 1 for node.Ch
                     (literal.Item3 is not null ? !literal.Item3.Contains(node.Ch) : (literal.Item2?[0] ?? literal.Item1) != node.Ch)) // no overlap between node.Ch and the start of the literal
                 {
@@ -3736,10 +3634,10 @@ namespace System.Text.RegularExpressions
                         EmitSingleChar(node, emitLengthChecksIfRequired);
                         return;
 
-                    case <= RegexNode.MultiVsRepeaterLimit when node.IsOneFamily && !IsCaseInsensitive(node):
+                    case <= RegexNode.MultiVsRepeaterLimit when node.IsOneFamily:
                         // This is a repeated case-sensitive character; emit it as a multi in order to get all the optimizations
                         // afforded to a multi, e.g. unrolling the loop with multi-char reads/comparisons at a time.
-                        EmitMultiCharString(new string(node.Ch, iterations), caseInsensitive: false, emitLengthChecksIfRequired, rtl);
+                        EmitMultiCharString(new string(node.Ch, iterations), emitLengthChecksIfRequired, rtl);
                         return;
                 }
 
@@ -3912,15 +3810,11 @@ namespace System.Text.RegularExpressions
                     LdindU2();
                     if (node.IsSetFamily)
                     {
-                        EmitMatchCharacterClass(node.Str!, IsCaseInsensitive(node));
+                        EmitMatchCharacterClass(node.Str!);
                         BrfalseFar(atomicLoopDoneLabel);
                     }
                     else
                     {
-                        if (IsCaseInsensitive(node))
-                        {
-                            CallToLower();
-                        }
                         Ldc(node.Ch);
                         if (node.IsOneFamily)
                         {
@@ -3952,8 +3846,7 @@ namespace System.Text.RegularExpressions
                     }
                 }
                 else if (node.IsNotoneFamily &&
-                    maxIterations == int.MaxValue &&
-                    (!IsCaseInsensitive(node)))
+                    maxIterations == int.MaxValue)
                 {
                     // For Notone, we're looking for a specific character, as everything until we find
                     // it is consumed by the loop.  If we're unbounded, such as with ".*" and if we're case-sensitive,
@@ -3993,7 +3886,6 @@ namespace System.Text.RegularExpressions
                 }
                 else if (node.IsSetFamily &&
                     maxIterations == int.MaxValue &&
-                    !IsCaseInsensitive(node) &&
                     (numSetChars = RegexCharClass.GetSetChars(node.Str!, setChars)) != 0 &&
                     RegexCharClass.IsNegated(node.Str!))
                 {
@@ -4097,15 +3989,11 @@ namespace System.Text.RegularExpressions
                     LdindU2();
                     if (node.IsSetFamily)
                     {
-                        EmitMatchCharacterClass(node.Str!, IsCaseInsensitive(node));
+                        EmitMatchCharacterClass(node.Str!);
                         BrfalseFar(atomicLoopDoneLabel);
                     }
                     else
                     {
-                        if (IsCaseInsensitive(node))
-                        {
-                            CallToLower();
-                        }
                         Ldc(node.Ch);
                         if (node.IsOneFamily)
                         {
@@ -4223,15 +4111,11 @@ namespace System.Text.RegularExpressions
                 LdindU2();
                 if (node.IsSetFamily)
                 {
-                    EmitMatchCharacterClass(node.Str!, IsCaseInsensitive(node));
+                    EmitMatchCharacterClass(node.Str!);
                     BrfalseFar(skipUpdatesLabel);
                 }
                 else
                 {
-                    if (IsCaseInsensitive(node))
-                    {
-                        CallToLower();
-                    }
                     Ldc(node.Ch);
                     if (node.IsOneFamily)
                     {
@@ -4742,20 +4626,9 @@ namespace System.Text.RegularExpressions
             Ret();
         }
 
-        private void InitializeCultureForTryMatchAtCurrentPositionIfNecessary(AnalysisResults analysis)
-        {
-            _textInfo = null;
-            if (analysis.HasIgnoreCase && (_options & RegexOptions.CultureInvariant) == 0)
-            {
-                // cache CultureInfo in local variable which saves excessive thread local storage accesses
-                _textInfo = DeclareTextInfo();
-                InitLocalCultureInfo();
-            }
-        }
-
         /// <summary>Emits a a check for whether the character is in the specified character class.</summary>
         /// <remarks>The character to be checked has already been loaded onto the stack.</remarks>
-        private void EmitMatchCharacterClass(string charClass, bool caseInsensitive)
+        private void EmitMatchCharacterClass(string charClass)
         {
             // We need to perform the equivalent of calling RegexRunner.CharInClass(ch, charClass),
             // but that call is relatively expensive.  Before we fall back to it, we try to optimize
@@ -4763,8 +4636,7 @@ namespace System.Text.RegularExpressions
             // for which we can call a dedicated method, or a fast-path for ASCII using a lookup table.
 
             // First, see if the char class is a built-in one for which there's a better function
-            // we can just call directly.  Everything in this section must work correctly for both
-            // case-sensitive and case-insensitive modes, regardless of culture.
+            // we can just call directly.
             switch (charClass)
             {
                 case RegexCharClass.AnyClass:
@@ -4810,24 +4682,8 @@ namespace System.Text.RegularExpressions
                     return;
             }
 
-            // If we're meant to be doing a case-insensitive lookup, and if we're not using the invariant culture,
-            // lowercase the input.  If we're using the invariant culture, we may still end up calling ToLower later
-            // on, but we may also be able to avoid it, in particular in the case of our lookup table, where we can
-            // generate the lookup table already factoring in the invariant case sensitivity.  There are multiple
-            // special-code paths between here and the lookup table, but we only take those if invariant is false;
-            // if it were true, they'd need to use CallToLower().
-            bool invariant = false;
-            if (caseInsensitive)
-            {
-                invariant = UseToLowerInvariant;
-                if (!invariant)
-                {
-                    CallToLower();
-                }
-            }
-
             // Next, handle simple sets of one range, e.g. [A-Z], [0-9], etc.  This includes some built-in classes, like ECMADigitClass.
-            if (!invariant && RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive))
+            if (RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive))
             {
                 if (lowInclusive == highInclusive)
                 {
@@ -4857,7 +4713,7 @@ namespace System.Text.RegularExpressions
             // Next if the character class contains nothing but a single Unicode category, we can calle char.GetUnicodeCategory and
             // compare against it.  It has a fast-lookup path for ASCII, so is as good or better than any lookup we'd generate (plus
             // we get smaller code), and it's what we'd do for the fallback (which we get to avoid generating) as part of CharInClass.
-            if (!invariant && RegexCharClass.TryGetSingleUnicodeCategory(charClass, out UnicodeCategory category, out bool negated))
+            if (RegexCharClass.TryGetSingleUnicodeCategory(charClass, out UnicodeCategory category, out bool negated))
             {
                 // char.GetUnicodeCategory(ch) == category
                 Call(s_charGetUnicodeInfo);
@@ -4879,7 +4735,7 @@ namespace System.Text.RegularExpressions
 
             // Next, if there's only 2 or 3 chars in the set (fairly common due to the sets we create for prefixes),
             // it's cheaper and smaller to compare against each than it is to use a lookup table.
-            if (!invariant && !RegexCharClass.IsNegated(charClass))
+            if (!RegexCharClass.IsNegated(charClass))
             {
                 Span<char> setChars = stackalloc char[3];
                 int numChars = RegexCharClass.GetSetChars(charClass, setChars);
@@ -4928,10 +4784,6 @@ namespace System.Text.RegularExpressions
             void EmitCharInClass()
             {
                 Ldloc(tempLocal);
-                if (invariant)
-                {
-                    CallToLower();
-                }
                 Ldstr(charClass);
                 Call(s_charInClassMethod);
                 Stloc(resultLocal);
@@ -4940,49 +4792,46 @@ namespace System.Text.RegularExpressions
             Label doneLabel = DefineLabel();
             Label comparisonLabel = DefineLabel();
 
-            if (!invariant) // if we're being asked to do a case insensitive, invariant comparison, use the lookup table
+            if (analysis.ContainsNoAscii)
             {
-                if (analysis.ContainsNoAscii)
-                {
-                    // We determined that the character class contains only non-ASCII,
-                    // for example if the class were [\p{IsGreek}\p{IsGreekExtended}], which is
-                    // the same as [\u0370-\u03FF\u1F00-1FFF]. (In the future, we could possibly
-                    // extend the analysis to produce a known lower-bound and compare against
-                    // that rather than always using 128 as the pivot point.)
-
-                    // ch >= 128 && RegexRunner.CharInClass(ch, "...")
-                    Ldloc(tempLocal);
-                    Ldc(128);
-                    Blt(comparisonLabel);
-                    EmitCharInClass();
-                    Br(doneLabel);
-                    MarkLabel(comparisonLabel);
-                    Ldc(0);
-                    Stloc(resultLocal);
-                    MarkLabel(doneLabel);
-                    Ldloc(resultLocal);
-                    return;
-                }
+                // We determined that the character class contains only non-ASCII,
+                // for example if the class were [\p{IsGreek}\p{IsGreekExtended}], which is
+                // the same as [\u0370-\u03FF\u1F00-1FFF]. (In the future, we could possibly
+                // extend the analysis to produce a known lower-bound and compare against
+                // that rather than always using 128 as the pivot point.)
 
-                if (analysis.AllAsciiContained)
-                {
-                    // We determined that every ASCII character is in the class, for example
-                    // if the class were the negated example from case 1 above:
-                    // [^\p{IsGreek}\p{IsGreekExtended}].
+                // ch >= 128 && RegexRunner.CharInClass(ch, "...")
+                Ldloc(tempLocal);
+                Ldc(128);
+                Blt(comparisonLabel);
+                EmitCharInClass();
+                Br(doneLabel);
+                MarkLabel(comparisonLabel);
+                Ldc(0);
+                Stloc(resultLocal);
+                MarkLabel(doneLabel);
+                Ldloc(resultLocal);
+                return;
+            }
 
-                    // ch < 128 || RegexRunner.CharInClass(ch, "...")
-                    Ldloc(tempLocal);
-                    Ldc(128);
-                    Blt(comparisonLabel);
-                    EmitCharInClass();
-                    Br(doneLabel);
-                    MarkLabel(comparisonLabel);
-                    Ldc(1);
-                    Stloc(resultLocal);
-                    MarkLabel(doneLabel);
-                    Ldloc(resultLocal);
-                    return;
-                }
+            if (analysis.AllAsciiContained)
+            {
+                // We determined that every ASCII character is in the class, for example
+                // if the class were the negated example from case 1 above:
+                // [^\p{IsGreek}\p{IsGreekExtended}].
+
+                // ch < 128 || RegexRunner.CharInClass(ch, "...")
+                Ldloc(tempLocal);
+                Ldc(128);
+                Blt(comparisonLabel);
+                EmitCharInClass();
+                Br(doneLabel);
+                MarkLabel(comparisonLabel);
+                Ldc(1);
+                Stloc(resultLocal);
+                MarkLabel(doneLabel);
+                Ldloc(resultLocal);
+                return;
             }
 
             // Now, our big hammer is to generate a lookup table that lets us quickly index by character into a yes/no
@@ -5000,15 +4849,12 @@ namespace System.Text.RegularExpressions
 
             // Generate the lookup table to store 128 answers as bits. We use a const string instead of a byte[] / static
             // data property because it lets IL emit handle all the details for us.
-            string bitVectorString = string.Create(8, (charClass, invariant), static (dest, state) => // String length is 8 chars == 16 bytes == 128 bits.
+            string bitVectorString = string.Create(8, charClass, static (dest, charClass) => // String length is 8 chars == 16 bytes == 128 bits.
             {
                 for (int i = 0; i < 128; i++)
                 {
                     char c = (char)i;
-                    bool isSet = state.invariant ?
-                        RegexCharClass.CharInClass(char.ToLowerInvariant(c), state.charClass) :
-                        RegexCharClass.CharInClass(c, state.charClass);
-                    if (isSet)
+                    if (RegexCharClass.CharInClass(c, charClass))
                     {
                         dest[i >> 4] |= (char)(1 << (i & 0xF));
                     }
index 5547039..f06e1ec 100644 (file)
@@ -12,15 +12,12 @@ namespace System.Text.RegularExpressions
     {
         /// <summary>True if the input should be processed right-to-left rather than left-to-right.</summary>
         private readonly bool _rightToLeft;
-        /// <summary>Provides the ToLower routine for lowercasing characters.</summary>
-        private readonly TextInfo _textInfo;
         /// <summary>Lookup table used for optimizing ASCII when doing set queries.</summary>
         private readonly uint[]?[]? _asciiLookups;
 
-        public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo culture)
+        public RegexFindOptimizations(RegexNode root, RegexOptions options)
         {
             _rightToLeft = (options & RegexOptions.RightToLeft) != 0;
-            _textInfo = culture.TextInfo;
 
             MinRequiredLength = root.ComputeMinLength();
 
@@ -80,14 +77,14 @@ namespace System.Text.RegularExpressions
                 }
             }
 
-            // If there's a leading case-sensitive substring, just use IndexOf and inherit all of its optimizations.
-            string caseSensitivePrefix = RegexPrefixAnalyzer.FindCaseSensitivePrefix(root);
-            if (caseSensitivePrefix.Length > 1)
+            // If there's a leading substring, just use IndexOf and inherit all of its optimizations.
+            string prefix = RegexPrefixAnalyzer.FindPrefix(root);
+            if (prefix.Length > 1)
             {
-                LeadingCaseSensitivePrefix = caseSensitivePrefix;
+                LeadingPrefix = prefix;
                 FindMode = _rightToLeft ?
-                    FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive :
-                    FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive;
+                    FindNextStartingPositionMode.LeadingPrefix_RightToLeft :
+                    FindNextStartingPositionMode.LeadingPrefix_LeftToRight;
                 return;
             }
 
@@ -107,14 +104,14 @@ namespace System.Text.RegularExpressions
             if (_rightToLeft)
             {
                 // Determine a set for anything that can possibly start the expression.
-                if (RegexPrefixAnalyzer.FindFirstCharClass(root, culture) is (string CharClass, bool CaseInsensitive) set)
+                if (RegexPrefixAnalyzer.FindFirstCharClass(root) is string charClass)
                 {
                     // See if the set is limited to holding only a few characters.
                     Span<char> scratch = stackalloc char[5]; // max optimized by IndexOfAny today
                     int scratchCount;
                     char[]? chars = null;
-                    if (!RegexCharClass.IsNegated(set.CharClass) &&
-                        (scratchCount = RegexCharClass.GetSetChars(set.CharClass, scratch)) > 0)
+                    if (!RegexCharClass.IsNegated(charClass) &&
+                        (scratchCount = RegexCharClass.GetSetChars(charClass, scratch)) > 0)
                     {
                         chars = scratch.Slice(0, scratchCount).ToArray();
                     }
@@ -125,20 +122,16 @@ namespace System.Text.RegularExpressions
                         // The set contains one and only one character, meaning every match starts
                         // with the same literal value (potentially case-insensitive). Search for that.
                         FixedDistanceLiteral = (chars[0], 0);
-                        FindMode = set.CaseInsensitive ?
-                            FindNextStartingPositionMode.LeadingLiteral_RightToLeft_CaseInsensitive :
-                            FindNextStartingPositionMode.LeadingLiteral_RightToLeft_CaseSensitive;
+                        FindMode = FindNextStartingPositionMode.LeadingLiteral_RightToLeft;
                     }
                     else
                     {
                         // The set may match multiple characters.  Search for that.
-                        FixedDistanceSets = new List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>()
+                        FixedDistanceSets = new List<(char[]? Chars, string Set, int Distance)>()
                         {
-                            (chars, set.CharClass, 0, set.CaseInsensitive)
+                            (chars, charClass, 0)
                         };
-                        FindMode = set.CaseInsensitive ?
-                            FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseInsensitive :
-                            FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive;
+                        FindMode = FindNextStartingPositionMode.LeadingSet_RightToLeft;
                         _asciiLookups = new uint[1][];
                     }
                 }
@@ -152,7 +145,7 @@ namespace System.Text.RegularExpressions
             (RegexNode LoopNode, (char Char, string? String, char[]? Chars) Literal)? literalAfterLoop = RegexPrefixAnalyzer.FindLiteralFollowingLeadingLoop(root);
 
             // Build up a list of all of the sets that are a fixed distance from the start of the expression.
-            List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? fixedDistanceSets = RegexPrefixAnalyzer.FindFixedDistanceSets(root, culture, thorough: !interpreter);
+            List<(char[]? Chars, string Set, int Distance)>? fixedDistanceSets = RegexPrefixAnalyzer.FindFixedDistanceSets(root, thorough: !interpreter);
             Debug.Assert(fixedDistanceSets is null || fixedDistanceSets.Count != 0);
 
             // If we got such sets, we'll likely use them.  However, if the best of them is something that doesn't support a vectorized
@@ -168,9 +161,7 @@ namespace System.Text.RegularExpressions
                     fixedDistanceSets[0].Chars is { Length: 1 })
                 {
                     FixedDistanceLiteral = (fixedDistanceSets[0].Chars![0], fixedDistanceSets[0].Distance);
-                    FindMode = fixedDistanceSets[0].CaseInsensitive ?
-                        FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseInsensitive :
-                        FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseSensitive;
+                    FindMode = FindNextStartingPositionMode.FixedLiteral_LeftToRight;
                 }
                 else
                 {
@@ -184,13 +175,8 @@ namespace System.Text.RegularExpressions
 
                     // Store the sets, and compute which mode to use.
                     FixedDistanceSets = fixedDistanceSets;
-                    FindMode = (fixedDistanceSets.Count == 1 && fixedDistanceSets[0].Distance == 0, fixedDistanceSets[0].CaseInsensitive) switch
-                    {
-                        (true, true) => FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive,
-                        (true, false) => FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive,
-                        (false, true) => FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive,
-                        (false, false) => FindNextStartingPositionMode.FixedSets_LeftToRight_CaseSensitive,
-                    };
+                    FindMode = (fixedDistanceSets.Count == 1 && fixedDistanceSets[0].Distance == 0) ? FindNextStartingPositionMode.LeadingSet_LeftToRight
+                        : FindNextStartingPositionMode.FixedSets_LeftToRight;
                     _asciiLookups = new uint[fixedDistanceSets.Count][];
                 }
                 return;
@@ -199,7 +185,7 @@ namespace System.Text.RegularExpressions
             // If we found a literal we can search for after a leading set loop, use it.
             if (literalAfterLoop is not null)
             {
-                FindMode = FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive;
+                FindMode = FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight;
                 LiteralAfterLoop = literalAfterLoop;
                 _asciiLookups = new uint[1][];
                 return;
@@ -227,14 +213,14 @@ namespace System.Text.RegularExpressions
         public int? MaxPossibleLength { get; }
 
         /// <summary>Gets the leading prefix.  May be an empty string.</summary>
-        public string LeadingCaseSensitivePrefix { get; } = string.Empty;
+        public string LeadingPrefix { get; } = string.Empty;
 
         /// <summary>When in fixed distance literal mode, gets the literal and how far it is from the start of the pattern.</summary>
         public (char Literal, int Distance) FixedDistanceLiteral { get; }
 
         /// <summary>When in fixed distance set mode, gets the set and how far it is from the start of the pattern.</summary>
         /// <remarks>The case-insensitivity of the 0th entry will always match the mode selected, but subsequent entries may not.</remarks>
-        public List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? FixedDistanceSets { get; }
+        public List<(char[]? Chars, string Set, int Distance)>? FixedDistanceSets { get; }
 
         /// <summary>When in literal after set loop node, gets the literal to search for and the RegexNode representing the leading loop.</summary>
         public (RegexNode LoopNode, (char Char, string? String, char[]? Chars) Literal)? LiteralAfterLoop { get; }
@@ -393,9 +379,9 @@ namespace System.Text.RegularExpressions
 
                 // There's a case-sensitive prefix.  Search for it with ordinal IndexOf.
 
-                case FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive:
+                case FindNextStartingPositionMode.LeadingPrefix_LeftToRight:
                     {
-                        int i = textSpan.Slice(pos).IndexOf(LeadingCaseSensitivePrefix.AsSpan());
+                        int i = textSpan.Slice(pos).IndexOf(LeadingPrefix.AsSpan());
                         if (i >= 0)
                         {
                             pos += i;
@@ -406,12 +392,12 @@ namespace System.Text.RegularExpressions
                         return false;
                     }
 
-                case FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive:
+                case FindNextStartingPositionMode.LeadingPrefix_RightToLeft:
                     {
-                        int i = textSpan.Slice(0, pos).LastIndexOf(LeadingCaseSensitivePrefix.AsSpan());
+                        int i = textSpan.Slice(0, pos).LastIndexOf(LeadingPrefix.AsSpan());
                         if (i >= 0)
                         {
-                            pos = i + LeadingCaseSensitivePrefix.Length;
+                            pos = i + LeadingPrefix.Length;
                             return true;
                         }
 
@@ -421,7 +407,7 @@ namespace System.Text.RegularExpressions
 
                 // There's a literal at the beginning of the pattern.  Search for it.
 
-                case FindNextStartingPositionMode.LeadingLiteral_RightToLeft_CaseSensitive:
+                case FindNextStartingPositionMode.LeadingLiteral_RightToLeft:
                     {
                         int i = textSpan.Slice(0, pos).LastIndexOf(FixedDistanceLiteral.Literal);
                         if (i >= 0)
@@ -434,30 +420,11 @@ namespace System.Text.RegularExpressions
                         return false;
                     }
 
-                case FindNextStartingPositionMode.LeadingLiteral_RightToLeft_CaseInsensitive:
-                    {
-                        char ch = FixedDistanceLiteral.Literal;
-                        TextInfo ti = _textInfo;
-
-                        ReadOnlySpan<char> span = textSpan.Slice(0, pos);
-                        for (int i = span.Length - 1; i >= 0; i--)
-                        {
-                            if (ti.ToLower(span[i]) == ch)
-                            {
-                                pos = i + 1;
-                                return true;
-                            }
-                        }
-
-                        pos = 0;
-                        return false;
-                    }
-
                 // There's a set at the beginning of the pattern.  Search for it.
 
-                case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive:
+                case FindNextStartingPositionMode.LeadingSet_LeftToRight:
                     {
-                        (char[]? chars, string set, _, _) = FixedDistanceSets![0];
+                        (char[]? chars, string set, _) = FixedDistanceSets![0];
 
                         ReadOnlySpan<char> span = textSpan.Slice(pos);
                         if (chars is not null)
@@ -486,27 +453,7 @@ namespace System.Text.RegularExpressions
                         return false;
                     }
 
-                case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive:
-                    {
-                        ref uint[]? startingAsciiLookup = ref _asciiLookups![0];
-                        string set = FixedDistanceSets![0].Set;
-                        TextInfo ti = _textInfo;
-
-                        ReadOnlySpan<char> span = textSpan.Slice(pos);
-                        for (int i = 0; i < span.Length; i++)
-                        {
-                            if (RegexCharClass.CharInClass(ti.ToLower(span[i]), set, ref startingAsciiLookup))
-                            {
-                                pos += i;
-                                return true;
-                            }
-                        }
-
-                        pos = textSpan.Length;
-                        return false;
-                    }
-
-                case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive:
+                case FindNextStartingPositionMode.LeadingSet_RightToLeft:
                     {
                         ref uint[]? startingAsciiLookup = ref _asciiLookups![0];
                         string set = FixedDistanceSets![0].Set;
@@ -525,29 +472,9 @@ namespace System.Text.RegularExpressions
                         return false;
                     }
 
-                case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseInsensitive:
-                    {
-                        ref uint[]? startingAsciiLookup = ref _asciiLookups![0];
-                        string set = FixedDistanceSets![0].Set;
-                        TextInfo ti = _textInfo;
-
-                        ReadOnlySpan<char> span = textSpan.Slice(0, pos);
-                        for (int i = span.Length - 1; i >= 0; i--)
-                        {
-                            if (RegexCharClass.CharInClass(ti.ToLower(span[i]), set, ref startingAsciiLookup))
-                            {
-                                pos = i + 1;
-                                return true;
-                            }
-                        }
-
-                        pos = 0;
-                        return false;
-                    }
-
                 // There's a literal at a fixed offset from the beginning of the pattern.  Search for it.
 
-                case FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseSensitive:
+                case FindNextStartingPositionMode.FixedLiteral_LeftToRight:
                     {
                         Debug.Assert(FixedDistanceLiteral.Distance <= MinRequiredLength);
 
@@ -562,33 +489,12 @@ namespace System.Text.RegularExpressions
                         return false;
                     }
 
-                case FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseInsensitive:
-                    {
-                        Debug.Assert(FixedDistanceLiteral.Distance <= MinRequiredLength);
-
-                        char ch = FixedDistanceLiteral.Literal;
-                        TextInfo ti = _textInfo;
-
-                        ReadOnlySpan<char> span = textSpan.Slice(pos + FixedDistanceLiteral.Distance);
-                        for (int i = 0; i < span.Length; i++)
-                        {
-                            if (ti.ToLower(span[i]) == ch)
-                            {
-                                pos += i;
-                                return true;
-                            }
-                        }
-
-                        pos = textSpan.Length;
-                        return false;
-                    }
-
                 // There are one or more sets at fixed offsets from the start of the pattern.
 
-                case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseSensitive:
+                case FindNextStartingPositionMode.FixedSets_LeftToRight:
                     {
-                        List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> sets = FixedDistanceSets!;
-                        (char[]? primaryChars, string primarySet, int primaryDistance, _) = sets[0];
+                        List<(char[]? Chars, string Set, int Distance)> sets = FixedDistanceSets!;
+                        (char[]? primaryChars, string primarySet, int primaryDistance) = sets[0];
                         int endMinusRequiredLength = textSpan.Length - Math.Max(1, MinRequiredLength);
 
                         if (primaryChars is not null)
@@ -612,9 +518,9 @@ namespace System.Text.RegularExpressions
 
                                 for (int i = 1; i < sets.Count; i++)
                                 {
-                                    (_, string nextSet, int nextDistance, bool nextCaseInsensitive) = sets[i];
+                                    (_, string nextSet, int nextDistance) = sets[i];
                                     char c = textSpan[inputPosition + nextDistance];
-                                    if (!RegexCharClass.CharInClass(nextCaseInsensitive ? _textInfo.ToLower(c) : c, nextSet, ref _asciiLookups![i]))
+                                    if (!RegexCharClass.CharInClass(c, nextSet, ref _asciiLookups![i]))
                                     {
                                         goto Bumpalong;
                                     }
@@ -640,9 +546,9 @@ namespace System.Text.RegularExpressions
 
                                 for (int i = 1; i < sets.Count; i++)
                                 {
-                                    (_, string nextSet, int nextDistance, bool nextCaseInsensitive) = sets[i];
+                                    (_, string nextSet, int nextDistance) = sets[i];
                                     c = textSpan[inputPosition + nextDistance];
-                                    if (!RegexCharClass.CharInClass(nextCaseInsensitive ? _textInfo.ToLower(c) : c, nextSet, ref _asciiLookups![i]))
+                                    if (!RegexCharClass.CharInClass(c, nextSet, ref _asciiLookups![i]))
                                     {
                                         goto Bumpalong;
                                     }
@@ -659,45 +565,8 @@ namespace System.Text.RegularExpressions
                         return false;
                     }
 
-                case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive:
-                    {
-                        List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> sets = FixedDistanceSets!;
-                        (_, string primarySet, int primaryDistance, _) = sets[0];
-
-                        int endMinusRequiredLength = textSpan.Length - Math.Max(1, MinRequiredLength);
-                        TextInfo ti = _textInfo;
-                        ref uint[]? startingAsciiLookup = ref _asciiLookups![0];
-
-                        for (int inputPosition = pos; inputPosition <= endMinusRequiredLength; inputPosition++)
-                        {
-                            char c = textSpan[inputPosition + primaryDistance];
-                            if (!RegexCharClass.CharInClass(ti.ToLower(c), primarySet, ref startingAsciiLookup))
-                            {
-                                goto Bumpalong;
-                            }
-
-                            for (int i = 1; i < sets.Count; i++)
-                            {
-                                (_, string nextSet, int nextDistance, bool nextCaseInsensitive) = sets[i];
-                                c = textSpan[inputPosition + nextDistance];
-                                if (!RegexCharClass.CharInClass(nextCaseInsensitive ? _textInfo.ToLower(c) : c, nextSet, ref _asciiLookups![i]))
-                                {
-                                    goto Bumpalong;
-                                }
-                            }
-
-                            pos = inputPosition;
-                            return true;
-
-                        Bumpalong:;
-                        }
-
-                        pos = textSpan.Length;
-                        return false;
-                    }
-
                 // There's a literal after a leading set loop.  Find the literal, then walk backwards through the loop to find the starting position.
-                case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive:
+                case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight:
                     {
                         Debug.Assert(LiteralAfterLoop is not null);
                         (RegexNode loopNode, (char Char, string? String, char[]? Chars) literal) = LiteralAfterLoop.GetValueOrDefault();
@@ -779,37 +648,27 @@ namespace System.Text.RegularExpressions
         /// <summary>An "endz" anchor at the end of the pattern, with the pattern always matching a fixed-length expression.</summary>
         TrailingAnchor_FixedLength_LeftToRight_EndZ,
 
-        /// <summary>A case-sensitive multi-character substring at the beginning of the pattern.</summary>
-        LeadingPrefix_LeftToRight_CaseSensitive,
-        /// <summary>A case-sensitive multi-character substring at the beginning of the right-to-left pattern.</summary>
-        LeadingPrefix_RightToLeft_CaseSensitive,
-
-        /// <summary>A case-sensitive set starting the pattern.</summary>
-        LeadingSet_LeftToRight_CaseSensitive,
-        /// <summary>A case-insensitive set starting the pattern.</summary>
-        LeadingSet_LeftToRight_CaseInsensitive,
-        /// <summary>A case-sensitive set starting the right-to-left pattern.</summary>
-        LeadingSet_RightToLeft_CaseSensitive,
-        /// <summary>A case-insensitive set starting the right-to-left pattern.</summary>
-        LeadingSet_RightToLeft_CaseInsensitive,
-
-        /// <summary>A case-sensitive single character at a fixed distance from the start of the right-to-left pattern.</summary>
-        LeadingLiteral_RightToLeft_CaseSensitive,
-        /// <summary>A case-insensitive single character at a fixed distance from the start of the right-to-left pattern.</summary>
-        LeadingLiteral_RightToLeft_CaseInsensitive,
-
-        /// <summary>A case-sensitive single character at a fixed distance from the start of the pattern.</summary>
-        FixedLiteral_LeftToRight_CaseSensitive,
-        /// <summary>A case-insensitive single character at a fixed distance from the start of the pattern.</summary>
-        FixedLiteral_LeftToRight_CaseInsensitive,
-
-        /// <summary>One or more sets at a fixed distance from the start of the pattern.  At least the first set is case-sensitive.</summary>
-        FixedSets_LeftToRight_CaseSensitive,
-        /// <summary>One or more sets at a fixed distance from the start of the pattern.  At least the first set is case-insensitive.</summary>
-        FixedSets_LeftToRight_CaseInsensitive,
-
-        /// <summary>A literal after a non-overlapping set loop at the start of the pattern.  The literal is case-sensitive.</summary>
-        LiteralAfterLoop_LeftToRight_CaseSensitive,
+        /// <summary>A multi-character substring at the beginning of the pattern.</summary>
+        LeadingPrefix_LeftToRight,
+        /// <summary>A multi-character substring at the beginning of the right-to-left pattern.</summary>
+        LeadingPrefix_RightToLeft,
+
+        /// <summary>A set starting the pattern.</summary>
+        LeadingSet_LeftToRight,
+        /// <summary>A set starting the right-to-left pattern.</summary>
+        LeadingSet_RightToLeft,
+
+        /// <summary>A single character at a fixed distance from the start of the right-to-left pattern.</summary>
+        LeadingLiteral_RightToLeft,
+
+        /// <summary>A single character at a fixed distance from the start of the pattern.</summary>
+        FixedLiteral_LeftToRight,
+
+        /// <summary>One or more sets at a fixed distance from the start of the pattern.</summary>
+        FixedSets_LeftToRight,
+
+        /// <summary>A literal after a non-overlapping set loop at the start of the pattern.</summary>
+        LiteralAfterLoop_LeftToRight,
 
         /// <summary>Nothing to search for. Nop.</summary>
         NoSearch,
index 1583c61..eb0a43b 100644 (file)
@@ -12,14 +12,20 @@ namespace System.Text.RegularExpressions
     internal sealed class RegexInterpreterFactory : RegexRunnerFactory
     {
         private readonly RegexInterpreterCode _code;
+        private readonly TextInfo? _textInfo;
 
-        public RegexInterpreterFactory(RegexTree tree, CultureInfo culture) =>
+        public RegexInterpreterFactory(RegexTree tree)
+        {
+            // We use the TextInfo field from the tree's culture which will only be set to an actual culture if the
+            // tree contains IgnoreCase backreferences. If the tree doesn't have IgnoreCase backreferences, then we keep _textInfo as null.
+            _textInfo = tree.Culture?.TextInfo;
             // Generate and store the RegexInterpretedCode for the RegexTree and the specified culture
-            _code = RegexWriter.Write(tree, culture);
+            _code = RegexWriter.Write(tree);
+        }
 
         protected internal override RegexRunner CreateInstance() =>
             // Create a new interpreter instance.
-            new RegexInterpreter(_code, RegexParser.GetTargetCulture(_code.Options));
+            new RegexInterpreter(_code, _textInfo);
     }
 
     /// <summary>Executes a block of regular expression codes while consuming input.</summary>
@@ -28,20 +34,19 @@ namespace System.Text.RegularExpressions
         private const int LoopTimeoutCheckCount = 2048; // conservative value to provide reasonably-accurate timeout handling.
 
         private readonly RegexInterpreterCode _code;
-        private readonly TextInfo _textInfo;
+        private readonly TextInfo? _textInfo;
 
         private RegexOpcode _operator;
         private int _codepos;
         private bool _rightToLeft;
         private bool _caseInsensitive;
 
-        public RegexInterpreter(RegexInterpreterCode code, CultureInfo culture)
+        public RegexInterpreter(RegexInterpreterCode code, TextInfo? textInfo)
         {
             Debug.Assert(code != null, "code must not be null.");
-            Debug.Assert(culture != null, "culture must not be null.");
 
             _code = code;
-            _textInfo = culture.TextInfo;
+            _textInfo = textInfo;
         }
 
         protected override void InitTrackCount() => runtrackcount = _code.TrackCount;
@@ -215,8 +220,7 @@ namespace System.Text.RegularExpressions
         private char Forwardcharnext(ReadOnlySpan<char> inputSpan)
         {
             int i = _rightToLeft ? --runtextpos : runtextpos++;
-            char ch = inputSpan[i];
-            return _caseInsensitive ? _textInfo.ToLower(ch) : ch;
+            return inputSpan[i];
         }
 
         private bool MatchString(string str, ReadOnlySpan<char> inputSpan)
@@ -243,25 +247,11 @@ namespace System.Text.RegularExpressions
                 pos = runtextpos;
             }
 
-            if (!_caseInsensitive)
-            {
-                while (c != 0)
-                {
-                    if (str[--c] != inputSpan[--pos])
-                    {
-                        return false;
-                    }
-                }
-            }
-            else
+            while (c != 0)
             {
-                TextInfo ti = _textInfo;
-                while (c != 0)
+                if (str[--c] != inputSpan[--pos])
                 {
-                    if (str[--c] != ti.ToLower(inputSpan[--pos]))
-                    {
-                        return false;
-                    }
+                    return false;
                 }
             }
 
@@ -312,6 +302,7 @@ namespace System.Text.RegularExpressions
             }
             else
             {
+                Debug.Assert(_textInfo != null, "If the pattern has backreferences and is IgnoreCase, then _textInfo must not be null.");
                 TextInfo ti = _textInfo;
                 while (c-- != 0)
                 {
index 0a1ab21..e97daba 100644 (file)
@@ -61,7 +61,7 @@ namespace System.Text.RegularExpressions
             DynamicMethod scanMethod = DefineDynamicMethod($"Regex{regexNum}_Scan{description}", null, typeof(CompiledRegexRunner), new[] { typeof(RegexRunner), typeof(ReadOnlySpan<char>) });
             EmitScan(options, tryfindNextPossibleStartPositionMethod, tryMatchAtCurrentPositionMethod);
 
-            return new CompiledRegexRunnerFactory(scanMethod);
+            return new CompiledRegexRunnerFactory(scanMethod, regexTree.Culture);
         }
 
         /// <summary>Begins the definition of a new method (no args) with a specified return value.</summary>
index 37c862f..132d745 100644 (file)
@@ -97,25 +97,17 @@ namespace System.Text.RegularExpressions
             {
                 Debug.Assert(culture is not null);
 
-                // If the character is part of a Unicode category that doesn't participate in case conversion,
-                // we can simply strip out the IgnoreCase option and make the node case-sensitive.
-                if (!RegexCharClass.ParticipatesInCaseConversion(ch))
+                if (!RegexCaseEquivalences.TryFindCaseEquivalencesForCharWithIBehavior(ch, culture, out ReadOnlySpan<char> equivalences))
                 {
+                    // If we reach here, then we know that ch does not participate in case conversion, so we just
+                    // create a One node with it and strip out the IgnoreCase option.
                     return new RegexNode(RegexNodeKind.One, options & ~RegexOptions.IgnoreCase, ch);
                 }
 
-                // Create a set for the character, trying to include all case-insensitive equivalent characters.
-                // If it's successful in doing so, resultIsCaseInsensitive will be false and we can strip
-                // out RegexOptions.IgnoreCase as part of creating the set.
-                string stringSet = RegexCharClass.OneToStringClass(ch, culture, out bool resultIsCaseInsensitive);
-                if (!resultIsCaseInsensitive)
-                {
-                    return new RegexNode(RegexNodeKind.Set, options & ~RegexOptions.IgnoreCase, stringSet);
-                }
-
-                // Otherwise, until we can get rid of ToLower usage at match time entirely (https://github.com/dotnet/runtime/issues/61048),
-                // lowercase the character and proceed to create an IgnoreCase One node.
-                ch = culture.TextInfo.ToLower(ch);
+                // If it does participate in case conversion, then transform the Node into a set with
+                // all possible valid values and remove the IgnoreCase option to make the node case-sensitive.
+                string stringSet = RegexCharClass.CharsToStringClass(equivalences);
+                return new RegexNode(RegexNodeKind.Set, options & ~RegexOptions.IgnoreCase, stringSet);
             }
 
             // Create a One node for the character.
@@ -295,6 +287,17 @@ namespace System.Text.RegularExpressions
                         Debug.Assert(node.Str is null, $"Expected null string for {node.Kind}, got \"{node.Str}\".");
                         break;
                 }
+
+                // Validate only Backreference nodes have IgnoreCase Option
+                switch (node.Kind)
+                {
+                    case RegexNodeKind.Backreference:
+                        break;
+
+                    default:
+                        Debug.Assert((node.Options & RegexOptions.IgnoreCase) == 0, $"{node.Kind} node should not have RegexOptions.IgnoreCase");
+                        break;
+                }
             }
         }
 #endif
@@ -501,10 +504,7 @@ namespace System.Text.RegularExpressions
         /// </summary>
         internal RegexNode Reduce()
         {
-            // TODO: https://github.com/dotnet/runtime/issues/61048
-            // As part of overhauling IgnoreCase handling, the parser shouldn't produce any nodes other than Backreference
-            // that ever have IgnoreCase set on them.  For now, though, remove IgnoreCase from any nodes for which it
-            // has no behavioral effect.
+            // Remove IgnoreCase option from everything except a Backreference
             switch (Kind)
             {
                 default:
@@ -512,10 +512,6 @@ namespace System.Text.RegularExpressions
                     Options &= ~RegexOptions.IgnoreCase;
                     break;
 
-                case RegexNodeKind.One or RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic:
-                case RegexNodeKind.Notone or RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic:
-                case RegexNodeKind.Set or RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic:
-                case RegexNodeKind.Multi:
                 case RegexNodeKind.Backreference:
                     // Still meaningful
                     break;
@@ -1017,11 +1013,9 @@ namespace System.Text.RegularExpressions
                             }
 
                             prev.Kind = RegexNodeKind.Set;
-                            prev.Str = prevCharClass.ToStringClass(Options);
-                            if ((prev.Options & RegexOptions.IgnoreCase) != 0 &&
-                                RegexCharClass.MakeCaseSensitiveIfPossible(prev.Str, RegexParser.GetTargetCulture(prev.Options)) is string newSetString)
+                            prev.Str = prevCharClass.ToStringClass();
+                            if ((prev.Options & RegexOptions.IgnoreCase) != 0)
                             {
-                                prev.Str = newSetString;
                                 prev.Options &= ~RegexOptions.IgnoreCase;
                             }
                         }
@@ -1983,8 +1977,8 @@ namespace System.Text.RegularExpressions
                     break;
                 }
 
-                // If the two nodes don't agree on options in any way, don't try to optimize them.
-                // TODO: Remove this once https://github.com/dotnet/runtime/issues/61048 is implemented.
+                // If the current node's options don't match the subsequent node, then we cannot make it atomic.
+                // This applies to RightToLeft for lookbehinds, as well as patterns that enable/disable global flags in the middle of the pattern.
                 if (node.Options != subsequent.Options)
                 {
                     return false;
@@ -2230,9 +2224,9 @@ namespace System.Text.RegularExpressions
                 case RegexNodeKind.Empty:
                 case RegexNodeKind.Nothing:
                 case RegexNodeKind.UpdateBumpalong:
-                    // Nothing to match. In the future, we could potentially use Nothing to say that the min length
-                    // is infinite, but that would require a different structure, as that would only apply if the
-                    // Nothing match is required in all cases (rather than, say, as one branch of an alternation).
+                // Nothing to match. In the future, we could potentially use Nothing to say that the min length
+                // is infinite, but that would require a different structure, as that would only apply if the
+                // Nothing match is required in all cases (rather than, say, as one branch of an alternation).
                 case RegexNodeKind.Beginning:
                 case RegexNodeKind.Bol:
                 case RegexNodeKind.Boundary:
@@ -2245,7 +2239,7 @@ namespace System.Text.RegularExpressions
                 case RegexNodeKind.Start:
                 case RegexNodeKind.NegativeLookaround:
                 case RegexNodeKind.PositiveLookaround:
-                    // Zero-width
+                // Zero-width
                 case RegexNodeKind.Backreference:
                     // Requires matching data available only at run-time.  In the future, we could choose to find
                     // and follow the capture group this aligns with, while being careful not to end up in an
@@ -2415,16 +2409,9 @@ namespace System.Text.RegularExpressions
 
             // Iterate from the child index to the exclusive upper bound.
             int i = childIndex;
-            for ( ; i < exclusiveChildBound; i++)
+            for (; i < exclusiveChildBound; i++)
             {
                 RegexNode child = Child(i);
-                if ((child.Options & RegexOptions.IgnoreCase) != 0)
-                {
-                    // TODO https://github.com/dotnet/runtime/issues/61048: Remove this block once fixed.
-                    // We don't want any nodes that are still IgnoreCase, as they'd no longer be IgnoreCase if
-                    // they were applicable to this optimization.
-                    break;
-                }
 
                 if (child.Kind is RegexNodeKind.One)
                 {
index bd89292..52d9094 100644 (file)
@@ -29,6 +29,7 @@ namespace System.Text.RegularExpressions
         private readonly string _pattern;
         private int _currentPos;
         private readonly CultureInfo _culture;
+        private bool _hasIgnoreCaseBackreferenceNodes;
 
         private int _autocap;
         private int _capcount;
@@ -57,6 +58,7 @@ namespace System.Text.RegularExpressions
             _pattern = pattern;
             _options = options;
             _culture = culture;
+            _hasIgnoreCaseBackreferenceNodes = false;
             _caps = caps;
             _capsize = capsize;
             _capnames = capnames;
@@ -110,7 +112,7 @@ namespace System.Text.RegularExpressions
                 }
             }
 
-            return new RegexTree(root, captureCount, parser._capnamelist?.ToArray(), parser._capnames!, sparseMapping, options, culture);
+            return new RegexTree(root, captureCount, parser._capnamelist?.ToArray(), parser._capnames!, sparseMapping, options, parser._hasIgnoreCaseBackreferenceNodes ? culture : null);
         }
 
         /// <summary>
@@ -265,7 +267,9 @@ namespace System.Text.RegularExpressions
             char ch;
             bool isQuantifier = false;
 
-            StartGroup(new RegexNode(RegexNodeKind.Capture, _options, 0, -1));
+            // For the main Capture object, strip out the IgnoreCase option. The rest of the nodes will strip it out depending on the content
+            // of each node.
+            StartGroup(new RegexNode(RegexNodeKind.Capture, (_options & ~RegexOptions.IgnoreCase), 0, -1));
 
             while (CharsRight() > 0)
             {
@@ -334,10 +338,8 @@ namespace System.Text.RegularExpressions
 
                     case '[':
                         {
-                            string setString = ScanCharClass(UseOptionI(), scanOnly: false)!.ToStringClass(_options);
-                            _unit = UseOptionI() && RegexCharClass.MakeCaseSensitiveIfPossible(setString, _culture) is string newSetString ?
-                                new RegexNode(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, newSetString) :
-                                new RegexNode(RegexNodeKind.Set, _options, setString);
+                            string setString = ScanCharClass(UseOptionI(), scanOnly: false)!.ToStringClass();
+                            _unit = new RegexNode(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, setString);
                         }
                         break;
 
@@ -762,7 +764,7 @@ namespace System.Text.RegularExpressions
 
             if (!scanOnly && caseInsensitive)
             {
-                charClass!.AddLowercase(_culture);
+                charClass!.AddCaseEquivalences(_culture);
             }
 
             return charClass;
@@ -1169,32 +1171,32 @@ namespace System.Text.RegularExpressions
                 case 'w':
                     MoveRight();
                     return scanOnly ? null :
-                        new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.ECMAWordClass : RegexCharClass.WordClass);
+                        new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.ECMAWordClass : RegexCharClass.WordClass);
 
                 case 'W':
                     MoveRight();
                     return scanOnly ? null :
-                        new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.NotECMAWordClass : RegexCharClass.NotWordClass);
+                        new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.NotECMAWordClass : RegexCharClass.NotWordClass);
 
                 case 's':
                     MoveRight();
                     return scanOnly ? null :
-                        new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.ECMASpaceClass : RegexCharClass.SpaceClass);
+                        new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.ECMASpaceClass : RegexCharClass.SpaceClass);
 
                 case 'S':
                     MoveRight();
                     return scanOnly ? null :
-                        new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.NotECMASpaceClass : RegexCharClass.NotSpaceClass);
+                        new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.NotECMASpaceClass : RegexCharClass.NotSpaceClass);
 
                 case 'd':
                     MoveRight();
                     return scanOnly ? null :
-                        new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.ECMADigitClass : RegexCharClass.DigitClass);
+                        new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.ECMADigitClass : RegexCharClass.DigitClass);
 
                 case 'D':
                     MoveRight();
                     return scanOnly ? null :
-                        new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.NotECMADigitClass : RegexCharClass.NotDigitClass);
+                        new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.NotECMADigitClass : RegexCharClass.NotDigitClass);
 
                 case 'p':
                 case 'P':
@@ -1208,29 +1210,18 @@ namespace System.Text.RegularExpressions
                     cc.AddCategoryFromName(ParseProperty(), ch != 'p', UseOptionI(), _pattern, _currentPos);
                     if (UseOptionI())
                     {
-                        cc.AddLowercase(_culture);
+                        cc.AddCaseEquivalences(_culture);
                     }
 
-                    return new RegexNode(RegexNodeKind.Set, _options, cc.ToStringClass(_options));
+                    return new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), cc.ToStringClass());
 
                 default:
-                    return ScanBasicBackslash(scanOnly);
-            }
-
-            static RegexOptions RemoveIgnoreCaseIfNotEcma(RegexOptions options)
-            {
-                // This function is used for \w, \W, \d, \D, \s, and \S to remove IgnoreCase,
-                // since they already include the notion of casing in their definitions.
-                // However, for compatibility, if ECMAScript is specified, we avoid stripping
-                // out the IgnoreCase.  We should revisit this as part of https://github.com/dotnet/runtime/issues/61048,
-                // as it seems wrong that specifying ECMAScript (which implies non-Unicode) would
-                // then still involve lowercasing potentially Unicode character inputs to match
-                // against these sets.
-                if ((options & RegexOptions.ECMAScript) == 0)
-                {
-                    options &= ~RegexOptions.IgnoreCase;
-                }
-                return options;
+                    RegexNode? result = ScanBasicBackslash(scanOnly);
+                    if (result != null && result.Kind == RegexNodeKind.Backreference && (result.Options & RegexOptions.IgnoreCase) != 0)
+                    {
+                        _hasIgnoreCaseBackreferenceNodes = true;
+                    }
+                    return result;
             }
         }
 
index c9077b7..a913d0f 100644 (file)
@@ -40,7 +40,7 @@ namespace System.Text.RegularExpressions
         }
 
         /// <summary>Computes the leading substring in <paramref name="node"/>; may be empty.</summary>
-        public static string FindCaseSensitivePrefix(RegexNode node)
+        public static string FindPrefix(RegexNode node)
         {
             var vsb = new ValueStringBuilder(stackalloc char[64]);
             Process(node, ref vsb);
@@ -130,17 +130,17 @@ namespace System.Text.RegularExpressions
                         }
 
                     // One character
-                    case RegexNodeKind.One when (node.Options & RegexOptions.IgnoreCase) == 0:
+                    case RegexNodeKind.One:
                         vsb.Append(node.Ch);
                         return !rtl;
 
                     // Multiple characters
-                    case RegexNodeKind.Multi when (node.Options & RegexOptions.IgnoreCase) == 0:
+                    case RegexNodeKind.Multi:
                         vsb.Append(node.Str);
                         return !rtl;
 
                     // Loop of one character
-                    case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0 && (node.Options & RegexOptions.IgnoreCase) == 0:
+                    case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0:
                         const int SingleCharIterationLimit = 32; // arbitrary cut-off to avoid creating super long strings unnecessarily
                         int count = Math.Min(node.M, SingleCharIterationLimit);
                         vsb.Append(node.Ch, count);
@@ -192,18 +192,17 @@ namespace System.Text.RegularExpressions
 
         /// <summary>Finds sets at fixed-offsets from the beginning of the pattern/</summary>
         /// <param name="root">The RegexNode tree root.</param>
-        /// <param name="culture">The culture to use for any case conversions.</param>
         /// <param name="thorough">true to spend more time finding sets (e.g. through alternations); false to do a faster analysis that's potentially more incomplete.</param>
         /// <returns>The array of found sets, or null if there aren't any.</returns>
-        public static List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? FindFixedDistanceSets(RegexNode root, CultureInfo culture, bool thorough)
+        public static List<(char[]? Chars, string Set, int Distance)>? FindFixedDistanceSets(RegexNode root, bool thorough)
         {
             const int MaxLoopExpansion = 20; // arbitrary cut-off to avoid loops adding significant overhead to processing
             const int MaxFixedResults = 50; // arbitrary cut-off to avoid generating lots of sets unnecessarily
 
             // Find all fixed-distance sets.
-            var results = new List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>();
+            var results = new List<(char[]? Chars, string Set, int Distance)>();
             int distance = 0;
-            TryFindFixedSets(root, results, ref distance, culture, thorough);
+            TryFindFixedSets(root, results, ref distance, thorough);
 
             // Remove any sets that match everything; they're not helpful.  (This check exists primarily to weed
             // out use of . in Singleline mode.)
@@ -226,10 +225,10 @@ namespace System.Text.RegularExpressions
             // doesn't.
             if (results.Count == 0)
             {
-                (string CharClass, bool CaseInsensitive)? first = FindFirstCharClass(root, culture);
-                if (first is not null)
+                string? charClass = FindFirstCharClass(root);
+                if (charClass is not null)
                 {
-                    results.Add((null, first.Value.CharClass, 0, first.Value.CaseInsensitive));
+                    results.Add((null, charClass, 0));
                 }
 
                 if (results.Count == 0)
@@ -238,28 +237,17 @@ namespace System.Text.RegularExpressions
                 }
             }
 
-            // For every entry, see if we can mark any that are case-insensitive as actually being case-sensitive
-            // based on not participating in case conversion.  And then for ones that are case-sensitive, try to
-            // get the chars that make up the set, if there are few enough.
+            // For every entry, try to get the chars that make up the set, if there are few enough.
             Span<char> scratch = stackalloc char[5]; // max optimized by IndexOfAny today
             for (int i = 0; i < results.Count; i++)
             {
-                (char[]? Chars, string Set, int Distance, bool CaseInsensitive) result = results[i];
+                (char[]? Chars, string Set, int Distance) result = results[i];
                 if (!RegexCharClass.IsNegated(result.Set))
                 {
                     int count = RegexCharClass.GetSetChars(result.Set, scratch);
                     if (count != 0)
                     {
-                        if (result.CaseInsensitive && !RegexCharClass.ParticipatesInCaseConversion(scratch.Slice(0, count)))
-                        {
-                            result.CaseInsensitive = false;
-                        }
-
-                        if (!result.CaseInsensitive)
-                        {
-                            result.Chars = scratch.Slice(0, count).ToArray();
-                        }
-
+                        result.Chars = scratch.Slice(0, count).ToArray();
                         results[i] = result;
                     }
                 }
@@ -269,12 +257,6 @@ namespace System.Text.RegularExpressions
             // for the fastest and that have the best chance of matching as few false positives as possible.
             results.Sort((s1, s2) =>
             {
-                if (s1.CaseInsensitive != s2.CaseInsensitive)
-                {
-                    // If their case-sensitivities don't match, whichever is case-sensitive comes first / is considered lower.
-                    return s1.CaseInsensitive ? 1 : -1;
-                }
-
                 if (s1.Chars is not null && s2.Chars is not null)
                 {
                     // Then of the ones that are the same length, prefer those with less frequent values.  The frequency is
@@ -322,7 +304,7 @@ namespace System.Text.RegularExpressions
             // of the node.  If it returns false, the node isn't entirely fixed, in which case subsequent nodes
             // shouldn't be examined and distance should no longer be trusted.  However, regardless of whether it
             // returns true or false, it may have populated results, and all populated results are valid.
-            static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> results, ref int distance, CultureInfo culture, bool thorough)
+            static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, int Distance)> results, ref int distance, bool thorough)
             {
                 if (!StackHelper.TryEnsureSufficientExecutionStack())
                 {
@@ -334,27 +316,25 @@ namespace System.Text.RegularExpressions
                     return false;
                 }
 
-                bool caseInsensitive = (node.Options & RegexOptions.IgnoreCase) != 0;
-
                 switch (node.Kind)
                 {
                     case RegexNodeKind.One:
                         if (results.Count < MaxFixedResults)
                         {
-                            string setString = RegexCharClass.OneToStringClass(node.Ch, caseInsensitive ? culture : null, out bool resultIsCaseInsensitive);
-                            results.Add((null, setString, distance++, resultIsCaseInsensitive));
+                            string setString = RegexCharClass.OneToStringClass(node.Ch);
+                            results.Add((null, setString, distance++));
                             return true;
                         }
                         return false;
 
                     case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when node.M > 0:
                         {
-                            string setString = RegexCharClass.OneToStringClass(node.Ch, caseInsensitive ? culture : null, out bool resultIsCaseInsensitive);
+                            string setString = RegexCharClass.OneToStringClass(node.Ch);
                             int minIterations = Math.Min(node.M, MaxLoopExpansion);
                             int i = 0;
                             for (; i < minIterations && results.Count < MaxFixedResults; i++)
                             {
-                                results.Add((null, setString, distance++, resultIsCaseInsensitive));
+                                results.Add((null, setString, distance++));
                             }
                             return i == node.M && i == node.N;
                         }
@@ -365,8 +345,8 @@ namespace System.Text.RegularExpressions
                             int i = 0;
                             for (; i < s.Length && results.Count < MaxFixedResults; i++)
                             {
-                                string setString = RegexCharClass.OneToStringClass(s[i], caseInsensitive ? culture : null, out bool resultIsCaseInsensitive);
-                                results.Add((null, setString, distance++, resultIsCaseInsensitive));
+                                string setString = RegexCharClass.OneToStringClass(s[i]);
+                                results.Add((null, setString, distance++));
                             }
                             return i == s.Length;
                         }
@@ -374,7 +354,7 @@ namespace System.Text.RegularExpressions
                     case RegexNodeKind.Set:
                         if (results.Count < MaxFixedResults)
                         {
-                            results.Add((null, node.Str!, distance++, caseInsensitive));
+                            results.Add((null, node.Str!, distance++));
                             return true;
                         }
                         return false;
@@ -385,7 +365,7 @@ namespace System.Text.RegularExpressions
                             int i = 0;
                             for (; i < minIterations && results.Count < MaxFixedResults; i++)
                             {
-                                results.Add((null, node.Str!, distance++, caseInsensitive));
+                                results.Add((null, node.Str!, distance++));
                             }
                             return i == node.M && i == node.N;
                         }
@@ -422,7 +402,7 @@ namespace System.Text.RegularExpressions
                     case RegexNodeKind.Atomic:
                     case RegexNodeKind.Group:
                     case RegexNodeKind.Capture:
-                        return TryFindFixedSets(node.Child(0), results, ref distance, culture, thorough);
+                        return TryFindFixedSets(node.Child(0), results, ref distance, thorough);
 
                     case RegexNodeKind.Lazyloop or RegexNodeKind.Loop when node.M > 0:
                         // This effectively only iterates the loop once.  If deemed valuable,
@@ -431,7 +411,7 @@ namespace System.Text.RegularExpressions
                         // summed distance for all node.M iterations.  If node.M == node.N,
                         // this would then also allow continued evaluation of the rest of the
                         // expression after the loop.
-                        TryFindFixedSets(node.Child(0), results, ref distance, culture, thorough);
+                        TryFindFixedSets(node.Child(0), results, ref distance, thorough);
                         return false;
 
                     case RegexNodeKind.Concatenate:
@@ -439,7 +419,7 @@ namespace System.Text.RegularExpressions
                             int childCount = node.ChildCount();
                             for (int i = 0; i < childCount; i++)
                             {
-                                if (!TryFindFixedSets(node.Child(i), results, ref distance, culture, thorough))
+                                if (!TryFindFixedSets(node.Child(i), results, ref distance, thorough))
                                 {
                                     return false;
                                 }
@@ -452,14 +432,14 @@ namespace System.Text.RegularExpressions
                             int childCount = node.ChildCount();
                             bool allSameSize = true;
                             int? sameDistance = null;
-                            var combined = new Dictionary<int, (RegexCharClass Set, bool CaseInsensitive, int Count)>();
+                            var combined = new Dictionary<int, (RegexCharClass Set, int Count)>();
 
-                            var localResults = new List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>();
+                            var localResults = new List<(char[]? Chars, string Set, int Distance)>();
                             for (int i = 0; i < childCount; i++)
                             {
                                 localResults.Clear();
                                 int localDistance = 0;
-                                allSameSize &= TryFindFixedSets(node.Child(i), localResults, ref localDistance, culture, thorough);
+                                allSameSize &= TryFindFixedSets(node.Child(i), localResults, ref localDistance, thorough);
 
                                 if (localResults.Count == 0)
                                 {
@@ -478,12 +458,11 @@ namespace System.Text.RegularExpressions
                                     }
                                 }
 
-                                foreach ((char[]? Chars, string Set, int Distance, bool CaseInsensitive) fixedSet in localResults)
+                                foreach ((char[]? Chars, string Set, int Distance) fixedSet in localResults)
                                 {
-                                    if (combined.TryGetValue(fixedSet.Distance, out (RegexCharClass Set, bool CaseInsensitive, int Count) value))
+                                    if (combined.TryGetValue(fixedSet.Distance, out (RegexCharClass Set, int Count) value))
                                     {
-                                        if (fixedSet.CaseInsensitive == value.CaseInsensitive &&
-                                            value.Set.TryAddCharClass(RegexCharClass.Parse(fixedSet.Set)))
+                                        if (value.Set.TryAddCharClass(RegexCharClass.Parse(fixedSet.Set)))
                                         {
                                             value.Count++;
                                             combined[fixedSet.Distance] = value;
@@ -491,12 +470,12 @@ namespace System.Text.RegularExpressions
                                     }
                                     else
                                     {
-                                        combined[fixedSet.Distance] = (RegexCharClass.Parse(fixedSet.Set), fixedSet.CaseInsensitive, 1);
+                                        combined[fixedSet.Distance] = (RegexCharClass.Parse(fixedSet.Set), 1);
                                     }
                                 }
                             }
 
-                            foreach (KeyValuePair<int, (RegexCharClass Set, bool CaseInsensitive, int Count)> pair in combined)
+                            foreach (KeyValuePair<int, (RegexCharClass Set, int Count)> pair in combined)
                             {
                                 if (results.Count >= MaxFixedResults)
                                 {
@@ -506,7 +485,7 @@ namespace System.Text.RegularExpressions
 
                                 if (pair.Value.Count == childCount)
                                 {
-                                    results.Add((null, pair.Value.Set.ToStringClass(), pair.Key + distance, pair.Value.CaseInsensitive));
+                                    results.Add((null, pair.Value.Set.ToStringClass(), pair.Key + distance));
                                 }
                             }
 
@@ -533,7 +512,7 @@ namespace System.Text.RegularExpressions
         /// variable position, but this will find [ab] as it's instead looking for anything that under any
         /// circumstance could possibly start a match.
         /// </summary>
-        public static (string CharClass, bool CaseInsensitive)? FindFirstCharClass(RegexNode root, CultureInfo culture)
+        public static string? FindFirstCharClass(RegexNode root)
         {
             var s = new RegexPrefixAnalyzer(stackalloc int[StackBufferSize]);
             RegexFC? fc = s.RegexFCFromRegexTree(root);
@@ -544,12 +523,7 @@ namespace System.Text.RegularExpressions
                 return null;
             }
 
-            if (fc.CaseInsensitive)
-            {
-                fc.AddLowercase(culture);
-            }
-
-            return (fc.GetFirstChars(), fc.CaseInsensitive);
+            return fc.GetFirstChars();
         }
 
         /// <summary>
@@ -602,35 +576,31 @@ namespace System.Text.RegularExpressions
             }
 
             // If the subsequent node is a literal, we need to ensure it doesn't overlap with the prior set.
-            // For simplicity, we also want to ensure they're both case-sensitive.  If there's no overlap
-            // and they're both case-sensitive, we have a winner.
-            if (((firstChild.Options | nextChild.Options) & RegexOptions.IgnoreCase) == 0)
+            // If there's no overlap, we have a winner.
+            switch (nextChild.Kind)
             {
-                switch (nextChild.Kind)
-                {
-                    case RegexNodeKind.One when !RegexCharClass.CharInClass(nextChild.Ch, firstChild.Str!):
-                        return (firstChild, (nextChild.Ch, null, null));
+                case RegexNodeKind.One when !RegexCharClass.CharInClass(nextChild.Ch, firstChild.Str!):
+                    return (firstChild, (nextChild.Ch, null, null));
 
-                    case RegexNodeKind.Multi when !RegexCharClass.CharInClass(nextChild.Str![0], firstChild.Str!):
-                        return (firstChild, ('\0', nextChild.Str, null));
+                case RegexNodeKind.Multi when !RegexCharClass.CharInClass(nextChild.Str![0], firstChild.Str!):
+                    return (firstChild, ('\0', nextChild.Str, null));
 
-                    case RegexNodeKind.Set when !RegexCharClass.IsNegated(nextChild.Str!):
-                        Span<char> chars = stackalloc char[5]; // maximum number of chars optimized by IndexOfAny
-                        chars = chars.Slice(0, RegexCharClass.GetSetChars(nextChild.Str!, chars));
-                        if (!chars.IsEmpty)
+                case RegexNodeKind.Set when !RegexCharClass.IsNegated(nextChild.Str!):
+                    Span<char> chars = stackalloc char[5]; // maximum number of chars optimized by IndexOfAny
+                    chars = chars.Slice(0, RegexCharClass.GetSetChars(nextChild.Str!, chars));
+                    if (!chars.IsEmpty)
+                    {
+                        foreach (char c in chars)
                         {
-                            foreach (char c in chars)
+                            if (RegexCharClass.CharInClass(c, firstChild.Str!))
                             {
-                                if (RegexCharClass.CharInClass(c, firstChild.Str!))
-                                {
-                                    return null;
-                                }
+                                return null;
                             }
-
-                            return (firstChild, ('\0', null, chars.ToArray()));
                         }
-                        break;
-                }
+
+                        return (firstChild, ('\0', null, chars.ToArray()));
+                    }
+                    break;
             }
 
             // Otherwise, we couldn't find the pattern of an atomic set loop followed by a literal.
@@ -848,7 +818,6 @@ namespace System.Text.RegularExpressions
         /// </summary>
         private void CalculateFC(RegexNodeKind nodeType, RegexNode node, int CurIndex)
         {
-            bool ci = (node.Options & RegexOptions.IgnoreCase) != 0;
             bool rtl = (node.Options & RegexOptions.RightToLeft) != 0;
 
             switch (nodeType)
@@ -929,42 +898,42 @@ namespace System.Text.RegularExpressions
 
                 case RegexNodeKind.One:
                 case RegexNodeKind.Notone:
-                    PushFC(new RegexFC(node.Ch, nodeType == RegexNodeKind.Notone, false, ci));
+                    PushFC(new RegexFC(node.Ch, nodeType == RegexNodeKind.Notone, false));
                     break;
 
                 case RegexNodeKind.Oneloop:
                 case RegexNodeKind.Oneloopatomic:
                 case RegexNodeKind.Onelazy:
-                    PushFC(new RegexFC(node.Ch, false, node.M == 0, ci));
+                    PushFC(new RegexFC(node.Ch, false, node.M == 0));
                     break;
 
                 case RegexNodeKind.Notoneloop:
                 case RegexNodeKind.Notoneloopatomic:
                 case RegexNodeKind.Notonelazy:
-                    PushFC(new RegexFC(node.Ch, true, node.M == 0, ci));
+                    PushFC(new RegexFC(node.Ch, true, node.M == 0));
                     break;
 
                 case RegexNodeKind.Multi:
                     if (node.Str!.Length == 0)
                         PushFC(new RegexFC(true));
                     else if (!rtl)
-                        PushFC(new RegexFC(node.Str[0], false, false, ci));
+                        PushFC(new RegexFC(node.Str[0], false, false));
                     else
-                        PushFC(new RegexFC(node.Str[node.Str.Length - 1], false, false, ci));
+                        PushFC(new RegexFC(node.Str[node.Str.Length - 1], false, false));
                     break;
 
                 case RegexNodeKind.Set:
-                    PushFC(new RegexFC(node.Str!, false, ci));
+                    PushFC(new RegexFC(node.Str!, false));
                     break;
 
                 case RegexNodeKind.Setloop:
                 case RegexNodeKind.Setloopatomic:
                 case RegexNodeKind.Setlazy:
-                    PushFC(new RegexFC(node.Str!, node.M == 0, ci));
+                    PushFC(new RegexFC(node.Str!, node.M == 0));
                     break;
 
                 case RegexNodeKind.Backreference:
-                    PushFC(new RegexFC(RegexCharClass.AnyClass, true, false));
+                    PushFC(new RegexFC(RegexCharClass.AnyClass, true));
                     break;
 
                 case RegexNodeKind.Nothing:
@@ -1078,7 +1047,7 @@ namespace System.Text.RegularExpressions
             _nullable = nullable;
         }
 
-        public RegexFC(char ch, bool not, bool nullable, bool caseInsensitive)
+        public RegexFC(char ch, bool not, bool nullable)
         {
             _cc = new RegexCharClass();
 
@@ -1099,16 +1068,14 @@ namespace System.Text.RegularExpressions
                 _cc.AddRange(ch, ch);
             }
 
-            CaseInsensitive = caseInsensitive;
             _nullable = nullable;
         }
 
-        public RegexFC(string charClass, bool nullable, bool caseInsensitive)
+        public RegexFC(string charClass, bool nullable)
         {
             _cc = RegexCharClass.Parse(charClass);
 
             _nullable = nullable;
-            CaseInsensitive = caseInsensitive;
         }
 
         public bool AddFC(RegexFC fc, bool concatenate)
@@ -1132,19 +1099,10 @@ namespace System.Text.RegularExpressions
                     _nullable = true;
             }
 
-            CaseInsensitive |= fc.CaseInsensitive;
             _cc.AddCharClass(fc._cc);
             return true;
         }
 
-        public bool CaseInsensitive { get; private set; }
-
-        public void AddLowercase(CultureInfo culture)
-        {
-            Debug.Assert(CaseInsensitive);
-            _cc.AddLowercase(culture);
-        }
-
         public string GetFirstChars() => _cc.ToStringClass();
     }
 }
index 8e7ada1..4ee944e 100644 (file)
@@ -21,6 +21,8 @@ namespace System.Text.RegularExpressions
         public readonly RegexFindOptimizations FindOptimizations;
         /// <summary>The number of captures in the regex.</summary>
         public readonly int CaptureCount;
+        /// <summary>If the pattern has backreferences and uses IgnoreCase, we cache the Culture at creation time to use it at match time.</summary>
+        public readonly CultureInfo? Culture;
         /// <summary>A list of all the captures' names.</summary>
         /// <remarks>
         /// For numbered (implicitly or explicitly) captures, these are string representations of the numbers.  This may be null if all captures were numbered
@@ -38,7 +40,7 @@ namespace System.Text.RegularExpressions
         /// </remarks>
         public readonly Hashtable? CaptureNumberSparseMapping;
 
-        internal RegexTree(RegexNode root, int captureCount, string[]? captureNames, Hashtable? captureNameToNumberMapping, Hashtable? captureNumberSparseMapping, RegexOptions options, CultureInfo culture)
+        internal RegexTree(RegexNode root, int captureCount, string[]? captureNames, Hashtable? captureNameToNumberMapping, Hashtable? captureNumberSparseMapping, RegexOptions options, CultureInfo? culture)
         {
 #if DEBUG
             // Asserts to both demonstrate and validate the relationships between the various capture data structures.
@@ -69,12 +71,13 @@ namespace System.Text.RegularExpressions
 #endif
 
             Root = root;
+            Culture = culture;
             CaptureNumberSparseMapping = captureNumberSparseMapping;
             CaptureCount = captureCount;
             CaptureNameToNumberMapping = captureNameToNumberMapping;
             CaptureNames = captureNames;
             Options = options;
-            FindOptimizations = new RegexFindOptimizations(root, options, culture);
+            FindOptimizations = new RegexFindOptimizations(root, options);
         }
     }
 }
index 4dcbcbc..a3c372b 100644 (file)
@@ -21,7 +21,6 @@ namespace System.Text.RegularExpressions
         private const int IntStackSize = 32;
 
         private readonly RegexTree _tree;
-        private readonly CultureInfo _culture;
         private readonly Dictionary<string, int> _stringTable;
         private ValueListBuilder<int> _emitted;
         private ValueListBuilder<int> _intStack;
@@ -35,10 +34,9 @@ namespace System.Text.RegularExpressions
         }
 #endif
 
-        private RegexWriter(RegexTree tree, CultureInfo culture, Span<int> emittedSpan, Span<int> intStackSpan)
+        private RegexWriter(RegexTree tree, Span<int> emittedSpan, Span<int> intStackSpan)
         {
             _tree = tree;
-            _culture = culture;
             _emitted = new ValueListBuilder<int>(emittedSpan);
             _intStack = new ValueListBuilder<int>(intStackSpan);
             _stringTable = new Dictionary<string, int>();
@@ -58,9 +56,9 @@ namespace System.Text.RegularExpressions
         /// This is the only function that should be called from outside.
         /// It takes a <see cref="RegexTree"/> and creates a corresponding <see cref="RegexInterpreterCode"/>.
         /// </summary>
-        public static RegexInterpreterCode Write(RegexTree tree, CultureInfo culture)
+        public static RegexInterpreterCode Write(RegexTree tree)
         {
-            using var writer = new RegexWriter(tree, culture, stackalloc int[EmittedSize], stackalloc int[IntStackSize]);
+            using var writer = new RegexWriter(tree, stackalloc int[EmittedSize], stackalloc int[IntStackSize]);
             return writer.EmitCode();
         }
 
index 4245fec..108ef1b 100644 (file)
@@ -57,11 +57,7 @@ namespace System.Text.RegularExpressions.Symbolic
 
         public ulong Or(ulong predicate1, ulong predicate2) => predicate1 | predicate2;
 
-        public ulong CharConstraint(char c, bool caseInsensitive = false, string? culture = null)
-        {
-            Debug.Assert(!caseInsensitive);
-            return ((ulong)1) << _classifier.GetMintermID(c);
-        }
+        public ulong CharConstraint(char c) => ((ulong)1) << _classifier.GetMintermID(c);
 
         /// <summary>
         /// Assumes that set is a union of some minterms (or empty).
index db243a5..86e80fe 100644 (file)
@@ -49,12 +49,7 @@ namespace System.Text.RegularExpressions.Symbolic
 
         public BitVector Or(BitVector predicate1, BitVector predicate2) => BitVector.Or(predicate1, predicate2);
 
-        public BitVector CharConstraint(char c, bool caseInsensitive = false, string? culture = null)
-        {
-            Debug.Assert(!caseInsensitive);
-            int i = _classifier.GetMintermID(c);
-            return _mintermVectors[i];
-        }
+        public BitVector CharConstraint(char c) => _mintermVectors[_classifier.GetMintermID(c)];
 
         /// <summary>
         /// Assumes that set is a union of some minterms (or empty).
index 80e0932..d31345c 100644 (file)
@@ -16,7 +16,6 @@ namespace System.Text.RegularExpressions.Symbolic
     {
         /// <summary>BDDs for all ASCII characters for fast lookup.</summary>
         private readonly BDD[] _charPredTable = new BDD[128];
-        private readonly IgnoreCaseTransformer _ignoreCase;
         internal readonly BDD _nonAscii;
 
         /// <summary>Initialize the solver.</summary>
@@ -24,7 +23,6 @@ namespace System.Text.RegularExpressions.Symbolic
         private CharSetSolver()
         {
             _nonAscii = CreateCharSetFromRange('\x80', '\uFFFF');
-            _ignoreCase = new IgnoreCaseTransformer(this); // do this last in ctor, as IgnoreCaseTransform's ctor uses `this`
         }
 
         /// <summary>Singleton instance of <see cref="CharSetSolver"/>.</summary>
@@ -33,20 +31,13 @@ namespace System.Text.RegularExpressions.Symbolic
         /// <summary>
         /// Make a character predicate for the given character c.
         /// </summary>
-        public BDD CharConstraint(char c, bool ignoreCase = false, string? culture = null)
+        public BDD CharConstraint(char c)
         {
-            if (ignoreCase)
-            {
-                return _ignoreCase.Apply(c, culture);
-            }
-            else
-            {
-                // individual character BDDs are always fixed
-                BDD[] charPredTable = _charPredTable;
-                return c < charPredTable.Length ?
-                    charPredTable[c] ??= CreateBDDFromChar(c) :
-                    CreateBDDFromChar(c);
-            }
+            // individual character BDDs are always fixed
+            BDD[] charPredTable = _charPredTable;
+            return c < charPredTable.Length ?
+                charPredTable[c] ??= CreateBDDFromChar(c) :
+                CreateBDDFromChar(c);
         }
 
         private BDD CreateBDDFromChar(ushort c)
@@ -69,22 +60,15 @@ namespace System.Text.RegularExpressions.Symbolic
 
         /// <summary>
         /// Make a character set of all the characters in the interval from c to d.
-        /// If ignoreCase is true ignore cases for upper and lower case characters by including both versions.
         /// </summary>
-        public BDD RangeConstraint(char c, char d, bool ignoreCase = false, string? culture = null)
+        public BDD RangeConstraint(char c, char d)
         {
             if (c == d)
             {
-                return CharConstraint(c, ignoreCase, culture);
-            }
-
-            BDD res = CreateSetFromRange(c, d, 15);
-            if (ignoreCase)
-            {
-                res = _ignoreCase.Apply(res, culture);
+                return CharConstraint(c);
             }
 
-            return res;
+            return CreateSetFromRange(c, d, 15);
         }
 
 #if DEBUG
index 9235d6d..dd128d5 100644 (file)
@@ -10,13 +10,10 @@ namespace System.Text.RegularExpressions.Symbolic
     internal interface ICharAlgebra<T> : IBooleanAlgebra<T>
     {
         /// <summary>
-        /// Make a constraint describing a singleton set containing the character c, or
-        /// a set containing also the upper and lowercase versions of c if caseInsensitive is true.
+        /// Make a constraint describing a singleton set containing the character c.
         /// </summary>
-        /// <param name="caseInsensitive">if true include both the uppercase and the lowercase versions of the given character</param>
         /// <param name="c">the given character</param>
-        /// <param name="culture">given culture, if null then the current culture is assumed</param>
-        T CharConstraint(char c, bool caseInsensitive = false, string? culture = null);
+        T CharConstraint(char c);
 
         /// <summary>
         /// Make a term that encodes the given character set.
index a2571f1..574e1fa 100644 (file)
@@ -53,10 +53,10 @@ namespace System.Text.RegularExpressions.Symbolic
                 // Singletons and multis
 
                 case RegexNodeKind.One:
-                    return _builder.CreateSingleton(CharSetSolver.Instance.CharConstraint(node.Ch, (node.Options & RegexOptions.IgnoreCase) != 0, _culture.Name));
+                    return _builder.CreateSingleton(CharSetSolver.Instance.CharConstraint(node.Ch));
 
                 case RegexNodeKind.Notone:
-                    return _builder.CreateSingleton(CharSetSolver.Instance.Not(CharSetSolver.Instance.CharConstraint(node.Ch, (node.Options & RegexOptions.IgnoreCase) != 0, _culture.Name)));
+                    return _builder.CreateSingleton(CharSetSolver.Instance.Not(CharSetSolver.Instance.CharConstraint(node.Ch)));
 
                 case RegexNodeKind.Set:
                     return ConvertSet(node);
@@ -70,7 +70,7 @@ namespace System.Text.RegularExpressions.Symbolic
                         var nodes = new SymbolicRegexNode<BDD>[str.Length];
                         for (int i = 0; i < nodes.Length; i++)
                         {
-                            nodes[i] = _builder.CreateSingleton(CharSetSolver.Instance.CharConstraint(str[i], ignoreCase, _culture.Name));
+                            nodes[i] = _builder.CreateSingleton(CharSetSolver.Instance.CharConstraint(str[i]));
                         }
                         return _builder.CreateConcat(nodes, tryCreateFixedLengthMarker);
                     }
@@ -108,7 +108,7 @@ namespace System.Text.RegularExpressions.Symbolic
                     {
                         // Create a BDD that represents the character, then create a loop around it.
                         bool ignoreCase = (node.Options & RegexOptions.IgnoreCase) != 0;
-                        BDD bdd = CharSetSolver.Instance.CharConstraint(node.Ch, ignoreCase, _culture.Name);
+                        BDD bdd = CharSetSolver.Instance.CharConstraint(node.Ch);
                         if (node.IsNotoneFamily)
                         {
                             bdd = CharSetSolver.Instance.Not(bdd);
@@ -323,7 +323,7 @@ namespace System.Text.RegularExpressions.Symbolic
                 {
                     foreach ((char first, char last) in ranges)
                     {
-                        BDD bdd = CharSetSolver.Instance.RangeConstraint(first, last, ignoreCase, _culture.Name);
+                        BDD bdd = CharSetSolver.Instance.RangeConstraint(first, last);
                         if (negate)
                         {
                             bdd = CharSetSolver.Instance.Not(bdd);
diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/GeneratorHelper.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/GeneratorHelper.cs
deleted file mode 100644 (file)
index 5900e44..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Diagnostics.CodeAnalysis;
-using System.IO;
-
-namespace System.Text.RegularExpressions.Symbolic.Unicode
-{
-#if DEBUG
-    [ExcludeFromCodeCoverage]
-    internal static class GeneratorHelper
-    {
-        public static void WriteInt64ArrayInitSyntax(StreamWriter sw, long[] values)
-        {
-            sw.Write("new long[] {");
-            for (int i = 0; i < values.Length; i++)
-            {
-                sw.Write($" 0x{values[i]:X}, ");
-            }
-            sw.Write("}");
-        }
-
-        public static void WriteByteArrayInitSyntax(StreamWriter sw, byte[] values)
-        {
-            sw.Write("new byte[] {");
-            for (int i = 0; i < values.Length; i++)
-            {
-                sw.Write($" 0x{values[i]:X}, ");
-            }
-            sw.Write("}");
-        }
-    }
-#endif
-}
diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelation.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelation.cs
deleted file mode 100644 (file)
index 561c515..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-// This is a programmatically generated file from Regex.GenerateUnicodeTables.
-// It provides serialized BDD Unicode category definitions for System.Environment.Version = 7.0.0
-
-namespace System.Text.RegularExpressions.Symbolic.Unicode
-{
-    internal static class IgnoreCaseRelation
-    {
-        /// <summary>Serialized BDD for mapping characters to their case-ignoring equivalence classes in the default (en-US) culture.</summary>
-        public static readonly byte[] IgnoreCaseEnUsSerializedBDD = new byte[] { 0x5, 0x5, 0x0, 0x0, 0x0, 0x0, 0xE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x18, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x0, 0x21, 0x0, 0x18, 0x0, 0x0, 0x41, 0x0, 0x8, 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x28, 0x0, 0x0, 0x2, 0x0, 0x30, 0x0, 0x0, 0xE2, 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, 0xA2, 0x0, 0x0, 0x0, 0x0, 0xC2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x38, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x48, 0x0, 0x0, 0x22, 0x1, 0x0, 0x0, 0x0, 0x42, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x50, 0x0, 0x0, 0xC2, 0x0, 0x38, 0x0, 0x0, 0x2, 0x0, 0x58, 0x0, 0x0, 0xC2, 0x0, 0x48, 0x0, 0x0, 0x82, 0x1, 0x0, 0x0, 0x0, 0xA3, 0x1, 0x0, 0x0, 0x0, 0xC3, 0x1, 0x0, 0x0, 0x0, 0xE3, 0x1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x80, 0x0, 0x0, 0x3, 0x0, 0x88, 0x0, 0x0, 0x3, 0x0, 0x90, 0x0, 0x0, 0x3, 0x0, 0x98, 0x0, 0x0, 0x3, 0x0, 0xA0, 0x0, 0x0, 0x3, 0x0, 0x68, 0x0, 0x0, 0x3, 0x0, 0x70, 0x0, 0x0, 0x3, 0x0, 0x78, 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x0, 0x23, 0x2, 0x0, 0x0, 0x0, 0x43, 0x2, 0x0, 0x0, 0x0, 0x63, 0x2, 0x0, 0x0, 0x0, 0x83, 0x2, 0x0, 0x0, 0x0, 0x3, 0x0, 0xA8, 0x0, 0x0, 0xC3, 0x2, 0x0, 0x0, 0x0, 0xE3, 0x1, 0x80, 0x0, 0x0, 0x3, 0x0, 0xB8, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x23, 0x3, 0x0, 0x0, 0x0, 0xE3, 0x2, 0x0, 0x0, 0x0, 0x43, 0x3, 0x0, 0x0, 0x0, 0x3, 0x0, 0xC0, 0x0, 0x0, 0x3, 0x0, 0xC8, 0x0, 0x0, 0x3, 0x0, 0xD0, 0x0, 0x0, 0x63, 0x3, 0x0, 0x0, 0x0, 0xA3, 0x2, 0x0, 0x0, 0x0, 0x3, 0x0, 0xD8, 0x0, 0x0, 0x63, 0x2, 0xA0, 0x0, 0x0, 0x63, 0x2, 0x90, 0x0, 0x0, 0x3, 0x2, 0x78, 0x0, 0x0, 0x3, 0x0, 0xB0, 0x0, 0x0, 0xC3, 0x1, 0x68, 0x0, 0x0, 0x3, 0x0, 0xE0, 0x0, 0x0, 0xA3, 0x3, 0x0, 0x0, 0x0, 0x43, 0x3, 0x80, 0x0, 0x0, 0x3, 0x0, 0xF0, 0x0, 0x0, 0xE4, 0x3, 0x0, 0x0, 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x24, 0x4, 0x0, 0x0, 0x0, 0x44, 0x4, 0x0, 0x0, 0x0, 0x64, 0x4, 0x0, 0x0, 0x0, 0x84, 0x4, 0x0, 0x0, 0x0, 0xA4, 0x4, 0x0, 0x0, 0x0, 0xC4, 0x4, 0x0, 0x0, 0x0, 0xE4, 0x4, 0x0, 0x0, 0x0, 0x4, 0x5, 0x0, 0x0, 0x0, 0x24, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x50, 0x1, 0x0, 0x4, 0x0, 0x58, 0x1, 0x0, 0x4, 0x0, 0x60, 0x1, 0x0, 0x4, 0x0, 0x68, 0x1, 0x0, 0x4, 0x0, 0x70, 0x1, 0x0, 0x4, 0x0, 0xF8, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0, 0x8, 0x1, 0x0, 0x4, 0x0, 0x10, 0x1, 0x0, 0x4, 0x0, 0x18, 0x1, 0x0, 0x4, 0x0, 0x20, 0x1, 0x0, 0x4, 0x0, 0x28, 0x1, 0x0, 0x4, 0x0, 0x30, 0x1, 0x0, 0x4, 0x0, 0x38, 0x1, 0x0, 0x4, 0x0, 0x40, 0x1, 0x0, 0x44, 0x5, 0x0, 0x0, 0x0, 0x64, 0x5, 0x0, 0x0, 0x0, 0x84, 0x5, 0x0, 0x0, 0x0, 0xA4, 0x5, 0x0, 0x0, 0x0, 0xC4, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x48, 0x1, 0x0, 0xE4, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x80, 0x1, 0x0, 0x4, 0x0, 0x88, 0x1, 0x0, 0x4, 0x0, 0x90, 0x1, 0x0, 0x64, 0x6, 0x0, 0x0, 0x0, 0x84, 0x6, 0x0, 0x0, 0x0, 0xA4, 0x6, 0x0, 0x0, 0x0, 0xC4, 0x6, 0x0, 0x0, 0x0, 0xE4, 0x6, 0x0, 0x0, 0x0, 0x4, 0x7, 0x0, 0x0, 0x0, 0x4, 0x0, 0xB0, 0x1, 0x0, 0x4, 0x0, 0xB8, 0x1, 0x0, 0x4, 0x0, 0xC0, 0x1, 0x0, 0x4, 0x0, 0xC8, 0x1, 0x0, 0x44, 0x6, 0x0, 0x0, 0x0, 0x24, 0x7, 0x0, 0x0, 0x0, 0x4, 0x0, 0xD0, 0x1, 0x0, 0x44, 0x7, 0x0, 0x0, 0x0, 0x4, 0x6, 0x0, 0x0, 0x0, 0x4, 0x0, 0x98, 0x1, 0x0, 0x4, 0x0, 0xA0, 0x1, 0x0, 0x4, 0x0, 0xA8, 0x1, 0x0, 0x4, 0x0, 0xD8, 0x1, 0x0, 0x44, 0x5, 0x20, 0x1, 0x0, 0x64, 0x5, 0x28, 0x1, 0x0, 0x84, 0x5, 0x30, 0x1, 0x0, 0xA4, 0x5, 0x38, 0x1, 0x0, 0xC4, 0x5, 0x40, 0x1, 0x0, 0xE4, 0x3, 0x48, 0x1, 0x0, 0x4, 0x0, 0xE0, 0x1, 0x0, 0xA4, 0x7, 0x0, 0x0, 0x0, 0x4, 0x0, 0xF0, 0x1, 0x0, 0x4, 0x0, 0x70, 0x0, 0x0, 0x4, 0x0, 0x78, 0x0, 0x0, 0xC4, 0x1, 0x0, 0x0, 0x0, 0xE4, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0xE8, 0x1, 0x0, 0x4, 0x0, 0x80, 0x0, 0x0, 0x4, 0x0, 0x88, 0x0, 0x0, 0x4, 0x0, 0x90, 0x0, 0x0, 0x4, 0x0, 0x98, 0x0, 0x0, 0x4, 0x0, 0xA0, 0x0, 0x0, 0x4, 0x0, 0x68, 0x0, 0x0, 0x4, 0x2, 0x0, 0x0, 0x0, 0x24, 0x2, 0x0, 0x0, 0x0, 0x44, 0x2, 0x0, 0x0, 0x0, 0x64, 0x2, 0x0, 0x0, 0x0, 0x84, 0x2, 0x0, 0x0, 0x0, 0xA4, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0xF8, 0x1, 0x0, 0x4, 0x0, 0x78, 0x1, 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, 0x24, 0x8, 0x0, 0x0, 0x0, 0x24, 0x6, 0x0, 0x0, 0x0, 0x44, 0x4, 0x50, 0x1, 0x0, 0x44, 0x8, 0x0, 0x0, 0x0, 0x84, 0x7, 0x0, 0x0, 0x0, 0x4, 0x8, 0x0, 0x0, 0x0, 0x24, 0x5, 0x50, 0x1, 0x0, 0x4, 0x0, 0x18, 0x2, 0x0, 0x4, 0x0, 0x20, 0x2, 0x0, 0x4, 0x0, 0x28, 0x2, 0x0, 0x64, 0x7, 0x0, 0x0, 0x0, 0x5, 0x0, 0x30, 0x2, 0x0, 0xC5, 0x8, 0x0, 0x0, 0x0, 0x5, 0x0, 0x38, 0x2, 0x0, 0xE5, 0x8, 0x0, 0x0, 0x0, 0x5, 0x0, 0x40, 0x2, 0x0, 0x5, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x48, 0x2, 0x0, 0x25, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x50, 0x2, 0x0, 0x45, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x58, 0x2, 0x0, 0x65, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x60, 0x2, 0x0, 0x85, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x68, 0x2, 0x0, 0xA5, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x70, 0x2, 0x0, 0xC5, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x78, 0x2, 0x0, 0xE5, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x80, 0x2, 0x0, 0x5, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0x88, 0x2, 0x0, 0x25, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0x90, 0x2, 0x0, 0x45, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0x98, 0x2, 0x0, 0x65, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xA0, 0x2, 0x0, 0x85, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xA8, 0x2, 0x0, 0xA5, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xB0, 0x2, 0x0, 0xC5, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xB8, 0x2, 0x0, 0xE5, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xC0, 0x2, 0x0, 0x5, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xC8, 0x2, 0x0, 0x25, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xD0, 0x2, 0x0, 0x45, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xD8, 0x2, 0x0, 0x65, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xE0, 0x2, 0x0, 0x85, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xE8, 0x2, 0x0, 0xA5, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xF0, 0x2, 0x0, 0xC5, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xF8, 0x2, 0x0, 0xE5, 0xB, 0x0, 0x0, 0x0, 0x5, 0xC, 0x0, 0x0, 0x0, 0x25, 0xC, 0x0, 0x0, 0x0, 0x45, 0xC, 0x0, 0x0, 0x0, 0x65, 0xC, 0x0, 0x0, 0x0, 0x85, 0xC, 0x0, 0x0, 0x0, 0xA5, 0xC, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, 0x0, 0x5, 0x0, 0x8, 0x3, 0x0, 0x5, 0x0, 0x10, 0x3, 0x0, 0x5, 0x0, 0x18, 0x3, 0x0, 0x5, 0x0, 0x20, 0x3, 0x0, 0x5, 0x0, 0x28, 0x3, 0x0, 0xC5, 0xC, 0x0, 0x0, 0x0, 0x5, 0x0, 0x38, 0x3, 0x0, 0x5, 0x0, 0x40, 0x3, 0x0, 0x5, 0x0, 0x48, 0x3, 0x0, 0x45, 0xD, 0x0, 0x0, 0x0, 0x65, 0xD, 0x0, 0x0, 0x0, 0x85, 0xD, 0x0, 0x0, 0x0, 0xA5, 0xD, 0x0, 0x0, 0x0, 0xC5, 0xD, 0x0, 0x0, 0x0, 0xE5, 0xD, 0x0, 0x0, 0x0, 0x5, 0xE, 0x0, 0x0, 0x0, 0x25, 0xE, 0x0, 0x0, 0x0, 0x45, 0xE, 0x0, 0x0, 0x0, 0x25, 0xD, 0x0, 0x0, 0x0, 0x65, 0xE, 0x0, 0x0, 0x0, 0x5, 0x0, 0x50, 0x3, 0x0, 0x5, 0x0, 0x58, 0x3, 0x0, 0x5, 0x0, 0x60, 0x3, 0x0, 0x5, 0x0, 0x68, 0x3, 0x0, 0x5, 0x0, 0x70, 0x3, 0x0, 0x5, 0x0, 0xA0, 0x3, 0x0, 0x5, 0x0, 0xA8, 0x3, 0x0, 0x5, 0x0, 0xB0, 0x3, 0x0, 0x5, 0x0, 0x88, 0x3, 0x0, 0x5, 0x0, 0x90, 0x3, 0x0, 0x5, 0x0, 0x98, 0x3, 0x0, 0xE5, 0xE, 0x0, 0x0, 0x0, 0x5, 0xF, 0x0, 0x0, 0x0, 0x25, 0xF, 0x0, 0x0, 0x0, 0x45, 0xF, 0x0, 0x0, 0x0, 0x65, 0xF, 0x0, 0x0, 0x0, 0x5, 0x0, 0x78, 0x3, 0x0, 0x5, 0x0, 0xC8, 0x3, 0x0, 0x5, 0x0, 0xD0, 0x3, 0x0, 0x5, 0x0, 0xD8, 0x3, 0x0, 0x5, 0x0, 0x80, 0x3, 0x0, 0x85, 0xE, 0x0, 0x0, 0x0, 0x85, 0xF, 0x0, 0x0, 0x0, 0xC5, 0xE, 0x0, 0x0, 0x0, 0xA5, 0xE, 0x0, 0x0, 0x0, 0xE5, 0xC, 0x0, 0x0, 0x0, 0x5, 0xD, 0x0, 0x0, 0x0, 0x5, 0xC, 0x88, 0x2, 0x0, 0x25, 0xC, 0x90, 0x2, 0x0, 0x45, 0xC, 0x98, 0x2, 0x0, 0x65, 0xC, 0xA0, 0x2, 0x0, 0x85, 0xC, 0xA8, 0x2, 0x0, 0xC5, 0x8, 0xB0, 0x2, 0x0, 0xE5, 0x8, 0xB8, 0x2, 0x0, 0x5, 0x9, 0xC0, 0x2, 0x0, 0x25, 0x9, 0xC8, 0x2, 0x0, 0x45, 0x9, 0xD0, 0x2, 0x0, 0x65, 0x9, 0xD8, 0x2, 0x0, 0x85, 0x9, 0xE0, 0x2, 0x0, 0xA5, 0x9, 0xE8, 0x2, 0x0, 0xC5, 0x9, 0xF0, 0x2, 0x0, 0xE5, 0x9, 0xF8, 0x2, 0x0, 0x5, 0xA, 0x28, 0x3, 0x0, 0xE5, 0xA, 0x88, 0x2, 0x0, 0x5, 0xB, 0x90, 0x2, 0x0, 0x25, 0xB, 0x98, 0x2, 0x0, 0x45, 0xB, 0xA0, 0x2, 0x0, 0x65, 0xB, 0xA8, 0x2, 0x0, 0x85, 0xB, 0xB0, 0x2, 0x0, 0xA5, 0xB, 0xB8, 0x2, 0x0, 0xC5, 0xB, 0xC0, 0x2, 0x0, 0xE5, 0xB, 0xC8, 0x2, 0x0, 0xA5, 0xC, 0xD0, 0x2, 0x0, 0x5, 0x0, 0xE8, 0x3, 0x0, 0x5, 0x0, 0xF0, 0x3, 0x0, 0x5, 0x0, 0xF8, 0x3, 0x0, 0x5, 0x0, 0x0, 0x4, 0x0, 0x5, 0x0, 0x8, 0x4, 0x0, 0x5, 0x0, 0x10, 0x4, 0x0, 0x5, 0x0, 0x18, 0x4, 0x0, 0x45, 0x5, 0x0, 0x0, 0x0, 0x65, 0x5, 0x0, 0x0, 0x0, 0x85, 0x5, 0x0, 0x0, 0x0, 0xA5, 0x5, 0x0, 0x0, 0x0, 0xC5, 0x5, 0x0, 0x0, 0x0, 0xE5, 0x3, 0x0, 0x0, 0x0, 0x5, 0x4, 0x0, 0x0, 0x0, 0x25, 0x4, 0x0, 0x0, 0x0, 0x45, 0x4, 0x0, 0x0, 0x0, 0x65, 0x4, 0x0, 0x0, 0x0, 0x85, 0x4, 0x0, 0x0, 0x0, 0xA5, 0x4, 0x0, 0x0, 0x0, 0xC5, 0x4, 0x0, 0x0, 0x0, 0xE5, 0x4, 0x0, 0x0, 0x0, 0x5, 0x5, 0x0, 0x0, 0x0, 0x25, 0x5, 0x0, 0x0, 0x0, 0x85, 0x10, 0x0, 0x0, 0x0, 0xA5, 0x10, 0x0, 0x0, 0x0, 0xC5, 0x10, 0x0, 0x0, 0x0, 0xE5, 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x40, 0x4, 0x0, 0x5, 0x0, 0x48, 0x4, 0x0, 0x5, 0x0, 0x50, 0x4, 0x0, 0x5, 0x11, 0x0, 0x0, 0x0, 0x25, 0x11, 0x0, 0x0, 0x0, 0x65, 0x11, 0x0, 0x0, 0x0, 0x85, 0x11, 0x0, 0x0, 0x0, 0xA5, 0x11, 0x0, 0x0, 0x0, 0xC5, 0x11, 0x0, 0x0, 0x0, 0xE5, 0x11, 0x0, 0x0, 0x0, 0x5, 0x12, 0x0, 0x0, 0x0, 0x5, 0x0, 0x88, 0x4, 0x0, 0x5, 0x0, 0x90, 0x4, 0x0, 0x5, 0x0, 0x98, 0x4, 0x0, 0x5, 0x0, 0xA0, 0x4, 0x0, 0x5, 0x0, 0xA8, 0x4, 0x0, 0x5, 0x0, 0xB0, 0x4, 0x0, 0x5, 0x0, 0x58, 0x4, 0x0, 0x5, 0x0, 0x60, 0x4, 0x0, 0x5, 0x0, 0x68, 0x4, 0x0, 0x5, 0x0, 0x70, 0x4, 0x0, 0x5, 0x0, 0x78, 0x4, 0x0, 0x5, 0x0, 0x80, 0x4, 0x0, 0x5, 0x0, 0x30, 0x4, 0x0, 0x5, 0x0, 0x38, 0x4, 0x0, 0x25, 0x12, 0x0, 0x0, 0x0, 0x45, 0x12, 0x0, 0x0, 0x0, 0x65, 0x12, 0x0, 0x0, 0x0, 0x85, 0x12, 0x0, 0x0, 0x0, 0xA5, 0x12, 0x0, 0x0, 0x0, 0xC5, 0x12, 0x0, 0x0, 0x0, 0x5, 0x0, 0xB8, 0x4, 0x0, 0x5, 0x0, 0xE0, 0x3, 0x0, 0x5, 0x0, 0xC0, 0x4, 0x0, 0x5, 0x0, 0xC8, 0x4, 0x0, 0x45, 0x13, 0x0, 0x0, 0x0, 0x65, 0x13, 0x0, 0x0, 0x0, 0x5, 0x0, 0xE0, 0x4, 0x0, 0x25, 0xA, 0xB0, 0x2, 0x0, 0x45, 0xA, 0xB8, 0x2, 0x0, 0x65, 0xA, 0xC0, 0x2, 0x0, 0x85, 0xA, 0xD0, 0x2, 0x0, 0xA5, 0x13, 0x0, 0x0, 0x0, 0x5, 0x0, 0xB8, 0x3, 0x0, 0x5, 0x0, 0xC0, 0x3, 0x0, 0x5, 0x0, 0xD8, 0x4, 0x0, 0x5, 0x0, 0x30, 0x3, 0x0, 0x5, 0x0, 0xF0, 0x4, 0x0, 0x5, 0x0, 0xF8, 0x4, 0x0, 0x5, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x8, 0x5, 0x0, 0x5, 0x0, 0x10, 0x5, 0x0, 0x5, 0x0, 0x18, 0x5, 0x0, 0xC5, 0x13, 0x0, 0x0, 0x0, 0x5, 0x14, 0x0, 0x0, 0x0, 0x85, 0x14, 0x0, 0x0, 0x0, 0xA6, 0x14, 0x30, 0x5, 0x0, 0xE6, 0x14, 0x40, 0x5, 0x0, 0x26, 0x15, 0x50, 0x5, 0x0, 0x66, 0x15, 0x60, 0x5, 0x0, 0xA6, 0x15, 0x70, 0x5, 0x0, 0xE6, 0x15, 0x80, 0x5, 0x0, 0x26, 0x16, 0x90, 0x5, 0x0, 0x66, 0x16, 0xA0, 0x5, 0x0, 0xA6, 0x16, 0xB0, 0x5, 0x0, 0xE6, 0x16, 0xC0, 0x5, 0x0, 0x26, 0x17, 0xD0, 0x5, 0x0, 0x66, 0x17, 0xE0, 0x5, 0x0, 0xA6, 0x17, 0xF0, 0x5, 0x0, 0xE6, 0x17, 0x0, 0x6, 0x0, 0x26, 0x18, 0x10, 0x6, 0x0, 0x66, 0x18, 0x20, 0x6, 0x0, 0xA6, 0x18, 0x30, 0x6, 0x0, 0xE6, 0x18, 0x40, 0x6, 0x0, 0x26, 0x19, 0x50, 0x6, 0x0, 0x66, 0x19, 0x60, 0x6, 0x0, 0xA6, 0x19, 0x70, 0x6, 0x0, 0xE6, 0x19, 0x80, 0x6, 0x0, 0x26, 0x1A, 0x90, 0x6, 0x0, 0x66, 0x1A, 0xA0, 0x6, 0x0, 0xA6, 0x1A, 0xB0, 0x6, 0x0, 0xE6, 0x1A, 0xC0, 0x6, 0x0, 0x6, 0x0, 0xC8, 0x6, 0x0, 0x86, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0xD0, 0x6, 0x0, 0xC6, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0xD8, 0x6, 0x0, 0x6, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0xE0, 0x6, 0x0, 0x46, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0xE8, 0x6, 0x0, 0x86, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x30, 0x5, 0x0, 0xC6, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x40, 0x5, 0x0, 0x6, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x50, 0x5, 0x0, 0x46, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x60, 0x5, 0x0, 0x86, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x70, 0x5, 0x0, 0xC6, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x80, 0x5, 0x0, 0x6, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x90, 0x5, 0x0, 0x46, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xA0, 0x5, 0x0, 0x86, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xB0, 0x5, 0x0, 0xC6, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xC0, 0x5, 0x0, 0x6, 0x1B, 0x0, 0x0, 0x0, 0x6, 0x0, 0xD0, 0x5, 0x0, 0xC6, 0x1B, 0x0, 0x0, 0x0, 0x6, 0x0, 0xE0, 0x5, 0x0, 0xE6, 0x1B, 0x0, 0x0, 0x0, 0x6, 0x0, 0xF0, 0x5, 0x0, 0x6, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x6, 0x0, 0x26, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x6, 0x0, 0x46, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x20, 0x6, 0x0, 0x66, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x30, 0x6, 0x0, 0xA6, 0x14, 0x0, 0x0, 0x0, 0x6, 0x0, 0x40, 0x6, 0x0, 0xE6, 0x14, 0x0, 0x0, 0x0, 0x6, 0x0, 0x50, 0x6, 0x0, 0x26, 0x15, 0x0, 0x0, 0x0, 0x6, 0x0, 0x60, 0x6, 0x0, 0x66, 0x15, 0x0, 0x0, 0x0, 0x6, 0x0, 0x70, 0x6, 0x0, 0xA6, 0x15, 0x0, 0x0, 0x0, 0x6, 0x0, 0x80, 0x6, 0x0, 0xE6, 0x15, 0x0, 0x0, 0x0, 0x6, 0x0, 0x90, 0x6, 0x0, 0x26, 0x16, 0x0, 0x0, 0x0, 0x6, 0x0, 0xA0, 0x6, 0x0, 0x66, 0x16, 0x0, 0x0, 0x0, 0x6, 0x0, 0xB0, 0x6, 0x0, 0xA6, 0x16, 0x0, 0x0, 0x0, 0x6, 0x0, 0xC0, 0x6, 0x0, 0xE6, 0x16, 0x0, 0x0, 0x0, 0x6, 0x0, 0xF0, 0x6, 0x0, 0x26, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0xF8, 0x6, 0x0, 0x66, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x7, 0x0, 0xA6, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0x8, 0x7, 0x0, 0xE6, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x7, 0x0, 0x26, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x18, 0x7, 0x0, 0x66, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x28, 0x5, 0x0, 0xA6, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x38, 0x5, 0x0, 0xE6, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x48, 0x5, 0x0, 0x26, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x58, 0x5, 0x0, 0x66, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x68, 0x5, 0x0, 0xA6, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x78, 0x5, 0x0, 0xE6, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x88, 0x5, 0x0, 0x26, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x98, 0x5, 0x0, 0x66, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xA8, 0x5, 0x0, 0xA6, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xB8, 0x5, 0x0, 0xE6, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xC8, 0x5, 0x0, 0x86, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0xD8, 0x5, 0x0, 0x6, 0x0, 0xE8, 0x5, 0x0, 0x6, 0x0, 0xF8, 0x5, 0x0, 0x6, 0x0, 0x8, 0x6, 0x0, 0x6, 0x0, 0x18, 0x6, 0x0, 0x6, 0x0, 0x28, 0x6, 0x0, 0x6, 0x0, 0x38, 0x6, 0x0, 0x6, 0x0, 0x48, 0x6, 0x0, 0x6, 0x0, 0x58, 0x6, 0x0, 0x6, 0x0, 0x68, 0x6, 0x0, 0x6, 0x0, 0x78, 0x6, 0x0, 0x6, 0x0, 0x88, 0x6, 0x0, 0x6, 0x0, 0x98, 0x6, 0x0, 0x6, 0x0, 0xA8, 0x6, 0x0, 0x6, 0x0, 0xB8, 0x6, 0x0, 0x6, 0x0, 0x20, 0x7, 0x0, 0x26, 0x1B, 0x0, 0x0, 0x0, 0x46, 0x1B, 0x0, 0x0, 0x0, 0x66, 0x1B, 0x0, 0x0, 0x0, 0x86, 0x1B, 0x0, 0x0, 0x0, 0xA6, 0x1B, 0x0, 0x0, 0x0, 0xC6, 0x14, 0x0, 0x0, 0x0, 0x6, 0x15, 0x0, 0x0, 0x0, 0x46, 0x15, 0x0, 0x0, 0x0, 0x86, 0x15, 0x0, 0x0, 0x0, 0xC6, 0x15, 0x0, 0x0, 0x0, 0x6, 0x16, 0x0, 0x0, 0x0, 0x46, 0x16, 0x0, 0x0, 0x0, 0x86, 0x16, 0x0, 0x0, 0x0, 0xC6, 0x16, 0x0, 0x0, 0x0, 0x6, 0x17, 0x0, 0x0, 0x0, 0x46, 0x17, 0x0, 0x0, 0x0, 0xA6, 0x1C, 0x0, 0x0, 0x0, 0xC6, 0x1C, 0x0, 0x0, 0x0, 0xE6, 0x1C, 0x0, 0x0, 0x0, 0x26, 0x1A, 0x88, 0x5, 0x0, 0x6, 0x1D, 0x0, 0x0, 0x0, 0x6, 0x0, 0x48, 0x7, 0x0, 0x6, 0x0, 0x50, 0x7, 0x0, 0x6, 0x0, 0x58, 0x7, 0x0, 0x6, 0x0, 0x60, 0x7, 0x0, 0x6, 0x0, 0x68, 0x7, 0x0, 0x6, 0x0, 0x70, 0x7, 0x0, 0x6, 0x0, 0x78, 0x7, 0x0, 0x6, 0x0, 0x80, 0x7, 0x0, 0x6, 0x0, 0x88, 0x7, 0x0, 0x6, 0x0, 0x90, 0x7, 0x0, 0x6, 0x0, 0x98, 0x7, 0x0, 0x6, 0x0, 0xA0, 0x7, 0x0, 0x6, 0x0, 0xA8, 0x7, 0x0, 0x6, 0x0, 0xB0, 0x7, 0x0, 0x6, 0x0, 0xB8, 0x7, 0x0, 0x6, 0x0, 0xC0, 0x7, 0x0, 0x6, 0x0, 0xC8, 0x7, 0x0, 0x6, 0x0, 0xD0, 0x7, 0x0, 0x6, 0x0, 0xD8, 0x7, 0x0, 0x6, 0x0, 0xE0, 0x7, 0x0, 0x6, 0x0, 0xE8, 0x7, 0x0, 0x6, 0x0, 0x40, 0x7, 0x0, 0x6, 0x0, 0xF0, 0x7, 0x0, 0x26, 0x1D, 0x0, 0x0, 0x0, 0xE6, 0x1F, 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, 0x26, 0x20, 0x0, 0x0, 0x0, 0x46, 0x20, 0x0, 0x0, 0x0, 0x66, 0x20, 0x0, 0x0, 0x0, 0xE6, 0x1D, 0x0, 0x0, 0x0, 0x6, 0x1E, 0x0, 0x0, 0x0, 0x26, 0x1E, 0x0, 0x0, 0x0, 0x46, 0x1E, 0x0, 0x0, 0x0, 0x66, 0x1E, 0x0, 0x0, 0x0, 0x86, 0x1E, 0x0, 0x0, 0x0, 0xA6, 0x1E, 0x0, 0x0, 0x0, 0xC6, 0x1E, 0x0, 0x0, 0x0, 0xE6, 0x1E, 0x0, 0x0, 0x0, 0x6, 0x1F, 0x0, 0x0, 0x0, 0x86, 0x20, 0x0, 0x0, 0x0, 0x26, 0x1F, 0x0, 0x0, 0x0, 0x46, 0x1F, 0x0, 0x0, 0x0, 0xA6, 0x20, 0x0, 0x0, 0x0, 0xC6, 0x20, 0x0, 0x0, 0x0, 0xE6, 0x20, 0x0, 0x0, 0x0, 0x6, 0x21, 0x0, 0x0, 0x0, 0x86, 0x1F, 0x0, 0x0, 0x0, 0xA6, 0x1F, 0x0, 0x0, 0x0, 0xC6, 0x1F, 0x0, 0x0, 0x0, 0x6, 0x0, 0x48, 0x8, 0x0, 0x6, 0x0, 0x8, 0x8, 0x0, 0x6, 0x0, 0x10, 0x8, 0x0, 0x6, 0x0, 0x18, 0x8, 0x0, 0x6, 0x0, 0x20, 0x8, 0x0, 0x6, 0x0, 0x28, 0x8, 0x0, 0x6, 0x0, 0x30, 0x8, 0x0, 0x6, 0x0, 0x38, 0x8, 0x0, 0x6, 0x0, 0x40, 0x8, 0x0, 0x26, 0x21, 0x0, 0x0, 0x0, 0x46, 0x21, 0x0, 0x0, 0x0, 0x66, 0x21, 0x0, 0x0, 0x0, 0x6, 0x0, 0x60, 0x8, 0x0, 0xA6, 0x21, 0x0, 0x0, 0x0, 0xC6, 0x21, 0x0, 0x0, 0x0, 0x6, 0x1C, 0xF0, 0x5, 0x0, 0x26, 0x1C, 0x0, 0x6, 0x0, 0x46, 0x1C, 0x10, 0x6, 0x0, 0x66, 0x1C, 0x20, 0x6, 0x0, 0xA6, 0x14, 0x30, 0x6, 0x0, 0xE6, 0x14, 0x40, 0x6, 0x0, 0x26, 0x15, 0x50, 0x6, 0x0, 0x66, 0x15, 0x60, 0x6, 0x0, 0xA6, 0x15, 0x70, 0x6, 0x0, 0xE6, 0x15, 0x80, 0x6, 0x0, 0x26, 0x16, 0x90, 0x6, 0x0, 0x66, 0x16, 0xA0, 0x6, 0x0, 0xA6, 0x16, 0xB0, 0x6, 0x0, 0xE6, 0x16, 0xC0, 0x6, 0x0, 0x26, 0x17, 0xF0, 0x6, 0x0, 0x66, 0x17, 0xF8, 0x6, 0x0, 0xA6, 0x17, 0x0, 0x7, 0x0, 0xE6, 0x17, 0x8, 0x7, 0x0, 0x26, 0x18, 0x10, 0x7, 0x0, 0x66, 0x18, 0x18, 0x7, 0x0, 0xA6, 0x18, 0x28, 0x5, 0x0, 0xE6, 0x18, 0x38, 0x5, 0x0, 0x26, 0x19, 0x48, 0x5, 0x0, 0x66, 0x19, 0x58, 0x5, 0x0, 0xA6, 0x19, 0x68, 0x5, 0x0, 0xE6, 0x19, 0x78, 0x5, 0x0, 0x66, 0x1A, 0x98, 0x5, 0x0, 0xA6, 0x1A, 0xA8, 0x5, 0x0, 0xE6, 0x1A, 0xB8, 0x5, 0x0, 0x86, 0x1C, 0xC8, 0x5, 0x0, 0x6, 0x0, 0x78, 0x8, 0x0, 0x6, 0x0, 0x80, 0x8, 0x0, 0x6, 0x0, 0x88, 0x8, 0x0, 0x6, 0x0, 0x90, 0x8, 0x0, 0x6, 0x0, 0x98, 0x8, 0x0, 0x6, 0x0, 0xA0, 0x8, 0x0, 0x6, 0x0, 0xA8, 0x8, 0x0, 0x6, 0x0, 0xB0, 0x8, 0x0, 0x6, 0x0, 0xB8, 0x8, 0x0, 0x6, 0x0, 0xC0, 0x8, 0x0, 0x6, 0x0, 0xC8, 0x8, 0x0, 0x6, 0x0, 0xD0, 0x8, 0x0, 0x6, 0x0, 0xD8, 0x8, 0x0, 0x6, 0x0, 0xE0, 0x8, 0x0, 0x6, 0x0, 0xE8, 0x8, 0x0, 0x6, 0x0, 0xF0, 0x8, 0x0, 0xE6, 0x23, 0x0, 0x0, 0x0, 0x6, 0x24, 0x0, 0x0, 0x0, 0x26, 0x24, 0x0, 0x0, 0x0, 0x46, 0x24, 0x0, 0x0, 0x0, 0x66, 0x24, 0x0, 0x0, 0x0, 0x86, 0x24, 0x0, 0x0, 0x0, 0xA6, 0x24, 0x0, 0x0, 0x0, 0xC6, 0x24, 0x0, 0x0, 0x0, 0xE6, 0x24, 0x0, 0x0, 0x0, 0x6, 0x25, 0x0, 0x0, 0x0, 0x26, 0x25, 0x0, 0x0, 0x0, 0x46, 0x25, 0x0, 0x0, 0x0, 0x66, 0x25, 0x0, 0x0, 0x0, 0x86, 0x25, 0x0, 0x0, 0x0, 0xA6, 0x25, 0x0, 0x0, 0x0, 0xC6, 0x25, 0x0, 0x0, 0x0, 0xE6, 0x14, 0xC8, 0x6, 0x0, 0x26, 0x15, 0xD0, 0x6, 0x0, 0x66, 0x15, 0xD8, 0x6, 0x0, 0xA6, 0x15, 0xE0, 0x6, 0x0, 0xE6, 0x15, 0xE8, 0x6, 0x0, 0x26, 0x16, 0x30, 0x5, 0x0, 0x66, 0x16, 0x40, 0x5, 0x0, 0xA6, 0x16, 0x50, 0x5, 0x0, 0xE6, 0x16, 0x60, 0x5, 0x0, 0x26, 0x17, 0x70, 0x5, 0x0, 0x6, 0x0, 0x78, 0x9, 0x0, 0x6, 0x26, 0x0, 0x0, 0x0, 0x26, 0x26, 0x0, 0x0, 0x0, 0x46, 0x26, 0x0, 0x0, 0x0, 0x66, 0x26, 0x0, 0x0, 0x0, 0x86, 0x26, 0x0, 0x0, 0x0, 0xA6, 0x26, 0x0, 0x0, 0x0, 0xC6, 0x26, 0x0, 0x0, 0x0, 0xE6, 0x26, 0x0, 0x0, 0x0, 0x6, 0x27, 0x0, 0x0, 0x0, 0x26, 0x27, 0x0, 0x0, 0x0, 0x46, 0x27, 0x0, 0x0, 0x0, 0x66, 0x27, 0x0, 0x0, 0x0, 0x86, 0x27, 0x0, 0x0, 0x0, 0xA6, 0x27, 0x0, 0x0, 0x0, 0xC6, 0x27, 0x0, 0x0, 0x0, 0xE6, 0x27, 0x0, 0x0, 0x0, 0xA6, 0x17, 0xB0, 0x5, 0x0, 0x66, 0xB, 0x0, 0x0, 0x0, 0xA6, 0xA, 0x0, 0x0, 0x0, 0x6, 0x28, 0x0, 0x0, 0x0, 0x26, 0x28, 0x0, 0x0, 0x0, 0x46, 0x28, 0x0, 0x0, 0x0, 0x66, 0x28, 0x0, 0x0, 0x0, 0x86, 0x28, 0x0, 0x0, 0x0, 0xA6, 0x28, 0x0, 0x0, 0x0, 0xC6, 0x28, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0xA, 0x0, 0x6, 0x0, 0x38, 0xA, 0x0, 0x6, 0x0, 0x40, 0xA, 0x0, 0x6, 0x0, 0x48, 0xA, 0x0, 0x6, 0x0, 0x50, 0xA, 0x0, 0x6, 0x0, 0x58, 0xA, 0x0, 0x6, 0x0, 0x60, 0xA, 0x0, 0x6, 0x0, 0x68, 0xA, 0x0, 0x6, 0x0, 0x70, 0xA, 0x0, 0x6, 0x0, 0x10, 0xA, 0x0, 0x6, 0x0, 0x18, 0xA, 0x0, 0x6, 0x0, 0x78, 0xA, 0x0, 0x6, 0x0, 0x80, 0xA, 0x0, 0x6, 0x0, 0x88, 0xA, 0x0, 0x6, 0x0, 0x90, 0xA, 0x0, 0x6, 0x0, 0x98, 0xA, 0x0, 0x6, 0x0, 0xA0, 0xA, 0x0, 0x6, 0x0, 0x20, 0xA, 0x0, 0x6, 0x0, 0x28, 0xA, 0x0, 0x6, 0x0, 0xA8, 0xA, 0x0, 0x6, 0x0, 0xB0, 0xA, 0x0, 0x6, 0x0, 0xB8, 0xA, 0x0, 0x6, 0x0, 0xC0, 0xA, 0x0, 0x6, 0x0, 0xC8, 0xA, 0x0, 0x6, 0x0, 0xD0, 0xA, 0x0, 0x6, 0x0, 0xD8, 0xA, 0x0, 0x6, 0x0, 0xE0, 0xA, 0x0, 0x26, 0x29, 0x0, 0x0, 0x0, 0x46, 0x29, 0x0, 0x0, 0x0, 0x66, 0x29, 0x0, 0x0, 0x0, 0x86, 0x29, 0x0, 0x0, 0x0, 0xA6, 0x29, 0x0, 0x0, 0x0, 0xC6, 0x29, 0x0, 0x0, 0x0, 0xE6, 0x29, 0x0, 0x0, 0x0, 0x26, 0x2A, 0x0, 0x0, 0x0, 0x66, 0x2A, 0x0, 0x0, 0x0, 0xE6, 0x2A, 0x0, 0x0, 0x0, 0x6, 0x2B, 0x0, 0x0, 0x0, 0x26, 0x2B, 0x0, 0x0, 0x0, 0x46, 0x2B, 0x0, 0x0, 0x0, 0x66, 0x2B, 0x0, 0x0, 0x0, 0x86, 0x2B, 0x0, 0x0, 0x0, 0x6, 0x0, 0xE8, 0xA, 0x0, 0x6, 0x0, 0xF0, 0xA, 0x0, 0x6, 0x0, 0xF8, 0xA, 0x0, 0x6, 0x0, 0x0, 0xB, 0x0, 0x6, 0x0, 0x8, 0xB, 0x0, 0x6, 0x0, 0x10, 0xB, 0x0, 0x46, 0x1D, 0x0, 0x0, 0x0, 0x66, 0x1D, 0x0, 0x0, 0x0, 0x86, 0x1D, 0x0, 0x0, 0x0, 0xA6, 0x1D, 0x0, 0x0, 0x0, 0xC6, 0x1D, 0x0, 0x0, 0x0, 0x86, 0x21, 0x0, 0x0, 0x0, 0xE6, 0x2B, 0x0, 0x0, 0x0, 0x6, 0x2C, 0x0, 0x0, 0x0, 0x26, 0x2C, 0x0, 0x0, 0x0, 0x46, 0x2C, 0x0, 0x0, 0x0, 0xE6, 0x28, 0x0, 0x0, 0x0, 0x6, 0x29, 0x0, 0x0, 0x0, 0xE6, 0x21, 0x0, 0x0, 0x0, 0x6, 0x22, 0x0, 0x0, 0x0, 0x26, 0x22, 0x0, 0x0, 0x0, 0x46, 0x22, 0x0, 0x0, 0x0, 0x66, 0x22, 0x0, 0x0, 0x0, 0x86, 0x22, 0x0, 0x0, 0x0, 0xA6, 0x22, 0x0, 0x0, 0x0, 0xC6, 0x22, 0x0, 0x0, 0x0, 0xE6, 0x22, 0x0, 0x0, 0x0, 0x6, 0x23, 0x0, 0x0, 0x0, 0x26, 0x23, 0x0, 0x0, 0x0, 0x46, 0x23, 0x0, 0x0, 0x0, 0x66, 0x23, 0x0, 0x0, 0x0, 0x86, 0x23, 0x0, 0x0, 0x0, 0xA6, 0x23, 0x0, 0x0, 0x0, 0xC6, 0x23, 0x0, 0x0, 0x0, 0x86, 0x17, 0xC8, 0x6, 0x0, 0xC6, 0x17, 0xD0, 0x6, 0x0, 0x6, 0x18, 0xD8, 0x6, 0x0, 0x46, 0x18, 0xE0, 0x6, 0x0, 0x86, 0x18, 0xE8, 0x6, 0x0, 0xC6, 0x18, 0x30, 0x5, 0x0, 0x6, 0x19, 0x40, 0x5, 0x0, 0x46, 0x19, 0x50, 0x5, 0x0, 0x86, 0x19, 0x60, 0x5, 0x0, 0xC6, 0x19, 0x70, 0x5, 0x0, 0x6, 0x1A, 0x80, 0x5, 0x0, 0x46, 0x1A, 0x90, 0x5, 0x0, 0x86, 0x1A, 0xA0, 0x5, 0x0, 0xC6, 0x1A, 0xB0, 0x5, 0x0, 0x6, 0x1B, 0xC0, 0x5, 0x0, 0x66, 0x2C, 0x0, 0x0, 0x0, 0x86, 0x2C, 0x0, 0x0, 0x0, 0x66, 0x1F, 0x0, 0x0, 0x0, 0xA6, 0x2C, 0x0, 0x0, 0x0, 0xE6, 0x25, 0x0, 0x0, 0x0, 0xC6, 0x2C, 0x0, 0x0, 0x0, 0xE6, 0x1B, 0xD8, 0x5, 0x0, 0x6, 0x1C, 0xE8, 0x5, 0x0, 0x26, 0x1C, 0xF8, 0x5, 0x0, 0x46, 0x1C, 0x8, 0x6, 0x0, 0x66, 0x1C, 0x18, 0x6, 0x0, 0xA6, 0x14, 0x28, 0x6, 0x0, 0xE6, 0x14, 0x38, 0x6, 0x0, 0x26, 0x15, 0x48, 0x6, 0x0, 0x66, 0x15, 0x58, 0x6, 0x0, 0xA6, 0x15, 0x68, 0x6, 0x0, 0xE6, 0x15, 0x78, 0x6, 0x0, 0x26, 0x16, 0x88, 0x6, 0x0, 0x66, 0x16, 0x98, 0x6, 0x0, 0xA6, 0x16, 0xA8, 0x6, 0x0, 0xE6, 0x16, 0xB8, 0x6, 0x0, 0x26, 0x17, 0x20, 0x7, 0x0, 0x86, 0x1C, 0xF0, 0x6, 0x0, 0x6, 0x0, 0x0, 0x3, 0x0, 0x6, 0x0, 0x8, 0x3, 0x0, 0x6, 0x0, 0x10, 0x3, 0x0, 0x6, 0x0, 0x18, 0x3, 0x0, 0x6, 0x0, 0x20, 0x3, 0x0, 0x6, 0x0, 0x30, 0x2, 0x0, 0x6, 0x0, 0x38, 0x2, 0x0, 0x6, 0x0, 0x40, 0x2, 0x0, 0x6, 0x0, 0x48, 0x2, 0x0, 0x6, 0x0, 0x50, 0x2, 0x0, 0x6, 0x0, 0x58, 0x2, 0x0, 0x6, 0x0, 0x60, 0x2, 0x0, 0x6, 0x0, 0x68, 0x2, 0x0, 0x6, 0x0, 0x70, 0x2, 0x0, 0x6, 0x0, 0x78, 0x2, 0x0, 0x6, 0x0, 0x80, 0x2, 0x0, 0xE6, 0x2C, 0x0, 0x0, 0x0, 0x6, 0x2D, 0x0, 0x0, 0x0, 0x46, 0x16, 0x40, 0x2, 0x0, 0x26, 0x2D, 0x0, 0x0, 0x0, 0xA6, 0x17, 0xD8, 0x5, 0x0, 0xE6, 0x17, 0xE8, 0x5, 0x0, 0x6, 0x0, 0x50, 0xB, 0x0, 0x6, 0x0, 0x58, 0xB, 0x0, 0x6, 0x0, 0x60, 0xB, 0x0, 0x6, 0x0, 0x68, 0xB, 0x0, 0x6, 0x0, 0xF8, 0x7, 0x0, 0x86, 0x15, 0xC8, 0x6, 0x0, 0xC6, 0x15, 0x78, 0x5, 0x0, 0xC6, 0x2D, 0x0, 0x0, 0x0, 0x26, 0x1C, 0xE8, 0x5, 0x0, 0xE6, 0x2D, 0x0, 0x0, 0x0, 0x6, 0x2E, 0x0, 0x0, 0x0, 0x26, 0x2E, 0x0, 0x0, 0x0, 0x46, 0x2E, 0x0, 0x0, 0x0, 0x66, 0x2E, 0x0, 0x0, 0x0, 0x86, 0x2E, 0x0, 0x0, 0x0, 0xA6, 0x2E, 0x0, 0x0, 0x0, 0xC6, 0x2E, 0x0, 0x0, 0x0, 0xE6, 0x2E, 0x0, 0x0, 0x0, 0x6, 0x2F, 0x0, 0x0, 0x0, 0x6, 0x0, 0x28, 0x7, 0x0, 0x6, 0x0, 0xC8, 0xB, 0x0, 0x6, 0x0, 0xD0, 0xB, 0x0, 0x6, 0x0, 0x70, 0x8, 0x0, 0x6, 0x0, 0xA0, 0xB, 0x0, 0x6, 0x0, 0x38, 0x7, 0x0, 0x66, 0x2F, 0x0, 0x0, 0x0, 0x86, 0x1C, 0xC8, 0x6, 0x0, 0x6, 0x0, 0xD8, 0xB, 0x0, 0x6, 0x0, 0x0, 0x8, 0x0, 0xE6, 0xA, 0x0, 0x0, 0x0, 0x26, 0xC, 0x0, 0x0, 0x0, 0x46, 0xC, 0x0, 0x0, 0x0, 0x66, 0xC, 0x0, 0x0, 0x0, 0x86, 0xC, 0x0, 0x0, 0x0, 0xC6, 0x8, 0x0, 0x0, 0x0, 0xE6, 0x8, 0x0, 0x0, 0x0, 0x6, 0x9, 0x0, 0x0, 0x0, 0x46, 0x9, 0x0, 0x0, 0x0, 0x66, 0x9, 0x0, 0x0, 0x0, 0x86, 0x9, 0x0, 0x0, 0x0, 0xA6, 0x9, 0x0, 0x0, 0x0, 0xC6, 0x9, 0x0, 0x0, 0x0, 0xE6, 0x9, 0x0, 0x0, 0x0, 0x6, 0xA, 0x0, 0x0, 0x0, 0x26, 0xA, 0x0, 0x0, 0x0, 0x46, 0xA, 0x0, 0x0, 0x0, 0x66, 0xA, 0x0, 0x0, 0x0, 0x86, 0xA, 0x0, 0x0, 0x0, 0xC6, 0xA, 0x0, 0x0, 0x0, 0x6, 0xB, 0x0, 0x0, 0x0, 0x26, 0xB, 0x0, 0x0, 0x0, 0x46, 0xB, 0x0, 0x0, 0x0, 0x86, 0xB, 0x0, 0x0, 0x0, 0xA6, 0xB, 0x0, 0x0, 0x0, 0xC6, 0xB, 0x0, 0x0, 0x0, 0xE6, 0xB, 0x0, 0x0, 0x0, 0xA6, 0xC, 0x0, 0x0, 0x0, 0x26, 0x9, 0x0, 0x0, 0x0, 0x7, 0x0, 0xE0, 0xB, 0x0, 0x7, 0x0, 0xE8, 0xB, 0x0, 0x7, 0x0, 0xF0, 0xB, 0x0, 0x7, 0x0, 0xF8, 0xB, 0x0, 0x7, 0x0, 0x0, 0xC, 0x0, 0x7, 0x0, 0x8, 0xC, 0x0, 0x7, 0x0, 0x10, 0xC, 0x0, 0x7, 0x0, 0x18, 0xC, 0x0, 0x7, 0x0, 0x20, 0xC, 0x0, 0x7, 0x0, 0x28, 0xC, 0x0, 0x7, 0x0, 0x30, 0xC, 0x0, 0x7, 0x0, 0x38, 0xC, 0x0, 0x7, 0x0, 0x40, 0xC, 0x0, 0x7, 0x0, 0x48, 0xC, 0x0, 0x7, 0x0, 0x50, 0xC, 0x0, 0x7, 0x0, 0x58, 0xC, 0x0, 0x7, 0x0, 0x60, 0xC, 0x0, 0x7, 0x0, 0x68, 0xC, 0x0, 0x7, 0x0, 0x70, 0xC, 0x0, 0x7, 0x0, 0x78, 0xC, 0x0, 0x7, 0x0, 0x80, 0xC, 0x0, 0x7, 0x0, 0x88, 0xC, 0x0, 0x7, 0x0, 0x90, 0xC, 0x0, 0x7, 0x0, 0x98, 0xC, 0x0, 0x7, 0x0, 0xA0, 0xC, 0x0, 0x7, 0x0, 0xA8, 0xC, 0x0, 0xC7, 0x32, 0x0, 0x0, 0x0, 0xE7, 0x32, 0x0, 0x0, 0x0, 0x7, 0x33, 0x0, 0x0, 0x0, 0x27, 0x33, 0x0, 0x0, 0x0, 0x47, 0x33, 0x0, 0x0, 0x0, 0x67, 0x33, 0x0, 0x0, 0x0, 0x87, 0x33, 0x0, 0x0, 0x0, 0xA7, 0x33, 0x0, 0x0, 0x0, 0xC7, 0x33, 0x0, 0x0, 0x0, 0xE7, 0x33, 0x0, 0x0, 0x0, 0x7, 0x34, 0x0, 0x0, 0x0, 0x27, 0x34, 0x0, 0x0, 0x0, 0x47, 0x34, 0x0, 0x0, 0x0, 0x67, 0x34, 0x0, 0x0, 0x0, 0x87, 0x34, 0x0, 0x0, 0x0, 0xA7, 0x34, 0x0, 0x0, 0x0, 0xC7, 0x34, 0x0, 0x0, 0x0, 0xE7, 0x34, 0x0, 0x0, 0x0, 0x7, 0x35, 0x0, 0x0, 0x0, 0x27, 0x35, 0x0, 0x0, 0x0, 0x47, 0x35, 0x0, 0x0, 0x0, 0x67, 0x35, 0x0, 0x0, 0x0, 0x87, 0x35, 0x0, 0x0, 0x0, 0xA7, 0x35, 0x0, 0x0, 0x0, 0xC7, 0x35, 0x0, 0x0, 0x0, 0xE7, 0x35, 0x0, 0x0, 0x0, 0x7, 0x36, 0x0, 0x0, 0x0, 0x27, 0x36, 0x0, 0x0, 0x0, 0x47, 0x36, 0x0, 0x0, 0x0, 0x67, 0x36, 0x0, 0x0, 0x0, 0x87, 0x36, 0x0, 0x0, 0x0, 0xA7, 0x36, 0x0, 0x0, 0x0, 0xC7, 0x36, 0x0, 0x0, 0x0, 0xE7, 0x36, 0x0, 0x0, 0x0, 0x7, 0x37, 0x0, 0x0, 0x0, 0x27, 0x37, 0x0, 0x0, 0x0, 0x47, 0x37, 0x0, 0x0, 0x0, 0x67, 0x37, 0x0, 0x0, 0x0, 0x87, 0x37, 0x0, 0x0, 0x0, 0xA7, 0x37, 0x0, 0x0, 0x0, 0xC7, 0x37, 0x0, 0x0, 0x0, 0xE7, 0x37, 0x0, 0x0, 0x0, 0x7, 0x38, 0x0, 0x0, 0x0, 0x27, 0x38, 0x0, 0x0, 0x0, 0x47, 0x38, 0x0, 0x0, 0x0, 0x67, 0x38, 0x0, 0x0, 0x0, 0x87, 0x38, 0x0, 0x0, 0x0, 0xA7, 0x38, 0x0, 0x0, 0x0, 0xC7, 0x38, 0x0, 0x0, 0x0, 0xE7, 0x38, 0x0, 0x0, 0x0, 0x7, 0x39, 0x0, 0x0, 0x0, 0x27, 0x39, 0x0, 0x0, 0x0, 0x47, 0x39, 0x0, 0x0, 0x0, 0x67, 0x39, 0x0, 0x0, 0x0, 0x87, 0x39, 0x0, 0x0, 0x0, 0xA7, 0x39, 0x0, 0x0, 0x0, 0xC7, 0x39, 0x0, 0x0, 0x0, 0xE7, 0x39, 0x0, 0x0, 0x0, 0x7, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x3A, 0x0, 0x0, 0x0, 0x47, 0x3A, 0x0, 0x0, 0x0, 0x67, 0x3A, 0x0, 0x0, 0x0, 0x87, 0x3A, 0x0, 0x0, 0x0, 0xA7, 0x3A, 0x0, 0x0, 0x0, 0xC7, 0x3A, 0x0, 0x0, 0x0, 0xE7, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x3B, 0x0, 0x0, 0x0, 0x27, 0x3B, 0x0, 0x0, 0x0, 0x47, 0x3B, 0x0, 0x0, 0x0, 0x67, 0x3B, 0x0, 0x0, 0x0, 0x87, 0x3B, 0x0, 0x0, 0x0, 0xA7, 0x3B, 0x0, 0x0, 0x0, 0xC7, 0x3B, 0x0, 0x0, 0x0, 0xE7, 0x3B, 0x0, 0x0, 0x0, 0x7, 0x3C, 0x0, 0x0, 0x0, 0x27, 0x3C, 0x0, 0x0, 0x0, 0x47, 0x3C, 0x0, 0x0, 0x0, 0x67, 0x3C, 0x0, 0x0, 0x0, 0x87, 0x3C, 0x0, 0x0, 0x0, 0xA7, 0x3C, 0x0, 0x0, 0x0, 0xC7, 0x3C, 0x0, 0x0, 0x0, 0xE7, 0x3C, 0x0, 0x0, 0x0, 0x7, 0x3D, 0x0, 0x0, 0x0, 0x27, 0x3D, 0x0, 0x0, 0x0, 0x47, 0x3D, 0x0, 0x0, 0x0, 0x67, 0x3D, 0x0, 0x0, 0x0, 0x87, 0x3D, 0x0, 0x0, 0x0, 0xA7, 0x3D, 0x0, 0x0, 0x0, 0xC7, 0x3D, 0x0, 0x0, 0x0, 0xE7, 0x3D, 0x0, 0x0, 0x0, 0x7, 0x3E, 0x0, 0x0, 0x0, 0x27, 0x3E, 0x0, 0x0, 0x0, 0x47, 0x3E, 0x0, 0x0, 0x0, 0x67, 0x3E, 0x0, 0x0, 0x0, 0x87, 0x3E, 0x0, 0x0, 0x0, 0xA7, 0x3E, 0x0, 0x0, 0x0, 0xC7, 0x3E, 0x0, 0x0, 0x0, 0xE7, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x3F, 0x0, 0x0, 0x0, 0x27, 0x3F, 0x0, 0x0, 0x0, 0x47, 0x3F, 0x0, 0x0, 0x0, 0x67, 0x3F, 0x0, 0x0, 0x0, 0x87, 0x3F, 0x0, 0x0, 0x0, 0xA7, 0x3F, 0x0, 0x0, 0x0, 0xC7, 0x3F, 0x0, 0x0, 0x0, 0xE7, 0x3F, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x27, 0x40, 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, 0x0, 0x67, 0x40, 0x0, 0x0, 0x0, 0x87, 0x40, 0x0, 0x0, 0x0, 0xA7, 0x40, 0x0, 0x0, 0x0, 0x7, 0x0, 0x30, 0x10, 0x0, 0x7, 0x0, 0x38, 0x10, 0x0, 0x7, 0x0, 0x40, 0x10, 0x0, 0x7, 0x0, 0x48, 0x10, 0x0, 0x7, 0x0, 0x50, 0x10, 0x0, 0x7, 0x0, 0x58, 0x10, 0x0, 0x7, 0x0, 0x60, 0x10, 0x0, 0x7, 0x0, 0x68, 0x10, 0x0, 0x7, 0x0, 0x70, 0x10, 0x0, 0x7, 0x0, 0x78, 0x10, 0x0, 0x7, 0x0, 0x80, 0x10, 0x0, 0x7, 0x0, 0x88, 0x10, 0x0, 0x7, 0x0, 0x90, 0x10, 0x0, 0x7, 0x0, 0x98, 0x10, 0x0, 0x7, 0x0, 0xA0, 0x10, 0x0, 0x7, 0x0, 0xA8, 0x10, 0x0, 0x7, 0x0, 0x78, 0xE, 0x0, 0xC7, 0x42, 0x0, 0x0, 0x0, 0xE7, 0x42, 0x0, 0x0, 0x0, 0x7, 0x43, 0x0, 0x0, 0x0, 0x27, 0x43, 0x0, 0x0, 0x0, 0x47, 0x43, 0x0, 0x0, 0x0, 0x67, 0x43, 0x0, 0x0, 0x0, 0x87, 0x43, 0x0, 0x0, 0x0, 0xA7, 0x43, 0x0, 0x0, 0x0, 0xC7, 0x43, 0x0, 0x0, 0x0, 0xE7, 0x43, 0x0, 0x0, 0x0, 0x7, 0x44, 0x0, 0x0, 0x0, 0x7, 0x0, 0x8, 0xD, 0x0, 0x7, 0x0, 0xE8, 0xC, 0x0, 0x7, 0x0, 0x98, 0xD, 0x0, 0x7, 0x0, 0xE8, 0xD, 0x0, 0x7, 0x0, 0x48, 0xD, 0x0, 0x27, 0x44, 0x0, 0x0, 0x0, 0x47, 0x44, 0x0, 0x0, 0x0, 0x67, 0x44, 0x0, 0x0, 0x0, 0x87, 0x44, 0x0, 0x0, 0x0, 0xA7, 0x44, 0x0, 0x0, 0x0, 0xC7, 0x44, 0x0, 0x0, 0x0, 0xE7, 0x44, 0x0, 0x0, 0x0, 0x7, 0x45, 0x0, 0x0, 0x0, 0x27, 0x45, 0x0, 0x0, 0x0, 0x47, 0x45, 0x0, 0x0, 0x0, 0x67, 0x45, 0x0, 0x0, 0x0, 0x87, 0x45, 0x0, 0x0, 0x0, 0x7, 0x0, 0x58, 0xD, 0x0, 0xA7, 0x45, 0x0, 0x0, 0x0, 0xC7, 0x45, 0x0, 0x0, 0x0, 0xE7, 0x45, 0x0, 0x0, 0x0, 0x7, 0x46, 0x0, 0x0, 0x0, 0x27, 0x46, 0x0, 0x0, 0x0, 0x7, 0x0, 0x90, 0x11, 0x0, 0x7, 0x0, 0x98, 0x11, 0x0, 0x7, 0x0, 0xA0, 0x11, 0x0, 0x7, 0x0, 0xA8, 0x11, 0x0, 0x7, 0x0, 0xB0, 0x11, 0x0, 0x7, 0x0, 0xB8, 0x11, 0x0, 0x7, 0x0, 0xC0, 0x11, 0x0, 0x7, 0x0, 0xC8, 0x11, 0x0, 0x7, 0x0, 0xD0, 0x11, 0x0, 0x7, 0x0, 0xD8, 0x11, 0x0, 0x7, 0x0, 0xE0, 0x11, 0x0, 0x7, 0x0, 0xE8, 0x11, 0x0, 0x7, 0x0, 0xF0, 0x11, 0x0, 0x7, 0x0, 0xF8, 0x11, 0x0, 0x7, 0x0, 0x0, 0x12, 0x0, 0x7, 0x0, 0x8, 0x12, 0x0, 0x7, 0x0, 0x10, 0x12, 0x0, 0x7, 0x0, 0x18, 0x12, 0x0, 0x7, 0x0, 0x20, 0x12, 0x0, 0x7, 0x0, 0x28, 0x12, 0x0, 0x7, 0x0, 0x30, 0x12, 0x0, 0x7, 0x0, 0x38, 0x12, 0x0, 0x7, 0x0, 0x40, 0x12, 0x0, 0x7, 0x0, 0x48, 0x12, 0x0, 0x7, 0x0, 0x50, 0x12, 0x0, 0x7, 0x0, 0xD0, 0x10, 0x0, 0x7, 0x0, 0x58, 0x12, 0x0, 0x7, 0x0, 0xD8, 0x10, 0x0, 0x7, 0x0, 0xE0, 0x10, 0x0, 0x7, 0x0, 0xE8, 0x10, 0x0, 0x7, 0x0, 0xF0, 0x10, 0x0, 0x7, 0x0, 0xF8, 0x10, 0x0, 0x7, 0x0, 0x0, 0x11, 0x0, 0x7, 0x0, 0x60, 0x12, 0x0, 0x7, 0x0, 0x68, 0x12, 0x0, 0x7, 0x0, 0x70, 0x12, 0x0, 0x7, 0x0, 0x78, 0x12, 0x0, 0x7, 0x0, 0x8, 0x11, 0x0, 0x7, 0x0, 0x10, 0x11, 0x0, 0x7, 0x0, 0x18, 0x11, 0x0, 0x7, 0x0, 0x20, 0x11, 0x0, 0x7, 0x4A, 0x0, 0x0, 0x0, 0x27, 0x4A, 0x0, 0x0, 0x0, 0x47, 0x4A, 0x0, 0x0, 0x0, 0x67, 0x4A, 0x0, 0x0, 0x0, 0x87, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x0, 0xD0, 0xD, 0x0, 0x7, 0x0, 0x30, 0xE, 0x0, 0x7, 0x0, 0x50, 0xE, 0x0, 0x7, 0x0, 0x60, 0xE, 0x0, 0x7, 0x0, 0x70, 0xE, 0x0, 0x7, 0x0, 0x80, 0xE, 0x0, 0x7, 0x0, 0x90, 0xE, 0x0, 0x7, 0x0, 0xA0, 0xE, 0x0, 0x7, 0x0, 0xB0, 0xE, 0x0, 0x7, 0x0, 0xC0, 0xE, 0x0, 0x7, 0x0, 0xD0, 0xE, 0x0, 0x7, 0x0, 0xE0, 0xE, 0x0, 0x7, 0x0, 0xF0, 0xE, 0x0, 0x7, 0x0, 0x0, 0xF, 0x0, 0x7, 0x0, 0x10, 0xF, 0x0, 0x7, 0x0, 0x20, 0xF, 0x0, 0x7, 0x0, 0x30, 0xF, 0x0, 0x7, 0x0, 0x40, 0xF, 0x0, 0x7, 0x0, 0x50, 0xF, 0x0, 0x7, 0x0, 0x60, 0xF, 0x0, 0x7, 0x0, 0x70, 0xF, 0x0, 0x7, 0x0, 0x80, 0xF, 0x0, 0x7, 0x0, 0x90, 0xF, 0x0, 0x7, 0x0, 0xA0, 0xF, 0x0, 0x7, 0x0, 0xB0, 0xF, 0x0, 0x7, 0x0, 0xB8, 0xF, 0x0, 0x7, 0x0, 0xC0, 0xF, 0x0, 0x7, 0x0, 0xC8, 0xF, 0x0, 0x7, 0x0, 0xD0, 0xF, 0x0, 0x7, 0x0, 0xD8, 0xF, 0x0, 0x7, 0x0, 0xE0, 0xF, 0x0, 0x7, 0x0, 0xE8, 0xF, 0x0, 0x7, 0x0, 0xF0, 0xF, 0x0, 0x7, 0x0, 0xF8, 0xF, 0x0, 0x7, 0x0, 0x0, 0x10, 0x0, 0x7, 0x0, 0x8, 0x10, 0x0, 0x7, 0x0, 0x10, 0x10, 0x0, 0x7, 0x0, 0x18, 0x10, 0x0, 0x7, 0x0, 0x20, 0x10, 0x0, 0x7, 0x0, 0x28, 0x10, 0x0, 0xA7, 0x4A, 0x0, 0x0, 0x0, 0xC7, 0x4A, 0x0, 0x0, 0x0, 0xE7, 0x4A, 0x0, 0x0, 0x0, 0x67, 0x47, 0x0, 0x0, 0x0, 0x87, 0x47, 0x0, 0x0, 0x0, 0xA7, 0x47, 0x0, 0x0, 0x0, 0xC7, 0x47, 0x0, 0x0, 0x0, 0xE7, 0x47, 0x0, 0x0, 0x0, 0x7, 0x48, 0x0, 0x0, 0x0, 0x27, 0x48, 0x0, 0x0, 0x0, 0x47, 0x48, 0x0, 0x0, 0x0, 0x67, 0x48, 0x0, 0x0, 0x0, 0x87, 0x48, 0x0, 0x0, 0x0, 0xA7, 0x48, 0x0, 0x0, 0x0, 0xC7, 0x48, 0x0, 0x0, 0x0, 0xE7, 0x48, 0x0, 0x0, 0x0, 0x7, 0x49, 0x0, 0x0, 0x0, 0x27, 0x49, 0x0, 0x0, 0x0, 0x47, 0x49, 0x0, 0x0, 0x0, 0x67, 0x49, 0x0, 0x0, 0x0, 0x87, 0x49, 0x0, 0x0, 0x0, 0x7, 0x4B, 0x0, 0x0, 0x0, 0xA7, 0x49, 0x0, 0x0, 0x0, 0xC7, 0x49, 0x0, 0x0, 0x0, 0xE7, 0x49, 0x0, 0x0, 0x0, 0x7, 0x0, 0xA8, 0xF, 0x0, 0x7, 0x0, 0xB0, 0xC, 0x0, 0x7, 0x0, 0xB0, 0x10, 0x0, 0x7, 0x0, 0xA8, 0x12, 0x0, 0x7, 0x0, 0x88, 0xE, 0x0, 0x7, 0x0, 0xB8, 0xC, 0x0, 0x7, 0x0, 0xA8, 0xE, 0x0, 0x7, 0x0, 0xC8, 0xC, 0x0, 0x7, 0x0, 0xD8, 0xC, 0x0, 0x7, 0x0, 0x98, 0xE, 0x0, 0x7, 0x0, 0xB8, 0x12, 0x0, 0x7, 0x0, 0xC8, 0x12, 0x0, 0x7, 0x0, 0xD0, 0x12, 0x0, 0x7, 0x0, 0xC0, 0xC, 0x0, 0x7, 0x0, 0x0, 0xD, 0x0, 0x7, 0x0, 0x68, 0xD, 0x0, 0x7, 0x0, 0x78, 0xD, 0x0, 0x7, 0x0, 0x88, 0xD, 0x0, 0x7, 0x0, 0xF8, 0xC, 0x0, 0x7, 0x0, 0xD8, 0x12, 0x0, 0x7, 0x0, 0xE0, 0x12, 0x0, 0x7, 0x0, 0xE8, 0x12, 0x0, 0x7, 0x0, 0xF0, 0x12, 0x0, 0x7, 0x0, 0xF8, 0x12, 0x0, 0x7, 0x0, 0x0, 0x13, 0x0, 0x7, 0x0, 0x8, 0x13, 0x0, 0x7, 0x0, 0x10, 0x13, 0x0, 0x7, 0x0, 0x18, 0x13, 0x0, 0x7, 0x0, 0x20, 0x13, 0x0, 0x7, 0x0, 0x28, 0x13, 0x0, 0x7, 0x0, 0x30, 0x13, 0x0, 0x7, 0x0, 0x38, 0x13, 0x0, 0x7, 0x0, 0x40, 0x13, 0x0, 0x7, 0x0, 0x48, 0x13, 0x0, 0x7, 0x0, 0x50, 0x13, 0x0, 0x7, 0x0, 0x58, 0x13, 0x0, 0x7, 0x0, 0x60, 0x13, 0x0, 0x7, 0x0, 0x68, 0x13, 0x0, 0x7, 0x0, 0x70, 0x13, 0x0, 0x7, 0x0, 0x78, 0x13, 0x0, 0x7, 0x0, 0x80, 0x13, 0x0, 0x7, 0x0, 0x88, 0x13, 0x0, 0x7, 0x0, 0x90, 0x13, 0x0, 0x7, 0x0, 0x98, 0x13, 0x0, 0x7, 0x0, 0xA0, 0x13, 0x0, 0x7, 0x0, 0xC8, 0x10, 0x0, 0x7, 0x0, 0xA8, 0x13, 0x0, 0x7, 0x0, 0xB0, 0x13, 0x0, 0x7, 0x0, 0xB8, 0x13, 0x0, 0x7, 0x0, 0xC0, 0x13, 0x0, 0x7, 0x0, 0xC8, 0x13, 0x0, 0x7, 0x0, 0xD0, 0x13, 0x0, 0x7, 0x0, 0xD8, 0x13, 0x0, 0x7, 0x0, 0xE0, 0x13, 0x0, 0x7, 0x0, 0xE8, 0x13, 0x0, 0x7, 0x0, 0xF0, 0x13, 0x0, 0x7, 0x0, 0xF8, 0x13, 0x0, 0x7, 0x0, 0x0, 0x14, 0x0, 0x7, 0x0, 0x8, 0x14, 0x0, 0x7, 0x0, 0x10, 0x14, 0x0, 0x7, 0x0, 0x18, 0x14, 0x0, 0x7, 0x0, 0x20, 0x14, 0x0, 0x7, 0x0, 0x28, 0x14, 0x0, 0x7, 0x0, 0x30, 0x14, 0x0, 0x7, 0x0, 0x38, 0x14, 0x0, 0x7, 0x0, 0x40, 0x14, 0x0, 0x27, 0x51, 0x0, 0x0, 0x0, 0x47, 0x51, 0x0, 0x0, 0x0, 0x67, 0x51, 0x0, 0x0, 0x0, 0x87, 0x51, 0x0, 0x0, 0x0, 0xA7, 0x51, 0x0, 0x0, 0x0, 0xC7, 0x51, 0x0, 0x0, 0x0, 0xE7, 0x51, 0x0, 0x0, 0x0, 0x7, 0x52, 0x0, 0x0, 0x0, 0x27, 0x52, 0x0, 0x0, 0x0, 0x47, 0x52, 0x0, 0x0, 0x0, 0x67, 0x52, 0x0, 0x0, 0x0, 0x87, 0x52, 0x0, 0x0, 0x0, 0xA7, 0x52, 0x0, 0x0, 0x0, 0xC7, 0x52, 0x0, 0x0, 0x0, 0xE7, 0x52, 0x0, 0x0, 0x0, 0x7, 0x53, 0x0, 0x0, 0x0, 0x27, 0x53, 0x0, 0x0, 0x0, 0x47, 0x53, 0x0, 0x0, 0x0, 0x67, 0x53, 0x0, 0x0, 0x0, 0x87, 0x53, 0x0, 0x0, 0x0, 0xA7, 0x53, 0x0, 0x0, 0x0, 0xC7, 0x53, 0x0, 0x0, 0x0, 0xE7, 0x53, 0x0, 0x0, 0x0, 0x7, 0x54, 0x0, 0x0, 0x0, 0x27, 0x54, 0x0, 0x0, 0x0, 0x47, 0x54, 0x0, 0x0, 0x0, 0x67, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x20, 0x15, 0x0, 0x7, 0x0, 0x28, 0x15, 0x0, 0x7, 0x0, 0x30, 0x15, 0x0, 0x7, 0x0, 0x38, 0x15, 0x0, 0x7, 0x0, 0x40, 0x15, 0x0, 0x7, 0x0, 0x48, 0x15, 0x0, 0x7, 0x0, 0x50, 0x15, 0x0, 0x7, 0x0, 0x58, 0x15, 0x0, 0x7, 0x0, 0x60, 0x15, 0x0, 0x7, 0x0, 0x68, 0x15, 0x0, 0x7, 0x0, 0x70, 0x15, 0x0, 0x7, 0x0, 0x78, 0x15, 0x0, 0x7, 0x0, 0x80, 0x15, 0x0, 0x7, 0x0, 0x88, 0x15, 0x0, 0x7, 0x0, 0x90, 0x15, 0x0, 0x7, 0x0, 0x98, 0x15, 0x0, 0x7, 0x0, 0xA0, 0x15, 0x0, 0x7, 0x0, 0xF0, 0xD, 0x0, 0xA7, 0x56, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0xE, 0x0, 0x7, 0x0, 0xB0, 0x15, 0x0, 0x7, 0x0, 0x40, 0xE, 0x0, 0xA7, 0x31, 0x0, 0x0, 0x0, 0xE7, 0x56, 0x0, 0x0, 0x0, 0x47, 0x41, 0x40, 0x10, 0x0, 0x67, 0x41, 0x48, 0x10, 0x0, 0x7, 0x57, 0x0, 0x0, 0x0, 0xE7, 0x33, 0x50, 0x10, 0x0, 0x27, 0x34, 0x58, 0x10, 0x0, 0x27, 0x57, 0x0, 0x0, 0x0, 0x47, 0x57, 0x0, 0x0, 0x0, 0xE7, 0x37, 0x70, 0x10, 0x0, 0x27, 0x38, 0x78, 0x10, 0x0, 0x67, 0x57, 0x0, 0x0, 0x0, 0x87, 0x57, 0x0, 0x0, 0x0, 0xA7, 0x57, 0x0, 0x0, 0x0, 0xE7, 0x3B, 0x80, 0x10, 0x0, 0x27, 0x3C, 0x88, 0x10, 0x0, 0x67, 0x3C, 0x90, 0x10, 0x0, 0xA7, 0x3C, 0x98, 0x10, 0x0, 0xC7, 0x57, 0x0, 0x0, 0x0, 0xC7, 0x33, 0xA0, 0x10, 0x0, 0x7, 0x34, 0xA8, 0x10, 0x0, 0xE7, 0x57, 0x0, 0x0, 0x0, 0x7, 0x58, 0x0, 0x0, 0x0, 0x27, 0x58, 0x0, 0x0, 0x0, 0x47, 0x58, 0x0, 0x0, 0x0, 0x67, 0x58, 0x0, 0x0, 0x0, 0x87, 0x58, 0x0, 0x0, 0x0, 0xA7, 0x58, 0x0, 0x0, 0x0, 0xC7, 0x58, 0x0, 0x0, 0x0, 0xE7, 0x58, 0x0, 0x0, 0x0, 0x7, 0x59, 0x0, 0x0, 0x0, 0x27, 0x59, 0x0, 0x0, 0x0, 0x47, 0x59, 0x0, 0x0, 0x0, 0x67, 0x59, 0x0, 0x0, 0x0, 0x87, 0x59, 0x0, 0x0, 0x0, 0xA7, 0x59, 0x0, 0x0, 0x0, 0xC7, 0x59, 0x0, 0x0, 0x0, 0xE7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x5A, 0x0, 0x0, 0x0, 0x27, 0x5A, 0x0, 0x0, 0x0, 0x47, 0x5A, 0x0, 0x0, 0x0, 0x67, 0x5A, 0x0, 0x0, 0x0, 0x87, 0x5A, 0x0, 0x0, 0x0, 0xA7, 0x5A, 0x0, 0x0, 0x0, 0xC7, 0x5A, 0x0, 0x0, 0x0, 0xE7, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x5B, 0x0, 0x0, 0x0, 0x7, 0x0, 0xC8, 0x16, 0x0, 0x7, 0x0, 0xD0, 0x16, 0x0, 0x7, 0x0, 0xD8, 0x16, 0x0, 0x7, 0x0, 0xE0, 0x16, 0x0, 0x7, 0x0, 0xE8, 0x16, 0x0, 0x7, 0x0, 0xF0, 0x16, 0x0, 0x7, 0x0, 0xC8, 0x15, 0x0, 0x7, 0x0, 0xD0, 0x15, 0x0, 0x7, 0x0, 0xF8, 0x16, 0x0, 0x7, 0x0, 0x0, 0x17, 0x0, 0x7, 0x0, 0x8, 0x17, 0x0, 0x7, 0x0, 0xD8, 0x15, 0x0, 0x7, 0x0, 0x10, 0x17, 0x0, 0x7, 0x0, 0x18, 0x17, 0x0, 0x7, 0x0, 0x20, 0x17, 0x0, 0x7, 0x0, 0x28, 0x17, 0x0, 0x7, 0x0, 0x30, 0x17, 0x0, 0x7, 0x0, 0x38, 0x17, 0x0, 0x7, 0x0, 0x40, 0x17, 0x0, 0x7, 0x0, 0x48, 0x17, 0x0, 0x7, 0x0, 0x50, 0x17, 0x0, 0x7, 0x0, 0x58, 0x17, 0x0, 0x7, 0x0, 0x60, 0x17, 0x0, 0x7, 0x0, 0x68, 0x17, 0x0, 0x7, 0x0, 0xF8, 0x15, 0x0, 0x7, 0x0, 0x0, 0x16, 0x0, 0x7, 0x0, 0x8, 0x16, 0x0, 0x7, 0x0, 0x10, 0x16, 0x0, 0x7, 0x0, 0x18, 0x16, 0x0, 0x7, 0x0, 0x20, 0x16, 0x0, 0x7, 0x0, 0x28, 0x16, 0x0, 0x7, 0x0, 0x30, 0x16, 0x0, 0x7, 0x0, 0x38, 0x16, 0x0, 0x7, 0x0, 0x40, 0x16, 0x0, 0x7, 0x0, 0x58, 0x16, 0x0, 0x7, 0x0, 0x60, 0x16, 0x0, 0x7, 0x0, 0x68, 0x16, 0x0, 0x7, 0x0, 0x70, 0x16, 0x0, 0x7, 0x0, 0x78, 0x16, 0x0, 0x7, 0x0, 0x80, 0x16, 0x0, 0x7, 0x0, 0x88, 0x16, 0x0, 0x7, 0x0, 0x90, 0x16, 0x0, 0x7, 0x0, 0x98, 0x16, 0x0, 0x7, 0x0, 0xA0, 0x16, 0x0, 0x7, 0x0, 0xA8, 0x16, 0x0, 0x7, 0x0, 0xB0, 0x16, 0x0, 0x7, 0x0, 0xB8, 0x16, 0x0, 0x7, 0x0, 0xC0, 0x16, 0x0, 0x47, 0x46, 0x0, 0x0, 0x0, 0xC7, 0x5D, 0x0, 0x0, 0x0, 0xE7, 0x5D, 0x0, 0x0, 0x0, 0x7, 0x5E, 0x0, 0x0, 0x0, 0x27, 0x5E, 0x0, 0x0, 0x0, 0x47, 0x5E, 0x0, 0x0, 0x0, 0x67, 0x5E, 0x0, 0x0, 0x0, 0xA7, 0x46, 0x0, 0x0, 0x0, 0xC7, 0x46, 0x0, 0x0, 0x0, 0xE7, 0x46, 0x0, 0x0, 0x0, 0x7, 0x47, 0x0, 0x0, 0x0, 0x27, 0x47, 0x0, 0x0, 0x0, 0x47, 0x47, 0x0, 0x0, 0x0, 0x7, 0x0, 0x70, 0x17, 0x0, 0x7, 0x0, 0x78, 0x17, 0x0, 0x7, 0x0, 0x80, 0x17, 0x0, 0x7, 0x0, 0x88, 0x17, 0x0, 0x7, 0x0, 0x90, 0x17, 0x0, 0x7, 0x0, 0x98, 0x17, 0x0, 0x7, 0x0, 0xC0, 0x12, 0x0, 0x7, 0x0, 0x28, 0x11, 0x0, 0x7, 0x0, 0x30, 0x11, 0x0, 0x7, 0x0, 0x38, 0x11, 0x0, 0x7, 0x0, 0x40, 0x11, 0x0, 0x7, 0x0, 0x48, 0x11, 0x0, 0x7, 0x0, 0x50, 0x11, 0x0, 0x7, 0x0, 0x80, 0x12, 0x0, 0x7, 0x0, 0x58, 0x11, 0x0, 0x7, 0x0, 0x60, 0x11, 0x0, 0x7, 0x0, 0x88, 0x12, 0x0, 0x7, 0x0, 0x90, 0x12, 0x0, 0x7, 0x0, 0x98, 0x12, 0x0, 0x7, 0x0, 0xA0, 0x12, 0x0, 0x7, 0x0, 0x70, 0x11, 0x0, 0x7, 0x0, 0x78, 0x11, 0x0, 0x7, 0x0, 0x80, 0x11, 0x0, 0x7, 0x0, 0x88, 0x11, 0x0, 0xC7, 0x40, 0x0, 0x0, 0x0, 0xE7, 0x40, 0x0, 0x0, 0x0, 0x7, 0x41, 0x0, 0x0, 0x0, 0x67, 0x41, 0x0, 0x0, 0x0, 0x87, 0x41, 0x0, 0x0, 0x0, 0xA7, 0x41, 0x0, 0x0, 0x0, 0xC7, 0x41, 0x0, 0x0, 0x0, 0xE7, 0x41, 0x0, 0x0, 0x0, 0x7, 0x42, 0x0, 0x0, 0x0, 0x27, 0x42, 0x0, 0x0, 0x0, 0x47, 0x42, 0x0, 0x0, 0x0, 0x67, 0x42, 0x0, 0x0, 0x0, 0x87, 0x42, 0x0, 0x0, 0x0, 0xA7, 0x42, 0x0, 0x0, 0x0, 0x87, 0x5E, 0x0, 0x0, 0x0, 0xA7, 0x5E, 0x0, 0x0, 0x0, 0xC7, 0x5E, 0x0, 0x0, 0x0, 0xE7, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x27, 0x5F, 0x0, 0x0, 0x0, 0xE7, 0x3F, 0x48, 0xE, 0x0, 0x7, 0x40, 0x58, 0xE, 0x0, 0x27, 0x40, 0x68, 0xE, 0x0, 0x47, 0x40, 0x78, 0xE, 0x0, 0x67, 0x40, 0x88, 0xE, 0x0, 0x87, 0x40, 0x98, 0xE, 0x0, 0xA7, 0x40, 0xA8, 0xE, 0x0, 0x7, 0x0, 0xD0, 0x17, 0x0, 0x7, 0x0, 0xD8, 0x17, 0x0, 0x7, 0x0, 0xE0, 0x17, 0x0, 0x7, 0x0, 0xE8, 0x17, 0x0, 0x7, 0x0, 0xF0, 0x17, 0x0, 0x7, 0x0, 0xF8, 0x17, 0x0, 0x7, 0x0, 0x0, 0x18, 0x0, 0x7, 0x0, 0x8, 0x18, 0x0, 0x7, 0x0, 0x10, 0x18, 0x0, 0x7, 0x0, 0x18, 0x18, 0x0, 0x7, 0x0, 0x20, 0x18, 0x0, 0x7, 0x0, 0x28, 0x18, 0x0, 0x7, 0x0, 0x30, 0x18, 0x0, 0x7, 0x0, 0x38, 0x18, 0x0, 0x7, 0x0, 0x40, 0x18, 0x0, 0x7, 0x0, 0x48, 0x18, 0x0, 0x7, 0x0, 0x50, 0x18, 0x0, 0x7, 0x0, 0x58, 0x18, 0x0, 0x7, 0x0, 0x60, 0x18, 0x0, 0x7, 0x0, 0x68, 0x18, 0x0, 0x7, 0x0, 0x70, 0x18, 0x0, 0x7, 0x0, 0x78, 0x18, 0x0, 0x7, 0x0, 0x80, 0x18, 0x0, 0x7, 0x0, 0x88, 0x18, 0x0, 0x7, 0x0, 0x90, 0x18, 0x0, 0x7, 0x0, 0x98, 0x18, 0x0, 0x7, 0x0, 0xA0, 0x18, 0x0, 0x7, 0x0, 0xA8, 0x18, 0x0, 0x7, 0x0, 0xB0, 0x18, 0x0, 0x7, 0x0, 0xB8, 0x18, 0x0, 0x7, 0x0, 0xC0, 0x18, 0x0, 0x27, 0x63, 0x0, 0x0, 0x0, 0x47, 0x63, 0x0, 0x0, 0x0, 0x67, 0x63, 0x0, 0x0, 0x0, 0x87, 0x63, 0x0, 0x0, 0x0, 0xA7, 0x63, 0x0, 0x0, 0x0, 0xC7, 0x63, 0x0, 0x0, 0x0, 0x7, 0x0, 0xF8, 0x18, 0x0, 0x7, 0x0, 0x0, 0x19, 0x0, 0x7, 0x0, 0x8, 0x19, 0x0, 0x7, 0x0, 0x10, 0x19, 0x0, 0x7, 0x0, 0x18, 0x19, 0x0, 0x7, 0x0, 0x20, 0x19, 0x0, 0x7, 0x0, 0x28, 0x19, 0x0, 0x7, 0x0, 0x30, 0x19, 0x0, 0x7, 0x0, 0x38, 0x19, 0x0, 0x7, 0x0, 0x40, 0x19, 0x0, 0x7, 0x0, 0x48, 0x19, 0x0, 0x7, 0x0, 0x50, 0x19, 0x0, 0x7, 0x0, 0x58, 0x19, 0x0, 0x7, 0x0, 0x60, 0x19, 0x0, 0x7, 0x0, 0x68, 0x19, 0x0, 0x7, 0x0, 0x70, 0x19, 0x0, 0x7, 0x0, 0x78, 0x19, 0x0, 0x7, 0x0, 0x80, 0x19, 0x0, 0x7, 0x0, 0x88, 0x19, 0x0, 0x7, 0x0, 0x90, 0x19, 0x0, 0x7, 0x0, 0x98, 0x19, 0x0, 0x7, 0x0, 0xA0, 0x19, 0x0, 0x7, 0x0, 0xA8, 0x19, 0x0, 0x7, 0x0, 0xB0, 0x19, 0x0, 0x7, 0x0, 0xB8, 0x19, 0x0, 0x7, 0x0, 0xC0, 0x19, 0x0, 0x7, 0x0, 0xC8, 0x19, 0x0, 0x7, 0x0, 0xD0, 0x19, 0x0, 0x7, 0x0, 0xD8, 0x19, 0x0, 0x7, 0x0, 0xE0, 0x19, 0x0, 0x7, 0x0, 0xE8, 0x19, 0x0, 0x7, 0x0, 0xF0, 0x19, 0x0, 0x7, 0x0, 0xF8, 0x19, 0x0, 0xC7, 0x40, 0x40, 0x10, 0x0, 0xE7, 0x40, 0x48, 0x10, 0x0, 0x7, 0x41, 0x50, 0x10, 0x0, 0x7, 0x68, 0x0, 0x0, 0x0, 0x27, 0x68, 0x0, 0x0, 0x0, 0x47, 0x68, 0x0, 0x0, 0x0, 0x47, 0x42, 0x30, 0x10, 0x0, 0x67, 0x68, 0x0, 0x0, 0x0, 0x87, 0x68, 0x0, 0x0, 0x0, 0xA7, 0x68, 0x0, 0x0, 0x0, 0x27, 0x18, 0x0, 0x0, 0x0, 0x67, 0x31, 0x0, 0x0, 0x0, 0x87, 0x31, 0x0, 0x0, 0x0, 0xC7, 0x31, 0x0, 0x0, 0x0, 0xE7, 0x31, 0x0, 0x0, 0x0, 0x7, 0x32, 0x0, 0x0, 0x0, 0x27, 0x32, 0x0, 0x0, 0x0, 0x47, 0x32, 0x0, 0x0, 0x0, 0x67, 0x32, 0x0, 0x0, 0x0, 0xA7, 0x32, 0x0, 0x0, 0x0, 0xE7, 0x65, 0x0, 0x0, 0x0, 0x7, 0x66, 0x0, 0x0, 0x0, 0x27, 0x66, 0x0, 0x0, 0x0, 0x47, 0x66, 0x0, 0x0, 0x0, 0x67, 0x66, 0x0, 0x0, 0x0, 0x87, 0x66, 0x0, 0x0, 0x0, 0xA7, 0x66, 0x0, 0x0, 0x0, 0xC7, 0x66, 0x0, 0x0, 0x0, 0x7, 0x67, 0x0, 0x0, 0x0, 0x27, 0x67, 0x0, 0x0, 0x0, 0x47, 0x67, 0x0, 0x0, 0x0, 0x67, 0x67, 0x0, 0x0, 0x0, 0x87, 0x67, 0x0, 0x0, 0x0, 0xA7, 0x67, 0x0, 0x0, 0x0, 0xC7, 0x67, 0x0, 0x0, 0x0, 0xC7, 0x68, 0x0, 0x0, 0x0, 0xE7, 0x68, 0x0, 0x0, 0x0, 0x7, 0x69, 0x0, 0x0, 0x0, 0x27, 0x69, 0x0, 0x0, 0x0, 0x27, 0x3F, 0x58, 0xF, 0x0, 0x87, 0x3F, 0x68, 0xF, 0x0, 0x7, 0x0, 0x18, 0xD, 0x0, 0x7, 0x0, 0x28, 0xD, 0x0, 0x7, 0x0, 0xA8, 0xD, 0x0, 0x7, 0x0, 0xF8, 0xD, 0x0, 0x7, 0x0, 0x18, 0xE, 0x0, 0x7, 0x0, 0x38, 0xE, 0x0, 0x7, 0x0, 0x48, 0xE, 0x0, 0x7, 0x0, 0x68, 0xE, 0x0, 0x7, 0x0, 0x78, 0xF, 0x0, 0x7, 0x0, 0xF0, 0x18, 0x0, 0x7, 0x0, 0xD0, 0xC, 0x0, 0x7, 0x0, 0x50, 0x1A, 0x0, 0x67, 0x69, 0x0, 0x0, 0x0, 0x87, 0x69, 0x0, 0x0, 0x0, 0xA7, 0x69, 0x0, 0x0, 0x0, 0xC7, 0x69, 0x0, 0x0, 0x0, 0xE7, 0x69, 0x0, 0x0, 0x0, 0x7, 0x6A, 0x0, 0x0, 0x0, 0x27, 0x6A, 0x0, 0x0, 0x0, 0x47, 0x6A, 0x0, 0x0, 0x0, 0x67, 0x6A, 0x0, 0x0, 0x0, 0x87, 0x6A, 0x0, 0x0, 0x0, 0xA7, 0x6A, 0x0, 0x0, 0x0, 0xC7, 0x6A, 0x0, 0x0, 0x0, 0xE7, 0x6A, 0x0, 0x0, 0x0, 0x7, 0x6B, 0x0, 0x0, 0x0, 0x27, 0x6B, 0x0, 0x0, 0x0, 0x47, 0x6B, 0x0, 0x0, 0x0, 0x67, 0x6B, 0x0, 0x0, 0x0, 0x87, 0x6B, 0x0, 0x0, 0x0, 0xA7, 0x6B, 0x0, 0x0, 0x0, 0xC7, 0x6B, 0x0, 0x0, 0x0, 0x7, 0x0, 0xF8, 0x1A, 0x0, 0x7, 0x0, 0xC0, 0x10, 0x0, 0x7, 0x0, 0xE0, 0x18, 0x0, 0x7, 0x0, 0xE8, 0x18, 0x0, 0x7, 0x0, 0x0, 0x1B, 0x0, 0x7, 0x0, 0x8, 0x1B, 0x0, 0x7, 0x0, 0x10, 0x1B, 0x0, 0x7, 0x0, 0xA0, 0xD, 0x0, 0x7, 0x0, 0x18, 0x1B, 0x0, 0x87, 0x6C, 0x0, 0x0, 0x0, 0xA7, 0x6C, 0x0, 0x0, 0x0, 0xC7, 0x6C, 0x0, 0x0, 0x0, 0xE7, 0x6C, 0x0, 0x0, 0x0, 0x7, 0x6D, 0x0, 0x0, 0x0, 0x27, 0x6D, 0x0, 0x0, 0x0, 0x47, 0x6D, 0x0, 0x0, 0x0, 0x67, 0x6D, 0x0, 0x0, 0x0, 0x87, 0x6D, 0x0, 0x0, 0x0, 0xA7, 0x6D, 0x0, 0x0, 0x0, 0xC7, 0x6D, 0x0, 0x0, 0x0, 0xE7, 0x6D, 0x0, 0x0, 0x0, 0x7, 0x6E, 0x0, 0x0, 0x0, 0x27, 0x6E, 0x0, 0x0, 0x0, 0x47, 0x6E, 0x0, 0x0, 0x0, 0x67, 0x6E, 0x0, 0x0, 0x0, 0x87, 0x6E, 0x0, 0x0, 0x0, 0xA7, 0x6E, 0x0, 0x0, 0x0, 0xC7, 0x56, 0x0, 0x0, 0x0, 0xC7, 0x6E, 0x0, 0x0, 0x0, 0x67, 0x6C, 0x0, 0x0, 0x0, 0xE7, 0x6E, 0x0, 0x0, 0x0, 0x7, 0x6F, 0x0, 0x0, 0x0, 0x27, 0x6F, 0x0, 0x0, 0x0, 0x47, 0x6F, 0x0, 0x0, 0x0, 0x67, 0x6F, 0x0, 0x0, 0x0, 0x87, 0x6F, 0x0, 0x0, 0x0, 0xA7, 0x6F, 0x0, 0x0, 0x0, 0xC7, 0x6F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x40, 0x1B, 0x0, 0x7, 0x0, 0x48, 0x1B, 0x0, 0x7, 0x0, 0x50, 0x1B, 0x0, 0x7, 0x0, 0xF8, 0x1B, 0x0, 0x7, 0x0, 0x58, 0x1B, 0x0, 0x7, 0x0, 0x60, 0x1B, 0x0, 0x7, 0x0, 0x68, 0x1B, 0x0, 0x7, 0x0, 0x70, 0x1B, 0x0, 0x7, 0x0, 0x78, 0x1B, 0x0, 0x7, 0x0, 0x80, 0x1B, 0x0, 0x7, 0x0, 0x88, 0x1B, 0x0, 0x7, 0x0, 0x90, 0x1B, 0x0, 0x7, 0x0, 0x98, 0x1B, 0x0, 0x7, 0x0, 0xA0, 0x1B, 0x0, 0x7, 0x0, 0xA8, 0x1B, 0x0, 0x7, 0x0, 0xB0, 0x1B, 0x0, 0x7, 0x0, 0xB8, 0x1B, 0x0, 0x7, 0x0, 0xC0, 0x1B, 0x0, 0x7, 0x0, 0xC8, 0x1B, 0x0, 0x7, 0x0, 0xA8, 0x15, 0x0, 0x7, 0x0, 0xD0, 0x1B, 0x0, 0x7, 0x0, 0xD8, 0x1B, 0x0, 0x7, 0x0, 0xE0, 0x1B, 0x0, 0x7, 0x0, 0xE8, 0x1B, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x28, 0x70, 0x0, 0x0, 0x0, 0x48, 0x70, 0x0, 0x0, 0x0, 0x68, 0x70, 0x0, 0x0, 0x0, 0x88, 0x70, 0x0, 0x0, 0x0, 0xA8, 0x70, 0x0, 0x0, 0x0, 0xC8, 0x70, 0x0, 0x0, 0x0, 0xE8, 0x70, 0x0, 0x0, 0x0, 0x8, 0x71, 0x0, 0x0, 0x0, 0x28, 0x71, 0x0, 0x0, 0x0, 0x48, 0x71, 0x0, 0x0, 0x0, 0x68, 0x71, 0x0, 0x0, 0x0, 0x88, 0x71, 0x0, 0x0, 0x0, 0xA8, 0x71, 0x0, 0x0, 0x0, 0xC8, 0x71, 0x0, 0x0, 0x0, 0xE8, 0x71, 0x0, 0x0, 0x0, 0x8, 0x72, 0x0, 0x0, 0x0, 0x28, 0x72, 0x0, 0x0, 0x0, 0x48, 0x72, 0x0, 0x0, 0x0, 0x68, 0x72, 0x0, 0x0, 0x0, 0x88, 0x72, 0x0, 0x0, 0x0, 0xA8, 0x72, 0x0, 0x0, 0x0, 0xC8, 0x72, 0x0, 0x0, 0x0, 0xE8, 0x72, 0x0, 0x0, 0x0, 0x8, 0x73, 0x0, 0x0, 0x0, 0x28, 0x73, 0x0, 0x0, 0x0, 0x48, 0x73, 0x0, 0x0, 0x0, 0x68, 0x73, 0x0, 0x0, 0x0, 0x88, 0x73, 0x0, 0x0, 0x0, 0xA8, 0x73, 0x0, 0x0, 0x0, 0xC8, 0x73, 0x0, 0x0, 0x0, 0xE8, 0x73, 0x0, 0x0, 0x0, 0x8, 0x74, 0x0, 0x0, 0x0, 0x28, 0x74, 0x0, 0x0, 0x0, 0x48, 0x74, 0x0, 0x0, 0x0, 0x68, 0x74, 0x0, 0x0, 0x0, 0x88, 0x74, 0x0, 0x0, 0x0, 0xA8, 0x74, 0x0, 0x0, 0x0, 0xC8, 0x74, 0x0, 0x0, 0x0, 0xE8, 0x74, 0x0, 0x0, 0x0, 0x8, 0x75, 0x0, 0x0, 0x0, 0x28, 0x75, 0x0, 0x0, 0x0, 0x48, 0x75, 0x0, 0x0, 0x0, 0x68, 0x75, 0x0, 0x0, 0x0, 0x88, 0x75, 0x0, 0x0, 0x0, 0xA8, 0x75, 0x0, 0x0, 0x0, 0xC8, 0x75, 0x0, 0x0, 0x0, 0xE8, 0x75, 0x0, 0x0, 0x0, 0x8, 0x76, 0x0, 0x0, 0x0, 0x28, 0x76, 0x0, 0x0, 0x0, 0x48, 0x76, 0x0, 0x0, 0x0, 0x68, 0x76, 0x0, 0x0, 0x0, 0x88, 0x76, 0x0, 0x0, 0x0, 0xA8, 0x76, 0x0, 0x0, 0x0, 0xC8, 0x76, 0x0, 0x0, 0x0, 0xE8, 0x76, 0x0, 0x0, 0x0, 0x8, 0x77, 0x0, 0x0, 0x0, 0x28, 0x77, 0x0, 0x0, 0x0, 0x48, 0x77, 0x0, 0x0, 0x0, 0x68, 0x77, 0x0, 0x0, 0x0, 0x88, 0x77, 0x0, 0x0, 0x0, 0xA8, 0x77, 0x0, 0x0, 0x0, 0xC8, 0x77, 0x0, 0x0, 0x0, 0xE8, 0x77, 0x0, 0x0, 0x0, 0x8, 0x78, 0x0, 0x0, 0x0, 0x28, 0x78, 0x0, 0x0, 0x0, 0x48, 0x78, 0x0, 0x0, 0x0, 0x68, 0x78, 0x0, 0x0, 0x0, 0x88, 0x78, 0x0, 0x0, 0x0, 0xA8, 0x78, 0x0, 0x0, 0x0, 0xC8, 0x78, 0x0, 0x0, 0x0, 0xE8, 0x78, 0x0, 0x0, 0x0, 0x8, 0x79, 0x0, 0x0, 0x0, 0x28, 0x79, 0x0, 0x0, 0x0, 0x48, 0x79, 0x0, 0x0, 0x0, 0x68, 0x79, 0x0, 0x0, 0x0, 0x88, 0x79, 0x0, 0x0, 0x0, 0xA8, 0x79, 0x0, 0x0, 0x0, 0xC8, 0x79, 0x0, 0x0, 0x0, 0xE8, 0x79, 0x0, 0x0, 0x0, 0x8, 0x7A, 0x0, 0x0, 0x0, 0x28, 0x7A, 0x0, 0x0, 0x0, 0x48, 0x7A, 0x0, 0x0, 0x0, 0x68, 0x7A, 0x0, 0x0, 0x0, 0x88, 0x7A, 0x0, 0x0, 0x0, 0xA8, 0x7A, 0x0, 0x0, 0x0, 0xC8, 0x7A, 0x0, 0x0, 0x0, 0xE8, 0x7A, 0x0, 0x0, 0x0, 0x8, 0x7B, 0x0, 0x0, 0x0, 0x28, 0x7B, 0x0, 0x0, 0x0, 0x48, 0x7B, 0x0, 0x0, 0x0, 0x68, 0x7B, 0x0, 0x0, 0x0, 0x88, 0x7B, 0x0, 0x0, 0x0, 0xA8, 0x7B, 0x0, 0x0, 0x0, 0xC8, 0x7B, 0x0, 0x0, 0x0, 0xE8, 0x7B, 0x0, 0x0, 0x0, 0x8, 0x7C, 0x0, 0x0, 0x0, 0x28, 0x7C, 0x0, 0x0, 0x0, 0x48, 0x7C, 0x0, 0x0, 0x0, 0x68, 0x7C, 0x0, 0x0, 0x0, 0x88, 0x7C, 0x0, 0x0, 0x0, 0xA8, 0x7C, 0x0, 0x0, 0x0, 0xC8, 0x7C, 0x0, 0x0, 0x0, 0xE8, 0x7C, 0x0, 0x0, 0x0, 0x8, 0x7D, 0x0, 0x0, 0x0, 0x28, 0x7D, 0x0, 0x0, 0x0, 0x48, 0x7D, 0x0, 0x0, 0x0, 0x68, 0x7D, 0x0, 0x0, 0x0, 0x88, 0x7D, 0x0, 0x0, 0x0, 0xA8, 0x7D, 0x0, 0x0, 0x0, 0xC8, 0x7D, 0x0, 0x0, 0x0, 0xE8, 0x7D, 0x0, 0x0, 0x0, 0x8, 0x7E, 0x0, 0x0, 0x0, 0x28, 0x7E, 0x0, 0x0, 0x0, 0x48, 0x7E, 0x0, 0x0, 0x0, 0x68, 0x7E, 0x0, 0x0, 0x0, 0x88, 0x7E, 0x0, 0x0, 0x0, 0xA8, 0x7E, 0x0, 0x0, 0x0, 0xC8, 0x7E, 0x0, 0x0, 0x0, 0xE8, 0x7E, 0x0, 0x0, 0x0, 0x8, 0x7F, 0x0, 0x0, 0x0, 0x28, 0x7F, 0x0, 0x0, 0x0, 0x48, 0x7F, 0x0, 0x0, 0x0, 0x68, 0x7F, 0x0, 0x0, 0x0, 0x88, 0x7F, 0x0, 0x0, 0x0, 0xA8, 0x7F, 0x0, 0x0, 0x0, 0xC8, 0x7F, 0x0, 0x0, 0x0, 0xE8, 0x7F, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, 0x28, 0x80, 0x0, 0x0, 0x0, 0x48, 0x80, 0x0, 0x0, 0x0, 0x68, 0x80, 0x0, 0x0, 0x0, 0x88, 0x80, 0x0, 0x0, 0x0, 0xA8, 0x80, 0x0, 0x0, 0x0, 0xC8, 0x80, 0x0, 0x0, 0x0, 0xE8, 0x80, 0x0, 0x0, 0x0, 0x8, 0x81, 0x0, 0x0, 0x0, 0x28, 0x81, 0x0, 0x0, 0x0, 0x48, 0x81, 0x0, 0x0, 0x0, 0x68, 0x81, 0x0, 0x0, 0x0, 0x88, 0x81, 0x0, 0x0, 0x0, 0xA8, 0x81, 0x0, 0x0, 0x0, 0xC8, 0x81, 0x0, 0x0, 0x0, 0xE8, 0x81, 0x0, 0x0, 0x0, 0x8, 0x82, 0x0, 0x0, 0x0, 0x28, 0x82, 0x0, 0x0, 0x0, 0x48, 0x82, 0x0, 0x0, 0x0, 0x68, 0x82, 0x0, 0x0, 0x0, 0x88, 0x82, 0x0, 0x0, 0x0, 0xA8, 0x82, 0x0, 0x0, 0x0, 0xC8, 0x82, 0x0, 0x0, 0x0, 0xE8, 0x82, 0x0, 0x0, 0x0, 0x8, 0x83, 0x0, 0x0, 0x0, 0x28, 0x83, 0x0, 0x0, 0x0, 0x48, 0x83, 0x0, 0x0, 0x0, 0x68, 0x83, 0x0, 0x0, 0x0, 0x88, 0x83, 0x0, 0x0, 0x0, 0xA8, 0x83, 0x0, 0x0, 0x0, 0x8, 0x0, 0x38, 0x20, 0x0, 0xC8, 0x83, 0x0, 0x0, 0x0, 0xE8, 0x83, 0x0, 0x0, 0x0, 0x8, 0x84, 0x0, 0x0, 0x0, 0x28, 0x84, 0x0, 0x0, 0x0, 0x48, 0x84, 0x0, 0x0, 0x0, 0x68, 0x84, 0x0, 0x0, 0x0, 0x88, 0x84, 0x0, 0x0, 0x0, 0xA8, 0x84, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF0, 0x1E, 0x0, 0x8, 0x0, 0x10, 0x20, 0x0, 0x8, 0x0, 0xE0, 0x1E, 0x0, 0x8, 0x0, 0x30, 0x21, 0x0, 0x8, 0x0, 0x38, 0x21, 0x0, 0x8, 0x0, 0x40, 0x21, 0x0, 0x8, 0x0, 0x48, 0x21, 0x0, 0x8, 0x0, 0x50, 0x21, 0x0, 0x68, 0x85, 0x0, 0x0, 0x0, 0x88, 0x85, 0x0, 0x0, 0x0, 0xA8, 0x85, 0x0, 0x0, 0x0, 0xC8, 0x85, 0x0, 0x0, 0x0, 0xE8, 0x85, 0x0, 0x0, 0x0, 0x8, 0x86, 0x0, 0x0, 0x0, 0x28, 0x86, 0x0, 0x0, 0x0, 0x48, 0x86, 0x0, 0x0, 0x0, 0x68, 0x86, 0x0, 0x0, 0x0, 0x88, 0x86, 0x0, 0x0, 0x0, 0xA8, 0x86, 0x0, 0x0, 0x0, 0xC8, 0x86, 0x0, 0x0, 0x0, 0x8, 0x0, 0xB8, 0x21, 0x0, 0x8, 0x87, 0x0, 0x0, 0x0, 0x28, 0x87, 0x0, 0x0, 0x0, 0x48, 0x87, 0x0, 0x0, 0x0, 0x68, 0x87, 0x0, 0x0, 0x0, 0x88, 0x87, 0x0, 0x0, 0x0, 0xA8, 0x87, 0x0, 0x0, 0x0, 0xC8, 0x87, 0x0, 0x0, 0x0, 0xE8, 0x87, 0x0, 0x0, 0x0, 0x8, 0x88, 0x0, 0x0, 0x0, 0x28, 0x88, 0x0, 0x0, 0x0, 0x48, 0x88, 0x0, 0x0, 0x0, 0x68, 0x88, 0x0, 0x0, 0x0, 0x88, 0x88, 0x0, 0x0, 0x0, 0xA8, 0x88, 0x0, 0x0, 0x0, 0xC8, 0x88, 0x0, 0x0, 0x0, 0xE8, 0x88, 0x0, 0x0, 0x0, 0x8, 0x89, 0x0, 0x0, 0x0, 0x28, 0x89, 0x0, 0x0, 0x0, 0x48, 0x89, 0x0, 0x0, 0x0, 0x68, 0x89, 0x0, 0x0, 0x0, 0x88, 0x89, 0x0, 0x0, 0x0, 0xA8, 0x89, 0x0, 0x0, 0x0, 0xC8, 0x89, 0x0, 0x0, 0x0, 0xE8, 0x89, 0x0, 0x0, 0x0, 0x8, 0x8A, 0x0, 0x0, 0x0, 0x28, 0x8A, 0x0, 0x0, 0x0, 0x48, 0x8A, 0x0, 0x0, 0x0, 0x68, 0x8A, 0x0, 0x0, 0x0, 0x88, 0x8A, 0x0, 0x0, 0x0, 0xA8, 0x8A, 0x0, 0x0, 0x0, 0xC8, 0x8A, 0x0, 0x0, 0x0, 0xE8, 0x8A, 0x0, 0x0, 0x0, 0x8, 0x8B, 0x0, 0x0, 0x0, 0x28, 0x8B, 0x0, 0x0, 0x0, 0x48, 0x8B, 0x0, 0x0, 0x0, 0x68, 0x8B, 0x0, 0x0, 0x0, 0x88, 0x8B, 0x0, 0x0, 0x0, 0xA8, 0x8B, 0x0, 0x0, 0x0, 0xC8, 0x8B, 0x0, 0x0, 0x0, 0xE8, 0x8B, 0x0, 0x0, 0x0, 0x8, 0x8C, 0x0, 0x0, 0x0, 0x28, 0x8C, 0x0, 0x0, 0x0, 0x48, 0x8C, 0x0, 0x0, 0x0, 0x68, 0x8C, 0x0, 0x0, 0x0, 0x88, 0x8C, 0x0, 0x0, 0x0, 0xA8, 0x8C, 0x0, 0x0, 0x0, 0x8, 0x0, 0x90, 0x21, 0x0, 0x8, 0x0, 0x98, 0x21, 0x0, 0x8, 0x0, 0xA0, 0x21, 0x0, 0x8, 0x0, 0x30, 0x23, 0x0, 0x8, 0x0, 0xA8, 0x21, 0x0, 0x8, 0x0, 0xB0, 0x21, 0x0, 0x8, 0x0, 0x38, 0x23, 0x0, 0x8, 0x0, 0x40, 0x23, 0x0, 0x8, 0x0, 0x48, 0x23, 0x0, 0x8, 0x0, 0x50, 0x23, 0x0, 0x8, 0x0, 0xC8, 0x21, 0x0, 0x8, 0x0, 0xD0, 0x21, 0x0, 0x8, 0x0, 0xD8, 0x21, 0x0, 0x8, 0x0, 0xE0, 0x21, 0x0, 0x8, 0x0, 0x8, 0x22, 0x0, 0x8, 0x0, 0x10, 0x22, 0x0, 0x8, 0x0, 0x18, 0x22, 0x0, 0x8, 0x0, 0x20, 0x22, 0x0, 0x8, 0x0, 0x28, 0x22, 0x0, 0x8, 0x0, 0x30, 0x22, 0x0, 0x8, 0x0, 0x38, 0x22, 0x0, 0x8, 0x0, 0x40, 0x22, 0x0, 0x8, 0x0, 0x48, 0x22, 0x0, 0x8, 0x0, 0x50, 0x22, 0x0, 0x8, 0x0, 0x58, 0x22, 0x0, 0x8, 0x0, 0x60, 0x22, 0x0, 0x8, 0x0, 0x68, 0x22, 0x0, 0x8, 0x0, 0x70, 0x22, 0x0, 0x8, 0x0, 0x78, 0x22, 0x0, 0x8, 0x0, 0x80, 0x22, 0x0, 0x8, 0x0, 0x88, 0x22, 0x0, 0x8, 0x0, 0x90, 0x22, 0x0, 0x8, 0x0, 0x98, 0x22, 0x0, 0x8, 0x0, 0xA0, 0x22, 0x0, 0x8, 0x0, 0xA8, 0x22, 0x0, 0x8, 0x0, 0xB0, 0x22, 0x0, 0x8, 0x0, 0xB8, 0x22, 0x0, 0x68, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF8, 0x1E, 0x0, 0x88, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0x58, 0x1F, 0x0, 0xA8, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0x78, 0x1F, 0x0, 0xC8, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0x88, 0x1F, 0x0, 0xE8, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0x98, 0x1F, 0x0, 0x8, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xA8, 0x1F, 0x0, 0x28, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xB8, 0x1F, 0x0, 0x48, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xC8, 0x1F, 0x0, 0x68, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xD0, 0x1C, 0x0, 0x88, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xE0, 0x1C, 0x0, 0xA8, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF0, 0x1C, 0x0, 0xC8, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1D, 0x0, 0xE8, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0x10, 0x1D, 0x0, 0x8, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x20, 0x1D, 0x0, 0x28, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x30, 0x1D, 0x0, 0x48, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x40, 0x1D, 0x0, 0x68, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x50, 0x1D, 0x0, 0x88, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x60, 0x1D, 0x0, 0xA8, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x70, 0x1D, 0x0, 0xC8, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x80, 0x1D, 0x0, 0xE8, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x90, 0x1D, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xA0, 0x1D, 0x0, 0x28, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xB0, 0x1D, 0x0, 0x48, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xC0, 0x1D, 0x0, 0x68, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xD0, 0x1D, 0x0, 0x88, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xE0, 0x1D, 0x0, 0xA8, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF0, 0x1D, 0x0, 0xC8, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1E, 0x0, 0xE8, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0x10, 0x1E, 0x0, 0x8, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x20, 0x1E, 0x0, 0x28, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x30, 0x1E, 0x0, 0x48, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x40, 0x1E, 0x0, 0x68, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x50, 0x1E, 0x0, 0x88, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x60, 0x1E, 0x0, 0xA8, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x70, 0x1E, 0x0, 0xC8, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x80, 0x1E, 0x0, 0xE8, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x90, 0x1E, 0x0, 0x8, 0x92, 0x0, 0x0, 0x0, 0x8, 0x0, 0xA0, 0x1E, 0x0, 0x28, 0x92, 0x0, 0x0, 0x0, 0x8, 0x0, 0xB0, 0x1E, 0x0, 0x48, 0x92, 0x0, 0x0, 0x0, 0x8, 0x0, 0xC0, 0x1E, 0x0, 0x8, 0x0, 0x98, 0x24, 0x0, 0x8, 0x0, 0xA0, 0x24, 0x0, 0x8, 0x0, 0xA8, 0x24, 0x0, 0x8, 0x0, 0xB0, 0x24, 0x0, 0x8, 0x0, 0xB8, 0x24, 0x0, 0x8, 0x0, 0xC0, 0x24, 0x0, 0x8, 0x0, 0xC8, 0x24, 0x0, 0x8, 0x0, 0xD0, 0x24, 0x0, 0x8, 0x0, 0xD8, 0x24, 0x0, 0x8, 0x0, 0xE0, 0x24, 0x0, 0x8, 0x0, 0xE8, 0x24, 0x0, 0x8, 0x0, 0xF0, 0x24, 0x0, 0x8, 0x0, 0xF8, 0x24, 0x0, 0x8, 0x0, 0x0, 0x25, 0x0, 0x8, 0x0, 0x8, 0x25, 0x0, 0x8, 0x0, 0x10, 0x25, 0x0, 0x8, 0x0, 0x18, 0x25, 0x0, 0x8, 0x0, 0x20, 0x25, 0x0, 0x8, 0x0, 0x28, 0x25, 0x0, 0x8, 0x0, 0xF8, 0x20, 0x0, 0x8, 0x0, 0x30, 0x25, 0x0, 0x8, 0x0, 0x0, 0x21, 0x0, 0x8, 0x0, 0x8, 0x21, 0x0, 0x8, 0x0, 0x10, 0x21, 0x0, 0x8, 0x0, 0x18, 0x21, 0x0, 0x8, 0x0, 0x20, 0x21, 0x0, 0x8, 0x0, 0x28, 0x21, 0x0, 0x8, 0x0, 0x38, 0x25, 0x0, 0x8, 0x0, 0x40, 0x25, 0x0, 0x8, 0x0, 0x48, 0x25, 0x0, 0x8, 0x0, 0x50, 0x25, 0x0, 0x8, 0x0, 0x58, 0x25, 0x0, 0x8, 0x0, 0x58, 0x21, 0x0, 0x8, 0x0, 0x60, 0x21, 0x0, 0x8, 0x0, 0x68, 0x21, 0x0, 0x8, 0x0, 0x70, 0x21, 0x0, 0x8, 0x0, 0x78, 0x21, 0x0, 0x8, 0x0, 0x80, 0x21, 0x0, 0x8, 0x0, 0x88, 0x21, 0x0, 0x8, 0x0, 0x50, 0x20, 0x0, 0x8, 0x0, 0x60, 0x25, 0x0, 0x8, 0x0, 0x58, 0x20, 0x0, 0x8, 0x0, 0x68, 0x25, 0x0, 0x8, 0x0, 0x70, 0x25, 0x0, 0x8, 0x0, 0x78, 0x25, 0x0, 0x8, 0x0, 0xC8, 0x20, 0x0, 0x8, 0x0, 0x80, 0x25, 0x0, 0x8, 0x0, 0x88, 0x25, 0x0, 0x8, 0x0, 0x90, 0x25, 0x0, 0x8, 0x0, 0x98, 0x25, 0x0, 0x8, 0x0, 0xC0, 0x20, 0x0, 0x8, 0x0, 0xA0, 0x25, 0x0, 0x8, 0x0, 0xA8, 0x25, 0x0, 0x8, 0x0, 0xB0, 0x25, 0x0, 0x8, 0x0, 0xB8, 0x25, 0x0, 0x8, 0x0, 0xC0, 0x25, 0x0, 0x8, 0x0, 0xC8, 0x25, 0x0, 0x8, 0x0, 0xD0, 0x25, 0x0, 0x8, 0x0, 0xD8, 0x25, 0x0, 0x8, 0x0, 0x60, 0x20, 0x0, 0x8, 0x0, 0xE0, 0x25, 0x0, 0x8, 0x0, 0xE8, 0x25, 0x0, 0x8, 0x0, 0xF0, 0x25, 0x0, 0x8, 0x0, 0xF8, 0x25, 0x0, 0x8, 0x0, 0x0, 0x26, 0x0, 0x8, 0x0, 0x8, 0x26, 0x0, 0x8, 0x0, 0x10, 0x26, 0x0, 0x8, 0x0, 0x18, 0x26, 0x0, 0x8, 0x0, 0x20, 0x26, 0x0, 0x8, 0x0, 0x28, 0x26, 0x0, 0x8, 0x0, 0x30, 0x26, 0x0, 0x8, 0x0, 0x38, 0x26, 0x0, 0x8, 0x0, 0x40, 0x26, 0x0, 0x8, 0x0, 0x48, 0x26, 0x0, 0x8, 0x0, 0x50, 0x26, 0x0, 0x8, 0x0, 0x58, 0x26, 0x0, 0x8, 0x0, 0x60, 0x26, 0x0, 0x8, 0x0, 0x68, 0x26, 0x0, 0x8, 0x0, 0x70, 0x26, 0x0, 0x8, 0x0, 0x78, 0x26, 0x0, 0x8, 0x0, 0x80, 0x26, 0x0, 0x8, 0x0, 0x88, 0x26, 0x0, 0x8, 0x0, 0x90, 0x26, 0x0, 0x8, 0x0, 0x98, 0x26, 0x0, 0x8, 0x0, 0xA0, 0x26, 0x0, 0x8, 0x0, 0xA8, 0x26, 0x0, 0x8, 0x0, 0xB0, 0x26, 0x0, 0x8, 0x0, 0xB8, 0x26, 0x0, 0x8, 0x0, 0xC0, 0x26, 0x0, 0x8, 0x0, 0xC8, 0x26, 0x0, 0x8, 0x0, 0xD0, 0x26, 0x0, 0x8, 0x0, 0xD8, 0x26, 0x0, 0x8, 0x0, 0xE0, 0x26, 0x0, 0x8, 0x0, 0xE8, 0x26, 0x0, 0x8, 0x0, 0xF0, 0x26, 0x0, 0x8, 0x0, 0xF8, 0x26, 0x0, 0x8, 0x0, 0x0, 0x27, 0x0, 0x8, 0x0, 0x8, 0x27, 0x0, 0x8, 0x0, 0x10, 0x27, 0x0, 0x8, 0x0, 0x18, 0x27, 0x0, 0x8, 0x0, 0x20, 0x27, 0x0, 0x8, 0x0, 0x28, 0x27, 0x0, 0x8, 0x0, 0x30, 0x27, 0x0, 0x8, 0x0, 0x38, 0x27, 0x0, 0x8, 0x0, 0x40, 0x27, 0x0, 0x8, 0x0, 0x48, 0x27, 0x0, 0x8, 0x0, 0x50, 0x27, 0x0, 0x8, 0x0, 0x58, 0x27, 0x0, 0x8, 0x0, 0x60, 0x27, 0x0, 0x8, 0x0, 0x68, 0x27, 0x0, 0x8, 0x0, 0x70, 0x27, 0x0, 0x8, 0x0, 0x78, 0x27, 0x0, 0x8, 0x0, 0x80, 0x27, 0x0, 0x8, 0x0, 0x88, 0x27, 0x0, 0x8, 0x0, 0x90, 0x27, 0x0, 0x8, 0x0, 0x98, 0x27, 0x0, 0x8, 0x0, 0xA0, 0x27, 0x0, 0x8, 0x0, 0xA8, 0x27, 0x0, 0x8, 0x0, 0xB0, 0x27, 0x0, 0x8, 0x0, 0xB8, 0x27, 0x0, 0x8, 0x0, 0xC0, 0x27, 0x0, 0x8, 0x0, 0xC8, 0x27, 0x0, 0x8, 0x0, 0xD0, 0x27, 0x0, 0x8, 0x0, 0xD8, 0x27, 0x0, 0x8, 0x0, 0xE0, 0x27, 0x0, 0x8, 0x0, 0xE8, 0x27, 0x0, 0x8, 0x0, 0xF0, 0x27, 0x0, 0x8, 0x0, 0xF8, 0x27, 0x0, 0x8, 0x0, 0x0, 0x28, 0x0, 0x8, 0x0, 0x8, 0x28, 0x0, 0x8, 0x0, 0x10, 0x28, 0x0, 0x8, 0x0, 0x18, 0x28, 0x0, 0x8, 0x0, 0x20, 0x28, 0x0, 0x8, 0x0, 0x28, 0x28, 0x0, 0x8, 0x0, 0x30, 0x28, 0x0, 0x8, 0x0, 0x38, 0x28, 0x0, 0x8, 0xA1, 0x0, 0x0, 0x0, 0x28, 0xA1, 0x0, 0x0, 0x0, 0x48, 0xA1, 0x0, 0x0, 0x0, 0x68, 0xA1, 0x0, 0x0, 0x0, 0x88, 0xA1, 0x0, 0x0, 0x0, 0xA8, 0xA1, 0x0, 0x0, 0x0, 0xC8, 0xA1, 0x0, 0x0, 0x0, 0xE8, 0xA1, 0x0, 0x0, 0x0, 0x8, 0xA2, 0x0, 0x0, 0x0, 0x28, 0xA2, 0x0, 0x0, 0x0, 0x48, 0xA2, 0x0, 0x0, 0x0, 0x68, 0xA2, 0x0, 0x0, 0x0, 0x88, 0xA2, 0x0, 0x0, 0x0, 0xA8, 0xA2, 0x0, 0x0, 0x0, 0xC8, 0xA2, 0x0, 0x0, 0x0, 0xE8, 0xA2, 0x0, 0x0, 0x0, 0x8, 0xA3, 0x0, 0x0, 0x0, 0x28, 0xA3, 0x0, 0x0, 0x0, 0x48, 0xA3, 0x0, 0x0, 0x0, 0x8, 0x0, 0xD8, 0x28, 0x0, 0x88, 0xA3, 0x0, 0x0, 0x0, 0x8, 0x0, 0xE8, 0x28, 0x0, 0xC8, 0xA3, 0x0, 0x0, 0x0, 0xE8, 0xA3, 0x0, 0x0, 0x0, 0x8, 0xA4, 0x0, 0x0, 0x0, 0x28, 0xA4, 0x0, 0x0, 0x0, 0x48, 0xA4, 0x0, 0x0, 0x0, 0x88, 0x41, 0x0, 0x0, 0x0, 0xA8, 0x41, 0x0, 0x0, 0x0, 0x68, 0xA4, 0x0, 0x0, 0x0, 0x88, 0xA4, 0x0, 0x0, 0x0, 0xA8, 0xA4, 0x0, 0x0, 0x0, 0xC8, 0xA4, 0x0, 0x0, 0x0, 0xE8, 0xA4, 0x0, 0x0, 0x0, 0x8, 0xA5, 0x0, 0x0, 0x0, 0x28, 0xA5, 0x0, 0x0, 0x0, 0x48, 0xA5, 0x0, 0x0, 0x0, 0x68, 0xA5, 0x0, 0x0, 0x0, 0x88, 0xA5, 0x0, 0x0, 0x0, 0xA8, 0xA5, 0x0, 0x0, 0x0, 0xC8, 0xA5, 0x0, 0x0, 0x0, 0xE8, 0xA5, 0x0, 0x0, 0x0, 0x8, 0xA6, 0x0, 0x0, 0x0, 0x28, 0xA6, 0x0, 0x0, 0x0, 0x48, 0xA6, 0x0, 0x0, 0x0, 0x68, 0xA6, 0x0, 0x0, 0x0, 0x88, 0xA6, 0x0, 0x0, 0x0, 0xA8, 0xA6, 0x0, 0x0, 0x0, 0xC8, 0xA6, 0x0, 0x0, 0x0, 0xE8, 0xA6, 0x0, 0x0, 0x0, 0x8, 0xA7, 0x0, 0x0, 0x0, 0x28, 0xA7, 0x0, 0x0, 0x0, 0x48, 0xA7, 0x0, 0x0, 0x0, 0x68, 0xA7, 0x0, 0x0, 0x0, 0x88, 0xA7, 0x0, 0x0, 0x0, 0xA8, 0xA7, 0x0, 0x0, 0x0, 0xC8, 0xA7, 0x0, 0x0, 0x0, 0xE8, 0xA7, 0x0, 0x0, 0x0, 0x8, 0xA8, 0x0, 0x0, 0x0, 0x28, 0xA8, 0x0, 0x0, 0x0, 0x48, 0xA8, 0x0, 0x0, 0x0, 0x68, 0xA8, 0x0, 0x0, 0x0, 0x88, 0xA8, 0x0, 0x0, 0x0, 0xA8, 0xA8, 0x0, 0x0, 0x0, 0xC8, 0xA8, 0x0, 0x0, 0x0, 0xE8, 0xA8, 0x0, 0x0, 0x0, 0x8, 0xA9, 0x0, 0x0, 0x0, 0x28, 0xA9, 0x0, 0x0, 0x0, 0x48, 0xA9, 0x0, 0x0, 0x0, 0x68, 0xA9, 0x0, 0x0, 0x0, 0x88, 0xA9, 0x0, 0x0, 0x0, 0xA8, 0xA9, 0x0, 0x0, 0x0, 0xC8, 0xA9, 0x0, 0x0, 0x0, 0xE8, 0xA9, 0x0, 0x0, 0x0, 0x8, 0xAA, 0x0, 0x0, 0x0, 0x28, 0xAA, 0x0, 0x0, 0x0, 0x48, 0xAA, 0x0, 0x0, 0x0, 0x68, 0xAA, 0x0, 0x0, 0x0, 0x88, 0xAA, 0x0, 0x0, 0x0, 0xA8, 0xAA, 0x0, 0x0, 0x0, 0xC8, 0xAA, 0x0, 0x0, 0x0, 0xE8, 0xAA, 0x0, 0x0, 0x0, 0x8, 0xAB, 0x0, 0x0, 0x0, 0x28, 0xAB, 0x0, 0x0, 0x0, 0x48, 0xAB, 0x0, 0x0, 0x0, 0x68, 0xAB, 0x0, 0x0, 0x0, 0x88, 0xAB, 0x0, 0x0, 0x0, 0xA8, 0xAB, 0x0, 0x0, 0x0, 0xC8, 0xAB, 0x0, 0x0, 0x0, 0xE8, 0xAB, 0x0, 0x0, 0x0, 0x8, 0xAC, 0x0, 0x0, 0x0, 0x28, 0xAC, 0x0, 0x0, 0x0, 0x48, 0xAC, 0x0, 0x0, 0x0, 0x68, 0xAC, 0x0, 0x0, 0x0, 0x88, 0xAC, 0x0, 0x0, 0x0, 0xA8, 0xAC, 0x0, 0x0, 0x0, 0xC8, 0xAC, 0x0, 0x0, 0x0, 0xE8, 0xAC, 0x0, 0x0, 0x0, 0x8, 0xAD, 0x0, 0x0, 0x0, 0x28, 0xAD, 0x0, 0x0, 0x0, 0x48, 0xAD, 0x0, 0x0, 0x0, 0x68, 0xAD, 0x0, 0x0, 0x0, 0x88, 0xAD, 0x0, 0x0, 0x0, 0xA8, 0xAD, 0x0, 0x0, 0x0, 0xC8, 0xAD, 0x0, 0x0, 0x0, 0xE8, 0xAD, 0x0, 0x0, 0x0, 0x8, 0xAE, 0x0, 0x0, 0x0, 0x28, 0xAE, 0x0, 0x0, 0x0, 0x48, 0xAE, 0x0, 0x0, 0x0, 0x68, 0xAE, 0x0, 0x0, 0x0, 0x88, 0xAE, 0x0, 0x0, 0x0, 0xA8, 0xAE, 0x0, 0x0, 0x0, 0xC8, 0xAE, 0x0, 0x0, 0x0, 0xE8, 0xAE, 0x0, 0x0, 0x0, 0x8, 0xAF, 0x0, 0x0, 0x0, 0x28, 0xAF, 0x0, 0x0, 0x0, 0x48, 0xAF, 0x0, 0x0, 0x0, 0x68, 0xAF, 0x0, 0x0, 0x0, 0x88, 0xAF, 0x0, 0x0, 0x0, 0xA8, 0xAF, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF0, 0x2B, 0x0, 0x8, 0x0, 0xF8, 0x2B, 0x0, 0x8, 0x0, 0x0, 0x2C, 0x0, 0x8, 0x0, 0x8, 0x2C, 0x0, 0x8, 0x0, 0x10, 0x2C, 0x0, 0x8, 0x0, 0x18, 0x2C, 0x0, 0x8, 0x0, 0x20, 0x2C, 0x0, 0x8, 0x0, 0x28, 0x2C, 0x0, 0x8, 0x0, 0x30, 0x2C, 0x0, 0x8, 0x0, 0x38, 0x2C, 0x0, 0x8, 0x0, 0x40, 0x2C, 0x0, 0x8, 0x0, 0x48, 0x2C, 0x0, 0x8, 0x0, 0x50, 0x2C, 0x0, 0x8, 0x0, 0xD8, 0x1D, 0x0, 0x8, 0x0, 0xE8, 0x21, 0x0, 0x8, 0x0, 0x58, 0x2C, 0x0, 0x8, 0x0, 0x60, 0x2C, 0x0, 0x8, 0x0, 0x68, 0x2C, 0x0, 0x8, 0x0, 0x70, 0x2C, 0x0, 0x8, 0x0, 0x78, 0x2C, 0x0, 0x8, 0x0, 0x80, 0x2C, 0x0, 0x8, 0x0, 0x0, 0x22, 0x0, 0x8, 0x0, 0xC0, 0x22, 0x0, 0x8, 0x0, 0xC8, 0x22, 0x0, 0x8, 0x0, 0xD0, 0x22, 0x0, 0x8, 0x0, 0xD8, 0x22, 0x0, 0x8, 0x0, 0xE0, 0x22, 0x0, 0x8, 0x0, 0xE8, 0x22, 0x0, 0x8, 0x0, 0xF0, 0x22, 0x0, 0x8, 0x0, 0x88, 0x2C, 0x0, 0x8, 0x0, 0xF8, 0x22, 0x0, 0x8, 0x0, 0x0, 0x23, 0x0, 0x8, 0x0, 0x8, 0x23, 0x0, 0x8, 0x0, 0x10, 0x23, 0x0, 0x8, 0x0, 0x18, 0x23, 0x0, 0x8, 0x0, 0x20, 0x23, 0x0, 0x8, 0x0, 0x28, 0x23, 0x0, 0x8, 0x0, 0x90, 0x2C, 0x0, 0x8, 0x0, 0x98, 0x2C, 0x0, 0x8, 0x0, 0xA0, 0x2C, 0x0, 0x8, 0x0, 0xA8, 0x2C, 0x0, 0x8, 0x0, 0xB0, 0x2C, 0x0, 0x8, 0x0, 0xB8, 0x2C, 0x0, 0x8, 0x0, 0xC0, 0x2C, 0x0, 0x8, 0x0, 0xC8, 0x2C, 0x0, 0x8, 0x0, 0xD0, 0x2C, 0x0, 0x8, 0x0, 0xD8, 0x2C, 0x0, 0x8, 0x0, 0xE0, 0x2C, 0x0, 0x8, 0x0, 0xE8, 0x2C, 0x0, 0x8, 0x0, 0xF0, 0x2C, 0x0, 0x8, 0x0, 0xF8, 0x2C, 0x0, 0x8, 0x0, 0x0, 0x2D, 0x0, 0x8, 0x0, 0x8, 0x2D, 0x0, 0x8, 0x0, 0x10, 0x2D, 0x0, 0x8, 0x0, 0x18, 0x2D, 0x0, 0x8, 0x0, 0x20, 0x2D, 0x0, 0x8, 0x0, 0x28, 0x2D, 0x0, 0x8, 0x0, 0x30, 0x2D, 0x0, 0x8, 0x0, 0x38, 0x2D, 0x0, 0x8, 0x0, 0x40, 0x2D, 0x0, 0x8, 0x0, 0x48, 0x2D, 0x0, 0x8, 0x0, 0x50, 0x2D, 0x0, 0x8, 0x0, 0x58, 0x2D, 0x0, 0x8, 0x0, 0x60, 0x2D, 0x0, 0x8, 0x0, 0x68, 0x2D, 0x0, 0x8, 0x0, 0x70, 0x2D, 0x0, 0x8, 0x0, 0x78, 0x2D, 0x0, 0x8, 0x0, 0x80, 0x2D, 0x0, 0x8, 0x0, 0xD8, 0x1C, 0x0, 0x8, 0x0, 0xE8, 0x1C, 0x0, 0x8, 0x0, 0xF8, 0x1C, 0x0, 0x8, 0x0, 0x8, 0x1D, 0x0, 0x8, 0x0, 0x18, 0x1D, 0x0, 0x8, 0x0, 0x28, 0x1D, 0x0, 0x8, 0x0, 0x38, 0x1D, 0x0, 0x8, 0x0, 0x48, 0x1D, 0x0, 0x8, 0x0, 0x58, 0x1D, 0x0, 0x8, 0x0, 0x68, 0x1D, 0x0, 0x8, 0x0, 0x78, 0x1D, 0x0, 0x8, 0x0, 0x88, 0x1D, 0x0, 0x8, 0x0, 0x98, 0x1D, 0x0, 0x8, 0x0, 0xA8, 0x1D, 0x0, 0x8, 0x0, 0xB8, 0x1D, 0x0, 0x8, 0x0, 0xC8, 0x1D, 0x0, 0x8, 0x0, 0xD0, 0x1E, 0x0, 0x8, 0x0, 0xE8, 0x1D, 0x0, 0x8, 0x0, 0xF8, 0x1D, 0x0, 0x8, 0x0, 0x0, 0x1F, 0x0, 0x8, 0x0, 0x8, 0x1E, 0x0, 0x8, 0x0, 0x10, 0x1F, 0x0, 0x8, 0x0, 0x18, 0x1E, 0x0, 0x8, 0x0, 0x20, 0x1F, 0x0, 0x8, 0x0, 0x28, 0x1E, 0x0, 0x8, 0x0, 0x30, 0x1F, 0x0, 0x8, 0x0, 0x38, 0x1E, 0x0, 0x8, 0x0, 0x40, 0x1F, 0x0, 0x8, 0x0, 0x48, 0x1E, 0x0, 0x8, 0x0, 0x50, 0x1F, 0x0, 0x8, 0x0, 0x58, 0x1E, 0x0, 0x8, 0x0, 0x60, 0x1F, 0x0, 0x8, 0x0, 0x68, 0x1E, 0x0, 0x8, 0x0, 0x70, 0x1F, 0x0, 0x8, 0x0, 0x78, 0x1E, 0x0, 0x8, 0x0, 0x80, 0x1F, 0x0, 0x8, 0x0, 0x88, 0x1E, 0x0, 0x8, 0x0, 0x90, 0x1F, 0x0, 0x8, 0x0, 0x98, 0x1E, 0x0, 0x8, 0x0, 0xA0, 0x1F, 0x0, 0x8, 0x0, 0xA8, 0x1E, 0x0, 0x8, 0x0, 0xB0, 0x1F, 0x0, 0x8, 0x0, 0xB8, 0x1E, 0x0, 0x8, 0x0, 0xC0, 0x1F, 0x0, 0x8, 0x0, 0xC8, 0x1E, 0x0, 0x28, 0xB6, 0x0, 0x0, 0x0, 0x48, 0xB6, 0x0, 0x0, 0x0, 0x68, 0xB6, 0x0, 0x0, 0x0, 0x88, 0xB6, 0x0, 0x0, 0x0, 0xA8, 0xB6, 0x0, 0x0, 0x0, 0xC8, 0xB6, 0x0, 0x0, 0x0, 0xE8, 0xB6, 0x0, 0x0, 0x0, 0x8, 0xB7, 0x0, 0x0, 0x0, 0x28, 0xB7, 0x0, 0x0, 0x0, 0x48, 0xB7, 0x0, 0x0, 0x0, 0x68, 0xB7, 0x0, 0x0, 0x0, 0x88, 0xB7, 0x0, 0x0, 0x0, 0xA8, 0xB7, 0x0, 0x0, 0x0, 0xC8, 0xB7, 0x0, 0x0, 0x0, 0xE8, 0xB7, 0x0, 0x0, 0x0, 0x8, 0xB8, 0x0, 0x0, 0x0, 0x28, 0xB8, 0x0, 0x0, 0x0, 0x48, 0xB8, 0x0, 0x0, 0x0, 0x68, 0xB8, 0x0, 0x0, 0x0, 0x88, 0xB8, 0x0, 0x0, 0x0, 0xA8, 0xB8, 0x0, 0x0, 0x0, 0xC8, 0xB8, 0x0, 0x0, 0x0, 0xE8, 0xB8, 0x0, 0x0, 0x0, 0x8, 0xB9, 0x0, 0x0, 0x0, 0x28, 0xB9, 0x0, 0x0, 0x0, 0x48, 0xB9, 0x0, 0x0, 0x0, 0x68, 0xB9, 0x0, 0x0, 0x0, 0x88, 0xB9, 0x0, 0x0, 0x0, 0xA8, 0xB9, 0x0, 0x0, 0x0, 0xC8, 0xB9, 0x0, 0x0, 0x0, 0xE8, 0xB9, 0x0, 0x0, 0x0, 0x8, 0xBA, 0x0, 0x0, 0x0, 0x28, 0xBA, 0x0, 0x0, 0x0, 0x48, 0xBA, 0x0, 0x0, 0x0, 0x68, 0xBA, 0x0, 0x0, 0x0, 0x88, 0xBA, 0x0, 0x0, 0x0, 0xA8, 0xBA, 0x0, 0x0, 0x0, 0xC8, 0xBA, 0x0, 0x0, 0x0, 0xE8, 0xBA, 0x0, 0x0, 0x0, 0x8, 0xBB, 0x0, 0x0, 0x0, 0x28, 0xBB, 0x0, 0x0, 0x0, 0x48, 0xBB, 0x0, 0x0, 0x0, 0x68, 0xBB, 0x0, 0x0, 0x0, 0x88, 0xBB, 0x0, 0x0, 0x0, 0x48, 0xB2, 0x0, 0x0, 0x0, 0x68, 0xB2, 0x0, 0x0, 0x0, 0x88, 0xB2, 0x0, 0x0, 0x0, 0xA8, 0xB2, 0x0, 0x0, 0x0, 0xC8, 0xB2, 0x0, 0x0, 0x0, 0xE8, 0xB2, 0x0, 0x0, 0x0, 0x8, 0xB3, 0x0, 0x0, 0x0, 0x28, 0xB3, 0x0, 0x0, 0x0, 0x48, 0xB3, 0x0, 0x0, 0x0, 0x68, 0xB3, 0x0, 0x0, 0x0, 0x88, 0xB3, 0x0, 0x0, 0x0, 0xA8, 0xB3, 0x0, 0x0, 0x0, 0xC8, 0xB3, 0x0, 0x0, 0x0, 0xE8, 0xB3, 0x0, 0x0, 0x0, 0x8, 0xB4, 0x0, 0x0, 0x0, 0x28, 0xB4, 0x0, 0x0, 0x0, 0x48, 0xB4, 0x0, 0x0, 0x0, 0x8, 0x0, 0xE8, 0x2E, 0x0, 0x8, 0x0, 0xF0, 0x2E, 0x0, 0x8, 0x0, 0xF8, 0x2E, 0x0, 0x8, 0x0, 0xE0, 0x20, 0x0, 0x8, 0x0, 0xE8, 0x20, 0x0, 0x8, 0x0, 0x0, 0x2F, 0x0, 0x8, 0x0, 0x8, 0x2F, 0x0, 0x8, 0x0, 0x10, 0x2F, 0x0, 0x8, 0x0, 0x18, 0x2F, 0x0, 0x8, 0x0, 0x20, 0x2F, 0x0, 0x8, 0x0, 0x28, 0x2F, 0x0, 0x8, 0x0, 0x30, 0x2F, 0x0, 0x8, 0x0, 0x38, 0x2F, 0x0, 0x8, 0x0, 0x40, 0x2F, 0x0, 0x8, 0x0, 0x48, 0x2F, 0x0, 0x8, 0x0, 0x50, 0x2F, 0x0, 0x8, 0x0, 0x58, 0x2F, 0x0, 0x8, 0x0, 0x60, 0x2F, 0x0, 0x8, 0x0, 0x68, 0x2F, 0x0, 0x8, 0x0, 0x70, 0x2F, 0x0, 0x8, 0x0, 0x78, 0x2F, 0x0, 0x8, 0x0, 0x80, 0x2F, 0x0, 0x8, 0x0, 0x88, 0x2F, 0x0, 0x8, 0x0, 0x90, 0x2F, 0x0, 0x8, 0x0, 0x58, 0x1C, 0x0, 0x8, 0x0, 0x60, 0x1C, 0x0, 0x8, 0x0, 0x68, 0x1C, 0x0, 0x8, 0x0, 0x70, 0x1C, 0x0, 0x8, 0x0, 0x78, 0x1C, 0x0, 0x8, 0x0, 0x80, 0x1C, 0x0, 0x8, 0x0, 0x88, 0x1C, 0x0, 0x8, 0x0, 0x90, 0x1C, 0x0, 0x8, 0x0, 0x98, 0x1C, 0x0, 0x8, 0x0, 0xA0, 0x1C, 0x0, 0x8, 0x0, 0xA8, 0x1C, 0x0, 0x8, 0x0, 0xB0, 0x1C, 0x0, 0x8, 0x0, 0xB8, 0x1C, 0x0, 0x8, 0x0, 0xC0, 0x1C, 0x0, 0x8, 0x0, 0xC8, 0x1C, 0x0, 0x8, 0x0, 0x98, 0x2F, 0x0, 0x8, 0x0, 0xA0, 0x2F, 0x0, 0x8, 0x0, 0xA8, 0x2F, 0x0, 0x8, 0x0, 0xB0, 0x2F, 0x0, 0x8, 0x0, 0xB8, 0x2F, 0x0, 0x8, 0x0, 0xC0, 0x2F, 0x0, 0x8, 0x0, 0xC8, 0x2F, 0x0, 0x8, 0x0, 0xD0, 0x2F, 0x0, 0x8, 0x0, 0xD8, 0x2F, 0x0, 0x8, 0x0, 0xE0, 0x2F, 0x0, 0x8, 0x0, 0xE8, 0x2F, 0x0, 0x8, 0x0, 0xF0, 0x2F, 0x0, 0x8, 0x0, 0xF8, 0x2F, 0x0, 0x8, 0x0, 0x0, 0x30, 0x0, 0x8, 0x0, 0x8, 0x30, 0x0, 0x8, 0x0, 0x10, 0x30, 0x0, 0x8, 0x0, 0x18, 0x30, 0x0, 0x88, 0xC0, 0x0, 0x0, 0x0, 0xA8, 0xC0, 0x0, 0x0, 0x0, 0xC8, 0xC0, 0x0, 0x0, 0x0, 0x8, 0xB0, 0x0, 0x0, 0x0, 0xE8, 0xC0, 0x0, 0x0, 0x0, 0x8, 0xC1, 0x0, 0x0, 0x0, 0x28, 0xC1, 0x0, 0x0, 0x0, 0x48, 0xC1, 0x0, 0x0, 0x0, 0xA8, 0xB0, 0x0, 0x0, 0x0, 0xC8, 0xB0, 0x0, 0x0, 0x0, 0xE8, 0xB0, 0x0, 0x0, 0x0, 0x8, 0xB1, 0x0, 0x0, 0x0, 0x28, 0xB1, 0x0, 0x0, 0x0, 0x48, 0xB1, 0x0, 0x0, 0x0, 0xC8, 0x92, 0x0, 0x0, 0x0, 0xE8, 0x92, 0x0, 0x0, 0x0, 0x8, 0x93, 0x0, 0x0, 0x0, 0x28, 0x93, 0x0, 0x0, 0x0, 0x48, 0x93, 0x0, 0x0, 0x0, 0x68, 0x93, 0x0, 0x0, 0x0, 0x68, 0xC1, 0x0, 0x0, 0x0, 0x88, 0xC1, 0x0, 0x0, 0x0, 0xA8, 0xC1, 0x0, 0x0, 0x0, 0xC8, 0xC1, 0x0, 0x0, 0x0, 0xE8, 0xC1, 0x0, 0x0, 0x0, 0x8, 0xC2, 0x0, 0x0, 0x0, 0x28, 0xC2, 0x0, 0x0, 0x0, 0x48, 0xC2, 0x0, 0x0, 0x0, 0x68, 0xC2, 0x0, 0x0, 0x0, 0x88, 0xC2, 0x0, 0x0, 0x0, 0xA8, 0xC2, 0x0, 0x0, 0x0, 0xC8, 0xC2, 0x0, 0x0, 0x0, 0xE8, 0xC2, 0x0, 0x0, 0x0, 0x8, 0xC3, 0x0, 0x0, 0x0, 0x28, 0xC3, 0x0, 0x0, 0x0, 0x48, 0xC3, 0x0, 0x0, 0x0, 0x68, 0xC3, 0x0, 0x0, 0x0, 0x88, 0xC3, 0x0, 0x0, 0x0, 0xA8, 0xC3, 0x0, 0x0, 0x0, 0xC8, 0xC3, 0x0, 0x0, 0x0, 0xE8, 0xC3, 0x0, 0x0, 0x0, 0x8, 0xC4, 0x0, 0x0, 0x0, 0x28, 0xC4, 0x0, 0x0, 0x0, 0x48, 0xC4, 0x0, 0x0, 0x0, 0x68, 0xC4, 0x0, 0x0, 0x0, 0x88, 0xC4, 0x0, 0x0, 0x0, 0xA8, 0xC4, 0x0, 0x0, 0x0, 0xC8, 0xC4, 0x0, 0x0, 0x0, 0xE8, 0xC4, 0x0, 0x0, 0x0, 0x8, 0xC5, 0x0, 0x0, 0x0, 0x28, 0xC5, 0x0, 0x0, 0x0, 0x48, 0xC5, 0x0, 0x0, 0x0, 0xC8, 0xB1, 0x0, 0x0, 0x0, 0xE8, 0x95, 0x0, 0x0, 0x0, 0x8, 0xB2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x58, 0x31, 0x0, 0x8, 0x0, 0xF0, 0x1F, 0x0, 0x8, 0x0, 0xF8, 0x1F, 0x0, 0x8, 0x0, 0x60, 0x31, 0x0, 0x8, 0x0, 0x8, 0x20, 0x0, 0x8, 0x0, 0x30, 0x20, 0x0, 0x8, 0x0, 0x48, 0x20, 0x0, 0x8, 0x0, 0xA0, 0x20, 0x0, 0x8, 0x0, 0xB8, 0x20, 0x0, 0x8, 0x0, 0x68, 0x31, 0x0, 0x8, 0x0, 0x70, 0x31, 0x0, 0x8, 0x0, 0x78, 0x31, 0x0, 0x8, 0x0, 0x80, 0x31, 0x0, 0x8, 0x0, 0x88, 0x31, 0x0, 0x8, 0x0, 0x90, 0x31, 0x0, 0x8, 0x0, 0x98, 0x31, 0x0, 0x8, 0x0, 0xA0, 0x31, 0x0, 0x8, 0x0, 0xD0, 0x20, 0x0, 0x8, 0x0, 0xA8, 0x31, 0x0, 0x8, 0x0, 0xB0, 0x31, 0x0, 0x8, 0x0, 0xB8, 0x31, 0x0, 0x8, 0x0, 0xC0, 0x31, 0x0, 0x8, 0x0, 0x90, 0x23, 0x0, 0xC8, 0xAF, 0x0, 0x0, 0x0, 0xE8, 0xAF, 0x0, 0x0, 0x0, 0x28, 0xB0, 0x0, 0x0, 0x0, 0x28, 0xC7, 0x0, 0x0, 0x0, 0x48, 0xC7, 0x0, 0x0, 0x0, 0x68, 0xB0, 0x0, 0x0, 0x0, 0x68, 0xC7, 0x0, 0x0, 0x0, 0x88, 0xC7, 0x0, 0x0, 0x0, 0xA8, 0xC7, 0x0, 0x0, 0x0, 0xC8, 0xC7, 0x0, 0x0, 0x0, 0xE8, 0xC7, 0x0, 0x0, 0x0, 0x8, 0xC8, 0x0, 0x0, 0x0, 0x28, 0xC8, 0x0, 0x0, 0x0, 0x48, 0xC8, 0x0, 0x0, 0x0, 0x68, 0xC8, 0x0, 0x0, 0x0, 0xC8, 0xBB, 0x0, 0x0, 0x0, 0x88, 0xC8, 0x0, 0x0, 0x0, 0xA8, 0xC8, 0x0, 0x0, 0x0, 0xC8, 0xC8, 0x0, 0x0, 0x0, 0xE8, 0xC8, 0x0, 0x0, 0x0, 0x8, 0xC9, 0x0, 0x0, 0x0, 0x28, 0xC9, 0x0, 0x0, 0x0, 0x48, 0x95, 0x0, 0x0, 0x0, 0x48, 0xC9, 0x0, 0x0, 0x0, 0x68, 0xC9, 0x0, 0x0, 0x0, 0x88, 0xC9, 0x0, 0x0, 0x0, 0xA8, 0xC9, 0x0, 0x0, 0x0, 0x28, 0x82, 0x18, 0x2D, 0x0, 0xE8, 0xB1, 0x0, 0x0, 0x0, 0xC8, 0xC9, 0x0, 0x0, 0x0, 0xE8, 0xC9, 0x0, 0x0, 0x0, 0x8, 0xCA, 0x0, 0x0, 0x0, 0xC8, 0xC6, 0x0, 0x0, 0x0, 0x28, 0xCA, 0x0, 0x0, 0x0, 0x48, 0xCA, 0x0, 0x0, 0x0, 0x8, 0xC7, 0x0, 0x0, 0x0, 0x68, 0xCA, 0x0, 0x0, 0x0, 0x88, 0xCA, 0xA8, 0x32, 0x0, 0x8, 0x0, 0xB0, 0x32, 0x0, 0x8, 0x0, 0xB8, 0x32, 0x0, 0x8, 0x0, 0xC0, 0x32, 0x0, 0x8, 0x0, 0xC8, 0x32, 0x0, 0x8, 0x0, 0xD0, 0x32, 0x0, 0x8, 0x0, 0xD8, 0x32, 0x0, 0x8, 0x0, 0xE0, 0x32, 0x0, 0x8, 0x0, 0xE8, 0x32, 0x0, 0x8, 0x0, 0xF0, 0x32, 0x0, 0x8, 0x0, 0xF8, 0x32, 0x0, 0x8, 0x0, 0x0, 0x33, 0x0, 0x8, 0x0, 0x8, 0x33, 0x0, 0x8, 0x0, 0x10, 0x33, 0x0, 0x8, 0x0, 0x18, 0x33, 0x0, 0x8, 0x0, 0x20, 0x33, 0x0, 0x8, 0x0, 0x28, 0x33, 0x0, 0x8, 0x0, 0x30, 0x33, 0x0, 0x8, 0x0, 0x38, 0x33, 0x0, 0x8, 0x0, 0x40, 0x33, 0x0, 0x8, 0x0, 0x48, 0x33, 0x0, 0x8, 0x0, 0x50, 0x33, 0x0, 0x8, 0x0, 0x58, 0x33, 0x0, 0x8, 0x0, 0x60, 0x33, 0x0, 0x8, 0x0, 0x68, 0x33, 0x0, 0x8, 0x0, 0x70, 0x33, 0x0, 0x8, 0x0, 0x78, 0x33, 0x0, 0x8, 0x0, 0x80, 0x33, 0x0, 0x8, 0x0, 0x88, 0x33, 0x0, 0x8, 0x0, 0x90, 0x33, 0x0, 0x8, 0x0, 0x98, 0x33, 0x0, 0x8, 0x0, 0xA0, 0x33, 0x0, 0x8, 0x0, 0xA8, 0x33, 0x0, 0x8, 0x0, 0xB0, 0x33, 0x0, 0x8, 0x0, 0xB8, 0x33, 0x0, 0x8, 0x0, 0xC0, 0x33, 0x0, 0x8, 0x0, 0xC8, 0x33, 0x0, 0x8, 0x0, 0xD0, 0x33, 0x0, 0x8, 0x0, 0xD8, 0x33, 0x0, 0x8, 0x0, 0xE0, 0x33, 0x0, 0x8, 0x0, 0xE8, 0x33, 0x0, 0x8, 0x0, 0xF0, 0x33, 0x0, 0x8, 0x0, 0xF8, 0x33, 0x0, 0x8, 0x0, 0x0, 0x34, 0x0, 0x8, 0x0, 0x8, 0x34, 0x0, 0x8, 0x0, 0x10, 0x34, 0x0, 0x8, 0x0, 0x18, 0x34, 0x0, 0x8, 0x0, 0x20, 0x34, 0x0, 0x8, 0x0, 0x28, 0x34, 0x0, 0x8, 0x0, 0x30, 0x34, 0x0, 0x8, 0x0, 0x38, 0x34, 0x0, 0x8, 0x0, 0x40, 0x34, 0x0, 0x8, 0x0, 0x48, 0x34, 0x0, 0x8, 0x0, 0x50, 0x34, 0x0, 0x69, 0xD1, 0x0, 0x0, 0x0, 0x89, 0xD1, 0x0, 0x0, 0x0, 0xA9, 0xD1, 0x0, 0x0, 0x0, 0xC9, 0xD1, 0x0, 0x0, 0x0, 0xE9, 0xD1, 0x0, 0x0, 0x0, 0x9, 0xD2, 0x0, 0x0, 0x0, 0x29, 0xD2, 0x0, 0x0, 0x0, 0x49, 0xD2, 0x0, 0x0, 0x0, 0x69, 0xD2, 0x0, 0x0, 0x0, 0x89, 0xD2, 0x0, 0x0, 0x0, 0xA9, 0xD2, 0x0, 0x0, 0x0, 0xC9, 0xD2, 0x0, 0x0, 0x0, 0xE9, 0xD2, 0x0, 0x0, 0x0, 0x9, 0xD3, 0x0, 0x0, 0x0, 0x29, 0xD3, 0x0, 0x0, 0x0, 0x49, 0xD3, 0x0, 0x0, 0x0, 0x69, 0xD3, 0x0, 0x0, 0x0, 0x89, 0xD3, 0x0, 0x0, 0x0, 0xA9, 0xD3, 0x0, 0x0, 0x0, 0xC9, 0xD3, 0x0, 0x0, 0x0, 0xE9, 0xD3, 0x0, 0x0, 0x0, 0x9, 0xD4, 0x0, 0x0, 0x0, 0x29, 0xD4, 0x0, 0x0, 0x0, 0x49, 0xD4, 0x0, 0x0, 0x0, 0x69, 0xD4, 0x0, 0x0, 0x0, 0x89, 0xD4, 0x0, 0x0, 0x0, 0xA9, 0xD4, 0x0, 0x0, 0x0, 0xC9, 0xD4, 0x0, 0x0, 0x0, 0xE9, 0xD4, 0x0, 0x0, 0x0, 0x9, 0xD5, 0x0, 0x0, 0x0, 0x29, 0xD5, 0x0, 0x0, 0x0, 0x49, 0xD5, 0x0, 0x0, 0x0, 0x69, 0xD5, 0x0, 0x0, 0x0, 0x89, 0xD5, 0x0, 0x0, 0x0, 0xA9, 0xD5, 0x0, 0x0, 0x0, 0xC9, 0xD5, 0x0, 0x0, 0x0, 0xE9, 0xD5, 0x0, 0x0, 0x0, 0x9, 0xD6, 0x0, 0x0, 0x0, 0x29, 0xD6, 0x0, 0x0, 0x0, 0x49, 0xD6, 0x0, 0x0, 0x0, 0x69, 0xD6, 0x0, 0x0, 0x0, 0x89, 0xD6, 0x0, 0x0, 0x0, 0xA9, 0xD6, 0x0, 0x0, 0x0, 0xC9, 0xD6, 0x0, 0x0, 0x0, 0xE9, 0xD6, 0x0, 0x0, 0x0, 0x9, 0xD7, 0x0, 0x0, 0x0, 0x29, 0xD7, 0x0, 0x0, 0x0, 0x49, 0xD7, 0x0, 0x0, 0x0, 0x69, 0xD7, 0x0, 0x0, 0x0, 0x89, 0xD7, 0x0, 0x0, 0x0, 0xA9, 0xD7, 0x0, 0x0, 0x0, 0xC9, 0xD7, 0x0, 0x0, 0x0, 0xE9, 0xD7, 0x0, 0x0, 0x0, 0x9, 0xD8, 0x0, 0x0, 0x0, 0x29, 0xD8, 0x0, 0x0, 0x0, 0x49, 0xD8, 0x0, 0x0, 0x0, 0x69, 0xD8, 0x0, 0x0, 0x0, 0x89, 0xD8, 0x0, 0x0, 0x0, 0xA9, 0xD8, 0x0, 0x0, 0x0, 0xC9, 0xD8, 0x0, 0x0, 0x0, 0xE9, 0xD8, 0x0, 0x0, 0x0, 0x9, 0xD9, 0x0, 0x0, 0x0, 0x29, 0xD9, 0x0, 0x0, 0x0, 0x49, 0xD9, 0x0, 0x0, 0x0, 0x69, 0xD9, 0x0, 0x0, 0x0, 0x89, 0xD9, 0x0, 0x0, 0x0, 0xA9, 0xD9, 0x0, 0x0, 0x0, 0xC9, 0xD9, 0x0, 0x0, 0x0, 0xE9, 0xD9, 0x0, 0x0, 0x0, 0x9, 0xDA, 0x0, 0x0, 0x0, 0x29, 0xDA, 0x0, 0x0, 0x0, 0x49, 0xDA, 0x0, 0x0, 0x0, 0x69, 0xDA, 0x0, 0x0, 0x0, 0x89, 0xDA, 0x0, 0x0, 0x0, 0xA9, 0xDA, 0x0, 0x0, 0x0, 0xC9, 0xDA, 0x0, 0x0, 0x0, 0xE9, 0xDA, 0x0, 0x0, 0x0, 0x9, 0xDB, 0x0, 0x0, 0x0, 0x29, 0xDB, 0x0, 0x0, 0x0, 0x49, 0xDB, 0x0, 0x0, 0x0, 0x69, 0xDB, 0x0, 0x0, 0x0, 0x89, 0xDB, 0x0, 0x0, 0x0, 0xA9, 0xDB, 0x0, 0x0, 0x0, 0xC9, 0xDB, 0x0, 0x0, 0x0, 0xE9, 0xDB, 0x0, 0x0, 0x0, 0x9, 0xDC, 0x0, 0x0, 0x0, 0x29, 0xDC, 0x0, 0x0, 0x0, 0x49, 0xDC, 0x0, 0x0, 0x0, 0x69, 0xDC, 0x0, 0x0, 0x0, 0x89, 0xDC, 0x0, 0x0, 0x0, 0xA9, 0xDC, 0x0, 0x0, 0x0, 0xC9, 0xDC, 0x0, 0x0, 0x0, 0xE9, 0xDC, 0x0, 0x0, 0x0, 0x9, 0xDD, 0x0, 0x0, 0x0, 0x29, 0xDD, 0x0, 0x0, 0x0, 0x49, 0xDD, 0x0, 0x0, 0x0, 0x69, 0xDD, 0x0, 0x0, 0x0, 0x89, 0xDD, 0x0, 0x0, 0x0, 0xA9, 0xDD, 0x0, 0x0, 0x0, 0xC9, 0xDD, 0x0, 0x0, 0x0, 0xE9, 0xDD, 0x0, 0x0, 0x0, 0x9, 0xDE, 0x0, 0x0, 0x0, 0x29, 0xDE, 0x0, 0x0, 0x0, 0x49, 0xDE, 0x0, 0x0, 0x0, 0x69, 0xDE, 0x0, 0x0, 0x0, 0x89, 0xDE, 0x0, 0x0, 0x0, 0xA9, 0xDE, 0x0, 0x0, 0x0, 0xC9, 0xDE, 0x0, 0x0, 0x0, 0xE9, 0xDE, 0x0, 0x0, 0x0, 0x9, 0xDF, 0x0, 0x0, 0x0, 0x29, 0xDF, 0x0, 0x0, 0x0, 0x49, 0xDF, 0x0, 0x0, 0x0, 0x69, 0xDF, 0x0, 0x0, 0x0, 0x89, 0xDF, 0x0, 0x0, 0x0, 0xA9, 0xDF, 0x0, 0x0, 0x0, 0xC9, 0xDF, 0x0, 0x0, 0x0, 0xE9, 0xDF, 0x0, 0x0, 0x0, 0x9, 0xE0, 0x0, 0x0, 0x0, 0x29, 0xE0, 0x0, 0x0, 0x0, 0x49, 0xE0, 0x0, 0x0, 0x0, 0x69, 0xE0, 0x0, 0x0, 0x0, 0x89, 0xE0, 0x0, 0x0, 0x0, 0xA9, 0xE0, 0x0, 0x0, 0x0, 0xC9, 0xE0, 0x0, 0x0, 0x0, 0xE9, 0xE0, 0x0, 0x0, 0x0, 0x9, 0xE1, 0x0, 0x0, 0x0, 0x29, 0xE1, 0x0, 0x0, 0x0, 0x49, 0xE1, 0x0, 0x0, 0x0, 0x69, 0xE1, 0x0, 0x0, 0x0, 0x89, 0xE1, 0x0, 0x0, 0x0, 0xA9, 0xE1, 0x0, 0x0, 0x0, 0xC9, 0xE1, 0x0, 0x0, 0x0, 0xE9, 0xE1, 0x0, 0x0, 0x0, 0x9, 0xE2, 0x0, 0x0, 0x0, 0x29, 0xE2, 0x0, 0x0, 0x0, 0x49, 0xE2, 0x0, 0x0, 0x0, 0x69, 0xE2, 0x0, 0x0, 0x0, 0x89, 0xE2, 0x0, 0x0, 0x0, 0xA9, 0xE2, 0x0, 0x0, 0x0, 0xC9, 0xE2, 0x0, 0x0, 0x0, 0xE9, 0xE2, 0x0, 0x0, 0x0, 0x9, 0xE3, 0x0, 0x0, 0x0, 0x29, 0xE3, 0x0, 0x0, 0x0, 0x49, 0xE3, 0x0, 0x0, 0x0, 0x69, 0xE3, 0x0, 0x0, 0x0, 0x89, 0xE3, 0x0, 0x0, 0x0, 0xA9, 0xE3, 0x0, 0x0, 0x0, 0xC9, 0xE3, 0x0, 0x0, 0x0, 0xE9, 0xE3, 0x0, 0x0, 0x0, 0x9, 0xE4, 0x0, 0x0, 0x0, 0x29, 0xE4, 0x0, 0x0, 0x0, 0x49, 0xE4, 0x0, 0x0, 0x0, 0x69, 0xE4, 0x0, 0x0, 0x0, 0x89, 0xE4, 0x0, 0x0, 0x0, 0xA9, 0xE4, 0x0, 0x0, 0x0, 0xC9, 0xE4, 0x0, 0x0, 0x0, 0xE9, 0xE4, 0x0, 0x0, 0x0, 0x9, 0xE5, 0x0, 0x0, 0x0, 0x9, 0x0, 0x30, 0x38, 0x0, 0x29, 0xE5, 0x0, 0x0, 0x0, 0x49, 0xE5, 0x0, 0x0, 0x0, 0x69, 0xE5, 0x0, 0x0, 0x0, 0x89, 0xE5, 0x0, 0x0, 0x0, 0xA9, 0xE5, 0x0, 0x0, 0x0, 0xC9, 0xE5, 0x0, 0x0, 0x0, 0xE9, 0xE5, 0x0, 0x0, 0x0, 0x9, 0xE6, 0x0, 0x0, 0x0, 0x29, 0xE6, 0x0, 0x0, 0x0, 0x49, 0xE6, 0x0, 0x0, 0x0, 0x69, 0xE6, 0x0, 0x0, 0x0, 0x89, 0xE6, 0x0, 0x0, 0x0, 0xA9, 0xE6, 0x0, 0x0, 0x0, 0xC9, 0xE6, 0x0, 0x0, 0x0, 0xE9, 0xE6, 0x0, 0x0, 0x0, 0x9, 0xE7, 0x0, 0x0, 0x0, 0x29, 0xE7, 0x0, 0x0, 0x0, 0x49, 0xE7, 0x0, 0x0, 0x0, 0x69, 0xE7, 0x0, 0x0, 0x0, 0x89, 0xE7, 0x0, 0x0, 0x0, 0xA9, 0xE7, 0x0, 0x0, 0x0, 0xC9, 0xE7, 0x0, 0x0, 0x0, 0xE9, 0xE7, 0x0, 0x0, 0x0, 0x9, 0xE8, 0x0, 0x0, 0x0, 0x29, 0xE8, 0x0, 0x0, 0x0, 0x49, 0xE8, 0x0, 0x0, 0x0, 0x69, 0xE8, 0x0, 0x0, 0x0, 0x89, 0xE8, 0x0, 0x0, 0x0, 0xA9, 0xE8, 0x0, 0x0, 0x0, 0xC9, 0xE8, 0x0, 0x0, 0x0, 0xE9, 0xE8, 0x0, 0x0, 0x0, 0x9, 0xE9, 0x0, 0x0, 0x0, 0x29, 0xE9, 0x0, 0x0, 0x0, 0x49, 0xE9, 0x0, 0x0, 0x0, 0x69, 0xE9, 0x0, 0x0, 0x0, 0x89, 0xE9, 0x0, 0x0, 0x0, 0x9, 0x0, 0xD8, 0x38, 0x0, 0xA9, 0xE9, 0x0, 0x0, 0x0, 0xC9, 0xE9, 0x0, 0x0, 0x0, 0xE9, 0xE9, 0x0, 0x0, 0x0, 0x9, 0xEA, 0x0, 0x0, 0x0, 0x29, 0xEA, 0x0, 0x0, 0x0, 0x49, 0xEA, 0x0, 0x0, 0x0, 0x69, 0xEA, 0x0, 0x0, 0x0, 0x89, 0xEA, 0x0, 0x0, 0x0, 0xA9, 0xEA, 0x0, 0x0, 0x0, 0xC9, 0xEA, 0x0, 0x0, 0x0, 0xE9, 0xEA, 0x0, 0x0, 0x0, 0x9, 0xEB, 0x0, 0x0, 0x0, 0x29, 0xEB, 0x0, 0x0, 0x0, 0x49, 0xEB, 0x0, 0x0, 0x0, 0x69, 0xEB, 0x0, 0x0, 0x0, 0x89, 0xEB, 0x0, 0x0, 0x0, 0xA9, 0xEB, 0x0, 0x0, 0x0, 0xC9, 0xEB, 0x0, 0x0, 0x0, 0xE9, 0xEB, 0x0, 0x0, 0x0, 0x9, 0xEC, 0x0, 0x0, 0x0, 0x29, 0xEC, 0x0, 0x0, 0x0, 0x49, 0xEC, 0x0, 0x0, 0x0, 0x69, 0xEC, 0x0, 0x0, 0x0, 0x89, 0xEC, 0x0, 0x0, 0x0, 0xA9, 0xEC, 0x0, 0x0, 0x0, 0xC9, 0xEC, 0x0, 0x0, 0x0, 0xE9, 0xEC, 0x0, 0x0, 0x0, 0x9, 0xED, 0x0, 0x0, 0x0, 0x29, 0xED, 0x0, 0x0, 0x0, 0x49, 0xED, 0x0, 0x0, 0x0, 0x69, 0xED, 0x0, 0x0, 0x0, 0x89, 0xED, 0x0, 0x0, 0x0, 0xA9, 0xED, 0x0, 0x0, 0x0, 0xC9, 0xED, 0x0, 0x0, 0x0, 0xE9, 0xED, 0x0, 0x0, 0x0, 0x9, 0xEE, 0x0, 0x0, 0x0, 0x29, 0xEE, 0x0, 0x0, 0x0, 0x49, 0xEE, 0x0, 0x0, 0x0, 0x69, 0xEE, 0x0, 0x0, 0x0, 0x89, 0xEE, 0x0, 0x0, 0x0, 0xA9, 0xEE, 0x0, 0x0, 0x0, 0xC9, 0xEE, 0x0, 0x0, 0x0, 0xE9, 0xEE, 0x0, 0x0, 0x0, 0x9, 0xEF, 0x0, 0x0, 0x0, 0x29, 0xEF, 0x0, 0x0, 0x0, 0x49, 0xEF, 0x0, 0x0, 0x0, 0x69, 0xEF, 0x0, 0x0, 0x0, 0x89, 0xEF, 0x0, 0x0, 0x0, 0xA9, 0xEF, 0x0, 0x0, 0x0, 0xC9, 0xEF, 0x0, 0x0, 0x0, 0xE9, 0xEF, 0x0, 0x0, 0x0, 0x9, 0xF0, 0x0, 0x0, 0x0, 0x29, 0xF0, 0x0, 0x0, 0x0, 0x49, 0xF0, 0x0, 0x0, 0x0, 0x69, 0xF0, 0x0, 0x0, 0x0, 0x89, 0xF0, 0x0, 0x0, 0x0, 0xA9, 0xF0, 0x0, 0x0, 0x0, 0xC9, 0xF0, 0x0, 0x0, 0x0, 0xE9, 0xF0, 0x0, 0x0, 0x0, 0x9, 0xF1, 0x0, 0x0, 0x0, 0x29, 0xF1, 0x0, 0x0, 0x0, 0x49, 0xF1, 0x0, 0x0, 0x0, 0x69, 0xF1, 0x0, 0x0, 0x0, 0x89, 0xF1, 0x0, 0x0, 0x0, 0xA9, 0xF1, 0x0, 0x0, 0x0, 0xC9, 0xF1, 0x0, 0x0, 0x0, 0xE9, 0xF1, 0x0, 0x0, 0x0, 0x9, 0xF2, 0x0, 0x0, 0x0, 0x29, 0xF2, 0x0, 0x0, 0x0, 0x49, 0xF2, 0x0, 0x0, 0x0, 0x69, 0xF2, 0x0, 0x0, 0x0, 0x89, 0xF2, 0x0, 0x0, 0x0, 0xA9, 0xF2, 0x0, 0x0, 0x0, 0xC9, 0xF2, 0x0, 0x0, 0x0, 0xE9, 0xF2, 0x0, 0x0, 0x0, 0x9, 0xF3, 0x0, 0x0, 0x0, 0x29, 0xF3, 0x0, 0x0, 0x0, 0x9, 0x0, 0xD0, 0x3C, 0x0, 0x9, 0x0, 0xD8, 0x3C, 0x0, 0x9, 0x0, 0xE0, 0x3C, 0x0, 0x9, 0x0, 0xE8, 0x3C, 0x0, 0x9, 0x0, 0xF0, 0x3C, 0x0, 0x9, 0x0, 0xF8, 0x3C, 0x0, 0x9, 0x0, 0x0, 0x3D, 0x0, 0x9, 0x0, 0x8, 0x3D, 0x0, 0x9, 0x0, 0x10, 0x3D, 0x0, 0x9, 0x0, 0x18, 0x3D, 0x0, 0x9, 0x0, 0x20, 0x3D, 0x0, 0x9, 0x0, 0x28, 0x3D, 0x0, 0x9, 0x0, 0x30, 0x3D, 0x0, 0x9, 0x0, 0x38, 0x3D, 0x0, 0x9, 0x0, 0x40, 0x3D, 0x0, 0x9, 0x0, 0x48, 0x3D, 0x0, 0x9, 0x0, 0x50, 0x3D, 0x0, 0x9, 0x0, 0x58, 0x3D, 0x0, 0x9, 0x0, 0x60, 0x3D, 0x0, 0x9, 0x0, 0x68, 0x3D, 0x0, 0x9, 0x0, 0x70, 0x3D, 0x0, 0x9, 0x0, 0x78, 0x3D, 0x0, 0x9, 0x0, 0x80, 0x3D, 0x0, 0x9, 0x0, 0x88, 0x3D, 0x0, 0x9, 0x0, 0x90, 0x3D, 0x0, 0x9, 0x0, 0x98, 0x3D, 0x0, 0x9, 0x0, 0xA0, 0x3D, 0x0, 0x9, 0x0, 0xA8, 0x3D, 0x0, 0x9, 0x0, 0xB0, 0x3D, 0x0, 0x9, 0x0, 0xB8, 0x3D, 0x0, 0x9, 0x0, 0xC0, 0x3D, 0x0, 0x9, 0x0, 0xC8, 0x3D, 0x0, 0x9, 0x0, 0xD0, 0x3D, 0x0, 0x9, 0x0, 0xD8, 0x3D, 0x0, 0x9, 0x0, 0xE0, 0x3D, 0x0, 0x9, 0x0, 0xE8, 0x3D, 0x0, 0x9, 0x0, 0xF0, 0x3D, 0x0, 0x9, 0x0, 0xF8, 0x3D, 0x0, 0x9, 0x0, 0x0, 0x3E, 0x0, 0x9, 0x0, 0x8, 0x3E, 0x0, 0x9, 0x0, 0x10, 0x3E, 0x0, 0x9, 0x0, 0x18, 0x3E, 0x0, 0x9, 0x0, 0x20, 0x3E, 0x0, 0x9, 0x0, 0x28, 0x3E, 0x0, 0x9, 0x0, 0x30, 0x3E, 0x0, 0x9, 0x0, 0x38, 0x3E, 0x0, 0x9, 0x0, 0x40, 0x3E, 0x0, 0x9, 0x0, 0x48, 0x3E, 0x0, 0x9, 0x0, 0x50, 0x3E, 0x0, 0x9, 0x0, 0x58, 0x3E, 0x0, 0x9, 0x0, 0x60, 0x3E, 0x0, 0x9, 0x0, 0x68, 0x3E, 0x0, 0x9, 0x0, 0x70, 0x3E, 0x0, 0x9, 0x0, 0x78, 0x3E, 0x0, 0x9, 0x0, 0x80, 0x3E, 0x0, 0x9, 0x0, 0x88, 0x3E, 0x0, 0x9, 0x0, 0x90, 0x3E, 0x0, 0x9, 0x0, 0x98, 0x3E, 0x0, 0x9, 0x0, 0xA0, 0x3E, 0x0, 0x9, 0x0, 0xA8, 0x3E, 0x0, 0x9, 0x0, 0xB0, 0x3E, 0x0, 0x9, 0x0, 0xB8, 0x3E, 0x0, 0x9, 0x0, 0xC0, 0x3E, 0x0, 0x9, 0x0, 0xC8, 0x3E, 0x0, 0x9, 0x0, 0xD0, 0x3E, 0x0, 0x9, 0x0, 0xD8, 0x3E, 0x0, 0x9, 0x0, 0xE0, 0x3E, 0x0, 0x9, 0x0, 0xE8, 0x3E, 0x0, 0x9, 0x0, 0xF0, 0x3E, 0x0, 0x9, 0x0, 0xF8, 0x3E, 0x0, 0x9, 0x0, 0x0, 0x3F, 0x0, 0x9, 0x0, 0x8, 0x3F, 0x0, 0x9, 0x0, 0x10, 0x3F, 0x0, 0x9, 0x0, 0x18, 0x3F, 0x0, 0x9, 0x0, 0x20, 0x3F, 0x0, 0x9, 0x0, 0x28, 0x3F, 0x0, 0x9, 0x0, 0x30, 0x3F, 0x0, 0x9, 0x0, 0x38, 0x3F, 0x0, 0x9, 0x0, 0x40, 0x3F, 0x0, 0x9, 0x0, 0x48, 0x3F, 0x0, 0x9, 0x0, 0x50, 0x3F, 0x0, 0x9, 0x0, 0x58, 0x3F, 0x0, 0x9, 0x0, 0x60, 0x3F, 0x0, 0x9, 0x0, 0x68, 0x3F, 0x0, 0x9, 0x0, 0x70, 0x3F, 0x0, 0x9, 0x0, 0x78, 0x3F, 0x0, 0x9, 0x0, 0x80, 0x3F, 0x0, 0x9, 0x0, 0x88, 0x3F, 0x0, 0x9, 0x0, 0x90, 0x3F, 0x0, 0x9, 0x0, 0x98, 0x3F, 0x0, 0x9, 0x0, 0xA0, 0x3F, 0x0, 0x9, 0x0, 0xA8, 0x3F, 0x0, 0x9, 0x0, 0xB0, 0x3F, 0x0, 0x9, 0x0, 0xB8, 0x3F, 0x0, 0x9, 0x0, 0xC0, 0x3F, 0x0, 0x9, 0x0, 0xC8, 0x3F, 0x0, 0x9, 0x0, 0xD0, 0x3F, 0x0, 0x9, 0x0, 0xD8, 0x3F, 0x0, 0x9, 0x0, 0xE0, 0x3F, 0x0, 0x9, 0x0, 0xE8, 0x3F, 0x0, 0x9, 0x0, 0xF0, 0x3F, 0x0, 0x9, 0x0, 0xF8, 0x3F, 0x0, 0x9, 0x0, 0x0, 0x40, 0x0, 0x9, 0x0, 0x8, 0x40, 0x0, 0x9, 0x0, 0x10, 0x40, 0x0, 0x9, 0x0, 0x18, 0x40, 0x0, 0x9, 0x0, 0x20, 0x40, 0x0, 0x9, 0x0, 0x28, 0x40, 0x0, 0x9, 0x0, 0x30, 0x40, 0x0, 0x9, 0x0, 0x38, 0x40, 0x0, 0x9, 0x0, 0x40, 0x40, 0x0, 0x9, 0x0, 0x48, 0x40, 0x0, 0x9, 0x0, 0x50, 0x40, 0x0, 0x9, 0x0, 0x58, 0x40, 0x0, 0x9, 0x0, 0x60, 0x40, 0x0, 0x9, 0x0, 0x68, 0x40, 0x0, 0x9, 0x0, 0x70, 0x40, 0x0, 0x9, 0x0, 0x78, 0x40, 0x0, 0x9, 0x0, 0x80, 0x40, 0x0, 0x9, 0x0, 0xA8, 0x3B, 0x0, 0x9, 0x0, 0xB0, 0x3B, 0x0, 0x9, 0x0, 0xB8, 0x3B, 0x0, 0x9, 0x0, 0xC0, 0x3B, 0x0, 0x9, 0x0, 0xC8, 0x3B, 0x0, 0x9, 0x0, 0xD0, 0x3B, 0x0, 0x9, 0x0, 0xD8, 0x3B, 0x0, 0x9, 0x0, 0xE0, 0x3B, 0x0, 0x9, 0x0, 0xE8, 0x3B, 0x0, 0x9, 0x0, 0xF0, 0x3B, 0x0, 0x9, 0x0, 0xF8, 0x3B, 0x0, 0x9, 0x0, 0x0, 0x3C, 0x0, 0x9, 0x0, 0x8, 0x3C, 0x0, 0x9, 0x0, 0x10, 0x3C, 0x0, 0x9, 0x0, 0x88, 0x40, 0x0, 0x49, 0x2, 0x1, 0x0, 0x0, 0x9, 0x0, 0x98, 0x40, 0x0, 0x89, 0x2, 0x1, 0x0, 0x0, 0x9, 0x0, 0xA8, 0x40, 0x0, 0x9, 0x0, 0xB0, 0x40, 0x0, 0x9, 0x0, 0xB8, 0x40, 0x0, 0x9, 0x3, 0x1, 0x0, 0x0, 0x9, 0x0, 0xC8, 0x40, 0x0, 0x49, 0x3, 0x1, 0x0, 0x0, 0x9, 0x0, 0xD8, 0x40, 0x0, 0x89, 0x3, 0x1, 0x0, 0x0, 0x9, 0x0, 0xE8, 0x40, 0x0, 0xC9, 0x3, 0x1, 0x0, 0x0, 0x9, 0x0, 0xF8, 0x40, 0x0, 0x9, 0x0, 0x0, 0x41, 0x0, 0x9, 0x0, 0x8, 0x41, 0x0, 0x9, 0x0, 0xC8, 0x39, 0x0, 0x49, 0x4, 0x1, 0x0, 0x0, 0x9, 0x0, 0x30, 0x3A, 0x0, 0x69, 0x4, 0x1, 0x0, 0x0, 0x9, 0x0, 0x20, 0x41, 0x0, 0xA9, 0x4, 0x1, 0x0, 0x0, 0x9, 0x0, 0x30, 0x41, 0x0, 0x9, 0x0, 0xB8, 0x38, 0x0, 0x9, 0x0, 0x38, 0x41, 0x0, 0x9, 0x5, 0x1, 0x0, 0x0, 0x9, 0x0, 0x48, 0x3C, 0x0, 0x9, 0x0, 0x48, 0x41, 0x0, 0x9, 0x0, 0x50, 0x41, 0x0, 0x9, 0x0, 0x58, 0x41, 0x0, 0x9, 0x0, 0x60, 0x41, 0x0, 0x9, 0x0, 0x68, 0x41, 0x0, 0x9, 0x0, 0x70, 0x41, 0x0, 0x9, 0x0, 0x78, 0x41, 0x0, 0x9, 0x0, 0x80, 0x41, 0x0, 0x9, 0x0, 0x88, 0x41, 0x0, 0x9, 0x0, 0x90, 0x41, 0x0, 0x9, 0x0, 0x98, 0x41, 0x0, 0x9, 0x0, 0xA0, 0x41, 0x0, 0x9, 0x0, 0xA8, 0x41, 0x0, 0x9, 0x0, 0xB0, 0x41, 0x0, 0x9, 0x0, 0xB8, 0x41, 0x0, 0x9, 0x0, 0xC0, 0x41, 0x0, 0x9, 0x0, 0xC8, 0x41, 0x0, 0x9, 0x0, 0xD0, 0x41, 0x0, 0x9, 0x0, 0xD8, 0x41, 0x0, 0x9, 0x0, 0xE0, 0x41, 0x0, 0x9, 0x0, 0xE8, 0x41, 0x0, 0x9, 0x0, 0xF0, 0x41, 0x0, 0x9, 0x0, 0xF8, 0x41, 0x0, 0x9, 0x0, 0x0, 0x42, 0x0, 0x9, 0x0, 0x8, 0x42, 0x0, 0x9, 0x0, 0x10, 0x42, 0x0, 0x9, 0x0, 0x18, 0x42, 0x0, 0x9, 0x0, 0x20, 0x42, 0x0, 0x9, 0x0, 0x28, 0x42, 0x0, 0x9, 0x0, 0x30, 0x42, 0x0, 0x9, 0x0, 0x38, 0x42, 0x0, 0x9, 0x0, 0x40, 0x42, 0x0, 0x9, 0x0, 0x48, 0x42, 0x0, 0x9, 0x0, 0x50, 0x42, 0x0, 0x9, 0x0, 0x58, 0x42, 0x0, 0x9, 0x0, 0x60, 0x42, 0x0, 0x9, 0x0, 0x68, 0x42, 0x0, 0x9, 0x0, 0x70, 0x42, 0x0, 0x9, 0x0, 0x78, 0x42, 0x0, 0x9, 0x0, 0x80, 0x42, 0x0, 0x9, 0x0, 0x88, 0x42, 0x0, 0x9, 0x0, 0x90, 0x42, 0x0, 0x9, 0x0, 0x98, 0x42, 0x0, 0x9, 0x0, 0xA0, 0x42, 0x0, 0x9, 0x0, 0xA8, 0x42, 0x0, 0x9, 0x0, 0xB0, 0x42, 0x0, 0x9, 0x0, 0xB8, 0x42, 0x0, 0x9, 0x0, 0xC0, 0x42, 0x0, 0x9, 0x0, 0xC8, 0x42, 0x0, 0x9, 0x0, 0xD0, 0x42, 0x0, 0x9, 0x0, 0xD8, 0x42, 0x0, 0x9, 0x0, 0xE0, 0x42, 0x0, 0x9, 0x0, 0xE8, 0x42, 0x0, 0x9, 0x0, 0xF0, 0x42, 0x0, 0x9, 0x0, 0xF8, 0x42, 0x0, 0x9, 0x0, 0x0, 0x43, 0x0, 0x9, 0x0, 0x8, 0x43, 0x0, 0x9, 0x0, 0x10, 0x43, 0x0, 0x9, 0x0, 0x18, 0x43, 0x0, 0x9, 0x0, 0x20, 0x43, 0x0, 0x9, 0x0, 0x28, 0x43, 0x0, 0x9, 0x0, 0x30, 0x43, 0x0, 0x9, 0x0, 0x38, 0x43, 0x0, 0x9, 0x0, 0x40, 0x43, 0x0, 0x9, 0x0, 0x48, 0x43, 0x0, 0x9, 0x0, 0x50, 0x43, 0x0, 0x9, 0x0, 0x58, 0x43, 0x0, 0x9, 0x0, 0x60, 0x43, 0x0, 0x9, 0x0, 0x68, 0x43, 0x0, 0x9, 0x0, 0x70, 0x43, 0x0, 0x9, 0x0, 0x78, 0x43, 0x0, 0x9, 0x0, 0x80, 0x43, 0x0, 0x9, 0x0, 0x88, 0x43, 0x0, 0x9, 0x0, 0x90, 0x43, 0x0, 0x9, 0x0, 0x98, 0x43, 0x0, 0x9, 0x0, 0xA0, 0x43, 0x0, 0x9, 0x0, 0xA8, 0x43, 0x0, 0x9, 0x0, 0xB0, 0x43, 0x0, 0x9, 0x0, 0xB8, 0x43, 0x0, 0x9, 0x0, 0xC0, 0x43, 0x0, 0x9, 0x0, 0xC8, 0x43, 0x0, 0x9, 0x0, 0xD0, 0x43, 0x0, 0x9, 0x0, 0xD8, 0x43, 0x0, 0x9, 0x0, 0xE0, 0x43, 0x0, 0x9, 0x0, 0xE8, 0x43, 0x0, 0x9, 0x0, 0xF0, 0x43, 0x0, 0x9, 0x0, 0xF8, 0x43, 0x0, 0x9, 0x0, 0x0, 0x44, 0x0, 0x9, 0x0, 0x8, 0x44, 0x0, 0x9, 0x0, 0x10, 0x44, 0x0, 0x9, 0x0, 0x18, 0x44, 0x0, 0x9, 0x0, 0x20, 0x44, 0x0, 0x9, 0x0, 0x28, 0x44, 0x0, 0x9, 0x0, 0x30, 0x44, 0x0, 0x9, 0x0, 0x38, 0x44, 0x0, 0x9, 0x0, 0x40, 0x44, 0x0, 0x29, 0x11, 0x1, 0x0, 0x0, 0x49, 0x11, 0x1, 0x0, 0x0, 0x69, 0x11, 0x1, 0x0, 0x0, 0x89, 0x11, 0x1, 0x0, 0x0, 0xA9, 0x11, 0x1, 0x0, 0x0, 0xC9, 0x11, 0x1, 0x0, 0x0, 0xE9, 0x11, 0x1, 0x0, 0x0, 0x9, 0x12, 0x1, 0x0, 0x0, 0x29, 0x12, 0x1, 0x0, 0x0, 0x49, 0x12, 0x1, 0x0, 0x0, 0x69, 0x12, 0x1, 0x0, 0x0, 0x89, 0x12, 0x1, 0x0, 0x0, 0xA9, 0x12, 0x1, 0x0, 0x0, 0xC9, 0x12, 0x1, 0x0, 0x0, 0xE9, 0x12, 0x1, 0x0, 0x0, 0x9, 0x13, 0x1, 0x0, 0x0, 0x29, 0x13, 0x1, 0x0, 0x0, 0x49, 0x13, 0x1, 0x0, 0x0, 0x69, 0x13, 0x1, 0x0, 0x0, 0x89, 0x13, 0x1, 0x0, 0x0, 0xA9, 0x13, 0x1, 0x0, 0x0, 0xC9, 0x13, 0x1, 0x0, 0x0, 0xE9, 0x13, 0x1, 0x0, 0x0, 0x9, 0x14, 0x1, 0x0, 0x0, 0x29, 0x14, 0x1, 0x0, 0x0, 0x49, 0x14, 0x1, 0x0, 0x0, 0x69, 0x14, 0x1, 0x0, 0x0, 0x89, 0x14, 0x1, 0x0, 0x0, 0xA9, 0x14, 0x1, 0x0, 0x0, 0xC9, 0x14, 0x1, 0x0, 0x0, 0xE9, 0x14, 0x1, 0x0, 0x0, 0x9, 0x15, 0x1, 0x0, 0x0, 0x29, 0x15, 0x1, 0x0, 0x0, 0x49, 0x15, 0x1, 0x0, 0x0, 0x69, 0x15, 0x1, 0x0, 0x0, 0x89, 0x15, 0x1, 0x0, 0x0, 0xA9, 0x15, 0x1, 0x0, 0x0, 0xC9, 0x15, 0x1, 0x0, 0x0, 0xE9, 0x15, 0x1, 0x0, 0x0, 0x9, 0x16, 0x1, 0x0, 0x0, 0x29, 0x16, 0x1, 0x0, 0x0, 0x49, 0x16, 0x1, 0x0, 0x0, 0x69, 0x16, 0x1, 0x0, 0x0, 0x89, 0x16, 0x1, 0x0, 0x0, 0xA9, 0x16, 0x1, 0x0, 0x0, 0xC9, 0x16, 0x1, 0x0, 0x0, 0xE9, 0x16, 0x1, 0x0, 0x0, 0x9, 0x17, 0x1, 0x0, 0x0, 0x29, 0x17, 0x1, 0x0, 0x0, 0x49, 0x17, 0x1, 0x0, 0x0, 0x69, 0x17, 0x1, 0x0, 0x0, 0x89, 0x17, 0x1, 0x0, 0x0, 0xA9, 0x17, 0x1, 0x0, 0x0, 0xC9, 0x17, 0x1, 0x0, 0x0, 0xE9, 0x17, 0x1, 0x0, 0x0, 0x9, 0x18, 0x1, 0x0, 0x0, 0x29, 0x18, 0x1, 0x0, 0x0, 0x49, 0x18, 0x1, 0x0, 0x0, 0x69, 0x18, 0x1, 0x0, 0x0, 0x89, 0x18, 0x1, 0x0, 0x0, 0xA9, 0x18, 0x1, 0x0, 0x0, 0xC9, 0x18, 0x1, 0x0, 0x0, 0xE9, 0x18, 0x1, 0x0, 0x0, 0x9, 0x19, 0x1, 0x0, 0x0, 0x29, 0x19, 0x1, 0x0, 0x0, 0x49, 0x19, 0x1, 0x0, 0x0, 0x69, 0x19, 0x1, 0x0, 0x0, 0x89, 0x19, 0x1, 0x0, 0x0, 0xA9, 0x19, 0x1, 0x0, 0x0, 0xC9, 0x19, 0x1, 0x0, 0x0, 0xE9, 0x19, 0x1, 0x0, 0x0, 0x9, 0x1A, 0x1, 0x0, 0x0, 0x29, 0x1A, 0x1, 0x0, 0x0, 0x49, 0x1A, 0x1, 0x0, 0x0, 0x69, 0x1A, 0x1, 0x0, 0x0, 0x89, 0x1A, 0x1, 0x0, 0x0, 0xA9, 0x1A, 0x1, 0x0, 0x0, 0xC9, 0x1A, 0x1, 0x0, 0x0, 0xE9, 0x1A, 0x1, 0x0, 0x0, 0x9, 0x1B, 0x1, 0x0, 0x0, 0x29, 0x1B, 0x1, 0x0, 0x0, 0x49, 0x1B, 0x1, 0x0, 0x0, 0x69, 0x1B, 0x1, 0x0, 0x0, 0x89, 0x1B, 0x1, 0x0, 0x0, 0xA9, 0x1B, 0x1, 0x0, 0x0, 0xC9, 0x1B, 0x1, 0x0, 0x0, 0xE9, 0x1B, 0x1, 0x0, 0x0, 0x9, 0x1C, 0x1, 0x0, 0x0, 0x29, 0x1C, 0x1, 0x0, 0x0, 0x49, 0x1C, 0x1, 0x0, 0x0, 0x69, 0x1C, 0x1, 0x0, 0x0, 0x89, 0x1C, 0x1, 0x0, 0x0, 0xA9, 0x1C, 0x1, 0x0, 0x0, 0xC9, 0x1C, 0x1, 0x0, 0x0, 0xE9, 0x1C, 0x1, 0x0, 0x0, 0x9, 0x1D, 0x1, 0x0, 0x0, 0x29, 0x1D, 0x1, 0x0, 0x0, 0x49, 0x1D, 0x1, 0x0, 0x0, 0x69, 0x1D, 0x1, 0x0, 0x0, 0x89, 0x1D, 0x1, 0x0, 0x0, 0xA9, 0x1D, 0x1, 0x0, 0x0, 0xC9, 0x1D, 0x1, 0x0, 0x0, 0xE9, 0x1D, 0x1, 0x0, 0x0, 0x49, 0xFD, 0x0, 0x0, 0x0, 0x9, 0x1E, 0x1, 0x0, 0x0, 0x29, 0x1E, 0x1, 0x0, 0x0, 0x49, 0x1E, 0x1, 0x0, 0x0, 0x69, 0x1E, 0x1, 0x0, 0x0, 0x89, 0x1E, 0x1, 0x0, 0x0, 0xA9, 0x1E, 0x1, 0x0, 0x0, 0xC9, 0x1E, 0x1, 0x0, 0x0, 0xA9, 0xFD, 0x0, 0x0, 0x0, 0xC9, 0xFD, 0x0, 0x0, 0x0, 0xE9, 0xFD, 0x0, 0x0, 0x0, 0x9, 0xFE, 0x0, 0x0, 0x0, 0x29, 0xFE, 0x0, 0x0, 0x0, 0x49, 0xFE, 0x0, 0x0, 0x0, 0x69, 0xFE, 0x0, 0x0, 0x0, 0x89, 0xFE, 0x0, 0x0, 0x0, 0xA9, 0xFE, 0x0, 0x0, 0x0, 0xC9, 0xFE, 0x0, 0x0, 0x0, 0xE9, 0xFE, 0x0, 0x0, 0x0, 0x9, 0xFF, 0x0, 0x0, 0x0, 0x29, 0xFF, 0x0, 0x0, 0x0, 0x49, 0xFF, 0x0, 0x0, 0x0, 0x69, 0xFF, 0x0, 0x0, 0x0, 0x89, 0xFF, 0x0, 0x0, 0x0, 0xA9, 0xFF, 0x0, 0x0, 0x0, 0xC9, 0xFF, 0x0, 0x0, 0x0, 0xE9, 0xFF, 0x0, 0x0, 0x0, 0x9, 0x0, 0x1, 0x0, 0x0, 0x29, 0x0, 0x1, 0x0, 0x0, 0x49, 0x0, 0x1, 0x0, 0x0, 0x69, 0x0, 0x1, 0x0, 0x0, 0x89, 0x0, 0x1, 0x0, 0x0, 0xA9, 0x0, 0x1, 0x0, 0x0, 0xC9, 0x0, 0x1, 0x0, 0x0, 0xE9, 0x0, 0x1, 0x0, 0x0, 0x9, 0x1, 0x1, 0x0, 0x0, 0x29, 0x1, 0x1, 0x0, 0x0, 0x49, 0x1, 0x1, 0x0, 0x0, 0x69, 0x1, 0x1, 0x0, 0x0, 0x89, 0x1, 0x1, 0x0, 0x0, 0xA9, 0x1, 0x1, 0x0, 0x0, 0xC9, 0x1, 0x1, 0x0, 0x0, 0x9, 0x0, 0xB8, 0x47, 0x0, 0x9, 0x1F, 0x1, 0x0, 0x0, 0x29, 0x1F, 0x1, 0x0, 0x0, 0x49, 0x1F, 0x1, 0x0, 0x0, 0x69, 0x1F, 0x1, 0x0, 0x0, 0x89, 0x1F, 0x1, 0x0, 0x0, 0xA9, 0x1F, 0x1, 0x0, 0x0, 0xC9, 0x2, 0x1, 0x0, 0x0, 0xC9, 0x1F, 0x1, 0x0, 0x0, 0xE9, 0x1F, 0x1, 0x0, 0x0, 0x9, 0x20, 0x1, 0x0, 0x0, 0x29, 0x20, 0x1, 0x0, 0x0, 0x49, 0x20, 0x1, 0x0, 0x0, 0x69, 0x20, 0x1, 0x0, 0x0, 0x89, 0x20, 0x1, 0x0, 0x0, 0xA9, 0x20, 0x1, 0x0, 0x0, 0xC9, 0x20, 0x1, 0x0, 0x0, 0xE9, 0x20, 0x1, 0x0, 0x0, 0x9, 0x21, 0x1, 0x0, 0x0, 0x29, 0x21, 0x1, 0x0, 0x0, 0x49, 0x21, 0x1, 0x0, 0x0, 0x69, 0x21, 0x1, 0x0, 0x0, 0x89, 0x21, 0x1, 0x0, 0x0, 0xA9, 0x21, 0x1, 0x0, 0x0, 0xC9, 0x21, 0x1, 0x0, 0x0, 0xE9, 0x21, 0x1, 0x0, 0x0, 0x9, 0x22, 0x1, 0x0, 0x0, 0x29, 0x22, 0x1, 0x0, 0x0, 0x49, 0x22, 0x1, 0x0, 0x0, 0x69, 0x22, 0x1, 0x0, 0x0, 0x89, 0x22, 0x1, 0x0, 0x0, 0xA9, 0x22, 0x1, 0x0, 0x0, 0xC9, 0x22, 0x1, 0x0, 0x0, 0xE9, 0x22, 0x1, 0x0, 0x0, 0x9, 0x23, 0x1, 0x0, 0x0, 0x29, 0x23, 0x1, 0x0, 0x0, 0x49, 0x23, 0x1, 0x0, 0x0, 0x69, 0x23, 0x1, 0x0, 0x0, 0x89, 0x23, 0x1, 0x0, 0x0, 0xA9, 0x23, 0x1, 0x0, 0x0, 0xC9, 0x23, 0x1, 0x0, 0x0, 0xE9, 0x23, 0x1, 0x0, 0x0, 0x9, 0x0, 0x0, 0x49, 0x0, 0x9, 0x0, 0x8, 0x49, 0x0, 0x9, 0x0, 0x10, 0x49, 0x0, 0x9, 0x0, 0x18, 0x49, 0x0, 0x9, 0x0, 0x20, 0x49, 0x0, 0x9, 0x0, 0x28, 0x49, 0x0, 0x9, 0x0, 0x30, 0x49, 0x0, 0x9, 0x0, 0x38, 0x49, 0x0, 0x9, 0x0, 0x40, 0x49, 0x0, 0x9, 0x0, 0x48, 0x49, 0x0, 0x9, 0x0, 0x50, 0x49, 0x0, 0x9, 0x0, 0x58, 0x49, 0x0, 0x9, 0x0, 0x60, 0x49, 0x0, 0x9, 0x0, 0x68, 0x49, 0x0, 0x9, 0x0, 0x70, 0x49, 0x0, 0x9, 0x0, 0x78, 0x49, 0x0, 0x9, 0x0, 0x80, 0x49, 0x0, 0x9, 0x0, 0x88, 0x49, 0x0, 0x9, 0x0, 0x90, 0x49, 0x0, 0x9, 0x0, 0x98, 0x49, 0x0, 0x9, 0x0, 0xA0, 0x49, 0x0, 0x9, 0x0, 0xA8, 0x49, 0x0, 0x9, 0x0, 0xB0, 0x49, 0x0, 0x9, 0x0, 0xB8, 0x49, 0x0, 0x9, 0x0, 0xC0, 0x49, 0x0, 0x9, 0x0, 0xC8, 0x49, 0x0, 0x9, 0x0, 0xD0, 0x49, 0x0, 0x9, 0x0, 0xD8, 0x49, 0x0, 0x9, 0x0, 0xE0, 0x49, 0x0, 0x9, 0x0, 0xE8, 0x49, 0x0, 0x9, 0x0, 0xF0, 0x49, 0x0, 0x9, 0x0, 0xA0, 0x39, 0x0, 0x9, 0x0, 0xF8, 0x49, 0x0, 0x9, 0x0, 0x90, 0x39, 0x0, 0x9, 0x0, 0x0, 0x4A, 0x0, 0x9, 0x0, 0x8, 0x4A, 0x0, 0x9, 0x0, 0x10, 0x4A, 0x0, 0x9, 0x0, 0x18, 0x4A, 0x0, 0x9, 0x0, 0x20, 0x4A, 0x0, 0x9, 0x0, 0x28, 0x4A, 0x0, 0x9, 0x0, 0x30, 0x4A, 0x0, 0x9, 0x0, 0x38, 0x4A, 0x0, 0x9, 0x0, 0x40, 0x4A, 0x0, 0x9, 0x0, 0x48, 0x4A, 0x0, 0x9, 0x0, 0x50, 0x4A, 0x0, 0x9, 0x0, 0x58, 0x4A, 0x0, 0x9, 0x0, 0x60, 0x4A, 0x0, 0x9, 0x0, 0x68, 0x4A, 0x0, 0x9, 0x0, 0x70, 0x4A, 0x0, 0x9, 0x0, 0x78, 0x4A, 0x0, 0x9, 0x0, 0x80, 0x4A, 0x0, 0x9, 0x0, 0x88, 0x4A, 0x0, 0x9, 0x0, 0x90, 0x4A, 0x0, 0x9, 0x0, 0x98, 0x4A, 0x0, 0x9, 0x0, 0xA0, 0x4A, 0x0, 0x9, 0x0, 0xA8, 0x4A, 0x0, 0x9, 0x0, 0xB0, 0x4A, 0x0, 0x9, 0x0, 0xB8, 0x4A, 0x0, 0x9, 0x0, 0xC0, 0x4A, 0x0, 0x9, 0x0, 0xC8, 0x4A, 0x0, 0x9, 0x0, 0xD0, 0x4A, 0x0, 0x69, 0x2B, 0x1, 0x0, 0x0, 0x89, 0x2B, 0x1, 0x0, 0x0, 0xA9, 0x2B, 0x1, 0x0, 0x0, 0xC9, 0x2B, 0x1, 0x0, 0x0, 0xE9, 0x2B, 0x1, 0x0, 0x0, 0x9, 0x2C, 0x1, 0x0, 0x0, 0x9, 0x0, 0x8, 0x4B, 0x0, 0x9, 0x0, 0x10, 0x4B, 0x0, 0x9, 0x0, 0x18, 0x4B, 0x0, 0x9, 0x0, 0x20, 0x4B, 0x0, 0x9, 0x0, 0x28, 0x4B, 0x0, 0x9, 0x0, 0x30, 0x4B, 0x0, 0x9, 0x0, 0x38, 0x4B, 0x0, 0x9, 0x0, 0x40, 0x4B, 0x0, 0x9, 0x0, 0x48, 0x4B, 0x0, 0x9, 0x0, 0x50, 0x4B, 0x0, 0x9, 0x0, 0x58, 0x4B, 0x0, 0x9, 0x0, 0x60, 0x4B, 0x0, 0x9, 0x0, 0x68, 0x4B, 0x0, 0x9, 0x0, 0x70, 0x4B, 0x0, 0x9, 0x0, 0x78, 0x4B, 0x0, 0x9, 0x0, 0x80, 0x4B, 0x0, 0x9, 0x0, 0x88, 0x4B, 0x0, 0x9, 0x0, 0x90, 0x4B, 0x0, 0x9, 0x0, 0x98, 0x4B, 0x0, 0x9, 0x0, 0xA0, 0x4B, 0x0, 0x9, 0x0, 0xA8, 0x4B, 0x0, 0x9, 0x0, 0xB0, 0x4B, 0x0, 0x9, 0x0, 0xB8, 0x4B, 0x0, 0x9, 0x0, 0xC0, 0x4B, 0x0, 0x9, 0x0, 0xC8, 0x4B, 0x0, 0x9, 0x0, 0xD0, 0x4B, 0x0, 0x9, 0x0, 0xD8, 0x4B, 0x0, 0x9, 0x0, 0xE0, 0x4B, 0x0, 0x9, 0x0, 0xE8, 0x4B, 0x0, 0x9, 0x0, 0xF0, 0x4B, 0x0, 0x9, 0x0, 0xF8, 0x4B, 0x0, 0x9, 0x0, 0x0, 0x4C, 0x0, 0x9, 0x0, 0x8, 0x4C, 0x0, 0x9, 0x0, 0x10, 0x4C, 0x0, 0x9, 0x0, 0x18, 0x4C, 0x0, 0x9, 0x0, 0x20, 0x4C, 0x0, 0x9, 0x0, 0x28, 0x4C, 0x0, 0x9, 0x0, 0x30, 0x4C, 0x0, 0x9, 0x0, 0x70, 0x3B, 0x0, 0x9, 0x0, 0x78, 0x3B, 0x0, 0x9, 0x0, 0x80, 0x3B, 0x0, 0x9, 0x0, 0x88, 0x3B, 0x0, 0x9, 0x0, 0x90, 0x3B, 0x0, 0x9, 0x0, 0x98, 0x3B, 0x0, 0x9, 0x0, 0xA0, 0x3B, 0x0, 0x9, 0x0, 0x38, 0x4C, 0x0, 0x9, 0x0, 0x40, 0x4C, 0x0, 0x9, 0x0, 0x48, 0x4C, 0x0, 0x9, 0x0, 0x50, 0x4C, 0x0, 0x9, 0x0, 0x58, 0x4C, 0x0, 0x9, 0x0, 0x60, 0x4C, 0x0, 0x9, 0x0, 0x68, 0x4C, 0x0, 0x9, 0x0, 0x70, 0x4C, 0x0, 0x9, 0x0, 0x78, 0x4C, 0x0, 0x9, 0x0, 0x80, 0x4C, 0x0, 0x9, 0x0, 0x88, 0x4C, 0x0, 0x9, 0x0, 0x90, 0x4C, 0x0, 0x9, 0x0, 0x98, 0x4C, 0x0, 0x9, 0x0, 0xA0, 0x4C, 0x0, 0x9, 0x0, 0xA8, 0x4C, 0x0, 0x9, 0x0, 0xB0, 0x4C, 0x0, 0x9, 0x0, 0xB8, 0x4C, 0x0, 0x9, 0x0, 0x50, 0x47, 0x0, 0x9, 0x0, 0x58, 0x47, 0x0, 0x9, 0x0, 0x60, 0x47, 0x0, 0x9, 0x0, 0x68, 0x47, 0x0, 0x9, 0x0, 0x70, 0x47, 0x0, 0x9, 0x0, 0x78, 0x47, 0x0, 0x9, 0x0, 0x80, 0x47, 0x0, 0x9, 0x0, 0x88, 0x47, 0x0, 0x9, 0x0, 0x90, 0x47, 0x0, 0x9, 0x0, 0x98, 0x47, 0x0, 0x9, 0x0, 0xA0, 0x47, 0x0, 0x9, 0x0, 0xA8, 0x47, 0x0, 0x9, 0x0, 0xB0, 0x47, 0x0, 0x9, 0x0, 0xC0, 0x4C, 0x0, 0x9, 0x0, 0xC8, 0x4C, 0x0, 0x9, 0x0, 0xD0, 0x4C, 0x0, 0x9, 0x0, 0xD8, 0x4C, 0x0, 0x9, 0x0, 0xE0, 0x4C, 0x0, 0x9, 0x0, 0xE8, 0x4C, 0x0, 0x9, 0x0, 0xF0, 0x4C, 0x0, 0x9, 0x0, 0xF8, 0x4C, 0x0, 0x9, 0x0, 0xC0, 0x47, 0x0, 0x9, 0x0, 0xC8, 0x47, 0x0, 0x9, 0x0, 0xD0, 0x47, 0x0, 0x9, 0x0, 0xD8, 0x47, 0x0, 0x9, 0x0, 0xE0, 0x47, 0x0, 0x9, 0x0, 0xE8, 0x47, 0x0, 0x9, 0x0, 0xF0, 0x47, 0x0, 0x9, 0x0, 0xF8, 0x47, 0x0, 0x9, 0x0, 0x18, 0x3C, 0x0, 0x9, 0x0, 0x20, 0x3C, 0x0, 0x9, 0x0, 0x28, 0x3C, 0x0, 0x9, 0x0, 0x30, 0x3C, 0x0, 0x9, 0x0, 0x38, 0x3C, 0x0, 0x9, 0x0, 0x40, 0x3C, 0x0, 0x9, 0x0, 0x0, 0x4D, 0x0, 0x9, 0x0, 0x8, 0x4D, 0x0, 0x9, 0x0, 0x10, 0x4D, 0x0, 0x9, 0x0, 0x18, 0x4D, 0x0, 0x9, 0x0, 0x20, 0x4D, 0x0, 0x9, 0x0, 0x28, 0x4D, 0x0, 0x9, 0x0, 0x30, 0x4D, 0x0, 0x9, 0x0, 0x38, 0x4D, 0x0, 0x9, 0x0, 0x40, 0x4D, 0x0, 0x9, 0x0, 0x48, 0x4D, 0x0, 0x9, 0x0, 0x50, 0x4D, 0x0, 0x9, 0x0, 0x58, 0x4D, 0x0, 0x9, 0x0, 0x60, 0x4D, 0x0, 0x9, 0x0, 0x68, 0x4D, 0x0, 0x9, 0x0, 0x70, 0x4D, 0x0, 0x9, 0x0, 0x78, 0x4D, 0x0, 0x9, 0x0, 0x80, 0x4D, 0x0, 0x9, 0x0, 0x88, 0x4D, 0x0, 0x9, 0x0, 0x90, 0x4D, 0x0, 0x9, 0x0, 0x98, 0x4D, 0x0, 0x9, 0x0, 0xA0, 0x4D, 0x0, 0x9, 0x0, 0xA8, 0x4D, 0x0, 0x9, 0x0, 0xB0, 0x4D, 0x0, 0x9, 0x0, 0xB8, 0x4D, 0x0, 0x9, 0x0, 0xC0, 0x4D, 0x0, 0x9, 0x0, 0xC8, 0x4D, 0x0, 0x9, 0x0, 0xD0, 0x4D, 0x0, 0x9, 0x0, 0xD8, 0x4D, 0x0, 0x9, 0x0, 0xE0, 0x4D, 0x0, 0x9, 0x0, 0xE8, 0x4D, 0x0, 0x9, 0x0, 0xF0, 0x4D, 0x0, 0x9, 0x0, 0xF8, 0x4D, 0x0, 0x9, 0x0, 0x0, 0x4E, 0x0, 0x9, 0x0, 0x8, 0x4E, 0x0, 0x9, 0x0, 0x10, 0x4E, 0x0, 0x9, 0x0, 0x18, 0x4E, 0x0, 0x9, 0x0, 0x20, 0x4E, 0x0, 0x9, 0x0, 0x28, 0x4E, 0x0, 0x9, 0x0, 0x30, 0x4E, 0x0, 0x9, 0x0, 0x38, 0x4E, 0x0, 0x9, 0x0, 0x40, 0x4E, 0x0, 0x9, 0x0, 0x48, 0x4E, 0x0, 0x9, 0x0, 0x50, 0x4E, 0x0, 0x9, 0x0, 0x58, 0x4E, 0x0, 0x9, 0x0, 0x60, 0x4E, 0x0, 0x9, 0x0, 0x68, 0x4E, 0x0, 0x9, 0x0, 0x70, 0x4E, 0x0, 0x9, 0x0, 0x78, 0x4E, 0x0, 0x9, 0x3A, 0x1, 0x0, 0x0, 0x29, 0x3A, 0x1, 0x0, 0x0, 0x49, 0x3A, 0x1, 0x0, 0x0, 0x69, 0x3A, 0x1, 0x0, 0x0, 0x89, 0x3A, 0x1, 0x0, 0x0, 0xA9, 0x3A, 0x1, 0x0, 0x0, 0xC9, 0x3A, 0x1, 0x0, 0x0, 0xE9, 0x3A, 0x1, 0x0, 0x0, 0x9, 0x3B, 0x1, 0x0, 0x0, 0x29, 0x3B, 0x1, 0x0, 0x0, 0x49, 0x3B, 0x1, 0x0, 0x0, 0x69, 0x3B, 0x1, 0x0, 0x0, 0x89, 0x3B, 0x1, 0x0, 0x0, 0xA9, 0x3B, 0x1, 0x0, 0x0, 0xC9, 0x3B, 0x1, 0x0, 0x0, 0xE9, 0x3B, 0x1, 0x0, 0x0, 0x9, 0x3C, 0x1, 0x0, 0x0, 0x29, 0x3C, 0x1, 0x0, 0x0, 0x49, 0x3C, 0x1, 0x0, 0x0, 0x69, 0x3C, 0x1, 0x0, 0x0, 0x89, 0x3C, 0x1, 0x0, 0x0, 0xA9, 0x3C, 0x1, 0x0, 0x0, 0xC9, 0x3C, 0x1, 0x0, 0x0, 0xE9, 0x3C, 0x1, 0x0, 0x0, 0x9, 0x3D, 0x1, 0x0, 0x0, 0x29, 0x3D, 0x1, 0x0, 0x0, 0x49, 0x3D, 0x1, 0x0, 0x0, 0x69, 0x3D, 0x1, 0x0, 0x0, 0x89, 0x3D, 0x1, 0x0, 0x0, 0xA9, 0x3D, 0x1, 0x0, 0x0, 0xC9, 0x3D, 0x1, 0x0, 0x0, 0xE9, 0x3D, 0x1, 0x0, 0x0, 0x9, 0x3E, 0x1, 0x0, 0x0, 0x29, 0x3E, 0x1, 0x0, 0x0, 0x49, 0x3E, 0x1, 0x0, 0x0, 0x69, 0x3E, 0x1, 0x0, 0x0, 0x89, 0x3E, 0x1, 0x0, 0x0, 0xA9, 0x3E, 0x1, 0x0, 0x0, 0xC9, 0x3E, 0x1, 0x0, 0x0, 0xE9, 0x3E, 0x1, 0x0, 0x0, 0x9, 0x3F, 0x1, 0x0, 0x0, 0x29, 0x3F, 0x1, 0x0, 0x0, 0x49, 0x3F, 0x1, 0x0, 0x0, 0x69, 0x3F, 0x1, 0x0, 0x0, 0x89, 0x3F, 0x1, 0x0, 0x0, 0xA9, 0x3F, 0x1, 0x0, 0x0, 0xC9, 0x3F, 0x1, 0x0, 0x0, 0xE9, 0x3F, 0x1, 0x0, 0x0, 0x9, 0x40, 0x1, 0x0, 0x0, 0x29, 0x40, 0x1, 0x0, 0x0, 0x49, 0x40, 0x1, 0x0, 0x0, 0x69, 0x40, 0x1, 0x0, 0x0, 0x89, 0x40, 0x1, 0x0, 0x0, 0xA9, 0x40, 0x1, 0x0, 0x0, 0xC9, 0x40, 0x1, 0x0, 0x0, 0xA9, 0x2A, 0xA9, 0x35, 0x0, 0xE9, 0x40, 0x1, 0x0, 0x0, 0x9, 0x41, 0xF9, 0x35, 0x0, 0x29, 0x41, 0x9, 0x36, 0x0, 0x49, 0x41, 0x1, 0x0, 0x0, 0x69, 0x41, 0x39, 0x36, 0x0, 0x89, 0x41, 0x89, 0x36, 0x0, 0xA9, 0x41, 0xB9, 0x36, 0x0, 0xC9, 0x41, 0x29, 0x37, 0x0, 0xE9, 0x41, 0x49, 0x37, 0x0, 0x29, 0x3, 0x59, 0x37, 0x0, 0x9, 0x42, 0xB9, 0x37, 0x0, 0x29, 0x42, 0xA9, 0x37, 0x0, 0xC9, 0x4, 0xD9, 0x37, 0x0, 0x49, 0x42, 0xE9, 0x37, 0x0, 0x69, 0x42, 0x19, 0x38, 0x0, 0x89, 0x42, 0x29, 0x38, 0x0, 0xA9, 0x42, 0x51, 0x38, 0x0, 0xC9, 0x42, 0x59, 0x38, 0x0, 0xE9, 0x42, 0x71, 0x38, 0x0, 0x9, 0x43, 0x99, 0x38, 0x0, 0x29, 0x43, 0xA1, 0x38, 0x0, 0x49, 0x43, 0x1, 0x0, 0x0, 0x69, 0x43, 0x79, 0x37, 0x0, 0x89, 0x43, 0x1, 0x0, 0x0, 0xA9, 0x43, 0x39, 0x37, 0x0, 0x9, 0x0, 0xF0, 0x50, 0x0, 0x9, 0x0, 0xF8, 0x50, 0x0, 0x9, 0x0, 0x98, 0x4E, 0x0, 0x9, 0x0, 0x0, 0x51, 0x0, 0x9, 0x0, 0x8, 0x51, 0x0, 0x9, 0x0, 0x10, 0x51, 0x0, 0x9, 0x0, 0x18, 0x51, 0x0, 0x9, 0x0, 0x20, 0x51, 0x0, 0x9, 0x0, 0xC0, 0x4E, 0x0, 0x9, 0x0, 0xC8, 0x4E, 0x0, 0x9, 0x0, 0xD0, 0x4E, 0x0, 0x9, 0x0, 0xD8, 0x4E, 0x0, 0x9, 0x0, 0xE0, 0x4E, 0x0, 0x9, 0x0, 0xE8, 0x4E, 0x0, 0x9, 0x0, 0xF0, 0x4E, 0x0, 0x9, 0x0, 0xF8, 0x4E, 0x0, 0x9, 0x0, 0x0, 0x4F, 0x0, 0x9, 0x0, 0x28, 0x51, 0x0, 0x9, 0x0, 0x30, 0x51, 0x0, 0x9, 0x0, 0x38, 0x51, 0x0, 0x9, 0x0, 0x40, 0x51, 0x0, 0x9, 0x0, 0x48, 0x51, 0x0, 0x9, 0x0, 0x50, 0x51, 0x0, 0x9, 0x0, 0x58, 0x51, 0x0, 0x9, 0x0, 0x60, 0x51, 0x0, 0x9, 0x0, 0x68, 0x51, 0x0, 0x9, 0x0, 0x70, 0x51, 0x0, 0x9, 0x0, 0x78, 0x51, 0x0, 0x9, 0x0, 0x80, 0x51, 0x0, 0x9, 0x0, 0x68, 0x39, 0x0, 0x9, 0x0, 0x78, 0x39, 0x0, 0x9, 0x0, 0x88, 0x51, 0x0, 0x9, 0x0, 0x90, 0x51, 0x0, 0x9, 0x0, 0x98, 0x51, 0x0, 0x9, 0x0, 0xA0, 0x51, 0x0, 0x9, 0x0, 0xA8, 0x51, 0x0, 0x9, 0x0, 0xE0, 0x39, 0x0, 0x9, 0x0, 0xE8, 0x39, 0x0, 0x9, 0x0, 0xF0, 0x39, 0x0, 0x9, 0x0, 0x10, 0x3A, 0x0, 0x9, 0x0, 0xB0, 0x51, 0x0, 0x9, 0x0, 0x38, 0x3A, 0x0, 0x9, 0x0, 0xB8, 0x51, 0x0, 0x9, 0x0, 0x48, 0x3A, 0x0, 0x9, 0x0, 0x50, 0x3A, 0x0, 0x9, 0x0, 0xC0, 0x51, 0x0, 0x9, 0x0, 0x68, 0x3A, 0x0, 0x9, 0x0, 0x70, 0x3A, 0x0, 0x9, 0x0, 0xC8, 0x51, 0x0, 0x9, 0x0, 0x20, 0x50, 0x0, 0x9, 0x0, 0xD0, 0x51, 0x0, 0x9, 0x0, 0x28, 0x50, 0x0, 0x9, 0x0, 0x30, 0x50, 0x0, 0x9, 0x0, 0x78, 0x3A, 0x0, 0x9, 0x0, 0x80, 0x3A, 0x0, 0x9, 0x0, 0x88, 0x3A, 0x0, 0x9, 0x0, 0x90, 0x3A, 0x0, 0x9, 0x0, 0x98, 0x3A, 0x0, 0x9, 0x0, 0xA0, 0x3A, 0x0, 0x9, 0x0, 0xA8, 0x3A, 0x0, 0x9, 0x0, 0xB0, 0x3A, 0x0, 0x9, 0x0, 0xB8, 0x3A, 0x0, 0x9, 0x0, 0xC0, 0x3A, 0x0, 0x9, 0x0, 0xC8, 0x3A, 0x0, 0x9, 0x0, 0xD0, 0x3A, 0x0, 0x9, 0x0, 0xD8, 0x3A, 0x0, 0x9, 0x0, 0xE0, 0x3A, 0x0, 0x9, 0x0, 0xE8, 0x3A, 0x0, 0x9, 0x0, 0xF0, 0x3A, 0x0, 0x9, 0x0, 0xF8, 0x3A, 0x0, 0x9, 0x0, 0x0, 0x3B, 0x0, 0x9, 0x0, 0x8, 0x3B, 0x0, 0x9, 0x0, 0xD8, 0x51, 0x0, 0x9, 0x0, 0xE0, 0x51, 0x0, 0x9, 0x0, 0xE8, 0x51, 0x0, 0x9, 0x0, 0xF0, 0x51, 0x0, 0x9, 0x0, 0xF8, 0x51, 0x0, 0x9, 0x0, 0x0, 0x52, 0x0, 0x9, 0x0, 0x8, 0x52, 0x0, 0x9, 0x0, 0x10, 0x52, 0x0, 0x9, 0x0, 0x58, 0x3B, 0x0, 0x9, 0x0, 0x60, 0x3B, 0x0, 0x9, 0x0, 0x68, 0x3B, 0x0, 0x9, 0x0, 0x18, 0x52, 0x0, 0x9, 0x0, 0x20, 0x52, 0x0, 0x9, 0x0, 0x28, 0x52, 0x0, 0x9, 0x0, 0x30, 0x52, 0x0, 0x9, 0x0, 0x38, 0x52, 0x0, 0x9, 0x0, 0x40, 0x52, 0x0, 0x9, 0x0, 0x48, 0x52, 0x0, 0x9, 0x0, 0x50, 0x52, 0x0, 0x9, 0x0, 0x58, 0x52, 0x0, 0x9, 0x0, 0x60, 0x52, 0x0, 0x9, 0x0, 0x68, 0x52, 0x0, 0x9, 0x0, 0x70, 0x52, 0x0, 0x9, 0x0, 0x78, 0x52, 0x0, 0x9, 0x0, 0x80, 0x52, 0x0, 0x9, 0x0, 0x88, 0x52, 0x0, 0x9, 0x0, 0x90, 0x52, 0x0, 0x9, 0x0, 0x98, 0x52, 0x0, 0x9, 0x0, 0xA0, 0x52, 0x0, 0x9, 0x0, 0xA8, 0x52, 0x0, 0x9, 0x0, 0xB0, 0x52, 0x0, 0x9, 0x0, 0xB8, 0x52, 0x0, 0x9, 0x0, 0xC0, 0x52, 0x0, 0x9, 0x0, 0xC8, 0x52, 0x0, 0x9, 0x0, 0xD0, 0x52, 0x0, 0x9, 0x0, 0xD8, 0x52, 0x0, 0x9, 0x0, 0xE0, 0x52, 0x0, 0x9, 0x0, 0xE8, 0x52, 0x0, 0x9, 0x0, 0xF0, 0x52, 0x0, 0x9, 0x0, 0xF8, 0x52, 0x0, 0x9, 0x0, 0x0, 0x53, 0x0, 0x9, 0x0, 0x8, 0x53, 0x0, 0x9, 0x0, 0x10, 0x53, 0x0, 0x9, 0x0, 0x18, 0x53, 0x0, 0x9, 0x0, 0x20, 0x53, 0x0, 0x9, 0x0, 0x28, 0x53, 0x0, 0x9, 0x0, 0x30, 0x53, 0x0, 0x9, 0x0, 0x38, 0x53, 0x0, 0x9, 0x0, 0x40, 0x53, 0x0, 0x9, 0x0, 0x48, 0x53, 0x0, 0x9, 0x0, 0x50, 0x53, 0x0, 0x9, 0x0, 0x58, 0x53, 0x0, 0x9, 0x0, 0x60, 0x53, 0x0, 0x9, 0x0, 0x68, 0x53, 0x0, 0x9, 0x0, 0x70, 0x53, 0x0, 0x9, 0x0, 0x78, 0x53, 0x0, 0x9, 0x0, 0x80, 0x53, 0x0, 0x9, 0x0, 0x88, 0x53, 0x0, 0x9, 0x0, 0x90, 0x53, 0x0, 0x9, 0x0, 0x98, 0x53, 0x0, 0x9, 0x0, 0xA0, 0x53, 0x0, 0x9, 0x0, 0xA8, 0x53, 0x0, 0x9, 0x0, 0xB0, 0x53, 0x0, 0x9, 0x0, 0xB8, 0x53, 0x0, 0x9, 0x0, 0xC0, 0x53, 0x0, 0x2A, 0x4F, 0x1, 0x0, 0x0, 0x4A, 0x4F, 0x1, 0x0, 0x0, 0x6A, 0x4F, 0x1, 0x0, 0x0, 0x8A, 0x4F, 0x1, 0x0, 0x0, 0xAA, 0x4F, 0x1, 0x0, 0x0, 0xCA, 0x4F, 0x1, 0x0, 0x0, 0xEA, 0x4F, 0x1, 0x0, 0x0, 0xA, 0x50, 0x1, 0x0, 0x0, 0x2A, 0x50, 0x1, 0x0, 0x0, 0x4A, 0x50, 0x1, 0x0, 0x0, 0x6A, 0x50, 0x1, 0x0, 0x0, 0x8A, 0x50, 0x1, 0x0, 0x0, 0xAA, 0x50, 0x1, 0x0, 0x0, 0xCA, 0x50, 0x1, 0x0, 0x0, 0xEA, 0x50, 0x1, 0x0, 0x0, 0xA, 0x51, 0x1, 0x0, 0x0, 0x2A, 0x51, 0x1, 0x0, 0x0, 0x4A, 0x51, 0x1, 0x0, 0x0, 0x6A, 0x51, 0x1, 0x0, 0x0, 0x8A, 0x51, 0x1, 0x0, 0x0, 0xAA, 0x51, 0x1, 0x0, 0x0, 0xCA, 0x51, 0x1, 0x0, 0x0, 0xEA, 0x51, 0x1, 0x0, 0x0, 0xA, 0x52, 0x1, 0x0, 0x0, 0x2A, 0x52, 0x1, 0x0, 0x0, 0x4A, 0x52, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x54, 0x0, 0xA, 0x0, 0xA0, 0x54, 0x0, 0xA, 0x0, 0xA8, 0x54, 0x0, 0xA, 0x0, 0xB0, 0x54, 0x0, 0xA, 0x0, 0xB8, 0x54, 0x0, 0xA, 0x0, 0xC0, 0x54, 0x0, 0xA, 0x0, 0xC8, 0x54, 0x0, 0xA, 0x0, 0xD0, 0x54, 0x0, 0xA, 0x0, 0xD8, 0x54, 0x0, 0xA, 0x0, 0xE0, 0x54, 0x0, 0xA, 0x0, 0xE8, 0x54, 0x0, 0xA, 0x0, 0xF0, 0x54, 0x0, 0xA, 0x0, 0xF8, 0x54, 0x0, 0xA, 0x0, 0x0, 0x55, 0x0, 0xA, 0x0, 0x8, 0x55, 0x0, 0xA, 0x0, 0x10, 0x55, 0x0, 0xA, 0x0, 0x18, 0x55, 0x0, 0xA, 0x0, 0x20, 0x55, 0x0, 0xA, 0x0, 0x28, 0x55, 0x0, 0xA, 0x0, 0x30, 0x55, 0x0, 0xA, 0x0, 0x38, 0x55, 0x0, 0xA, 0x0, 0x40, 0x55, 0x0, 0xA, 0x0, 0x48, 0x55, 0x0, 0xA, 0x0, 0x50, 0x55, 0x0, 0xA, 0x0, 0x58, 0x55, 0x0, 0xA, 0x0, 0x60, 0x55, 0x0, 0xA, 0x0, 0x68, 0x55, 0x0, 0xA, 0x0, 0x70, 0x55, 0x0, 0xA, 0x0, 0x78, 0x55, 0x0, 0xA, 0x0, 0x80, 0x55, 0x0, 0xA, 0x0, 0x88, 0x55, 0x0, 0xA, 0x0, 0x90, 0x55, 0x0, 0xA, 0x0, 0x98, 0x55, 0x0, 0xA, 0x0, 0xA0, 0x55, 0x0, 0xA, 0x0, 0xA8, 0x55, 0x0, 0xA, 0x0, 0xB0, 0x55, 0x0, 0xA, 0x0, 0xB8, 0x55, 0x0, 0xA, 0x0, 0xC0, 0x55, 0x0, 0xA, 0x0, 0xC8, 0x55, 0x0, 0xA, 0x0, 0xD0, 0x55, 0x0, 0xA, 0x0, 0xD8, 0x55, 0x0, 0xA, 0x0, 0xE0, 0x55, 0x0, 0xA, 0x0, 0xE8, 0x55, 0x0, 0xA, 0x0, 0xF0, 0x55, 0x0, 0xA, 0x0, 0xF8, 0x55, 0x0, 0xA, 0x0, 0x0, 0x56, 0x0, 0xA, 0x0, 0x8, 0x56, 0x0, 0xA, 0x0, 0x10, 0x56, 0x0, 0xA, 0x0, 0x18, 0x56, 0x0, 0xA, 0x0, 0x20, 0x56, 0x0, 0xA, 0x0, 0x28, 0x56, 0x0, 0xA, 0x0, 0x30, 0x56, 0x0, 0xA, 0x0, 0x38, 0x56, 0x0, 0xA, 0x0, 0x40, 0x56, 0x0, 0xA, 0x0, 0x48, 0x56, 0x0, 0xA, 0x0, 0x50, 0x56, 0x0, 0xA, 0x0, 0x58, 0x56, 0x0, 0xA, 0x0, 0x60, 0x56, 0x0, 0xA, 0x0, 0x68, 0x56, 0x0, 0xA, 0x0, 0x70, 0x56, 0x0, 0xA, 0x0, 0x78, 0x56, 0x0, 0xA, 0x0, 0x80, 0x56, 0x0, 0xA, 0x0, 0x88, 0x56, 0x0, 0xA, 0x0, 0x90, 0x56, 0x0, 0xA, 0x0, 0x98, 0x56, 0x0, 0xA, 0x0, 0xA0, 0x56, 0x0, 0xA, 0x0, 0xA8, 0x56, 0x0, 0xA, 0x0, 0xB0, 0x56, 0x0, 0xA, 0x0, 0xB8, 0x56, 0x0, 0xA, 0x0, 0xC0, 0x56, 0x0, 0xA, 0x0, 0xC8, 0x56, 0x0, 0xA, 0x0, 0xD0, 0x56, 0x0, 0xA, 0x0, 0xD8, 0x56, 0x0, 0xA, 0x0, 0xE0, 0x56, 0x0, 0xA, 0x0, 0xE8, 0x56, 0x0, 0xA, 0x0, 0xF0, 0x56, 0x0, 0xA, 0x0, 0xF8, 0x56, 0x0, 0xA, 0x0, 0x0, 0x57, 0x0, 0xA, 0x0, 0x8, 0x57, 0x0, 0xA, 0x0, 0x10, 0x57, 0x0, 0xA, 0x0, 0x18, 0x57, 0x0, 0xA, 0x0, 0x20, 0x57, 0x0, 0xA, 0x0, 0x28, 0x57, 0x0, 0xA, 0x0, 0x30, 0x57, 0x0, 0xA, 0x0, 0x38, 0x57, 0x0, 0xA, 0x0, 0x40, 0x57, 0x0, 0xA, 0x0, 0x48, 0x57, 0x0, 0xA, 0x0, 0x50, 0x57, 0x0, 0xA, 0x0, 0x58, 0x57, 0x0, 0xA, 0x0, 0x60, 0x57, 0x0, 0xA, 0x0, 0x68, 0x57, 0x0, 0xA, 0x0, 0x70, 0x57, 0x0, 0xA, 0x0, 0x78, 0x57, 0x0, 0xA, 0x0, 0x80, 0x57, 0x0, 0xA, 0x0, 0x88, 0x57, 0x0, 0xA, 0x0, 0x90, 0x57, 0x0, 0xA, 0x0, 0x98, 0x57, 0x0, 0xA, 0x0, 0xA0, 0x57, 0x0, 0xA, 0x0, 0xA8, 0x57, 0x0, 0xA, 0x0, 0xB0, 0x57, 0x0, 0xA, 0x0, 0xB8, 0x57, 0x0, 0xA, 0x0, 0xC0, 0x57, 0x0, 0xA, 0x0, 0xC8, 0x57, 0x0, 0xA, 0x0, 0xD0, 0x57, 0x0, 0xA, 0x0, 0xD8, 0x57, 0x0, 0xA, 0x0, 0xE0, 0x57, 0x0, 0xA, 0x0, 0xE8, 0x57, 0x0, 0xA, 0x0, 0xF0, 0x57, 0x0, 0xA, 0x0, 0xF8, 0x57, 0x0, 0xA, 0x0, 0x0, 0x58, 0x0, 0xA, 0x0, 0x8, 0x58, 0x0, 0xA, 0x0, 0x10, 0x58, 0x0, 0xA, 0x0, 0x18, 0x58, 0x0, 0xA, 0x0, 0x20, 0x58, 0x0, 0xA, 0x0, 0x28, 0x58, 0x0, 0xA, 0x0, 0x30, 0x58, 0x0, 0xA, 0x0, 0x38, 0x58, 0x0, 0xA, 0x0, 0x40, 0x58, 0x0, 0xA, 0x0, 0x48, 0x58, 0x0, 0xA, 0x0, 0x50, 0x58, 0x0, 0xA, 0x0, 0x58, 0x58, 0x0, 0xA, 0x0, 0x60, 0x58, 0x0, 0xA, 0x0, 0x68, 0x58, 0x0, 0xA, 0x0, 0x70, 0x58, 0x0, 0xA, 0x0, 0x78, 0x58, 0x0, 0xA, 0x0, 0x80, 0x58, 0x0, 0xA, 0x0, 0x88, 0x58, 0x0, 0xA, 0x0, 0x90, 0x58, 0x0, 0xA, 0x0, 0x98, 0x58, 0x0, 0x6A, 0x55, 0x1, 0x0, 0x0, 0x8A, 0x62, 0x1, 0x0, 0x0, 0xAA, 0x62, 0x1, 0x0, 0x0, 0xCA, 0x62, 0x1, 0x0, 0x0, 0xCA, 0x5C, 0x1, 0x0, 0x0, 0xEA, 0x62, 0x1, 0x0, 0x0, 0xA, 0x5D, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC0, 0x58, 0x0, 0x2A, 0x63, 0x1, 0x0, 0x0, 0x4A, 0x63, 0x1, 0x0, 0x0, 0x6A, 0x63, 0x1, 0x0, 0x0, 0x8A, 0x63, 0x1, 0x0, 0x0, 0xAA, 0x63, 0x1, 0x0, 0x0, 0xCA, 0x63, 0x1, 0x0, 0x0, 0xEA, 0x63, 0x1, 0x0, 0x0, 0xA, 0x64, 0x1, 0x0, 0x0, 0xAA, 0x55, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x59, 0x0, 0xEA, 0x55, 0x1, 0x0, 0x0, 0xA, 0x0, 0x10, 0x59, 0x0, 0x2A, 0x56, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x59, 0x0, 0xAA, 0x56, 0x1, 0x0, 0x0, 0xA, 0x0, 0x20, 0x59, 0x0, 0xEA, 0x56, 0x1, 0x0, 0x0, 0xA, 0x0, 0x28, 0x59, 0x0, 0x2A, 0x57, 0x1, 0x0, 0x0, 0xA, 0x0, 0x30, 0x59, 0x0, 0x6A, 0x57, 0x1, 0x0, 0x0, 0xA, 0x0, 0x38, 0x59, 0x0, 0xAA, 0x57, 0x1, 0x0, 0x0, 0xA, 0x0, 0x40, 0x59, 0x0, 0x2A, 0x65, 0x1, 0x0, 0x0, 0x4A, 0x65, 0x1, 0x0, 0x0, 0x6A, 0x65, 0x1, 0x0, 0x0, 0x8A, 0x65, 0x1, 0x0, 0x0, 0xAA, 0x65, 0x1, 0x0, 0x0, 0xCA, 0x65, 0x1, 0x0, 0x0, 0xEA, 0x65, 0x1, 0x0, 0x0, 0xA, 0x66, 0x1, 0x0, 0x0, 0x2A, 0x66, 0x1, 0x0, 0x0, 0x4A, 0x66, 0x1, 0x0, 0x0, 0x6A, 0x66, 0x1, 0x0, 0x0, 0x8A, 0x66, 0x1, 0x0, 0x0, 0xAA, 0x5E, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x59, 0x0, 0xCA, 0x66, 0x1, 0x0, 0x0, 0xEA, 0x66, 0x1, 0x0, 0x0, 0xA, 0x67, 0x1, 0x0, 0x0, 0x2A, 0x67, 0x1, 0x0, 0x0, 0x4A, 0x67, 0x1, 0x0, 0x0, 0x6A, 0x67, 0x1, 0x0, 0x0, 0xAA, 0x60, 0x1, 0x0, 0x0, 0x8A, 0x67, 0x1, 0x0, 0x0, 0xAA, 0x67, 0x1, 0x0, 0x0, 0xCA, 0x67, 0x1, 0x0, 0x0, 0xEA, 0x67, 0x1, 0x0, 0x0, 0xA, 0x68, 0x1, 0x0, 0x0, 0x2A, 0x68, 0x1, 0x0, 0x0, 0x4A, 0x68, 0x1, 0x0, 0x0, 0x6A, 0x68, 0x1, 0x0, 0x0, 0x8A, 0x68, 0x1, 0x0, 0x0, 0xAA, 0x68, 0x1, 0x0, 0x0, 0xCA, 0x68, 0x1, 0x0, 0x0, 0xEA, 0x68, 0x1, 0x0, 0x0, 0xA, 0x69, 0x1, 0x0, 0x0, 0x2A, 0x69, 0x1, 0x0, 0x0, 0x4A, 0x69, 0x1, 0x0, 0x0, 0x6A, 0x69, 0x1, 0x0, 0x0, 0x8A, 0x69, 0x1, 0x0, 0x0, 0xAA, 0x69, 0x1, 0x0, 0x0, 0xCA, 0x69, 0x1, 0x0, 0x0, 0xEA, 0x69, 0x1, 0x0, 0x0, 0xA, 0x6A, 0x1, 0x0, 0x0, 0x2A, 0x6A, 0x1, 0x0, 0x0, 0x4A, 0x6A, 0x1, 0x0, 0x0, 0x6A, 0x6A, 0x1, 0x0, 0x0, 0x8A, 0x6A, 0x1, 0x0, 0x0, 0xAA, 0x6A, 0x1, 0x0, 0x0, 0xCA, 0x6A, 0x1, 0x0, 0x0, 0xEA, 0x6A, 0x1, 0x0, 0x0, 0xA, 0x6B, 0x1, 0x0, 0x0, 0x2A, 0x6B, 0x1, 0x0, 0x0, 0x4A, 0x6B, 0x1, 0x0, 0x0, 0x6A, 0x6B, 0x1, 0x0, 0x0, 0x8A, 0x6B, 0x1, 0x0, 0x0, 0xAA, 0x6B, 0x1, 0x0, 0x0, 0xCA, 0x6B, 0x1, 0x0, 0x0, 0xEA, 0x6B, 0x1, 0x0, 0x0, 0xA, 0x6C, 0x1, 0x0, 0x0, 0x2A, 0x6C, 0x1, 0x0, 0x0, 0x4A, 0x6C, 0x1, 0x0, 0x0, 0x6A, 0x6C, 0x1, 0x0, 0x0, 0x8A, 0x6C, 0x1, 0x0, 0x0, 0xAA, 0x6C, 0x1, 0x0, 0x0, 0xCA, 0x6C, 0x1, 0x0, 0x0, 0xEA, 0x6C, 0x1, 0x0, 0x0, 0xA, 0x6D, 0x1, 0x0, 0x0, 0x2A, 0x6D, 0x1, 0x0, 0x0, 0x4A, 0x6D, 0x1, 0x0, 0x0, 0x6A, 0x6D, 0x1, 0x0, 0x0, 0x8A, 0x6D, 0x1, 0x0, 0x0, 0xAA, 0x6D, 0x1, 0x0, 0x0, 0xCA, 0x6D, 0x1, 0x0, 0x0, 0xEA, 0x6D, 0x1, 0x0, 0x0, 0xA, 0x6E, 0x1, 0x0, 0x0, 0x2A, 0x6E, 0x1, 0x0, 0x0, 0x4A, 0x6E, 0x1, 0x0, 0x0, 0x6A, 0x6E, 0x1, 0x0, 0x0, 0x8A, 0x6E, 0x1, 0x0, 0x0, 0xAA, 0x6E, 0x1, 0x0, 0x0, 0xCA, 0x6E, 0x1, 0x0, 0x0, 0xEA, 0x6E, 0x1, 0x0, 0x0, 0xA, 0x6F, 0x1, 0x0, 0x0, 0x2A, 0x6F, 0x1, 0x0, 0x0, 0x4A, 0x6F, 0x1, 0x0, 0x0, 0x6A, 0x6F, 0x1, 0x0, 0x0, 0x8A, 0x6F, 0x1, 0x0, 0x0, 0xAA, 0x6F, 0x1, 0x0, 0x0, 0xCA, 0x6F, 0x1, 0x0, 0x0, 0xEA, 0x6F, 0x1, 0x0, 0x0, 0xA, 0x70, 0x1, 0x0, 0x0, 0x2A, 0x70, 0x1, 0x0, 0x0, 0x4A, 0x70, 0x1, 0x0, 0x0, 0x6A, 0x70, 0x1, 0x0, 0x0, 0x8A, 0x70, 0x1, 0x0, 0x0, 0xAA, 0x70, 0x1, 0x0, 0x0, 0xCA, 0x70, 0x1, 0x0, 0x0, 0xEA, 0x70, 0x1, 0x0, 0x0, 0xA, 0x71, 0x1, 0x0, 0x0, 0x2A, 0x71, 0x1, 0x0, 0x0, 0x4A, 0x71, 0x1, 0x0, 0x0, 0xA, 0x0, 0x58, 0x5C, 0x0, 0x8A, 0x71, 0x1, 0x0, 0x0, 0xA, 0x0, 0x68, 0x5C, 0x0, 0xCA, 0x71, 0x1, 0x0, 0x0, 0xA, 0x0, 0x78, 0x5C, 0x0, 0xA, 0x72, 0x1, 0x0, 0x0, 0xA, 0x0, 0x88, 0x5C, 0x0, 0x4A, 0x72, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x5C, 0x0, 0x8A, 0x72, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x5C, 0x0, 0xCA, 0x72, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB8, 0x5C, 0x0, 0xA, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC8, 0x5C, 0x0, 0x4A, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD8, 0x5C, 0x0, 0x8A, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE8, 0x5C, 0x0, 0xCA, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF8, 0x5C, 0x0, 0xA, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x5D, 0x0, 0x4A, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x5D, 0x0, 0x8A, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x28, 0x5D, 0x0, 0xCA, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x38, 0x5D, 0x0, 0xA, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x48, 0x5D, 0x0, 0x4A, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x58, 0x5D, 0x0, 0x8A, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x68, 0x5D, 0x0, 0xCA, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x78, 0x5D, 0x0, 0xA, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x88, 0x5D, 0x0, 0x4A, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x5D, 0x0, 0x8A, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x5D, 0x0, 0xCA, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB8, 0x5D, 0x0, 0xA, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC8, 0x5D, 0x0, 0x4A, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD8, 0x5D, 0x0, 0x8A, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE8, 0x5D, 0x0, 0xCA, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF8, 0x5D, 0x0, 0xA, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x5E, 0x0, 0x4A, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x5E, 0x0, 0x8A, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0x28, 0x5E, 0x0, 0xCA, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0x38, 0x5E, 0x0, 0xA, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0x48, 0x5E, 0x0, 0x4A, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0x58, 0x5E, 0x0, 0x8A, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0x68, 0x5E, 0x0, 0xCA, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0x78, 0x5E, 0x0, 0xA, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x88, 0x5E, 0x0, 0x4A, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x5E, 0x0, 0x8A, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x5E, 0x0, 0xCA, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB8, 0x5E, 0x0, 0xA, 0x7B, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC8, 0x5E, 0x0, 0x4A, 0x7B, 0x1, 0x0, 0x0, 0x6A, 0x7B, 0x1, 0x0, 0x0, 0x8A, 0x7B, 0x1, 0x0, 0x0, 0xAA, 0x7B, 0x1, 0x0, 0x0, 0xCA, 0x7B, 0x1, 0x0, 0x0, 0xEA, 0x7B, 0x1, 0x0, 0x0, 0xA, 0x7C, 0x1, 0x0, 0x0, 0x2A, 0x7C, 0x1, 0x0, 0x0, 0x4A, 0x7C, 0x1, 0x0, 0x0, 0x6A, 0x7C, 0x1, 0x0, 0x0, 0x8A, 0x7C, 0x1, 0x0, 0x0, 0xAA, 0x7C, 0x1, 0x0, 0x0, 0xCA, 0x7C, 0x1, 0x0, 0x0, 0xEA, 0x7C, 0x1, 0x0, 0x0, 0xA, 0x7D, 0x1, 0x0, 0x0, 0x2A, 0x7D, 0x1, 0x0, 0x0, 0x4A, 0x7D, 0x1, 0x0, 0x0, 0x6A, 0x7D, 0x1, 0x0, 0x0, 0x8A, 0x7D, 0x1, 0x0, 0x0, 0xAA, 0x7D, 0x1, 0x0, 0x0, 0xCA, 0x7D, 0x1, 0x0, 0x0, 0xEA, 0x7D, 0x1, 0x0, 0x0, 0xA, 0x7E, 0x1, 0x0, 0x0, 0x2A, 0x7E, 0x1, 0x0, 0x0, 0x4A, 0x7E, 0x1, 0x0, 0x0, 0x6A, 0x7E, 0x1, 0x0, 0x0, 0x8A, 0x7E, 0x1, 0x0, 0x0, 0xAA, 0x7E, 0x1, 0x0, 0x0, 0xCA, 0x7E, 0x1, 0x0, 0x0, 0xEA, 0x7E, 0x1, 0x0, 0x0, 0xA, 0x7F, 0x1, 0x0, 0x0, 0x2A, 0x7F, 0x1, 0x0, 0x0, 0x4A, 0x7F, 0x1, 0x0, 0x0, 0x6A, 0x7F, 0x1, 0x0, 0x0, 0x8A, 0x7F, 0x1, 0x0, 0x0, 0xAA, 0x7F, 0x1, 0x0, 0x0, 0xCA, 0x7F, 0x1, 0x0, 0x0, 0xEA, 0x7F, 0x1, 0x0, 0x0, 0xA, 0x80, 0x1, 0x0, 0x0, 0x2A, 0x80, 0x1, 0x0, 0x0, 0x4A, 0x80, 0x1, 0x0, 0x0, 0x6A, 0x80, 0x1, 0x0, 0x0, 0x8A, 0x80, 0x1, 0x0, 0x0, 0xAA, 0x80, 0x1, 0x0, 0x0, 0xCA, 0x80, 0x1, 0x0, 0x0, 0xEA, 0x80, 0x1, 0x0, 0x0, 0xA, 0x81, 0x1, 0x0, 0x0, 0x2A, 0x81, 0x1, 0x0, 0x0, 0x4A, 0x81, 0x1, 0x0, 0x0, 0x6A, 0x81, 0x1, 0x0, 0x0, 0x8A, 0x81, 0x1, 0x0, 0x0, 0xAA, 0x81, 0x1, 0x0, 0x0, 0xCA, 0x81, 0x1, 0x0, 0x0, 0xEA, 0x81, 0x1, 0x0, 0x0, 0xA, 0x0, 0x80, 0x60, 0x0, 0x2A, 0x82, 0x1, 0x0, 0x0, 0xA, 0x0, 0x90, 0x60, 0x0, 0x6A, 0x82, 0x1, 0x0, 0x0, 0x8A, 0x82, 0x1, 0x0, 0x0, 0xAA, 0x82, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB0, 0x60, 0x0, 0xEA, 0x82, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC0, 0x60, 0x0, 0x2A, 0x83, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD0, 0x60, 0x0, 0x6A, 0x83, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE0, 0x60, 0x0, 0xAA, 0x83, 0x1, 0x0, 0x0, 0xCA, 0x83, 0x1, 0x0, 0x0, 0xEA, 0x83, 0x1, 0x0, 0x0, 0xA, 0x84, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x61, 0x0, 0x4A, 0x84, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x61, 0x0, 0x8A, 0x84, 0x1, 0x0, 0x0, 0xA, 0x0, 0x28, 0x61, 0x0, 0xCA, 0x84, 0x1, 0x0, 0x0, 0xEA, 0x84, 0x1, 0x0, 0x0, 0xA, 0x85, 0x1, 0x0, 0x0, 0xA, 0x0, 0x48, 0x61, 0x0, 0x4A, 0x85, 0x1, 0x0, 0x0, 0x6A, 0x85, 0x1, 0x0, 0x0, 0x8A, 0x85, 0x1, 0x0, 0x0, 0xAA, 0x85, 0x1, 0x0, 0x0, 0xCA, 0x85, 0x1, 0x0, 0x0, 0xEA, 0x85, 0x1, 0x0, 0x0, 0xA, 0x86, 0x1, 0x0, 0x0, 0x2A, 0x86, 0x1, 0x0, 0x0, 0x4A, 0x86, 0x1, 0x0, 0x0, 0x6A, 0x86, 0x1, 0x0, 0x0, 0x8A, 0x86, 0x1, 0x0, 0x0, 0xAA, 0x86, 0x1, 0x0, 0x0, 0xCA, 0x86, 0x1, 0x0, 0x0, 0xEA, 0x86, 0x1, 0x0, 0x0, 0xA, 0x87, 0x1, 0x0, 0x0, 0x2A, 0x87, 0x1, 0x0, 0x0, 0x4A, 0x87, 0x1, 0x0, 0x0, 0x6A, 0x87, 0x1, 0x0, 0x0, 0x8A, 0x87, 0x1, 0x0, 0x0, 0xAA, 0x87, 0x1, 0x0, 0x0, 0xCA, 0x87, 0x1, 0x0, 0x0, 0xEA, 0x87, 0x1, 0x0, 0x0, 0xA, 0x88, 0x1, 0x0, 0x0, 0x2A, 0x88, 0x1, 0x0, 0x0, 0x4A, 0x88, 0x1, 0x0, 0x0, 0x6A, 0x88, 0x1, 0x0, 0x0, 0x8A, 0x88, 0x1, 0x0, 0x0, 0xAA, 0x88, 0x1, 0x0, 0x0, 0xCA, 0x88, 0x1, 0x0, 0x0, 0xEA, 0x88, 0x1, 0x0, 0x0, 0xA, 0x89, 0x1, 0x0, 0x0, 0x2A, 0x89, 0x1, 0x0, 0x0, 0x4A, 0x89, 0x1, 0x0, 0x0, 0x6A, 0x89, 0x1, 0x0, 0x0, 0x8A, 0x89, 0x1, 0x0, 0x0, 0xAA, 0x89, 0x1, 0x0, 0x0, 0xCA, 0x89, 0x1, 0x0, 0x0, 0xEA, 0x89, 0x1, 0x0, 0x0, 0xA, 0x8A, 0x1, 0x0, 0x0, 0x2A, 0x8A, 0x1, 0x0, 0x0, 0x4A, 0x8A, 0x1, 0x0, 0x0, 0x6A, 0x8A, 0x1, 0x0, 0x0, 0x8A, 0x8A, 0x1, 0x0, 0x0, 0xAA, 0x8A, 0x1, 0x0, 0x0, 0xCA, 0x8A, 0x1, 0x0, 0x0, 0xEA, 0x8A, 0x1, 0x0, 0x0, 0xA, 0x8B, 0x1, 0x0, 0x0, 0x2A, 0x8B, 0x1, 0x0, 0x0, 0x4A, 0x8B, 0x1, 0x0, 0x0, 0x6A, 0x8B, 0x1, 0x0, 0x0, 0x8A, 0x8B, 0x1, 0x0, 0x0, 0xAA, 0x8B, 0x1, 0x0, 0x0, 0xCA, 0x8B, 0x1, 0x0, 0x0, 0xEA, 0x8B, 0x1, 0x0, 0x0, 0xA, 0x8C, 0x1, 0x0, 0x0, 0x2A, 0x8C, 0x1, 0x0, 0x0, 0x4A, 0x8C, 0x1, 0x0, 0x0, 0x6A, 0x8C, 0x1, 0x0, 0x0, 0x8A, 0x8C, 0x1, 0x0, 0x0, 0xAA, 0x8C, 0x1, 0x0, 0x0, 0xCA, 0x8C, 0x1, 0x0, 0x0, 0xEA, 0x8C, 0x1, 0x0, 0x0, 0xA, 0x8D, 0x1, 0x0, 0x0, 0x2A, 0x8D, 0x1, 0x0, 0x0, 0x4A, 0x8D, 0x1, 0x0, 0x0, 0x6A, 0x8D, 0x1, 0x0, 0x0, 0x8A, 0x8D, 0x1, 0x0, 0x0, 0xAA, 0x8D, 0x1, 0x0, 0x0, 0xCA, 0x8D, 0x1, 0x0, 0x0, 0xEA, 0x8D, 0x1, 0x0, 0x0, 0xA, 0x8E, 0x1, 0x0, 0x0, 0x2A, 0x8E, 0x1, 0x0, 0x0, 0x4A, 0x8E, 0x1, 0x0, 0x0, 0x6A, 0x8E, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA0, 0x63, 0x0, 0xA, 0x0, 0xA8, 0x63, 0x0, 0xA, 0x0, 0xB0, 0x63, 0x0, 0xA, 0x0, 0xB8, 0x63, 0x0, 0xA, 0x0, 0xC0, 0x63, 0x0, 0xA, 0x0, 0xC8, 0x63, 0x0, 0xA, 0x0, 0xD0, 0x63, 0x0, 0xA, 0x0, 0xD8, 0x63, 0x0, 0xA, 0x0, 0xE0, 0x63, 0x0, 0xA, 0x0, 0xE8, 0x63, 0x0, 0xA, 0x0, 0xF0, 0x63, 0x0, 0xA, 0x0, 0xF8, 0x63, 0x0, 0xA, 0x0, 0x0, 0x64, 0x0, 0xA, 0x0, 0x8, 0x64, 0x0, 0xA, 0x0, 0x10, 0x64, 0x0, 0xA, 0x0, 0x18, 0x64, 0x0, 0xA, 0x0, 0x20, 0x64, 0x0, 0xA, 0x0, 0x28, 0x64, 0x0, 0xA, 0x0, 0x30, 0x64, 0x0, 0xA, 0x0, 0x38, 0x64, 0x0, 0xA, 0x0, 0x40, 0x64, 0x0, 0xA, 0x0, 0x48, 0x64, 0x0, 0xA, 0x0, 0x50, 0x64, 0x0, 0xA, 0x0, 0x58, 0x64, 0x0, 0x8A, 0x91, 0x1, 0x0, 0x0, 0xAA, 0x91, 0x1, 0x0, 0x0, 0xCA, 0x91, 0x1, 0x0, 0x0, 0xEA, 0x91, 0x1, 0x0, 0x0, 0xA, 0x92, 0x1, 0x0, 0x0, 0x2A, 0x92, 0x1, 0x0, 0x0, 0x4A, 0x92, 0x1, 0x0, 0x0, 0x6A, 0x92, 0x1, 0x0, 0x0, 0x8A, 0x92, 0x1, 0x0, 0x0, 0xAA, 0x92, 0x1, 0x0, 0x0, 0xCA, 0x92, 0x1, 0x0, 0x0, 0xEA, 0x92, 0x1, 0x0, 0x0, 0xA, 0x93, 0x1, 0x0, 0x0, 0x2A, 0x93, 0x1, 0x0, 0x0, 0x4A, 0x93, 0x1, 0x0, 0x0, 0x6A, 0x93, 0x1, 0x0, 0x0, 0x8A, 0x93, 0x1, 0x0, 0x0, 0xAA, 0x93, 0x1, 0x0, 0x0, 0xCA, 0x93, 0x1, 0x0, 0x0, 0xEA, 0x93, 0x1, 0x0, 0x0, 0xA, 0x94, 0x1, 0x0, 0x0, 0x2A, 0x94, 0x1, 0x0, 0x0, 0x4A, 0x94, 0x1, 0x0, 0x0, 0x6A, 0x94, 0x1, 0x0, 0x0, 0x8A, 0x94, 0x1, 0x0, 0x0, 0xAA, 0x94, 0x1, 0x0, 0x0, 0xCA, 0x94, 0x1, 0x0, 0x0, 0xEA, 0x94, 0x1, 0x0, 0x0, 0xA, 0x95, 0x1, 0x0, 0x0, 0x2A, 0x95, 0x1, 0x0, 0x0, 0x4A, 0x95, 0x1, 0x0, 0x0, 0x6A, 0x95, 0x1, 0x0, 0x0, 0x8A, 0x95, 0x1, 0x0, 0x0, 0xAA, 0x95, 0x1, 0x0, 0x0, 0xCA, 0x95, 0x1, 0x0, 0x0, 0xEA, 0x95, 0x1, 0x0, 0x0, 0xA, 0x96, 0x1, 0x0, 0x0, 0x2A, 0x96, 0x1, 0x0, 0x0, 0x4A, 0x96, 0x1, 0x0, 0x0, 0x6A, 0x96, 0x1, 0x0, 0x0, 0x8A, 0x96, 0x1, 0x0, 0x0, 0xAA, 0x96, 0x1, 0x0, 0x0, 0xCA, 0x96, 0x1, 0x0, 0x0, 0xEA, 0x96, 0x1, 0x0, 0x0, 0xA, 0x97, 0x1, 0x0, 0x0, 0x2A, 0x97, 0x1, 0x0, 0x0, 0x4A, 0x97, 0x1, 0x0, 0x0, 0x6A, 0x97, 0x1, 0x0, 0x0, 0x8A, 0x97, 0x1, 0x0, 0x0, 0xAA, 0x97, 0x1, 0x0, 0x0, 0xCA, 0x97, 0x1, 0x0, 0x0, 0xEA, 0x97, 0x1, 0x0, 0x0, 0xA, 0x98, 0x1, 0x0, 0x0, 0x2A, 0x98, 0x1, 0x0, 0x0, 0x4A, 0x98, 0x1, 0x0, 0x0, 0x6A, 0x98, 0x1, 0x0, 0x0, 0x8A, 0x98, 0x1, 0x0, 0x0, 0xAA, 0x98, 0x1, 0x0, 0x0, 0xCA, 0x98, 0x1, 0x0, 0x0, 0xEA, 0x98, 0x1, 0x0, 0x0, 0xA, 0x99, 0x1, 0x0, 0x0, 0x2A, 0x99, 0x1, 0x0, 0x0, 0x4A, 0x99, 0x1, 0x0, 0x0, 0x6A, 0x99, 0x1, 0x0, 0x0, 0x8A, 0x99, 0x1, 0x0, 0x0, 0xAA, 0x99, 0x1, 0x0, 0x0, 0xCA, 0x99, 0x1, 0x0, 0x0, 0xEA, 0x99, 0x1, 0x0, 0x0, 0xA, 0x9A, 0x1, 0x0, 0x0, 0x2A, 0x9A, 0x1, 0x0, 0x0, 0x4A, 0x9A, 0x1, 0x0, 0x0, 0x6A, 0x9A, 0x1, 0x0, 0x0, 0x8A, 0x9A, 0x1, 0x0, 0x0, 0xAA, 0x9A, 0x1, 0x0, 0x0, 0xCA, 0x9A, 0x1, 0x0, 0x0, 0xEA, 0x9A, 0x1, 0x0, 0x0, 0xA, 0x9B, 0x1, 0x0, 0x0, 0x2A, 0x9B, 0x1, 0x0, 0x0, 0x4A, 0x9B, 0x1, 0x0, 0x0, 0x6A, 0x9B, 0x1, 0x0, 0x0, 0x8A, 0x9B, 0x1, 0x0, 0x0, 0xAA, 0x9B, 0x1, 0x0, 0x0, 0xCA, 0x9B, 0x1, 0x0, 0x0, 0xEA, 0x9B, 0x1, 0x0, 0x0, 0xA, 0x9C, 0x1, 0x0, 0x0, 0x2A, 0x9C, 0x1, 0x0, 0x0, 0x4A, 0x9C, 0x1, 0x0, 0x0, 0x6A, 0x9C, 0x1, 0x0, 0x0, 0x8A, 0x9C, 0x1, 0x0, 0x0, 0xAA, 0x9C, 0x1, 0x0, 0x0, 0xCA, 0x9C, 0x1, 0x0, 0x0, 0xEA, 0x9C, 0x1, 0x0, 0x0, 0xA, 0x9D, 0x1, 0x0, 0x0, 0x2A, 0x9D, 0x1, 0x0, 0x0, 0x4A, 0x9D, 0x1, 0x0, 0x0, 0x6A, 0x9D, 0x1, 0x0, 0x0, 0x8A, 0x9D, 0x1, 0x0, 0x0, 0xAA, 0x9D, 0x1, 0x0, 0x0, 0xCA, 0x9D, 0x1, 0x0, 0x0, 0xEA, 0x9D, 0x1, 0x0, 0x0, 0xA, 0x9E, 0x1, 0x0, 0x0, 0x2A, 0x9E, 0x1, 0x0, 0x0, 0x4A, 0x9E, 0x1, 0x0, 0x0, 0x6A, 0x9E, 0x1, 0x0, 0x0, 0x8A, 0x9E, 0x1, 0x0, 0x0, 0xAA, 0x9E, 0x1, 0x0, 0x0, 0xCA, 0x9E, 0x1, 0x0, 0x0, 0xEA, 0x9E, 0x1, 0x0, 0x0, 0xA, 0x9F, 0x1, 0x0, 0x0, 0x2A, 0x9F, 0x1, 0x0, 0x0, 0x4A, 0x9F, 0x1, 0x0, 0x0, 0x6A, 0x9F, 0x1, 0x0, 0x0, 0x8A, 0x9F, 0x1, 0x0, 0x0, 0xAA, 0x9F, 0x1, 0x0, 0x0, 0xCA, 0x9F, 0x1, 0x0, 0x0, 0xEA, 0x9F, 0x1, 0x0, 0x0, 0xA, 0xA0, 0x1, 0x0, 0x0, 0x2A, 0xA0, 0x1, 0x0, 0x0, 0x4A, 0xA0, 0x1, 0x0, 0x0, 0x6A, 0xA0, 0x1, 0x0, 0x0, 0x8A, 0xA0, 0x1, 0x0, 0x0, 0xAA, 0xA0, 0x1, 0x0, 0x0, 0xCA, 0xA0, 0x1, 0x0, 0x0, 0xEA, 0xA0, 0x1, 0x0, 0x0, 0xA, 0xA1, 0x1, 0x0, 0x0, 0x2A, 0xA1, 0x1, 0x0, 0x0, 0x4A, 0xA1, 0x1, 0x0, 0x0, 0x6A, 0xA1, 0x1, 0x0, 0x0, 0x8A, 0xA1, 0x1, 0x0, 0x0, 0xAA, 0xA1, 0x1, 0x0, 0x0, 0xCA, 0xA1, 0x1, 0x0, 0x0, 0xEA, 0xA1, 0x1, 0x0, 0x0, 0xA, 0xA2, 0x1, 0x0, 0x0, 0x2A, 0xA2, 0x1, 0x0, 0x0, 0x4A, 0xA2, 0x1, 0x0, 0x0, 0x6A, 0xA2, 0x1, 0x0, 0x0, 0x8A, 0xA2, 0x1, 0x0, 0x0, 0xAA, 0xA2, 0x1, 0x0, 0x0, 0xCA, 0xA2, 0x1, 0x0, 0x0, 0xEA, 0xA2, 0x1, 0x0, 0x0, 0xA, 0xA3, 0x1, 0x0, 0x0, 0x2A, 0xA3, 0x1, 0x0, 0x0, 0x4A, 0xA3, 0x1, 0x0, 0x0, 0x6A, 0xA3, 0x1, 0x0, 0x0, 0x6A, 0x64, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE0, 0x68, 0x0, 0xAA, 0xA3, 0x1, 0x0, 0x0, 0xCA, 0xA3, 0x1, 0x0, 0x0, 0xEA, 0xA3, 0x1, 0x0, 0x0, 0xA, 0xA4, 0x1, 0x0, 0x0, 0x2A, 0xA4, 0x1, 0x0, 0x0, 0x4A, 0xA4, 0x1, 0x0, 0x0, 0x6A, 0xA4, 0x1, 0x0, 0x0, 0x8A, 0xA4, 0x1, 0x0, 0x0, 0xAA, 0xA4, 0x1, 0x0, 0x0, 0xCA, 0xA4, 0x1, 0x0, 0x0, 0xEA, 0xA4, 0x1, 0x0, 0x0, 0xA, 0xA5, 0x1, 0x0, 0x0, 0x2A, 0xA5, 0x1, 0x0, 0x0, 0x4A, 0xA5, 0x1, 0x0, 0x0, 0x6A, 0xA5, 0x1, 0x0, 0x0, 0x8A, 0xA5, 0x1, 0x0, 0x0, 0xAA, 0xA5, 0x1, 0x0, 0x0, 0xCA, 0xA5, 0x1, 0x0, 0x0, 0xEA, 0xA5, 0x1, 0x0, 0x0, 0xA, 0xA6, 0x1, 0x0, 0x0, 0x2A, 0xA6, 0x1, 0x0, 0x0, 0x4A, 0xA6, 0x1, 0x0, 0x0, 0x6A, 0xA6, 0x1, 0x0, 0x0, 0x8A, 0xA6, 0x1, 0x0, 0x0, 0xAA, 0xA6, 0x1, 0x0, 0x0, 0xCA, 0xA6, 0x1, 0x0, 0x0, 0xEA, 0xA6, 0x1, 0x0, 0x0, 0xA, 0xA7, 0x1, 0x0, 0x0, 0x2A, 0xA7, 0x1, 0x0, 0x0, 0x4A, 0xA7, 0x1, 0x0, 0x0, 0x6A, 0xA7, 0x1, 0x0, 0x0, 0x8A, 0xA7, 0x1, 0x0, 0x0, 0xAA, 0xA7, 0x1, 0x0, 0x0, 0xCA, 0xA7, 0x1, 0x0, 0x0, 0xEA, 0xA7, 0x1, 0x0, 0x0, 0xA, 0xA8, 0x1, 0x0, 0x0, 0x2A, 0xA8, 0x1, 0x0, 0x0, 0x4A, 0xA8, 0x1, 0x0, 0x0, 0x6A, 0xA8, 0x1, 0x0, 0x0, 0x8A, 0xA8, 0x1, 0x0, 0x0, 0xAA, 0xA8, 0x1, 0x0, 0x0, 0x6A, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0x30, 0x6A, 0x0, 0xAA, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0x38, 0x6A, 0x0, 0xEA, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0x40, 0x6A, 0x0, 0xAA, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x48, 0x6A, 0x0, 0xEA, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x50, 0x6A, 0x0, 0x2A, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x58, 0x6A, 0x0, 0x6A, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x60, 0x6A, 0x0, 0xAA, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x68, 0x6A, 0x0, 0xEA, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x70, 0x6A, 0x0, 0x2A, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x78, 0x6A, 0x0, 0x6A, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x80, 0x6A, 0x0, 0xAA, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x88, 0x6A, 0x0, 0xEA, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x90, 0x6A, 0x0, 0x2A, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x6A, 0x0, 0x6A, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA0, 0x6A, 0x0, 0xAA, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x6A, 0x0, 0xEA, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB0, 0x6A, 0x0, 0x2A, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB8, 0x6A, 0x0, 0x6A, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC0, 0x6A, 0x0, 0xAA, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC8, 0x6A, 0x0, 0xEA, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD0, 0x6A, 0x0, 0x2A, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD8, 0x6A, 0x0, 0x6A, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE0, 0x6A, 0x0, 0xAA, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE8, 0x6A, 0x0, 0xEA, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF0, 0x6A, 0x0, 0x2A, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF8, 0x6A, 0x0, 0x6A, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x0, 0x6B, 0x0, 0xAA, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x6B, 0x0, 0xEA, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x10, 0x6B, 0x0, 0x2A, 0x7B, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x6B, 0x0, 0x8A, 0xAC, 0x1, 0x0, 0x0, 0xAA, 0xAC, 0x1, 0x0, 0x0, 0xA, 0x0, 0x30, 0x6B, 0x0, 0xEA, 0xAC, 0x1, 0x0, 0x0, 0xA, 0x0, 0x40, 0x6B, 0x0, 0x2A, 0xAD, 0x1, 0x0, 0x0, 0xA, 0x0, 0x50, 0x6B, 0x0, 0x6A, 0xAD, 0x1, 0x0, 0x0, 0xA, 0x0, 0x60, 0x6B, 0x0, 0xAA, 0xAD, 0x1, 0x0, 0x0, 0xA, 0x0, 0x70, 0x6B, 0x0, 0xEA, 0xAD, 0x1, 0x0, 0x0, 0xA, 0x0, 0x80, 0x6B, 0x0, 0x2A, 0xAE, 0x1, 0x0, 0x0, 0xA, 0x0, 0x90, 0x6B, 0x0, 0x6A, 0xAE, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA0, 0x6B, 0x0, 0xAA, 0xAE, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB0, 0x6B, 0x0, 0xEA, 0xAE, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC0, 0x6B, 0x0, 0x2A, 0xAF, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD0, 0x6B, 0x0, 0x6A, 0xAF, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE0, 0x6B, 0x0, 0xAA, 0xAF, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF0, 0x6B, 0x0, 0xEA, 0xAF, 0x1, 0x0, 0x0, 0xA, 0x0, 0x0, 0x6C, 0x0, 0x2A, 0xB0, 0x1, 0x0, 0x0, 0xA, 0x0, 0x10, 0x6C, 0x0, 0xA, 0x0, 0x18, 0x6C, 0x0, 0xA, 0x0, 0x20, 0x6C, 0x0, 0xA, 0x0, 0x28, 0x6C, 0x0, 0xA, 0x0, 0x30, 0x6C, 0x0, 0xA, 0x0, 0x38, 0x6C, 0x0, 0xA, 0x0, 0x40, 0x6C, 0x0, 0x2A, 0xB1, 0x1, 0x0, 0x0, 0x4A, 0xB1, 0x1, 0x0, 0x0, 0x6A, 0xB1, 0x1, 0x0, 0x0, 0x8A, 0xB1, 0x1, 0x0, 0x0, 0xAA, 0xB1, 0x1, 0x0, 0x0, 0xCA, 0xB1, 0x1, 0x0, 0x0, 0xEA, 0xB1, 0x1, 0x0, 0x0, 0xA, 0xB2, 0x1, 0x0, 0x0, 0x2A, 0xB2, 0x1, 0x0, 0x0, 0x4A, 0xB2, 0x1, 0x0, 0x0, 0x6A, 0xB2, 0x1, 0x0, 0x0, 0x8A, 0xB2, 0x1, 0x0, 0x0, 0xAA, 0xB2, 0x1, 0x0, 0x0, 0xCA, 0xB2, 0x1, 0x0, 0x0, 0xEA, 0xB2, 0x1, 0x0, 0x0, 0xA, 0xB3, 0x1, 0x0, 0x0, 0x2A, 0xB3, 0x1, 0x0, 0x0, 0x4A, 0xB3, 0x1, 0x0, 0x0, 0x6A, 0xB3, 0x1, 0x0, 0x0, 0x8A, 0xB3, 0x1, 0x0, 0x0, 0xAA, 0xB3, 0x1, 0x0, 0x0, 0xCA, 0xB3, 0x1, 0x0, 0x0, 0xEA, 0xB3, 0x1, 0x0, 0x0, 0xA, 0xB4, 0x1, 0x0, 0x0, 0x2A, 0xB4, 0x1, 0x0, 0x0, 0x4A, 0xB4, 0x1, 0x0, 0x0, 0x6A, 0xB4, 0x1, 0x0, 0x0, 0x8A, 0xB4, 0x1, 0x0, 0x0, 0xAA, 0xB4, 0x1, 0x0, 0x0, 0xCA, 0xB4, 0x1, 0x0, 0x0, 0xEA, 0xB4, 0x1, 0x0, 0x0, 0xA, 0xB5, 0x1, 0x0, 0x0, 0x2A, 0xB5, 0x1, 0x0, 0x0, 0x4A, 0xB5, 0x1, 0x0, 0x0, 0x6A, 0xB5, 0x1, 0x0, 0x0, 0x8A, 0xB5, 0x1, 0x0, 0x0, 0xAA, 0xB5, 0x1, 0x0, 0x0, 0xCA, 0xB5, 0x1, 0x0, 0x0, 0xEA, 0xB5, 0x1, 0x0, 0x0, 0xA, 0xB6, 0x1, 0x0, 0x0, 0x2A, 0xB6, 0x1, 0x0, 0x0, 0x4A, 0xB6, 0x1, 0x0, 0x0, 0x6A, 0xB6, 0x1, 0x0, 0x0, 0x8A, 0xB6, 0x1, 0x0, 0x0, 0xAA, 0xB6, 0x1, 0x0, 0x0, 0xCA, 0xB6, 0x1, 0x0, 0x0, 0xEA, 0xB6, 0x1, 0x0, 0x0, 0xA, 0xB7, 0x1, 0x0, 0x0, 0x2A, 0xB7, 0x1, 0x0, 0x0, 0x4A, 0xB7, 0x1, 0x0, 0x0, 0x6A, 0xB7, 0x1, 0x0, 0x0, 0x8A, 0xB7, 0x1, 0x0, 0x0, 0xAA, 0xB7, 0x1, 0x0, 0x0, 0xCA, 0xB7, 0x1, 0x0, 0x0, 0xEA, 0xB7, 0x1, 0x0, 0x0, 0xA, 0xB8, 0x1, 0x0, 0x0, 0x2A, 0xB8, 0x1, 0x0, 0x0, 0x4A, 0xB8, 0x1, 0x0, 0x0, 0x6A, 0xB8, 0x1, 0x0, 0x0, 0x8A, 0xB8, 0x1, 0x0, 0x0, 0xAA, 0xB8, 0x1, 0x0, 0x0, 0xCA, 0xB8, 0x1, 0x0, 0x0, 0xEA, 0xB8, 0x1, 0x0, 0x0, 0xA, 0xB9, 0x1, 0x0, 0x0, 0x2A, 0xB9, 0x1, 0x0, 0x0, 0x4A, 0xB9, 0x1, 0x0, 0x0, 0x6A, 0xB9, 0x1, 0x0, 0x0, 0x8A, 0xB9, 0x1, 0x0, 0x0, 0xAA, 0xB9, 0x1, 0x0, 0x0, 0xCA, 0xB9, 0x1, 0x0, 0x0, 0xEA, 0xB9, 0x1, 0x0, 0x0, 0xA, 0xBA, 0x1, 0x0, 0x0, 0x2A, 0xBA, 0x1, 0x0, 0x0, 0x4A, 0xBA, 0x1, 0x0, 0x0, 0x6A, 0xBA, 0x1, 0x0, 0x0, 0x8A, 0xBA, 0x1, 0x0, 0x0, 0xAA, 0xBA, 0x1, 0x0, 0x0, 0xCA, 0xBA, 0x1, 0x0, 0x0, 0xEA, 0xBA, 0x1, 0x0, 0x0, 0xA, 0xBB, 0x1, 0x0, 0x0, 0x2A, 0xBB, 0x1, 0x0, 0x0, 0x4A, 0xBB, 0x1, 0x0, 0x0, 0x6A, 0xBB, 0x1, 0x0, 0x0, 0x8A, 0xBB, 0x1, 0x0, 0x0, 0xAA, 0xBB, 0x1, 0x0, 0x0, 0xCA, 0xBB, 0x1, 0x0, 0x0, 0xEA, 0xBB, 0x1, 0x0, 0x0, 0xA, 0xBC, 0x1, 0x0, 0x0, 0x2A, 0xBC, 0x1, 0x0, 0x0, 0x4A, 0xBC, 0x1, 0x0, 0x0, 0x6A, 0xBC, 0x1, 0x0, 0x0, 0x8A, 0xBC, 0x1, 0x0, 0x0, 0xAA, 0xBC, 0x1, 0x0, 0x0, 0xCA, 0xBC, 0x1, 0x0, 0x0, 0xEA, 0xBC, 0x1, 0x0, 0x0, 0xA, 0xBD, 0x1, 0x0, 0x0, 0x2A, 0xBD, 0x1, 0x0, 0x0, 0x4A, 0xBD, 0x1, 0x0, 0x0, 0x6A, 0xBD, 0x1, 0x0, 0x0, 0x8A, 0xBD, 0x1, 0x0, 0x0, 0xAA, 0xBD, 0x1, 0x0, 0x0, 0xCA, 0xBD, 0x1, 0x0, 0x0, 0xEA, 0xBD, 0x1, 0x0, 0x0, 0xA, 0xBE, 0x1, 0x0, 0x0, 0x2A, 0xBE, 0x1, 0x0, 0x0, 0x4A, 0xBE, 0x1, 0x0, 0x0, 0x6A, 0xBE, 0x1, 0x0, 0x0, 0x8A, 0xBE, 0x1, 0x0, 0x0, 0xAA, 0xBE, 0x1, 0x0, 0x0, 0xCA, 0xBE, 0x1, 0x0, 0x0, 0xEA, 0xBE, 0x1, 0x0, 0x0, 0xA, 0xBF, 0x1, 0x0, 0x0, 0x2A, 0xBF, 0x1, 0x0, 0x0, 0x4A, 0xBF, 0x1, 0x0, 0x0, 0x6A, 0xBF, 0x1, 0x0, 0x0, 0x8A, 0xBF, 0x1, 0x0, 0x0, 0xAA, 0xBF, 0x1, 0x0, 0x0, 0xCA, 0xBF, 0x1, 0x0, 0x0, 0xEA, 0xBF, 0x1, 0x0, 0x0, 0xA, 0xC0, 0x1, 0x0, 0x0, 0x2A, 0xC0, 0x1, 0x0, 0x0, 0x4A, 0xC0, 0x1, 0x0, 0x0, 0x6A, 0xC0, 0x1, 0x0, 0x0, 0x8A, 0xC0, 0x1, 0x0, 0x0, 0xAA, 0xC0, 0x1, 0x0, 0x0, 0xCA, 0xC0, 0x1, 0x0, 0x0, 0xEA, 0xC0, 0x1, 0x0, 0x0, 0xA, 0xC1, 0x1, 0x0, 0x0, 0x2A, 0xC1, 0x1, 0x0, 0x0, 0x4A, 0xC1, 0x1, 0x0, 0x0, 0x6A, 0xC1, 0x1, 0x0, 0x0, 0x8A, 0xC1, 0x1, 0x0, 0x0, 0xAA, 0xC1, 0x1, 0x0, 0x0, 0xCA, 0xC1, 0x1, 0x0, 0x0, 0xEA, 0xC1, 0x1, 0x0, 0x0, 0xA, 0xC2, 0x1, 0x0, 0x0, 0x2A, 0xC2, 0x1, 0x0, 0x0, 0x4A, 0xC2, 0x1, 0x0, 0x0, 0x6A, 0xC2, 0x1, 0x0, 0x0, 0x8A, 0xC2, 0x1, 0x0, 0x0, 0xAA, 0xC2, 0x1, 0x0, 0x0, 0xCA, 0xC2, 0x1, 0x0, 0x0, 0xEA, 0xC2, 0x1, 0x0, 0x0, 0xA, 0xC3, 0x1, 0x0, 0x0, 0x2A, 0xC3, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD0, 0x70, 0x0, 0xA, 0x0, 0xD8, 0x70, 0x0, 0xA, 0x0, 0xE0, 0x70, 0x0, 0xA, 0x0, 0xE8, 0x70, 0x0, 0xA, 0x0, 0xF0, 0x70, 0x0, 0xA, 0x0, 0xF8, 0x70, 0x0, 0xA, 0x0, 0x0, 0x71, 0x0, 0xA, 0x0, 0x8, 0x71, 0x0, 0xA, 0x0, 0x10, 0x71, 0x0, 0xA, 0x0, 0x18, 0x71, 0x0, 0xA, 0x0, 0x20, 0x71, 0x0, 0xA, 0x0, 0x28, 0x71, 0x0, 0xA, 0x0, 0x30, 0x71, 0x0, 0xA, 0x0, 0x38, 0x71, 0x0, 0xA, 0x0, 0x40, 0x71, 0x0, 0xA, 0x0, 0x48, 0x71, 0x0, 0xA, 0x0, 0x50, 0x71, 0x0, 0xA, 0x0, 0x58, 0x71, 0x0, 0xA, 0x0, 0x60, 0x71, 0x0, 0xA, 0x0, 0x68, 0x71, 0x0, 0xA, 0x0, 0x70, 0x71, 0x0, 0xA, 0x0, 0x78, 0x71, 0x0, 0xA, 0x0, 0x80, 0x71, 0x0, 0xA, 0x0, 0x88, 0x71, 0x0, 0xA, 0x0, 0x90, 0x71, 0x0, 0xA, 0x0, 0x98, 0x71, 0x0, 0xA, 0x0, 0xA0, 0x71, 0x0, 0xA, 0x0, 0xA8, 0x71, 0x0, 0xA, 0x0, 0xB0, 0x71, 0x0, 0xA, 0x0, 0xB8, 0x71, 0x0, 0xA, 0x0, 0xC0, 0x71, 0x0, 0xA, 0x0, 0xC8, 0x71, 0x0, 0xA, 0x0, 0xD0, 0x71, 0x0, 0xA, 0x0, 0xD8, 0x71, 0x0, 0xA, 0x0, 0xE0, 0x71, 0x0, 0xA, 0x0, 0xE8, 0x71, 0x0, 0xA, 0x0, 0xF0, 0x71, 0x0, 0xA, 0x0, 0xF8, 0x71, 0x0, 0xA, 0x0, 0x0, 0x72, 0x0, 0xA, 0x0, 0x8, 0x72, 0x0, 0xA, 0x0, 0x10, 0x72, 0x0, 0xA, 0x0, 0x18, 0x72, 0x0, 0xA, 0x0, 0x20, 0x72, 0x0, 0xA, 0x0, 0x28, 0x72, 0x0, 0xA, 0x0, 0x30, 0x72, 0x0, 0xA, 0x0, 0x38, 0x72, 0x0, 0xA, 0x0, 0x40, 0x72, 0x0, 0xA, 0x0, 0x48, 0x72, 0x0, 0xA, 0x0, 0x50, 0x72, 0x0, 0xA, 0x0, 0x58, 0x72, 0x0, 0xA, 0x0, 0x60, 0x72, 0x0, 0xA, 0x0, 0x68, 0x72, 0x0, 0xA, 0x0, 0x70, 0x72, 0x0, 0xA, 0x0, 0x78, 0x72, 0x0, 0xA, 0x0, 0x80, 0x72, 0x0, 0xA, 0x0, 0x88, 0x72, 0x0, 0xA, 0x0, 0x90, 0x72, 0x0, 0xA, 0x0, 0x98, 0x72, 0x0, 0xA, 0x0, 0xA0, 0x72, 0x0, 0xA, 0x0, 0xA8, 0x72, 0x0, 0xA, 0x0, 0xB0, 0x72, 0x0, 0xA, 0x0, 0xB8, 0x72, 0x0, 0xA, 0x0, 0xC0, 0x72, 0x0, 0xA, 0x0, 0xC8, 0x72, 0x0, 0xA, 0x0, 0xD0, 0x72, 0x0, 0xA, 0x0, 0xD8, 0x72, 0x0, 0xA, 0x0, 0xE0, 0x72, 0x0, 0xA, 0x0, 0xE8, 0x72, 0x0, 0xA, 0x0, 0xF0, 0x72, 0x0, 0xA, 0x0, 0xF8, 0x72, 0x0, 0xA, 0x0, 0x0, 0x73, 0x0, 0xA, 0x0, 0x8, 0x73, 0x0, 0xA, 0x0, 0x10, 0x73, 0x0, 0xA, 0x0, 0x18, 0x73, 0x0, 0xA, 0x0, 0x20, 0x73, 0x0, 0xA, 0x0, 0x28, 0x73, 0x0, 0xA, 0x0, 0x10, 0x5C, 0x0, 0xA, 0x0, 0x18, 0x5C, 0x0, 0xA, 0x0, 0x20, 0x5C, 0x0, 0xA, 0x0, 0x28, 0x5C, 0x0, 0xA, 0x0, 0x30, 0x5C, 0x0, 0xA, 0x0, 0x30, 0x73, 0x0, 0xA, 0x0, 0x38, 0x73, 0x0, 0xA, 0x0, 0x40, 0x73, 0x0, 0xA, 0x0, 0x48, 0x73, 0x0, 0xA, 0x0, 0x60, 0x69, 0x0, 0xA, 0x0, 0x68, 0x69, 0x0, 0xA, 0x0, 0x70, 0x69, 0x0, 0xA, 0x0, 0x78, 0x69, 0x0, 0xA, 0x0, 0x80, 0x69, 0x0, 0xA, 0x0, 0x88, 0x69, 0x0, 0xA, 0x0, 0x90, 0x69, 0x0, 0xA, 0x0, 0x98, 0x69, 0x0, 0xA, 0x0, 0xA0, 0x69, 0x0, 0xA, 0x0, 0x50, 0x73, 0x0, 0xA, 0x0, 0xB0, 0x69, 0x0, 0xA, 0x0, 0xB8, 0x69, 0x0, 0xA, 0x0, 0xC0, 0x69, 0x0, 0xA, 0x0, 0xC8, 0x69, 0x0, 0xA, 0x0, 0xD0, 0x69, 0x0, 0xA, 0x0, 0xD8, 0x69, 0x0, 0xA, 0x0, 0xE0, 0x69, 0x0, 0xA, 0x0, 0xE8, 0x69, 0x0, 0xA, 0x0, 0xF0, 0x69, 0x0, 0xA, 0x0, 0xF8, 0x69, 0x0, 0xA, 0x0, 0x0, 0x6A, 0x0, 0xA, 0x0, 0x8, 0x6A, 0x0, 0xA, 0x0, 0x10, 0x6A, 0x0, 0xA, 0x0, 0x18, 0x6A, 0x0, 0xA, 0x0, 0x20, 0x6A, 0x0, 0xA, 0x0, 0x28, 0x6A, 0x0, 0xA, 0x0, 0x58, 0x73, 0x0, 0xA, 0x0, 0x60, 0x73, 0x0, 0xA, 0x0, 0x68, 0x73, 0x0, 0xA, 0x0, 0x70, 0x73, 0x0, 0xA, 0x0, 0x78, 0x73, 0x0, 0xA, 0x0, 0x80, 0x73, 0x0, 0xA, 0x0, 0x88, 0x73, 0x0, 0xA, 0x0, 0x90, 0x73, 0x0, 0xA, 0x0, 0x98, 0x73, 0x0, 0xA, 0x0, 0xA0, 0x73, 0x0, 0xA, 0x0, 0xA8, 0x73, 0x0, 0xA, 0x0, 0xB0, 0x73, 0x0, 0xA, 0x0, 0xB8, 0x73, 0x0, 0xA, 0x0, 0xC0, 0x73, 0x0, 0xA, 0x0, 0xC8, 0x73, 0x0, 0xA, 0x0, 0xD0, 0x73, 0x0, 0xA, 0x0, 0xD8, 0x73, 0x0, 0xA, 0x0, 0xE0, 0x73, 0x0, 0xA, 0x0, 0xE8, 0x73, 0x0, 0xA, 0x0, 0xF0, 0x73, 0x0, 0xA, 0x0, 0xF8, 0x73, 0x0, 0xA, 0x0, 0x0, 0x74, 0x0, 0xA, 0x0, 0x8, 0x74, 0x0, 0xA, 0x0, 0x10, 0x74, 0x0, 0xA, 0x0, 0x18, 0x74, 0x0, 0xA, 0x0, 0x20, 0x74, 0x0, 0xA, 0x0, 0x28, 0x74, 0x0, 0xA, 0x0, 0x30, 0x74, 0x0, 0xA, 0x0, 0x38, 0x74, 0x0, 0xA, 0x0, 0x40, 0x74, 0x0, 0xA, 0x0, 0x48, 0x74, 0x0, 0xA, 0x0, 0x50, 0x74, 0x0, 0xA, 0x0, 0x58, 0x74, 0x0, 0xA, 0x0, 0x60, 0x74, 0x0, 0xA, 0x0, 0x68, 0x74, 0x0, 0xA, 0x0, 0x70, 0x74, 0x0, 0xA, 0x0, 0x78, 0x74, 0x0, 0xA, 0x0, 0x80, 0x74, 0x0, 0xA, 0x0, 0x88, 0x74, 0x0, 0xA, 0x0, 0x90, 0x74, 0x0, 0xA, 0x0, 0x98, 0x74, 0x0, 0xA, 0x0, 0xA0, 0x74, 0x0, 0xA, 0x0, 0xA8, 0x74, 0x0, 0xA, 0x0, 0xB0, 0x74, 0x0, 0xA, 0x0, 0xB8, 0x74, 0x0, 0xA, 0x0, 0xC0, 0x74, 0x0, 0xA, 0x0, 0xC8, 0x74, 0x0, 0xA, 0x0, 0xD0, 0x74, 0x0, 0xA, 0x0, 0xD8, 0x74, 0x0, 0xA, 0x0, 0xE0, 0x74, 0x0, 0xA, 0x0, 0xE8, 0x74, 0x0, 0xA, 0x0, 0xF0, 0x74, 0x0, 0xA, 0x0, 0xF8, 0x74, 0x0, 0xA, 0x0, 0x0, 0x75, 0x0, 0xA, 0x0, 0x8, 0x75, 0x0, 0xA, 0x0, 0x10, 0x75, 0x0, 0xA, 0x0, 0x18, 0x75, 0x0, 0xA, 0x0, 0x20, 0x75, 0x0, 0xA, 0x0, 0x28, 0x75, 0x0, 0xA, 0x0, 0x30, 0x75, 0x0, 0xA, 0x0, 0x38, 0x75, 0x0, 0xA, 0x0, 0x40, 0x75, 0x0, 0xA, 0x0, 0x48, 0x75, 0x0, 0xA, 0x0, 0x50, 0x75, 0x0, 0xA, 0x0, 0x58, 0x75, 0x0, 0xA, 0x0, 0x60, 0x75, 0x0, 0xA, 0x0, 0x68, 0x75, 0x0, 0xA, 0x0, 0x70, 0x75, 0x0, 0xA, 0x0, 0x78, 0x75, 0x0, 0xA, 0x0, 0x80, 0x75, 0x0, 0xA, 0x0, 0x88, 0x75, 0x0, 0xA, 0x0, 0x90, 0x75, 0x0, 0xA, 0x0, 0x98, 0x75, 0x0, 0xA, 0x0, 0xA0, 0x75, 0x0, 0xA, 0x0, 0xA8, 0x75, 0x0, 0xA, 0x0, 0xB0, 0x75, 0x0, 0xA, 0x0, 0xB8, 0x75, 0x0, 0xA, 0x0, 0xC0, 0x75, 0x0, 0xA, 0x0, 0xC8, 0x75, 0x0, 0xA, 0x0, 0xD0, 0x75, 0x0, 0xA, 0x0, 0xD8, 0x75, 0x0, 0xA, 0x0, 0xE0, 0x75, 0x0, 0xA, 0x0, 0xE8, 0x75, 0x0, 0xA, 0x0, 0xF0, 0x75, 0x0, 0xA, 0x0, 0x78, 0x6D, 0x0, 0xA, 0x0, 0x80, 0x6D, 0x0, 0xA, 0x0, 0x88, 0x6D, 0x0, 0xA, 0x0, 0x90, 0x6D, 0x0, 0xA, 0x0, 0x98, 0x6D, 0x0, 0xA, 0x0, 0xA0, 0x6D, 0x0, 0xA, 0x0, 0xA8, 0x6D, 0x0, 0xA, 0x0, 0xB0, 0x6D, 0x0, 0xA, 0x0, 0xB8, 0x6D, 0x0, 0xA, 0x0, 0xC0, 0x6D, 0x0, 0xA, 0x0, 0xC8, 0x6D, 0x0, 0xA, 0x0, 0xD0, 0x6D, 0x0, 0xA, 0x0, 0xD8, 0x6D, 0x0, 0xA, 0x0, 0xE0, 0x6D, 0x0, 0xA, 0x0, 0xE8, 0x6D, 0x0, 0xA, 0x0, 0xF0, 0x6D, 0x0, 0xA, 0x0, 0xF8, 0x6D, 0x0, 0xA, 0x0, 0x0, 0x6E, 0x0, 0xA, 0x0, 0x8, 0x6E, 0x0, 0xA, 0x0, 0x10, 0x6E, 0x0, 0xA, 0x0, 0x18, 0x6E, 0x0, 0xA, 0x0, 0x20, 0x6E, 0x0, 0xA, 0x0, 0x28, 0x6E, 0x0, 0xA, 0x0, 0x30, 0x6E, 0x0, 0xA, 0x0, 0xF8, 0x75, 0x0, 0xA, 0x0, 0x0, 0x76, 0x0, 0xA, 0x0, 0x8, 0x76, 0x0, 0xA, 0x0, 0x10, 0x76, 0x0, 0xA, 0x0, 0x18, 0x76, 0x0, 0xA, 0x0, 0x20, 0x76, 0x0, 0xA, 0x0, 0x28, 0x76, 0x0, 0xA, 0x0, 0x30, 0x76, 0x0, 0xA, 0x0, 0x38, 0x76, 0x0, 0xA, 0x0, 0x40, 0x76, 0x0, 0xA, 0x0, 0x48, 0x76, 0x0, 0xA, 0x0, 0x50, 0x76, 0x0, 0xA, 0x0, 0x58, 0x76, 0x0, 0xA, 0x0, 0x60, 0x76, 0x0, 0xA, 0x0, 0x68, 0x76, 0x0, 0xA, 0x0, 0x70, 0x76, 0x0, 0xA, 0x0, 0x78, 0x76, 0x0, 0xA, 0x0, 0x80, 0x76, 0x0, 0xA, 0x0, 0x88, 0x76, 0x0, 0xA, 0x0, 0x90, 0x76, 0x0, 0xA, 0x0, 0x98, 0x76, 0x0, 0xA, 0x0, 0xA0, 0x76, 0x0, 0xA, 0x0, 0xA8, 0x76, 0x0, 0xA, 0x0, 0xB0, 0x76, 0x0, 0xA, 0x0, 0xB8, 0x76, 0x0, 0xA, 0x0, 0xC0, 0x76, 0x0, 0xA, 0x0, 0xC8, 0x76, 0x0, 0xA, 0x0, 0xD0, 0x76, 0x0, 0xA, 0x0, 0xD8, 0x76, 0x0, 0xA, 0x0, 0xE0, 0x76, 0x0, 0xA, 0x0, 0xE8, 0x76, 0x0, 0xA, 0x0, 0xF0, 0x76, 0x0, 0xA, 0x0, 0xF8, 0x76, 0x0, 0xA, 0x0, 0x0, 0x77, 0x0, 0xA, 0x0, 0x8, 0x77, 0x0, 0xA, 0x0, 0x10, 0x77, 0x0, 0xA, 0x0, 0x18, 0x77, 0x0, 0xA, 0x0, 0x20, 0x77, 0x0, 0xA, 0x0, 0x28, 0x77, 0x0, 0xA, 0x0, 0x30, 0x77, 0x0, 0xA, 0x0, 0x38, 0x77, 0x0, 0xA, 0x0, 0x40, 0x77, 0x0, 0xA, 0x0, 0x48, 0x77, 0x0, 0xA, 0x0, 0x50, 0x77, 0x0, 0xA, 0x0, 0x58, 0x77, 0x0, 0xA, 0x0, 0x60, 0x77, 0x0, 0xA, 0x0, 0x68, 0x77, 0x0, 0xA, 0x0, 0x70, 0x77, 0x0, 0xA, 0x0, 0x78, 0x77, 0x0, 0xA, 0x0, 0x80, 0x77, 0x0, 0xA, 0x0, 0x88, 0x77, 0x0, 0xA, 0x0, 0x90, 0x77, 0x0, 0xA, 0x0, 0x98, 0x77, 0x0, 0x8B, 0xDE, 0x1, 0x0, 0x0, 0xAB, 0xDE, 0x1, 0x0, 0x0, 0xCB, 0xDE, 0x1, 0x0, 0x0, 0xEB, 0xDE, 0x1, 0x0, 0x0, 0xB, 0xDF, 0x1, 0x0, 0x0, 0x2B, 0xDF, 0x1, 0x0, 0x0, 0x4B, 0xDF, 0x1, 0x0, 0x0, 0x6B, 0xDF, 0x1, 0x0, 0x0, 0x8B, 0xDF, 0x1, 0x0, 0x0, 0xAB, 0xDF, 0x1, 0x0, 0x0, 0xCB, 0xDF, 0x1, 0x0, 0x0, 0xEB, 0xDF, 0x1, 0x0, 0x0, 0xB, 0xE0, 0x1, 0x0, 0x0, 0x2B, 0xE0, 0x1, 0x0, 0x0, 0x4B, 0xE0, 0x1, 0x0, 0x0, 0x6B, 0xE0, 0x1, 0x0, 0x0, 0x8B, 0xE0, 0x1, 0x0, 0x0, 0xAB, 0xE0, 0x1, 0x0, 0x0, 0xCB, 0xE0, 0x1, 0x0, 0x0, 0xEB, 0xE0, 0x1, 0x0, 0x0, 0xB, 0xE1, 0x1, 0x0, 0x0, 0x2B, 0xE1, 0x1, 0x0, 0x0, 0x4B, 0xE1, 0x1, 0x0, 0x0, 0x6B, 0xE1, 0x1, 0x0, 0x0, 0x8B, 0xE1, 0x1, 0x0, 0x0, 0xAB, 0xE1, 0x1, 0x0, 0x0, 0xCB, 0xE1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x78, 0x78, 0x0, 0xB, 0xE2, 0x1, 0x0, 0x0, 0xB, 0x0, 0x88, 0x78, 0x0, 0x4B, 0xE2, 0x1, 0x0, 0x0, 0xB, 0x0, 0x98, 0x78, 0x0, 0x8B, 0xE2, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x78, 0x0, 0xCB, 0xE2, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x78, 0x0, 0xB, 0xE3, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x78, 0x0, 0x4B, 0xE3, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x78, 0x0, 0x8B, 0xE3, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x78, 0x0, 0xCB, 0xE3, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x78, 0x0, 0xB, 0xE4, 0x1, 0x0, 0x0, 0xB, 0x0, 0x8, 0x79, 0x0, 0x4B, 0xE4, 0x1, 0x0, 0x0, 0xB, 0x0, 0x18, 0x79, 0x0, 0x8B, 0xE4, 0x1, 0x0, 0x0, 0xB, 0x0, 0x28, 0x79, 0x0, 0xCB, 0xE4, 0x1, 0x0, 0x0, 0xB, 0x0, 0x38, 0x79, 0x0, 0xB, 0xE5, 0x1, 0x0, 0x0, 0xB, 0x0, 0x48, 0x79, 0x0, 0x4B, 0xE5, 0x1, 0x0, 0x0, 0xB, 0x0, 0x58, 0x79, 0x0, 0x8B, 0xE5, 0x1, 0x0, 0x0, 0xB, 0x0, 0x68, 0x79, 0x0, 0xCB, 0xE5, 0x1, 0x0, 0x0, 0xB, 0x0, 0x78, 0x79, 0x0, 0xB, 0xE6, 0x1, 0x0, 0x0, 0xB, 0x0, 0x88, 0x79, 0x0, 0x4B, 0xE6, 0x1, 0x0, 0x0, 0xB, 0x0, 0x98, 0x79, 0x0, 0x8B, 0xE6, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x79, 0x0, 0xCB, 0xE6, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x79, 0x0, 0xB, 0xE7, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x79, 0x0, 0x4B, 0xE7, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x79, 0x0, 0x8B, 0xE7, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x79, 0x0, 0xCB, 0xE7, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x79, 0x0, 0xB, 0xE8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x8, 0x7A, 0x0, 0x4B, 0xE8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x18, 0x7A, 0x0, 0x8B, 0xE8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x28, 0x7A, 0x0, 0xCB, 0xE8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x38, 0x7A, 0x0, 0xB, 0xE9, 0x1, 0x0, 0x0, 0xB, 0x0, 0x48, 0x7A, 0x0, 0x4B, 0xE9, 0x1, 0x0, 0x0, 0xB, 0x0, 0x58, 0x7A, 0x0, 0x8B, 0xE9, 0x1, 0x0, 0x0, 0xB, 0x0, 0x68, 0x7A, 0x0, 0xCB, 0xE9, 0x1, 0x0, 0x0, 0xB, 0x0, 0x78, 0x7A, 0x0, 0xB, 0xEA, 0x1, 0x0, 0x0, 0xB, 0x0, 0x88, 0x7A, 0x0, 0x4B, 0xEA, 0x1, 0x0, 0x0, 0xB, 0x0, 0x98, 0x7A, 0x0, 0x8B, 0xEA, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x7A, 0x0, 0xCB, 0xEA, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x7A, 0x0, 0xB, 0xEB, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x7A, 0x0, 0x4B, 0xEB, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x7A, 0x0, 0x8B, 0xEB, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x7A, 0x0, 0xCB, 0xEB, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x7A, 0x0, 0xB, 0xEC, 0x1, 0x0, 0x0, 0xB, 0x0, 0x8, 0x7B, 0x0, 0x4B, 0xEC, 0x1, 0x0, 0x0, 0xB, 0x0, 0x18, 0x7B, 0x0, 0x8B, 0xEC, 0x1, 0x0, 0x0, 0xB, 0x0, 0x28, 0x7B, 0x0, 0xCB, 0xEC, 0x1, 0x0, 0x0, 0xB, 0x0, 0x38, 0x7B, 0x0, 0xB, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x48, 0x7B, 0x0, 0x4B, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x58, 0x7B, 0x0, 0x8B, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x68, 0x7B, 0x0, 0xCB, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x70, 0x78, 0x0, 0xEB, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x80, 0x78, 0x0, 0xB, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0x90, 0x78, 0x0, 0x2B, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA0, 0x78, 0x0, 0x4B, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB0, 0x78, 0x0, 0x6B, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC0, 0x78, 0x0, 0x8B, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD0, 0x78, 0x0, 0xAB, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE0, 0x78, 0x0, 0xCB, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF0, 0x78, 0x0, 0xEB, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0x0, 0x79, 0x0, 0xB, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x10, 0x79, 0x0, 0x2B, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x20, 0x79, 0x0, 0x4B, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x30, 0x79, 0x0, 0x6B, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x40, 0x79, 0x0, 0x8B, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x50, 0x79, 0x0, 0xAB, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x60, 0x79, 0x0, 0xCB, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x70, 0x79, 0x0, 0xEB, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x80, 0x79, 0x0, 0xB, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0x90, 0x79, 0x0, 0x2B, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA0, 0x79, 0x0, 0x4B, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB0, 0x79, 0x0, 0x6B, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC0, 0x79, 0x0, 0x8B, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD0, 0x79, 0x0, 0xAB, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE0, 0x79, 0x0, 0xCB, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF0, 0x79, 0x0, 0xEB, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0x0, 0x7A, 0x0, 0xB, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x10, 0x7A, 0x0, 0x2B, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x20, 0x7A, 0x0, 0x4B, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x30, 0x7A, 0x0, 0x6B, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x40, 0x7A, 0x0, 0x8B, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x50, 0x7A, 0x0, 0xAB, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x60, 0x7A, 0x0, 0xCB, 0xF1, 0x79, 0x7C, 0x0, 0xB, 0x0, 0x80, 0x7C, 0x0, 0xB, 0x0, 0x88, 0x7C, 0x0, 0xB, 0x0, 0x90, 0x7C, 0x0, 0xB, 0x0, 0x98, 0x7C, 0x0, 0x8B, 0xF2, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x7C, 0x0, 0xB, 0x0, 0xB0, 0x7C, 0x0, 0xB, 0x0, 0xB8, 0x7C, 0x0, 0xB, 0x0, 0xC0, 0x7C, 0x0, 0xB, 0x0, 0xC8, 0x7C, 0x0, 0xB, 0x0, 0xD0, 0x7C, 0x0, 0xB, 0x0, 0xD8, 0x7C, 0x0, 0xB, 0x0, 0xE0, 0x7C, 0x0, 0xB, 0x0, 0xE8, 0x7C, 0x0, 0xB, 0x0, 0xF0, 0x7C, 0x0, 0xB, 0x0, 0xF8, 0x7C, 0x0, 0xB, 0x0, 0x0, 0x7D, 0x0, 0xB, 0x0, 0x8, 0x7D, 0x0, 0xB, 0x0, 0x10, 0x7D, 0x0, 0xB, 0x0, 0x18, 0x7D, 0x0, 0xB, 0x0, 0x20, 0x7D, 0x0, 0xB, 0x0, 0x28, 0x7D, 0x0, 0xB, 0x0, 0x30, 0x7D, 0x0, 0xB, 0x0, 0x38, 0x7D, 0x0, 0xB, 0x0, 0x40, 0x7D, 0x0, 0xB, 0x0, 0x48, 0x7D, 0x0, 0xB, 0x0, 0x50, 0x7D, 0x0, 0xB, 0x0, 0x58, 0x7D, 0x0, 0xB, 0x0, 0x60, 0x7D, 0x0, 0xB, 0x0, 0x68, 0x7D, 0x0, 0xB, 0x0, 0x70, 0x7D, 0x0, 0xB, 0x0, 0x78, 0x7D, 0x0, 0xB, 0x0, 0x80, 0x7D, 0x0, 0xB, 0x0, 0x88, 0x7D, 0x0, 0xB, 0x0, 0x90, 0x7D, 0x0, 0xB, 0x0, 0x98, 0x7D, 0x0, 0xB, 0x0, 0xA0, 0x7D, 0x0, 0xB, 0x0, 0xA8, 0x7D, 0x0, 0xB, 0x0, 0xB0, 0x7D, 0x0, 0xB, 0x0, 0xB8, 0x7D, 0x0, 0xB, 0x0, 0xC0, 0x7D, 0x0, 0xB, 0x0, 0xC8, 0x7D, 0x0, 0xB, 0x0, 0xD0, 0x7D, 0x0, 0xB, 0x0, 0xD8, 0x7D, 0x0, 0xB, 0x0, 0xE0, 0x7D, 0x0, 0xB, 0x0, 0xE8, 0x7D, 0x0, 0xB, 0x0, 0xF0, 0x7D, 0x0, 0xB, 0x0, 0xF8, 0x7D, 0x0, 0xB, 0x0, 0x0, 0x7E, 0x0, 0xB, 0x0, 0x8, 0x7E, 0x0, 0xB, 0x0, 0x10, 0x7E, 0x0, 0xB, 0x0, 0x18, 0x7E, 0x0, 0x8B, 0xF8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x28, 0x7E, 0x0, 0xB, 0x0, 0x30, 0x7E, 0x0, 0xB, 0x0, 0x38, 0x7E, 0x0, 0xB, 0x0, 0x40, 0x7E, 0x0, 0xB, 0x0, 0x48, 0x7E, 0x0, 0xB, 0x0, 0x50, 0x7E, 0x0, 0xB, 0x0, 0x58, 0x7E, 0x0, 0xB, 0x0, 0x60, 0x7E, 0x0, 0xB, 0x0, 0x68, 0x7E, 0x0, 0xB, 0x0, 0x70, 0x7E, 0x0, 0xB, 0x0, 0x78, 0x7E, 0x0, 0xB, 0x0, 0x80, 0x7E, 0x0, 0xB, 0x0, 0x88, 0x7E, 0x0, 0xB, 0x0, 0x90, 0x7E, 0x0, 0xB, 0x0, 0x98, 0x7E, 0x0, 0xB, 0x0, 0xA0, 0x7E, 0x0, 0xB, 0x0, 0xA8, 0x7E, 0x0, 0xB, 0x0, 0xB0, 0x7E, 0x0, 0xB, 0x0, 0xB8, 0x7E, 0x0, 0xB, 0x0, 0xC0, 0x7E, 0x0, 0xB, 0x0, 0xC8, 0x7E, 0x0, 0xB, 0x0, 0xD0, 0x7E, 0x0, 0xB, 0x0, 0xD8, 0x7E, 0x0, 0xB, 0x0, 0xE0, 0x7E, 0x0, 0xB, 0x0, 0xE8, 0x7E, 0x0, 0xB, 0x0, 0xF0, 0x7E, 0x0, 0xB, 0x0, 0xF8, 0x7E, 0x0, 0xB, 0x0, 0x0, 0x7F, 0x0, 0xB, 0x0, 0x8, 0x7F, 0x0, 0xB, 0x0, 0x10, 0x7F, 0x0, 0xB, 0x0, 0x18, 0x7F, 0x0, 0xB, 0x0, 0x20, 0x7F, 0x0, 0xB, 0x0, 0x28, 0x7F, 0x0, 0xB, 0x0, 0x30, 0x7F, 0x0, 0xB, 0x0, 0x38, 0x7F, 0x0, 0xB, 0x0, 0x40, 0x7F, 0x0, 0xB, 0x0, 0x48, 0x7F, 0x0, 0xB, 0x0, 0x50, 0x7F, 0x0, 0xB, 0x0, 0x58, 0x7F, 0x0, 0xB, 0x0, 0x60, 0x7F, 0x0, 0xB, 0x0, 0x68, 0x7F, 0x0, 0xB, 0x0, 0x70, 0x7F, 0x0, 0xB, 0x0, 0x78, 0x7F, 0x0, 0xB, 0x0, 0x80, 0x7F, 0x0, 0xB, 0x0, 0x88, 0x7F, 0x0, 0xB, 0x0, 0x90, 0x7F, 0x0, 0xB, 0x0, 0x98, 0x7F, 0x0, 0xB, 0x0, 0xA0, 0x7F, 0x0, 0xB, 0x0, 0xA8, 0x7F, 0x0, 0xB, 0x0, 0xB0, 0x7F, 0x0, 0xB, 0x0, 0xB8, 0x7F, 0x0, 0xB, 0x0, 0xC0, 0x7F, 0x0, 0xB, 0x0, 0xC8, 0x7F, 0x0, 0xB, 0x0, 0xD0, 0x7F, 0x0, 0xB, 0x0, 0xD8, 0x7F, 0x0, 0xB, 0x0, 0xE0, 0x7F, 0x0, 0xB, 0x0, 0xE8, 0x7F, 0x0, 0xB, 0x0, 0xF0, 0x7F, 0x0, 0xB, 0x0, 0xF8, 0x7F, 0x0, 0xB, 0x0, 0x0, 0x80, 0x0, 0xB, 0x0, 0x8, 0x80, 0x0, 0xB, 0x0, 0x10, 0x80, 0x0, 0xB, 0x0, 0x18, 0x80, 0x0, 0xB, 0x0, 0x20, 0x80, 0x0, 0xB, 0x0, 0x28, 0x80, 0x0, 0xB, 0x0, 0x30, 0x80, 0x0, 0xB, 0x0, 0x38, 0x80, 0x0, 0xB, 0x0, 0x40, 0x80, 0x0, 0xB, 0x0, 0x48, 0x80, 0x0, 0xB, 0x0, 0x50, 0x80, 0x0, 0xB, 0x0, 0x58, 0x80, 0x0, 0xB, 0x0, 0x60, 0x80, 0x0, 0xB, 0x0, 0x68, 0x80, 0x0, 0xB, 0x0, 0x70, 0x80, 0x0, 0xB, 0x0, 0x78, 0x80, 0x0, 0xB, 0x0, 0x80, 0x80, 0x0, 0xB, 0x0, 0x88, 0x80, 0x0, 0x4B, 0x2, 0x2, 0x0, 0x0, 0xB, 0x0, 0x98, 0x80, 0x0, 0x8B, 0x2, 0x2, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x80, 0x0, 0xCB, 0x2, 0x2, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x80, 0x0, 0xB, 0x3, 0x2, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x80, 0x0, 0x4B, 0x3, 0x2, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x80, 0x0, 0x8B, 0x3, 0x2, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x80, 0x0, 0xCB, 0x3, 0x2, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x80, 0x0, 0xB, 0x4, 0x2, 0x0, 0x0, 0xB, 0x0, 0x8, 0x81, 0x0, 0x4B, 0x4, 0x2, 0x0, 0x0, 0xB, 0x0, 0x18, 0x81, 0x0, 0x8B, 0x4, 0x2, 0x0, 0x0, 0xB, 0x0, 0x28, 0x81, 0x0, 0xCB, 0x4, 0x2, 0x0, 0x0, 0xB, 0x0, 0x38, 0x81, 0x0, 0xB, 0x5, 0x2, 0x0, 0x0, 0xB, 0x0, 0x48, 0x81, 0x0, 0x4B, 0x5, 0x2, 0x0, 0x0, 0xB, 0x0, 0x58, 0x81, 0x0, 0x8B, 0x5, 0x2, 0x0, 0x0, 0xB, 0x0, 0x68, 0x81, 0x0, 0xCB, 0x5, 0x2, 0x0, 0x0, 0xB, 0x0, 0x78, 0x81, 0x0, 0xB, 0x6, 0x2, 0x0, 0x0, 0xB, 0x0, 0x88, 0x81, 0x0, 0x4B, 0x6, 0x2, 0x0, 0x0, 0xB, 0x0, 0x98, 0x81, 0x0, 0x8B, 0x6, 0x2, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x81, 0x0, 0xCB, 0x6, 0x2, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x81, 0x0, 0xB, 0x7, 0x2, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x81, 0x0, 0x4B, 0x7, 0x2, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x81, 0x0, 0x8B, 0x7, 0x2, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x81, 0x0, 0xCB, 0x7, 0x2, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x81, 0x0, 0xB, 0x8, 0x2, 0x0, 0x0, 0xB, 0x0, 0x8, 0x82, 0x0, 0x4B, 0x8, 0x2, 0x0, 0x0, 0xB, 0x0, 0x18, 0x82, 0x0, 0x8B, 0x8, 0x2, 0x0, 0x0, 0xB, 0x0, 0x28, 0x82, 0x0, 0xCB, 0x8, 0x2, 0x0, 0x0, 0xB, 0x0, 0x38, 0x82, 0x0, 0xB, 0x9, 0x2, 0x0, 0x0, 0xB, 0x0, 0x48, 0x82, 0x0, 0x4B, 0x9, 0x2, 0x0, 0x0, 0xB, 0x0, 0x58, 0x82, 0x0, 0x8B, 0x9, 0x2, 0x0, 0x0, 0xB, 0x0, 0x68, 0x82, 0x0, 0xCB, 0x9, 0x2, 0x0, 0x0, 0xB, 0x0, 0x78, 0x82, 0x0, 0xB, 0xA, 0x2, 0x0, 0x0, 0xB, 0x0, 0x88, 0x82, 0x0, 0x4B, 0xA, 0x2, 0x0, 0x0, 0xB, 0x0, 0x98, 0x82, 0x0, 0x8B, 0xA, 0x2, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x82, 0x0, 0xCB, 0xA, 0x2, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x82, 0x0, 0xB, 0xB, 0x2, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x82, 0x0, 0x4B, 0xB, 0x2, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x82, 0x0, 0x8B, 0xB, 0x2, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x82, 0x0, 0xCB, 0xB, 0x2, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x82, 0x0, 0xB, 0xC, 0x2, 0x0, 0x0, 0xB, 0x0, 0x8, 0x83, 0x0, 0x4B, 0xC, 0x2, 0x0, 0x0, 0x6B, 0xC, 0x2, 0x0, 0x0, 0x8B, 0xC, 0x2, 0x0, 0x0, 0xAB, 0xC, 0x2, 0x0, 0x0, 0xCB, 0xC, 0x2, 0x0, 0x0, 0xEB, 0xC, 0x2, 0x0, 0x0, 0xB, 0xD, 0x2, 0x0, 0x0, 0x2B, 0xD, 0x2, 0x0, 0x0, 0x4B, 0xD, 0x2, 0x0, 0x0, 0x6B, 0xD, 0x2, 0x0, 0x0, 0x8B, 0xD, 0x2, 0x0, 0x0, 0xAB, 0xD, 0x2, 0x0, 0x0, 0xCB, 0xD, 0x2, 0x0, 0x0, 0xEB, 0xD, 0x2, 0x0, 0x0, 0xB, 0xE, 0x2, 0x0, 0x0, 0x2B, 0xE, 0x2, 0x0, 0x0, 0x4B, 0xE, 0x2, 0x0, 0x0, 0x6B, 0xE, 0x2, 0x0, 0x0, 0x8B, 0xE, 0x2, 0x0, 0x0, 0xAB, 0xE, 0x2, 0x0, 0x0, 0xCB, 0xE, 0x2, 0x0, 0x0, 0xEB, 0xE, 0x2, 0x0, 0x0, 0xB, 0xF, 0x2, 0x0, 0x0, 0x2B, 0xF, 0x2, 0x0, 0x0, 0x4B, 0xF, 0x2, 0x0, 0x0, 0x6B, 0xF, 0x2, 0x0, 0x0, 0x8B, 0xF, 0x2, 0x0, 0x0, 0xAB, 0xF, 0x2, 0x0, 0x0, 0xCB, 0xF, 0x2, 0x0, 0x0, 0xEB, 0xF, 0x2, 0x0, 0x0, 0xB, 0x10, 0x2, 0x0, 0x0, 0x2B, 0x10, 0x2, 0x0, 0x0, 0x4B, 0x10, 0x2, 0x0, 0x0, 0x6B, 0x10, 0x2, 0x0, 0x0, 0x8B, 0x10, 0x2, 0x0, 0x0, 0xAB, 0x10, 0x2, 0x0, 0x0, 0xCB, 0x10, 0x2, 0x0, 0x0, 0xEB, 0x10, 0x2, 0x0, 0x0, 0xB, 0x11, 0x2, 0x0, 0x0, 0x2B, 0x11, 0x2, 0x0, 0x0, 0x4B, 0x11, 0x2, 0x0, 0x0, 0x6B, 0x11, 0x2, 0x0, 0x0, 0x8B, 0x11, 0x2, 0x0, 0x0, 0xAB, 0x11, 0x2, 0x0, 0x0, 0xCB, 0x11, 0x2, 0x0, 0x0, 0xEB, 0x11, 0x2, 0x0, 0x0, 0xB, 0x12, 0x2, 0x0, 0x0, 0x2B, 0x12, 0x2, 0x0, 0x0, 0x4B, 0x12, 0x2, 0x0, 0x0, 0x6B, 0x12, 0x2, 0x0, 0x0, 0x8B, 0x12, 0x2, 0x0, 0x0, 0xAB, 0x12, 0x2, 0x0, 0x0, 0xCB, 0x12, 0x2, 0x0, 0x0, 0xEB, 0x12, 0x2, 0x0, 0x0, 0xB, 0x0, 0xC0, 0x84, 0x0, 0x2B, 0x13, 0x2, 0x0, 0x0, 0xB, 0x0, 0xD0, 0x84, 0x0, 0x6B, 0x13, 0x2, 0x0, 0x0, 0x8B, 0x13, 0x2, 0x0, 0x0, 0xAB, 0x13, 0x2, 0x0, 0x0, 0xB, 0x0, 0xF0, 0x84, 0x0, 0xEB, 0x13, 0x2, 0x0, 0x0, 0xB, 0x0, 0x0, 0x85, 0x0, 0x2B, 0x14, 0x2, 0x0, 0x0, 0xB, 0x0, 0x10, 0x85, 0x0, 0x6B, 0x14, 0x2, 0x0, 0x0, 0xB, 0x0, 0x20, 0x85, 0x0, 0xAB, 0x14, 0x2, 0x0, 0x0, 0xCB, 0x14, 0x2, 0x0, 0x0, 0xEB, 0x14, 0x2, 0x0, 0x0, 0xB, 0x15, 0x2, 0x0, 0x0, 0xB, 0x0, 0x48, 0x85, 0x0, 0x4B, 0x15, 0x2, 0x0, 0x0, 0xB, 0x0, 0x58, 0x85, 0x0, 0x8B, 0x15, 0x2, 0x0, 0x0, 0xB, 0x0, 0x68, 0x85, 0x0, 0xCB, 0x15, 0x2, 0x0, 0x0, 0xEB, 0x15, 0x2, 0x0, 0x0, 0xB, 0x16, 0x2, 0x0, 0x0, 0xB, 0x0, 0x88, 0x85, 0x0, 0x4B, 0x16, 0x2, 0x0, 0x0, 0x6B, 0x16, 0x2, 0x0, 0x0, 0x8B, 0x16, 0x2, 0x0, 0x0, 0xAB, 0x16, 0x2, 0x0, 0x0, 0xCB, 0x16, 0x2, 0x0, 0x0, 0xEB, 0x16, 0x2, 0x0, 0x0, 0xB, 0x17, 0x2, 0x0, 0x0, 0x2B, 0x17, 0x2, 0x0, 0x0, 0x4B, 0x17, 0x2, 0x0, 0x0, 0x6B, 0x17, 0x2, 0x0, 0x0, 0x8B, 0x17, 0x2, 0x0, 0x0, 0xAB, 0x17, 0x2, 0x0, 0x0, 0xCB, 0x17, 0x2, 0x0, 0x0, 0xEB, 0x17, 0x2, 0x0, 0x0, 0xB, 0x18, 0x2, 0x0, 0x0, 0x2B, 0x18, 0x2, 0x0, 0x0, 0x4B, 0x18, 0x2, 0x0, 0x0, 0x6B, 0x18, 0x2, 0x0, 0x0, 0x8B, 0x18, 0x2, 0x0, 0x0, 0xAB, 0x18, 0x2, 0x0, 0x0, 0xCB, 0x18, 0x2, 0x0, 0x0, 0xEB, 0x18, 0x2, 0x0, 0x0, 0xB, 0x19, 0x2, 0x0, 0x0, 0x2B, 0x19, 0x2, 0x0, 0x0, 0x4B, 0x19, 0x2, 0x0, 0x0, 0x6B, 0x19, 0x2, 0x0, 0x0, 0x8B, 0x19, 0x2, 0x0, 0x0, 0xAB, 0x19, 0x2, 0x0, 0x0, 0xCB, 0x19, 0x2, 0x0, 0x0, 0xEB, 0x19, 0x2, 0x0, 0x0, 0xB, 0x1A, 0x2, 0x0, 0x0, 0x2B, 0x1A, 0x2, 0x0, 0x0, 0x4B, 0x1A, 0x2, 0x0, 0x0, 0x6B, 0x1A, 0x2, 0x0, 0x0, 0x8B, 0x1A, 0x2, 0x0, 0x0, 0xAB, 0x1A, 0x2, 0x0, 0x0, 0xCB, 0x1A, 0x2, 0x0, 0x0, 0xEB, 0x1A, 0x2, 0x0, 0x0, 0xB, 0x1B, 0x2, 0x0, 0x0, 0x2B, 0x1B, 0x2, 0x0, 0x0, 0x4B, 0x1B, 0x2, 0x0, 0x0, 0x6B, 0x1B, 0x2, 0x0, 0x0, 0x8B, 0x1B, 0x2, 0x0, 0x0, 0xAB, 0x1B, 0x2, 0x0, 0x0, 0xCB, 0x1B, 0x2, 0x0, 0x0, 0xEB, 0x1B, 0x2, 0x0, 0x0, 0xB, 0x1C, 0x2, 0x0, 0x0, 0x2B, 0x1C, 0x2, 0x0, 0x0, 0xB, 0x0, 0x10, 0x87, 0x0, 0xB, 0x0, 0x18, 0x87, 0x0, 0xB, 0x0, 0x20, 0x87, 0x0, 0xB, 0x0, 0x28, 0x87, 0x0, 0xB, 0x0, 0x30, 0x87, 0x0, 0xB, 0x0, 0x38, 0x87, 0x0, 0xB, 0x0, 0x40, 0x87, 0x0, 0xB, 0x0, 0x48, 0x87, 0x0, 0xB, 0x0, 0x50, 0x87, 0x0, 0xB, 0x0, 0x58, 0x87, 0x0, 0xB, 0x0, 0x60, 0x87, 0x0, 0xB, 0x0, 0x68, 0x87, 0x0, 0xB, 0x0, 0x70, 0x87, 0x0, 0xB, 0x0, 0x78, 0x87, 0x0, 0xB, 0x0, 0x80, 0x87, 0x0, 0xB, 0x0, 0x88, 0x87, 0x0, 0xB, 0x0, 0x90, 0x87, 0x0, 0xB, 0x0, 0x98, 0x87, 0x0, 0xB, 0x0, 0xA0, 0x87, 0x0, 0xB, 0x0, 0xA8, 0x87, 0x0, 0xB, 0x0, 0xB0, 0x87, 0x0, 0xB, 0x0, 0xB8, 0x87, 0x0, 0xB, 0x0, 0xC0, 0x87, 0x0, 0xB, 0x0, 0xC8, 0x87, 0x0, 0xB, 0x0, 0xD0, 0x87, 0x0, 0xB, 0x0, 0xD8, 0x87, 0x0, 0xB, 0x0, 0xE0, 0x87, 0x0, 0xB, 0x0, 0xE8, 0x87, 0x0, 0xB, 0x0, 0xF0, 0x87, 0x0, 0xB, 0x0, 0xF8, 0x87, 0x0, 0xB, 0x0, 0x0, 0x88, 0x0, 0xB, 0x0, 0x8, 0x88, 0x0, 0xB, 0x0, 0x10, 0x88, 0x0, 0xB, 0x0, 0x18, 0x88, 0x0, 0xB, 0x0, 0x20, 0x88, 0x0, 0xB, 0x0, 0x28, 0x88, 0x0, 0xB, 0x0, 0x30, 0x88, 0x0, 0xB, 0x0, 0x38, 0x88, 0x0, 0xB, 0x0, 0x40, 0x88, 0x0, 0xB, 0x0, 0x48, 0x88, 0x0, 0xB, 0x0, 0x50, 0x88, 0x0, 0xB, 0x0, 0x58, 0x88, 0x0, 0xB, 0x0, 0x60, 0x88, 0x0, 0xB, 0x0, 0x68, 0x88, 0x0, 0xB, 0x0, 0x70, 0x88, 0x0, 0xB, 0x0, 0x78, 0x88, 0x0, 0xB, 0x0, 0x80, 0x88, 0x0, 0xB, 0x0, 0x88, 0x88, 0x0, 0xB, 0x0, 0x90, 0x88, 0x0, 0xB, 0x0, 0x98, 0x88, 0x0, 0x8B, 0x22, 0x2, 0x0, 0x0, 0xAB, 0x22, 0x2, 0x0, 0x0, 0xCB, 0x22, 0x2, 0x0, 0x0, 0xEB, 0x22, 0x2, 0x0, 0x0, 0xB, 0x23, 0x2, 0x0, 0x0, 0x2B, 0x23, 0x2, 0x0, 0x0, 0x4B, 0x23, 0x2, 0x0, 0x0, 0x6B, 0x23, 0x2, 0x0, 0x0, 0x8B, 0x23, 0x2, 0x0, 0x0, 0xAB, 0x23, 0x2, 0x0, 0x0, 0xCB, 0x23, 0x2, 0x0, 0x0, 0xEB, 0x23, 0x2, 0x0, 0x0, 0xB, 0x24, 0x2, 0x0, 0x0, 0x2B, 0x24, 0x2, 0x0, 0x0, 0x4B, 0x24, 0x2, 0x0, 0x0, 0x6B, 0x24, 0x2, 0x0, 0x0, 0x8B, 0x24, 0x2, 0x0, 0x0, 0xAB, 0x24, 0x2, 0x0, 0x0, 0xCB, 0x24, 0x2, 0x0, 0x0, 0xEB, 0x24, 0x2, 0x0, 0x0, 0xB, 0x25, 0x2, 0x0, 0x0, 0x2B, 0x25, 0x2, 0x0, 0x0, 0x4B, 0x25, 0x2, 0x0, 0x0, 0x6B, 0x25, 0x2, 0x0, 0x0, 0x8B, 0x25, 0x2, 0x0, 0x0, 0xAB, 0x25, 0x2, 0x0, 0x0, 0xCB, 0x25, 0x2, 0x0, 0x0, 0xEB, 0x25, 0x2, 0x0, 0x0, 0xB, 0x26, 0x2, 0x0, 0x0, 0x2B, 0x26, 0x2, 0x0, 0x0, 0x4B, 0x26, 0x2, 0x0, 0x0, 0x6B, 0x26, 0x2, 0x0, 0x0, 0x8B, 0x26, 0x2, 0x0, 0x0, 0xAB, 0x26, 0x2, 0x0, 0x0, 0xCB, 0x26, 0x2, 0x0, 0x0, 0xEB, 0x26, 0x2, 0x0, 0x0, 0xB, 0x27, 0x2, 0x0, 0x0, 0x2B, 0x27, 0x2, 0x0, 0x0, 0x4B, 0x27, 0x2, 0x0, 0x0, 0x6B, 0x27, 0x2, 0x0, 0x0, 0x8B, 0x27, 0x2, 0x0, 0x0, 0xAB, 0x27, 0x2, 0x0, 0x0, 0xCB, 0x27, 0x2, 0x0, 0x0, 0xEB, 0x27, 0x2, 0x0, 0x0, 0xB, 0x28, 0x2, 0x0, 0x0, 0x2B, 0x28, 0x2, 0x0, 0x0, 0x4B, 0x28, 0x2, 0x0, 0x0, 0x6B, 0x28, 0x2, 0x0, 0x0, 0x8B, 0x28, 0x2, 0x0, 0x0, 0xAB, 0x28, 0x2, 0x0, 0x0, 0xCB, 0x28, 0x2, 0x0, 0x0, 0xEB, 0x28, 0x2, 0x0, 0x0, 0xB, 0x29, 0x2, 0x0, 0x0, 0x2B, 0x29, 0x2, 0x0, 0x0, 0x4B, 0x29, 0x2, 0x0, 0x0, 0x6B, 0x29, 0x2, 0x0, 0x0, 0x8B, 0x29, 0x2, 0x0, 0x0, 0xAB, 0x29, 0x2, 0x0, 0x0, 0xCB, 0x29, 0x2, 0x0, 0x0, 0xEB, 0x29, 0x2, 0x0, 0x0, 0xB, 0x2A, 0x2, 0x0, 0x0, 0x2B, 0x2A, 0x2, 0x0, 0x0, 0x4B, 0x2A, 0x2, 0x0, 0x0, 0x6B, 0x2A, 0x2, 0x0, 0x0, 0x8B, 0x2A, 0x2, 0x0, 0x0, 0xAB, 0x2A, 0x2, 0x0, 0x0, 0xCB, 0x2A, 0x2, 0x0, 0x0, 0xEB, 0x2A, 0x2, 0x0, 0x0, 0xB, 0x2B, 0x2, 0x0, 0x0, 0x2B, 0x2B, 0x2, 0x0, 0x0, 0x4B, 0x2B, 0x2, 0x0, 0x0, 0x6B, 0x2B, 0x2, 0x0, 0x0, 0x8B, 0x2B, 0x2, 0x0, 0x0, 0xAB, 0x2B, 0x2, 0x0, 0x0, 0xCB, 0x2B, 0x2, 0x0, 0x0, 0xEB, 0x2B, 0x2, 0x0, 0x0, 0xB, 0x2C, 0x2, 0x0, 0x0, 0x2B, 0x2C, 0x2, 0x0, 0x0, 0x4B, 0x2C, 0x2, 0x0, 0x0, 0x6B, 0x2C, 0x2, 0x0, 0x0, 0x8B, 0x2C, 0x2, 0x0, 0x0, 0xAB, 0x2C, 0x2, 0x0, 0x0, 0xCB, 0x2C, 0x2, 0x0, 0x0, 0xEB, 0x2C, 0x2, 0x0, 0x0, 0xB, 0x2D, 0x2, 0x0, 0x0, 0x2B, 0x2D, 0x2, 0x0, 0x0, 0x4B, 0x2D, 0x2, 0x0, 0x0, 0x6B, 0x2D, 0x2, 0x0, 0x0, 0x8B, 0x2D, 0x2, 0x0, 0x0, 0xAB, 0x2D, 0x2, 0x0, 0x0, 0xCB, 0x2D, 0x2, 0x0, 0x0, 0xEB, 0x2D, 0x2, 0x0, 0x0, 0xB, 0x2E, 0x2, 0x0, 0x0, 0x2B, 0x2E, 0x2, 0x0, 0x0, 0x4B, 0x2E, 0x2, 0x0, 0x0, 0x6B, 0x2E, 0x2, 0x0, 0x0, 0x8B, 0x2E, 0x2, 0x0, 0x0, 0xAB, 0x2E, 0x2, 0x0, 0x0, 0xCB, 0x2E, 0x2, 0x0, 0x0, 0xEB, 0x2E, 0x2, 0x0, 0x0, 0xB, 0x2F, 0x2, 0x0, 0x0, 0x2B, 0x2F, 0x2, 0x0, 0x0, 0x4B, 0x2F, 0x2, 0x0, 0x0, 0x6B, 0x2F, 0x2, 0x0, 0x0, 0x8B, 0x2F, 0x2, 0x0, 0x0, 0xAB, 0x2F, 0x2, 0x0, 0x0, 0xCB, 0x2F, 0x2, 0x0, 0x0, 0xEB, 0x2F, 0x2, 0x0, 0x0, 0xB, 0x30, 0x2, 0x0, 0x0, 0x2B, 0x30, 0x2, 0x0, 0x0, 0x4B, 0x30, 0x2, 0x0, 0x0, 0x6B, 0x30, 0x2, 0x0, 0x0, 0x8B, 0x30, 0x2, 0x0, 0x0, 0xAB, 0x30, 0x2, 0x0, 0x0, 0xCB, 0x30, 0x2, 0x0, 0x0, 0xEB, 0x30, 0x2, 0x0, 0x0, 0xB, 0x31, 0x2, 0x0, 0x0, 0x2B, 0x31, 0x2, 0x0, 0x0, 0x4B, 0x31, 0x2, 0x0, 0x0, 0x6B, 0x31, 0x2, 0x0, 0x0, 0x8B, 0x31, 0x2, 0x0, 0x0, 0xAB, 0x31, 0x2, 0x0, 0x0, 0xCB, 0x31, 0x2, 0x0, 0x0, 0xEB, 0x31, 0x2, 0x0, 0x0, 0xB, 0x32, 0x2, 0x0, 0x0, 0x2B, 0x32, 0x2, 0x0, 0x0, 0x4B, 0x32, 0x2, 0x0, 0x0, 0x6B, 0x32, 0x2, 0x0, 0x0, 0x8B, 0x32, 0x2, 0x0, 0x0, 0xAB, 0x32, 0x2, 0x0, 0x0, 0xCB, 0x32, 0x2, 0x0, 0x0, 0xEB, 0x32, 0x2, 0x0, 0x0, 0xB, 0x33, 0x2, 0x0, 0x0, 0x2B, 0x33, 0x2, 0x0, 0x0, 0x4B, 0x33, 0x2, 0x0, 0x0, 0x6B, 0x33, 0x2, 0x0, 0x0, 0x8B, 0x33, 0x2, 0x0, 0x0, 0xAB, 0x33, 0x2, 0x0, 0x0, 0xCB, 0x33, 0x2, 0x0, 0x0, 0xEB, 0x33, 0x2, 0x0, 0x0, 0xB, 0x34, 0x2, 0x0, 0x0, 0x2B, 0x34, 0x2, 0x0, 0x0, 0x4B, 0x34, 0x2, 0x0, 0x0, 0x6B, 0x34, 0x2, 0x0, 0x0, 0x8B, 0x34, 0x2, 0x0, 0x0, 0xB, 0x0, 0x28, 0x8D, 0x0, 0xB, 0xFE, 0x1, 0x0, 0x0, 0x2B, 0xFE, 0x1, 0x0, 0x0, 0x4B, 0xFE, 0x1, 0x0, 0x0, 0x6B, 0xFE, 0x1, 0x0, 0x0, 0x8B, 0xFE, 0x1, 0x0, 0x0, 0xAB, 0xFE, 0x1, 0x0, 0x0, 0xCB, 0xFE, 0x1, 0x0, 0x0, 0xEB, 0xFE, 0x1, 0x0, 0x0, 0xB, 0xFF, 0x1, 0x0, 0x0, 0x2B, 0xFF, 0x1, 0x0, 0x0, 0x4B, 0xFF, 0x1, 0x0, 0x0, 0xCB, 0x34, 0x2, 0x0, 0x0, 0xEB, 0x34, 0x2, 0x0, 0x0, 0xB, 0x35, 0x2, 0x0, 0x0, 0x2B, 0x35, 0x2, 0x0, 0x0, 0x4B, 0x35, 0x2, 0x0, 0x0, 0x6B, 0x35, 0x2, 0x0, 0x0, 0x8B, 0x35, 0x2, 0x0, 0x0, 0xAB, 0x35, 0x2, 0x0, 0x0, 0xCB, 0x35, 0x2, 0x0, 0x0, 0x6B, 0xFF, 0x1, 0x0, 0x0, 0x8B, 0xFF, 0x1, 0x0, 0x0, 0xAB, 0xFF, 0x1, 0x0, 0x0, 0xCB, 0xFF, 0x1, 0x0, 0x0, 0xEB, 0xFF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x2, 0x0, 0x0, 0x2B, 0x0, 0x2, 0x0, 0x0, 0x4B, 0x0, 0x2, 0x0, 0x0, 0x6B, 0x0, 0x2, 0x0, 0x0, 0x8B, 0x0, 0x2, 0x0, 0x0, 0xAB, 0x0, 0x2, 0x0, 0x0, 0xCB, 0x0, 0x2, 0x0, 0x0, 0xEB, 0x0, 0x2, 0x0, 0x0, 0xB, 0x1, 0x2, 0x0, 0x0, 0x2B, 0x1, 0x2, 0x0, 0x0, 0x4B, 0x1, 0x2, 0x0, 0x0, 0x6B, 0x1, 0x2, 0x0, 0x0, 0x8B, 0x1, 0x2, 0x0, 0x0, 0xAB, 0x1, 0x2, 0x0, 0x0, 0xCB, 0x1, 0x2, 0x0, 0x0, 0xEB, 0x1, 0x2, 0x0, 0x0, 0xB, 0x2, 0x2, 0x0, 0x0, 0x2B, 0x2, 0x2, 0x0, 0x0, 0xEB, 0x35, 0x2, 0x0, 0x0, 0xB, 0x36, 0x2, 0x0, 0x0, 0x2B, 0x36, 0x2, 0x0, 0x0, 0x4B, 0x36, 0x2, 0x0, 0x0, 0x6B, 0x36, 0x2, 0x0, 0x0, 0x8B, 0x36, 0x2, 0x0, 0x0, 0xAB, 0x36, 0x2, 0x0, 0x0, 0xCB, 0x36, 0x2, 0x0, 0x0, 0xEB, 0x36, 0x2, 0x0, 0x0, 0xB, 0x37, 0x2, 0x0, 0x0, 0x2B, 0x37, 0x2, 0x0, 0x0, 0x4B, 0x37, 0x2, 0x0, 0x0, 0x6B, 0x37, 0x2, 0x0, 0x0, 0x8B, 0x37, 0x2, 0x0, 0x0, 0xAB, 0x37, 0x2, 0x0, 0x0, 0xCB, 0x37, 0x2, 0x0, 0x0, 0xEB, 0x37, 0x2, 0x0, 0x0, 0xB, 0x38, 0x2, 0x0, 0x0, 0x2B, 0x38, 0x2, 0x0, 0x0, 0x4B, 0x38, 0x2, 0x0, 0x0, 0x6B, 0x38, 0x2, 0x0, 0x0, 0x8B, 0x38, 0x2, 0x0, 0x0, 0xAB, 0x38, 0x2, 0x0, 0x0, 0xCB, 0x38, 0x2, 0x0, 0x0, 0xEB, 0x38, 0x2, 0x0, 0x0, 0xB, 0x39, 0x2, 0x0, 0x0, 0x2B, 0x39, 0x2, 0x0, 0x0, 0x4B, 0x39, 0x2, 0x0, 0x0, 0x6B, 0x39, 0x2, 0x0, 0x0, 0x8B, 0x39, 0x2, 0x0, 0x0, 0xAB, 0x39, 0x2, 0x0, 0x0, 0xCB, 0x39, 0x2, 0x0, 0x0, 0xEB, 0x39, 0x82, 0x8E, 0x0, 0x2B, 0x3A, 0x92, 0x8E, 0x0, 0x6B, 0x3A, 0xA2, 0x8E, 0x0, 0xAB, 0x3A, 0xB2, 0x8E, 0x0, 0xEB, 0x3A, 0xC2, 0x8E, 0x0, 0x2B, 0x3B, 0xD2, 0x8E, 0x0, 0x6B, 0x3B, 0xE2, 0x8E, 0x0, 0xAB, 0x3B, 0xF2, 0x8E, 0x0, 0xEB, 0x3B, 0x2, 0x8F, 0x0, 0x2B, 0x3C, 0x12, 0x8F, 0x0, 0x6B, 0x3C, 0x22, 0x8F, 0x0, 0xAB, 0x3C, 0x32, 0x8F, 0x0, 0xEB, 0x3C, 0x42, 0x8F, 0x0, 0x2B, 0x3D, 0x52, 0x8F, 0x0, 0x6B, 0x3D, 0x62, 0x8F, 0x0, 0xAB, 0x3D, 0x72, 0x8F, 0x0, 0xEB, 0x3D, 0x82, 0x8F, 0x0, 0x2B, 0x3E, 0x92, 0x8F, 0x0, 0x6B, 0x3E, 0xA2, 0x8F, 0x0, 0xAB, 0x3E, 0xB2, 0x8F, 0x0, 0xEB, 0x3E, 0xC2, 0x8F, 0x0, 0x2B, 0x3F, 0xD2, 0x8F, 0x0, 0x6B, 0x3F, 0xE2, 0x8F, 0x0, 0xAB, 0x3F, 0xF2, 0x8F, 0x0, 0xEB, 0x3F, 0x2, 0x90, 0x0, 0x2B, 0x40, 0x12, 0x90, 0x0, 0x6B, 0x40, 0x22, 0x90, 0x0, 0xAB, 0x40, 0x32, 0x90, 0x0, 0xEB, 0x40, 0x42, 0x90, 0x0, 0x2B, 0x41, 0x52, 0x90, 0x0, 0x6B, 0x41, 0x2A, 0x8D, 0x0, 0x8B, 0x41, 0x6A, 0x90, 0x0, 0xCB, 0x41, 0x7A, 0x90, 0x0, 0xB, 0x42, 0x8A, 0x90, 0x0, 0x4B, 0x42, 0x9A, 0x90, 0x0, 0x8B, 0x42, 0xAA, 0x90, 0x0, 0xCB, 0x42, 0xBA, 0x90, 0x0, 0xB, 0x43, 0xCA, 0x90, 0x0, 0x4B, 0x43, 0xDA, 0x90, 0x0, 0x8B, 0x43, 0xEA, 0x90, 0x0, 0xCB, 0x43, 0xFA, 0x90, 0x0, 0xB, 0x44, 0xA, 0x91, 0x0, 0x4B, 0x44, 0x1A, 0x91, 0x0, 0x8B, 0x44, 0x2A, 0x91, 0x0, 0xCB, 0x44, 0x3A, 0x91, 0x0, 0xB, 0x45, 0x4A, 0x91, 0x0, 0xB, 0x0, 0x50, 0x91, 0x0, 0xB, 0x0, 0x58, 0x91, 0x0, 0xB, 0x0, 0x60, 0x91, 0x0, 0xB, 0x0, 0x68, 0x91, 0x0, 0xB, 0x0, 0x70, 0x91, 0x0, 0xB, 0x0, 0x78, 0x91, 0x0, 0xB, 0x0, 0x80, 0x91, 0x0, 0xB, 0x0, 0x88, 0x91, 0x0, 0xB, 0x0, 0x90, 0x91, 0x0, 0xB, 0x0, 0x98, 0x91, 0x0, 0xB, 0x0, 0xA0, 0x91, 0x0, 0xB, 0x0, 0xA8, 0x91, 0x0, 0xB, 0x0, 0xB0, 0x91, 0x0, 0xB, 0x0, 0xB8, 0x91, 0x0, 0xB, 0x0, 0xC0, 0x91, 0x0, 0xB, 0x0, 0xC8, 0x91, 0x0, 0xB, 0x0, 0xD0, 0x91, 0x0, 0xB, 0x0, 0xD8, 0x91, 0x0, 0xB, 0x0, 0xE0, 0x91, 0x0, 0xB, 0x0, 0xE8, 0x91, 0x0, 0xB, 0x0, 0xF0, 0x91, 0x0, 0xB, 0x0, 0xF8, 0x91, 0x0, 0xB, 0x0, 0x0, 0x92, 0x0, 0xB, 0x0, 0x8, 0x92, 0x0, 0xB, 0x0, 0x10, 0x92, 0x0, 0xB, 0x0, 0x18, 0x92, 0x0, 0xB, 0x0, 0x20, 0x92, 0x0, 0xB, 0x0, 0x28, 0x92, 0x0, 0xB, 0x0, 0x30, 0x92, 0x0, 0xB, 0x0, 0x38, 0x92, 0x0, 0xB, 0x0, 0x40, 0x92, 0x0, 0xB, 0x0, 0x48, 0x92, 0x0, 0xB, 0x0, 0x50, 0x92, 0x0, 0xB, 0x0, 0x58, 0x92, 0x0, 0xB, 0x0, 0x60, 0x92, 0x0, 0xB, 0x0, 0x68, 0x92, 0x0, 0xB, 0x0, 0x70, 0x92, 0x0, 0xB, 0x0, 0x78, 0x92, 0x0, 0xB, 0x0, 0x80, 0x92, 0x0, 0xB, 0x0, 0x88, 0x92, 0x0, 0xB, 0x0, 0x90, 0x92, 0x0, 0xB, 0x0, 0x98, 0x92, 0x0, 0xB, 0x0, 0xA0, 0x92, 0x0, 0xB, 0x0, 0xA8, 0x92, 0x0, 0xB, 0x0, 0xB0, 0x92, 0x0, 0xB, 0x0, 0xB8, 0x92, 0x0, 0xB, 0x0, 0xC0, 0x92, 0x0, 0xB, 0x0, 0xC8, 0x92, 0x0, 0xB, 0x0, 0xD0, 0x92, 0x0, 0xB, 0x0, 0xD8, 0x92, 0x0, 0xB, 0x0, 0xE0, 0x92, 0x0, 0xB, 0x0, 0xE8, 0x92, 0x0, 0xB, 0x0, 0xF0, 0x92, 0x0, 0xB, 0x0, 0xF8, 0x92, 0x0, 0xB, 0x0, 0x0, 0x93, 0x0, 0xB, 0x0, 0x8, 0x93, 0x0, 0xB, 0x0, 0x10, 0x93, 0x0, 0xB, 0x0, 0x18, 0x93, 0x0, 0xB, 0x0, 0x20, 0x93, 0x0, 0xB, 0x0, 0x28, 0x93, 0x0, 0xB, 0x0, 0x30, 0x93, 0x0, 0xB, 0x0, 0x38, 0x93, 0x0, 0xB, 0x0, 0x40, 0x93, 0x0, 0xB, 0x0, 0x48, 0x93, 0x0, 0xB, 0x0, 0x50, 0x93, 0x0, 0xB, 0x0, 0x58, 0x93, 0x0, 0xB, 0x0, 0x60, 0x93, 0x0, 0xB, 0x0, 0x68, 0x93, 0x0, 0xB, 0x0, 0x70, 0x93, 0x0, 0xB, 0x0, 0x78, 0x93, 0x0, 0xB, 0x0, 0x80, 0x93, 0x0, 0xB, 0x0, 0x88, 0x93, 0x0, 0xB, 0x0, 0x90, 0x93, 0x0, 0xB, 0x0, 0x98, 0x93, 0x0, 0xB, 0x0, 0x10, 0x83, 0x0, 0xB, 0x0, 0xA0, 0x93, 0x0, 0xB, 0x0, 0xA8, 0x93, 0x0, 0xB, 0x0, 0xB0, 0x93, 0x0, 0xB, 0x0, 0xB8, 0x93, 0x0, 0xB, 0x0, 0xC0, 0x93, 0x0, 0xB, 0x0, 0xC8, 0x93, 0x0, 0xB, 0x0, 0xD0, 0x93, 0x0, 0xB, 0x0, 0x28, 0x83, 0x0, 0xB, 0x0, 0x30, 0x83, 0x0, 0xB, 0x0, 0x38, 0x83, 0x0, 0xB, 0x0, 0x40, 0x83, 0x0, 0xB, 0x0, 0x48, 0x83, 0x0, 0xB, 0x0, 0x50, 0x83, 0x0, 0xB, 0x0, 0x58, 0x83, 0x0, 0xB, 0x0, 0x60, 0x83, 0x0, 0xB, 0x0, 0x68, 0x83, 0x0, 0xB, 0x0, 0x70, 0x83, 0x0, 0xB, 0x0, 0xD8, 0x93, 0x0, 0xB, 0x0, 0xE0, 0x93, 0x0, 0xB, 0x0, 0xE8, 0x93, 0x0, 0xB, 0x0, 0xF0, 0x93, 0x0, 0xB, 0x0, 0xF8, 0x93, 0x0, 0xB, 0x0, 0x0, 0x94, 0x0, 0xB, 0x0, 0x8, 0x94, 0x0, 0xB, 0x0, 0x10, 0x94, 0x0, 0xB, 0x0, 0xB8, 0x83, 0x0, 0xB, 0x0, 0xC0, 0x83, 0x0, 0xB, 0x0, 0xC8, 0x83, 0x0, 0xB, 0x0, 0xD0, 0x83, 0x0, 0xB, 0x0, 0xD8, 0x83, 0x0, 0xB, 0x0, 0xE0, 0x83, 0x0, 0xB, 0x0, 0xE8, 0x83, 0x0, 0xB, 0x0, 0xF0, 0x83, 0x0, 0xB, 0x0, 0xF8, 0x83, 0x0, 0xB, 0x0, 0x0, 0x84, 0x0, 0xB, 0x0, 0x8, 0x84, 0x0, 0xB, 0x0, 0x10, 0x84, 0x0, 0xB, 0x0, 0x18, 0x84, 0x0, 0xB, 0x0, 0x20, 0x84, 0x0, 0xB, 0x0, 0x28, 0x84, 0x0, 0xB, 0x0, 0x30, 0x84, 0x0, 0xB, 0x0, 0x38, 0x84, 0x0, 0xB, 0x0, 0x40, 0x84, 0x0, 0xB, 0x0, 0x48, 0x84, 0x0, 0xB, 0x0, 0x50, 0x84, 0x0, 0xB, 0x0, 0x58, 0x84, 0x0, 0xB, 0x0, 0x60, 0x84, 0x0, 0xB, 0x0, 0x68, 0x84, 0x0, 0xB, 0x0, 0x70, 0x84, 0x0, 0xB, 0x0, 0x78, 0x84, 0x0, 0xB, 0x0, 0x80, 0x84, 0x0, 0xB, 0x0, 0x88, 0x84, 0x0, 0xB, 0x0, 0xB0, 0x84, 0x0, 0xB, 0x0, 0x18, 0x94, 0x0, 0xB, 0x0, 0x20, 0x94, 0x0, 0xB, 0x0, 0x28, 0x94, 0x0, 0xB, 0x0, 0x30, 0x94, 0x0, 0xB, 0x0, 0x38, 0x94, 0x0, 0xB, 0x0, 0x40, 0x94, 0x0, 0xB, 0x0, 0xE0, 0x84, 0x0, 0xB, 0x0, 0x48, 0x94, 0x0, 0xB, 0x0, 0x50, 0x94, 0x0, 0xB, 0x0, 0x58, 0x94, 0x0, 0xB, 0x0, 0x60, 0x94, 0x0, 0xB, 0x0, 0x68, 0x94, 0x0, 0xB, 0x0, 0x70, 0x94, 0x0, 0xB, 0x0, 0x78, 0x94, 0x0, 0xB, 0x0, 0x80, 0x94, 0x0, 0xB, 0x0, 0x90, 0x85, 0x0, 0xB, 0x0, 0x88, 0x94, 0x0, 0xB, 0x0, 0x90, 0x94, 0x0, 0xB, 0x0, 0x98, 0x94, 0x0, 0xB, 0x0, 0xA0, 0x94, 0x0, 0xB, 0x0, 0xA8, 0x94, 0x0, 0xB, 0x0, 0xB0, 0x94, 0x0, 0xB, 0x0, 0xB8, 0x94, 0x0, 0xB, 0x0, 0xC0, 0x94, 0x0, 0xB, 0x0, 0xC8, 0x94, 0x0, 0xB, 0x0, 0xD0, 0x94, 0x0, 0xB, 0x0, 0xD8, 0x94, 0x0, 0xB, 0x0, 0xE0, 0x94, 0x0, 0xB, 0x0, 0xE8, 0x94, 0x0, 0xB, 0x0, 0xF0, 0x94, 0x0, 0xB, 0x0, 0xF8, 0x94, 0x0, 0xB, 0x0, 0x0, 0x95, 0x0, 0xB, 0x0, 0x8, 0x95, 0x0, 0xB, 0x0, 0x10, 0x95, 0x0, 0xB, 0x0, 0x18, 0x95, 0x0, 0xB, 0x0, 0x20, 0x95, 0x0, 0xB, 0x0, 0x28, 0x95, 0x0, 0xB, 0x0, 0x30, 0x95, 0x0, 0xB, 0x0, 0x38, 0x95, 0x0, 0xB, 0x0, 0x40, 0x95, 0x0, 0xB, 0x0, 0x48, 0x95, 0x0, 0xB, 0x0, 0x50, 0x95, 0x0, 0xB, 0x0, 0x58, 0x95, 0x0, 0xB, 0x0, 0x60, 0x95, 0x0, 0xB, 0x0, 0x68, 0x95, 0x0, 0xB, 0x0, 0x70, 0x95, 0x0, 0xB, 0x0, 0x78, 0x95, 0x0, 0xB, 0x0, 0x80, 0x95, 0x0, 0xB, 0x0, 0x88, 0x95, 0x0, 0xB, 0x0, 0x90, 0x95, 0x0, 0xB, 0x0, 0x98, 0x95, 0x0, 0xB, 0x0, 0xA0, 0x95, 0x0, 0xB, 0x0, 0xA8, 0x95, 0x0, 0xB, 0x0, 0xB0, 0x95, 0x0, 0xB, 0x0, 0xB8, 0x95, 0x0, 0xB, 0x0, 0xC0, 0x95, 0x0, 0xB, 0x0, 0xC8, 0x95, 0x0, 0xB, 0x0, 0xD0, 0x95, 0x0, 0xB, 0x0, 0xD8, 0x95, 0x0, 0xB, 0x0, 0xE0, 0x95, 0x0, 0xB, 0x0, 0xE8, 0x95, 0x0, 0xB, 0x0, 0xF0, 0x95, 0x0, 0xB, 0x0, 0xF8, 0x95, 0x0, 0xB, 0x0, 0x0, 0x96, 0x0, 0xB, 0x0, 0x8, 0x96, 0x0, 0xB, 0x0, 0x10, 0x96, 0x0, 0xB, 0x0, 0x18, 0x96, 0x0, 0xB, 0x0, 0x20, 0x96, 0x0, 0xB, 0x0, 0x28, 0x96, 0x0, 0xB, 0x0, 0x30, 0x96, 0x0, 0xB, 0x0, 0x38, 0x96, 0x0, 0xB, 0x0, 0x40, 0x96, 0x0, 0xB, 0x0, 0x48, 0x96, 0x0, 0xB, 0x0, 0x50, 0x96, 0x0, 0xB, 0x0, 0x58, 0x96, 0x0, 0xB, 0x0, 0x60, 0x96, 0x0, 0xB, 0x0, 0x68, 0x96, 0x0, 0xB, 0x0, 0x70, 0x96, 0x0, 0xB, 0x0, 0x78, 0x96, 0x0, 0xB, 0x0, 0x80, 0x96, 0x0, 0xB, 0x0, 0x88, 0x96, 0x0, 0xB, 0x0, 0x90, 0x96, 0x0, 0xB, 0x0, 0x98, 0x96, 0x0, 0xB, 0x0, 0xA0, 0x96, 0x0, 0xB, 0x0, 0xA8, 0x96, 0x0, 0xB, 0x0, 0xB0, 0x96, 0x0, 0xB, 0x0, 0xB8, 0x96, 0x0, 0xB, 0x0, 0xC0, 0x96, 0x0, 0xB, 0x0, 0xC8, 0x96, 0x0, 0xB, 0x0, 0xD0, 0x96, 0x0, 0xB, 0x0, 0xD8, 0x96, 0x0, 0xB, 0x0, 0xE0, 0x96, 0x0, 0xB, 0x0, 0xE8, 0x96, 0x0, 0xB, 0x0, 0xF0, 0x96, 0x0, 0xB, 0x0, 0xF8, 0x96, 0x0, 0xB, 0x0, 0x0, 0x97, 0x0, 0xB, 0x0, 0x8, 0x97, 0x0, 0xB, 0x0, 0x10, 0x97, 0x0, 0xB, 0x0, 0x18, 0x97, 0x0, 0xB, 0x0, 0x20, 0x97, 0x0, 0xB, 0x0, 0x28, 0x97, 0x0, 0xB, 0x0, 0x30, 0x97, 0x0, 0xB, 0x0, 0x38, 0x97, 0x0, 0xB, 0x0, 0x40, 0x97, 0x0, 0xB, 0x0, 0x48, 0x97, 0x0, 0xB, 0x0, 0x50, 0x97, 0x0, 0xB, 0x0, 0x58, 0x97, 0x0, 0xB, 0x0, 0x60, 0x97, 0x0, 0xB, 0x0, 0x68, 0x97, 0x0, 0xB, 0x0, 0x70, 0x97, 0x0, 0xB, 0x0, 0x78, 0x97, 0x0, 0xB, 0x0, 0x80, 0x97, 0x0, 0xB, 0x0, 0x88, 0x97, 0x0, 0xB, 0x0, 0x90, 0x97, 0x0, 0xB, 0x0, 0x98, 0x97, 0x0, 0xB, 0x0, 0xA0, 0x97, 0x0, 0xB, 0x0, 0xA8, 0x97, 0x0, 0xB, 0x0, 0xB0, 0x97, 0x0, 0xB, 0x0, 0xB8, 0x97, 0x0, 0xB, 0x0, 0xC0, 0x97, 0x0, 0xB, 0x0, 0xC8, 0x97, 0x0, 0xB, 0x0, 0xD0, 0x97, 0x0, 0xB, 0x0, 0xD8, 0x97, 0x0, 0xB, 0x0, 0xE0, 0x97, 0x0, 0xB, 0x0, 0xE8, 0x97, 0x0, 0xB, 0x0, 0xF0, 0x97, 0x0, 0xB, 0x0, 0xF8, 0x97, 0x0, 0xB, 0x0, 0x0, 0x98, 0x0, 0xB, 0x0, 0x8, 0x98, 0x0, 0xB, 0x0, 0x10, 0x98, 0x0, 0xB, 0x0, 0x18, 0x98, 0x0, 0xB, 0x0, 0x20, 0x98, 0x0, 0xB, 0x0, 0x28, 0x98, 0x0, 0xB, 0x0, 0x30, 0x98, 0x0, 0xB, 0x0, 0x38, 0x98, 0x0, 0xB, 0x0, 0x40, 0x98, 0x0, 0xB, 0x0, 0x48, 0x98, 0x0, 0xB, 0x0, 0x50, 0x98, 0x0, 0xB, 0x0, 0x58, 0x98, 0x0, 0xB, 0x0, 0x60, 0x98, 0x0, 0xB, 0x0, 0x68, 0x98, 0x0, 0xB, 0x0, 0x70, 0x98, 0x0, 0xB, 0x0, 0x78, 0x98, 0x0, 0xB, 0x0, 0x80, 0x98, 0x0, 0xB, 0x0, 0x88, 0x98, 0x0, 0xB, 0x0, 0x90, 0x98, 0x0, 0xB, 0x0, 0x98, 0x98, 0x0, 0xB, 0x0, 0xA0, 0x98, 0x0, 0xB, 0x0, 0xA8, 0x98, 0x0, 0xB, 0x0, 0xB0, 0x98, 0x0, 0xB, 0x0, 0xB8, 0x98, 0x0, 0xB, 0x0, 0xC0, 0x98, 0x0, 0xB, 0x0, 0xC8, 0x98, 0x0, 0xB, 0x0, 0xD0, 0x98, 0x0, 0xB, 0x0, 0xD8, 0x98, 0x0, 0xB, 0x0, 0xE0, 0x98, 0x0, 0xB, 0x0, 0xE8, 0x98, 0x0, 0xB, 0x0, 0xF0, 0x98, 0x0, 0xB, 0x0, 0xF8, 0x98, 0x0, 0xB, 0x0, 0x0, 0x99, 0x0, 0xB, 0x0, 0x8, 0x99, 0x0, 0xB, 0x0, 0x10, 0x99, 0x0, 0xB, 0x0, 0x18, 0x99, 0x0, 0xB, 0x0, 0x20, 0x99, 0x0, 0xB, 0x0, 0x28, 0x99, 0x0, 0xB, 0x0, 0x30, 0x99, 0x0, 0xB, 0x0, 0x38, 0x99, 0x0, 0xB, 0x0, 0x40, 0x99, 0x0, 0xB, 0x0, 0x48, 0x99, 0x0, 0xB, 0x0, 0x50, 0x99, 0x0, 0xB, 0x0, 0x58, 0x99, 0x0, 0xB, 0x0, 0x60, 0x99, 0x0, 0xB, 0x0, 0x68, 0x99, 0x0, 0xB, 0x0, 0x70, 0x99, 0x0, 0xB, 0x0, 0x78, 0x99, 0x0, 0xB, 0x0, 0x80, 0x99, 0x0, 0xB, 0x0, 0x88, 0x99, 0x0, 0xB, 0x0, 0x90, 0x99, 0x0, 0xB, 0x0, 0x98, 0x99, 0x0, 0xB, 0x0, 0xA0, 0x99, 0x0, 0xB, 0x0, 0xA8, 0x99, 0x0, 0xB, 0x0, 0xB0, 0x99, 0x0, 0xB, 0x0, 0xB8, 0x99, 0x0, 0xB, 0x0, 0xC0, 0x99, 0x0, 0xB, 0x0, 0xC8, 0x99, 0x0, 0xB, 0x0, 0xD0, 0x99, 0x0, 0xB, 0x0, 0xD8, 0x99, 0x0, 0xB, 0x0, 0xE0, 0x99, 0x0, 0xB, 0x0, 0xE8, 0x99, 0x0, 0xB, 0x0, 0xF0, 0x99, 0x0, 0xB, 0x0, 0xF8, 0x99, 0x0, 0xB, 0x0, 0x0, 0x9A, 0x0, 0xB, 0x0, 0x8, 0x9A, 0x0, 0xB, 0x0, 0x10, 0x9A, 0x0, 0xB, 0x0, 0x18, 0x9A, 0x0, 0xB, 0x0, 0x20, 0x9A, 0x0, 0xB, 0x0, 0x28, 0x9A, 0x0, 0xB, 0x0, 0x30, 0x9A, 0x0, 0xB, 0x0, 0x38, 0x9A, 0x0, 0xB, 0x0, 0x40, 0x9A, 0x0, 0xB, 0x0, 0x48, 0x9A, 0x0, 0xB, 0x0, 0x50, 0x9A, 0x0, 0xB, 0x0, 0x58, 0x9A, 0x0, 0xB, 0x0, 0x60, 0x9A, 0x0, 0xB, 0x0, 0x68, 0x9A, 0x0, 0xB, 0x0, 0x70, 0x9A, 0x0, 0xB, 0x0, 0x78, 0x9A, 0x0, 0xB, 0x0, 0x80, 0x9A, 0x0, 0xB, 0x0, 0x88, 0x9A, 0x0, 0xB, 0x0, 0x90, 0x9A, 0x0, 0xB, 0x0, 0x98, 0x9A, 0x0, 0xB, 0x0, 0xA0, 0x9A, 0x0, 0xB, 0x0, 0xA8, 0x9A, 0x0, 0xB, 0x0, 0xB0, 0x9A, 0x0, 0xB, 0x0, 0xB8, 0x9A, 0x0, 0xB, 0x0, 0xC0, 0x9A, 0x0, 0xB, 0x0, 0xC8, 0x9A, 0x0, 0xB, 0x0, 0xD0, 0x9A, 0x0, 0xB, 0x0, 0xD8, 0x9A, 0x0, 0xB, 0x0, 0xE0, 0x9A, 0x0, 0xB, 0x0, 0xE8, 0x9A, 0x0, 0xB, 0x0, 0xF0, 0x9A, 0x0, 0xB, 0x0, 0xF8, 0x9A, 0x0, 0xB, 0x0, 0x0, 0x9B, 0x0, 0xB, 0x0, 0x8, 0x9B, 0x0, 0xB, 0x0, 0x10, 0x9B, 0x0, 0xB, 0x0, 0x18, 0x9B, 0x0, 0xB, 0x0, 0x20, 0x9B, 0x0, 0xB, 0x0, 0x28, 0x9B, 0x0, 0xB, 0x0, 0x30, 0x9B, 0x0, 0xB, 0x0, 0x38, 0x9B, 0x0, 0xB, 0x0, 0x40, 0x9B, 0x0, 0xB, 0x0, 0x48, 0x9B, 0x0, 0xB, 0x0, 0x50, 0x9B, 0x0, 0xB, 0x0, 0x58, 0x9B, 0x0, 0xB, 0x0, 0x60, 0x9B, 0x0, 0xB, 0x0, 0x68, 0x9B, 0x0, 0xB, 0x0, 0x70, 0x9B, 0x0, 0xB, 0x0, 0x78, 0x9B, 0x0, 0xB, 0x0, 0x80, 0x9B, 0x0, 0xB, 0x0, 0x88, 0x9B, 0x0, 0xB, 0x0, 0x90, 0x9B, 0x0, 0xB, 0x0, 0x98, 0x9B, 0x0, 0xB, 0x0, 0xA0, 0x9B, 0x0, 0xB, 0x0, 0xA8, 0x9B, 0x0, 0xB, 0x0, 0xB0, 0x9B, 0x0, 0xB, 0x0, 0xB8, 0x9B, 0x0, 0xB, 0x0, 0xC0, 0x9B, 0x0, 0xB, 0x0, 0xC8, 0x9B, 0x0, 0xB, 0x0, 0xD0, 0x9B, 0x0, 0xB, 0x0, 0xD8, 0x9B, 0x0, 0xB, 0x0, 0xE0, 0x9B, 0x0, 0xB, 0x0, 0xE8, 0x9B, 0x0, 0xB, 0x0, 0xF0, 0x9B, 0x0, 0xB, 0x0, 0xF8, 0x9B, 0x0, 0xB, 0x0, 0x0, 0x9C, 0x0, 0xB, 0x0, 0x8, 0x9C, 0x0, 0xB, 0x0, 0x10, 0x9C, 0x0, 0xB, 0x0, 0x18, 0x9C, 0x0, 0xB, 0x0, 0x20, 0x9C, 0x0, 0xB, 0x0, 0x28, 0x9C, 0x0, 0xB, 0x0, 0x30, 0x9C, 0x0, 0xB, 0x0, 0x38, 0x9C, 0x0, 0xB, 0x0, 0x40, 0x9C, 0x0, 0xB, 0x0, 0x48, 0x9C, 0x0, 0xB, 0x0, 0x50, 0x9C, 0x0, 0xB, 0x0, 0x58, 0x9C, 0x0, 0xB, 0x0, 0x60, 0x9C, 0x0, 0xB, 0x0, 0x68, 0x9C, 0x0, 0xB, 0x0, 0x70, 0x9C, 0x0, 0xB, 0x0, 0x78, 0x9C, 0x0, 0xB, 0x0, 0x80, 0x9C, 0x0, 0xB, 0x0, 0x88, 0x9C, 0x0, 0xB, 0x0, 0x90, 0x9C, 0x0, 0xB, 0x0, 0x98, 0x9C, 0x0, 0xB, 0x0, 0xA0, 0x9C, 0x0, 0xB, 0x0, 0xA8, 0x9C, 0x0, 0xB, 0x0, 0xB0, 0x9C, 0x0, 0xB, 0x0, 0xB8, 0x9C, 0x0, 0xB, 0x0, 0xC0, 0x9C, 0x0, 0xB, 0x0, 0xC8, 0x9C, 0x0, 0xB, 0x0, 0xD0, 0x9C, 0x0, 0xB, 0x0, 0xD8, 0x9C, 0x0, 0xB, 0x0, 0xE0, 0x9C, 0x0, 0xB, 0x0, 0xE8, 0x9C, 0x0, 0xB, 0x0, 0xF0, 0x9C, 0x0, 0xB, 0x0, 0xF8, 0x9C, 0x0, 0xB, 0x0, 0x0, 0x9D, 0x0, 0xB, 0x0, 0x8, 0x9D, 0x0, 0xB, 0x0, 0x10, 0x9D, 0x0, 0xB, 0x0, 0x18, 0x9D, 0x0, 0xB, 0x0, 0x20, 0x9D, 0x0, 0xB, 0x0, 0x28, 0x9D, 0x0, 0xB, 0x0, 0x30, 0x9D, 0x0, 0xB, 0x0, 0x38, 0x9D, 0x0, 0xB, 0x0, 0x40, 0x9D, 0x0, 0xB, 0x0, 0x48, 0x9D, 0x0, 0xB, 0x0, 0x50, 0x9D, 0x0, 0xB, 0x0, 0x58, 0x9D, 0x0, 0xB, 0x0, 0x60, 0x9D, 0x0, 0xB, 0x0, 0x68, 0x9D, 0x0, 0xB, 0x0, 0x70, 0x9D, 0x0, 0xB, 0x0, 0x78, 0x9D, 0x0, 0xB, 0x0, 0x80, 0x9D, 0x0, 0xB, 0x0, 0x88, 0x9D, 0x0, 0xB, 0x0, 0x90, 0x9D, 0x0, 0xB, 0x0, 0x98, 0x9D, 0x0, 0xB, 0x0, 0xA0, 0x9D, 0x0, 0xB, 0x0, 0xA8, 0x9D, 0x0, 0xB, 0x0, 0xB0, 0x9D, 0x0, 0xB, 0x0, 0xB8, 0x9D, 0x0, 0xB, 0x0, 0xC0, 0x9D, 0x0, 0xB, 0x0, 0xC8, 0x9D, 0x0, 0xB, 0x0, 0xD0, 0x9D, 0x0, 0xB, 0x0, 0xD8, 0x9D, 0x0, 0xB, 0x0, 0xE0, 0x9D, 0x0, 0xB, 0x0, 0xE8, 0x9D, 0x0, 0xB, 0x0, 0xF0, 0x9D, 0x0, 0xB, 0x0, 0xF8, 0x9D, 0x0, 0xB, 0x0, 0x0, 0x9E, 0x0, 0xB, 0x0, 0x8, 0x9E, 0x0, 0xB, 0x0, 0x10, 0x9E, 0x0, 0xB, 0x0, 0x18, 0x9E, 0x0, 0xB, 0x0, 0x20, 0x9E, 0x0, 0xB, 0x0, 0x28, 0x9E, 0x0, 0xB, 0x0, 0x30, 0x9E, 0x0, 0xB, 0x0, 0x38, 0x9E, 0x0, 0xB, 0x0, 0x40, 0x9E, 0x0, 0xB, 0x0, 0x48, 0x9E, 0x0, 0xB, 0x0, 0x50, 0x9E, 0x0, 0xB, 0x0, 0x58, 0x9E, 0x0, 0xB, 0x0, 0x60, 0x9E, 0x0, 0xB, 0x0, 0x68, 0x9E, 0x0, 0xB, 0x0, 0x70, 0x9E, 0x0, 0xB, 0x0, 0x78, 0x9E, 0x0, 0xB, 0x0, 0x80, 0x9E, 0x0, 0x2C, 0x7A, 0x2, 0x0, 0x0, 0x4C, 0x7A, 0x2, 0x0, 0x0, 0x6C, 0x7A, 0x2, 0x0, 0x0, 0x8C, 0x7A, 0x2, 0x0, 0x0, 0xAC, 0x7A, 0x2, 0x0, 0x0, 0xCC, 0x7A, 0x2, 0x0, 0x0, 0xEC, 0x7A, 0x2, 0x0, 0x0, 0xC, 0x7B, 0x2, 0x0, 0x0, 0x2C, 0x7B, 0x2, 0x0, 0x0, 0x4C, 0x7B, 0x2, 0x0, 0x0, 0x6C, 0x7B, 0x2, 0x0, 0x0, 0x8C, 0x7B, 0x2, 0x0, 0x0, 0xAC, 0x7B, 0x2, 0x0, 0x0, 0xCC, 0x7B, 0x2, 0x0, 0x0, 0xEC, 0x7B, 0x2, 0x0, 0x0, 0xC, 0x7C, 0x2, 0x0, 0x0, 0x2C, 0x7C, 0x2, 0x0, 0x0, 0x4C, 0x7C, 0x2, 0x0, 0x0, 0x6C, 0x7C, 0x2, 0x0, 0x0, 0x8C, 0x7C, 0x2, 0x0, 0x0, 0xAC, 0x7C, 0x2, 0x0, 0x0, 0xCC, 0x7C, 0x2, 0x0, 0x0, 0xEC, 0x7C, 0x2, 0x0, 0x0, 0xC, 0x7D, 0x2, 0x0, 0x0, 0x2C, 0x7D, 0x2, 0x0, 0x0, 0x4C, 0x7D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0x9F, 0x0, 0x8C, 0x7D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0x9F, 0x0, 0xCC, 0x7D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0x9F, 0x0, 0xC, 0x7E, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0x9F, 0x0, 0x4C, 0x7E, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0x9F, 0x0, 0x8C, 0x7E, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0x9F, 0x0, 0xCC, 0x7E, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0x9F, 0x0, 0xC, 0x7F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0x9F, 0x0, 0x4C, 0x7F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0x9F, 0x0, 0x8C, 0x7F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0x9F, 0x0, 0xCC, 0x7F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0x9F, 0x0, 0xC, 0x80, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA0, 0x0, 0x4C, 0x80, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA0, 0x0, 0x8C, 0x80, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA0, 0x0, 0xCC, 0x80, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA0, 0x0, 0xC, 0x81, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA0, 0x0, 0x4C, 0x81, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA0, 0x0, 0x8C, 0x81, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0xA0, 0x0, 0xCC, 0x81, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0xA0, 0x0, 0xC, 0x82, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA0, 0x0, 0x4C, 0x82, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0xA0, 0x0, 0x8C, 0x82, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0xA0, 0x0, 0xCC, 0x82, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0xA0, 0x0, 0xC, 0x83, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0xA0, 0x0, 0x4C, 0x83, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0xA0, 0x0, 0x8C, 0x83, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0xA0, 0x0, 0xCC, 0x83, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0xA0, 0x0, 0xC, 0x84, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA1, 0x0, 0x4C, 0x84, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA1, 0x0, 0x8C, 0x84, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA1, 0x0, 0xCC, 0x84, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA1, 0x0, 0xC, 0x85, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA1, 0x0, 0x4C, 0x85, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA1, 0x0, 0x8C, 0x85, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0xA1, 0x0, 0xCC, 0x85, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0xA1, 0x0, 0xC, 0x86, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA1, 0x0, 0x4C, 0x86, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0xA1, 0x0, 0x8C, 0x86, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0xA1, 0x0, 0xCC, 0x86, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0xA1, 0x0, 0xC, 0x87, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0xA1, 0x0, 0x4C, 0x87, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0xA1, 0x0, 0x8C, 0x87, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0xA1, 0x0, 0xCC, 0x87, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0xA1, 0x0, 0xC, 0x88, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA2, 0x0, 0x4C, 0x88, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA2, 0x0, 0x8C, 0x88, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA2, 0x0, 0xCC, 0x88, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA2, 0x0, 0xC, 0x89, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA2, 0x0, 0x4C, 0x89, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA2, 0x0, 0x8C, 0x89, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0xA2, 0x0, 0xCC, 0x89, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0xA2, 0x0, 0xC, 0x8A, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA2, 0x0, 0x4C, 0x8A, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0xA2, 0x0, 0x8C, 0x8A, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0xA2, 0x0, 0xCC, 0x8A, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0xA2, 0x0, 0xC, 0x8B, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0xA2, 0x0, 0x4C, 0x8B, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0xA2, 0x0, 0x8C, 0x8B, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0xA2, 0x0, 0xCC, 0x8B, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0xA2, 0x0, 0xC, 0x8C, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA3, 0x0, 0x4C, 0x8C, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA3, 0x0, 0x8C, 0x8C, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA3, 0x0, 0xCC, 0x8C, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA3, 0x0, 0xC, 0x8D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA3, 0x0, 0x4C, 0x8D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA3, 0x0, 0x8C, 0x8D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0xA3, 0x0, 0xCC, 0x8D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0xA3, 0x0, 0xC, 0x8E, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA3, 0x0, 0x4C, 0x8E, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0xA3, 0x0, 0x8C, 0x8E, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0xA3, 0x0, 0xCC, 0x8E, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0xA3, 0x0, 0xC, 0x8F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0xA3, 0x0, 0x4C, 0x8F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0xA3, 0x0, 0x8C, 0x8F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0xA3, 0x0, 0xCC, 0x8F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0xA3, 0x0, 0xC, 0x90, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA4, 0x0, 0x4C, 0x90, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA4, 0x0, 0x8C, 0x90, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA4, 0x0, 0xCC, 0x90, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA4, 0x0, 0xC, 0x91, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA4, 0x0, 0x4C, 0x91, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA4, 0x0, 0xC, 0x0, 0x60, 0xA4, 0x0, 0xC, 0x0, 0x68, 0xA4, 0x0, 0xC, 0x0, 0x70, 0xA4, 0x0, 0xC, 0x0, 0x78, 0xA4, 0x0, 0xC, 0x92, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA4, 0x0, 0xC, 0x0, 0x90, 0xA4, 0x0, 0xC, 0x0, 0x98, 0xA4, 0x0, 0xC, 0x0, 0xA0, 0xA4, 0x0, 0xC, 0x0, 0xA8, 0xA4, 0x0, 0xC, 0x0, 0xB0, 0xA4, 0x0, 0xC, 0x0, 0xB8, 0xA4, 0x0, 0xC, 0x0, 0xC0, 0xA4, 0x0, 0xC, 0x0, 0xC8, 0xA4, 0x0, 0xC, 0x0, 0xD0, 0xA4, 0x0, 0xC, 0x0, 0xD8, 0xA4, 0x0, 0xC, 0x0, 0xE0, 0xA4, 0x0, 0xC, 0x0, 0xE8, 0xA4, 0x0, 0xC, 0x0, 0xF0, 0xA4, 0x0, 0xC, 0x0, 0xF8, 0xA4, 0x0, 0xC, 0x0, 0x0, 0xA5, 0x0, 0xC, 0x0, 0x8, 0xA5, 0x0, 0xC, 0x0, 0x10, 0xA5, 0x0, 0xC, 0x0, 0x18, 0xA5, 0x0, 0xC, 0x0, 0x20, 0xA5, 0x0, 0xC, 0x0, 0x28, 0xA5, 0x0, 0xC, 0x0, 0x30, 0xA5, 0x0, 0xC, 0x0, 0x38, 0xA5, 0x0, 0xC, 0x0, 0x40, 0xA5, 0x0, 0xC, 0x0, 0x48, 0xA5, 0x0, 0xC, 0x0, 0x50, 0xA5, 0x0, 0xC, 0x0, 0x58, 0xA5, 0x0, 0xC, 0x0, 0x60, 0xA5, 0x0, 0xC, 0x0, 0x68, 0xA5, 0x0, 0xC, 0x0, 0x70, 0xA5, 0x0, 0xC, 0x0, 0x78, 0xA5, 0x0, 0xC, 0x0, 0x80, 0xA5, 0x0, 0xC, 0x0, 0x88, 0xA5, 0x0, 0xC, 0x0, 0x90, 0xA5, 0x0, 0xC, 0x0, 0x98, 0xA5, 0x0, 0xC, 0x0, 0xA0, 0xA5, 0x0, 0xC, 0x0, 0xA8, 0xA5, 0x0, 0xC, 0x0, 0xB0, 0xA5, 0x0, 0xC, 0x0, 0xB8, 0xA5, 0x0, 0xC, 0x0, 0xC0, 0xA5, 0x0, 0xC, 0x0, 0xC8, 0xA5, 0x0, 0xC, 0x0, 0xD0, 0xA5, 0x0, 0xC, 0x0, 0xD8, 0xA5, 0x0, 0xC, 0x0, 0xE0, 0xA5, 0x0, 0xC, 0x0, 0xE8, 0xA5, 0x0, 0xC, 0x0, 0xF0, 0xA5, 0x0, 0xC, 0x0, 0xF8, 0xA5, 0x0, 0xC, 0x98, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA6, 0x0, 0xC, 0x0, 0x10, 0xA6, 0x0, 0xC, 0x0, 0x18, 0xA6, 0x0, 0xC, 0x0, 0x20, 0xA6, 0x0, 0xC, 0x0, 0x28, 0xA6, 0x0, 0xC, 0x0, 0x30, 0xA6, 0x0, 0xC, 0x0, 0x38, 0xA6, 0x0, 0xC, 0x0, 0x40, 0xA6, 0x0, 0xC, 0x0, 0x48, 0xA6, 0x0, 0xC, 0x0, 0x50, 0xA6, 0x0, 0xC, 0x0, 0x58, 0xA6, 0x0, 0xC, 0x0, 0x60, 0xA6, 0x0, 0xC, 0x0, 0x68, 0xA6, 0x0, 0xC, 0x0, 0x70, 0xA6, 0x0, 0xC, 0x0, 0x78, 0xA6, 0x0, 0xC, 0x0, 0x80, 0xA6, 0x0, 0xC, 0x0, 0x88, 0xA6, 0x0, 0xC, 0x0, 0x90, 0xA6, 0x0, 0xC, 0x0, 0x98, 0xA6, 0x0, 0xC, 0x0, 0xA0, 0xA6, 0x0, 0xC, 0x0, 0xA8, 0xA6, 0x0, 0xC, 0x0, 0xB0, 0xA6, 0x0, 0xC, 0x0, 0xB8, 0xA6, 0x0, 0xC, 0x0, 0xC0, 0xA6, 0x0, 0xC, 0x0, 0xC8, 0xA6, 0x0, 0xC, 0x0, 0xD0, 0xA6, 0x0, 0xC, 0x0, 0xD8, 0xA6, 0x0, 0xC, 0x0, 0xE0, 0xA6, 0x0, 0xC, 0x0, 0xE8, 0xA6, 0x0, 0xC, 0x0, 0xF0, 0xA6, 0x0, 0xC, 0x0, 0xF8, 0xA6, 0x0, 0xC, 0x0, 0x0, 0xA7, 0x0, 0xC, 0x0, 0x8, 0xA7, 0x0, 0xC, 0x0, 0x10, 0xA7, 0x0, 0xC, 0x0, 0x18, 0xA7, 0x0, 0xC, 0x0, 0x20, 0xA7, 0x0, 0xC, 0x0, 0x28, 0xA7, 0x0, 0xC, 0x0, 0x30, 0xA7, 0x0, 0xC, 0x0, 0x38, 0xA7, 0x0, 0xC, 0x0, 0x40, 0xA7, 0x0, 0xC, 0x0, 0x48, 0xA7, 0x0, 0xC, 0x0, 0x50, 0xA7, 0x0, 0xC, 0x0, 0x58, 0xA7, 0x0, 0xC, 0x0, 0x60, 0xA7, 0x0, 0xC, 0x0, 0x68, 0xA7, 0x0, 0xC, 0x0, 0x70, 0xA7, 0x0, 0xC, 0x0, 0x78, 0xA7, 0x0, 0xC, 0x0, 0x80, 0xA7, 0x0, 0xC, 0x0, 0x88, 0xA7, 0x0, 0xC, 0x0, 0x90, 0xA7, 0x0, 0xC, 0x0, 0x98, 0xA7, 0x0, 0xC, 0x0, 0xA0, 0xA7, 0x0, 0xC, 0x0, 0xA8, 0xA7, 0x0, 0xC, 0x0, 0xB0, 0xA7, 0x0, 0xC, 0x0, 0xB8, 0xA7, 0x0, 0xC, 0x0, 0xC0, 0xA7, 0x0, 0xC, 0x0, 0xC8, 0xA7, 0x0, 0xC, 0x0, 0xD0, 0xA7, 0x0, 0xC, 0x0, 0xD8, 0xA7, 0x0, 0xC, 0x0, 0xE0, 0xA7, 0x0, 0xC, 0x0, 0xE8, 0xA7, 0x0, 0xC, 0x0, 0xF0, 0xA7, 0x0, 0xC, 0x0, 0xF8, 0xA7, 0x0, 0xC, 0x0, 0x0, 0xA8, 0x0, 0xC, 0x0, 0x8, 0xA8, 0x0, 0xC, 0x0, 0x10, 0xA8, 0x0, 0xC, 0x0, 0x18, 0xA8, 0x0, 0xC, 0x0, 0x20, 0xA8, 0x0, 0xC, 0x0, 0x28, 0xA8, 0x0, 0xC, 0x0, 0x30, 0xA8, 0x0, 0xC, 0x0, 0x38, 0xA8, 0x0, 0xC, 0x0, 0x40, 0xA8, 0x0, 0xC, 0x0, 0x48, 0xA8, 0x0, 0xC, 0x0, 0x50, 0xA8, 0x0, 0xC, 0x0, 0x58, 0xA8, 0x0, 0xC, 0x0, 0x60, 0xA8, 0x0, 0xC, 0x0, 0x68, 0xA8, 0x0, 0xC, 0x0, 0x70, 0xA8, 0x0, 0xEC, 0xA1, 0x2, 0x0, 0x0, 0xC, 0x0, 0x80, 0xA8, 0x0, 0x2C, 0xA2, 0x2, 0x0, 0x0, 0xC, 0x0, 0x90, 0xA8, 0x0, 0x6C, 0xA2, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA0, 0xA8, 0x0, 0xAC, 0xA2, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB0, 0xA8, 0x0, 0xEC, 0xA2, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC0, 0xA8, 0x0, 0x2C, 0xA3, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD0, 0xA8, 0x0, 0x6C, 0xA3, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE0, 0xA8, 0x0, 0xAC, 0xA3, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF0, 0xA8, 0x0, 0xEC, 0xA3, 0x2, 0x0, 0x0, 0xC, 0x0, 0x0, 0xA9, 0x0, 0x2C, 0xA4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x10, 0xA9, 0x0, 0x6C, 0xA4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x20, 0xA9, 0x0, 0xAC, 0xA4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x30, 0xA9, 0x0, 0xEC, 0xA4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x40, 0xA9, 0x0, 0x2C, 0xA5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x50, 0xA9, 0x0, 0x6C, 0xA5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x60, 0xA9, 0x0, 0xAC, 0xA5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x70, 0xA9, 0x0, 0xEC, 0xA5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x80, 0xA9, 0x0, 0x2C, 0xA6, 0x2, 0x0, 0x0, 0xC, 0x0, 0x90, 0xA9, 0x0, 0x6C, 0xA6, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA0, 0xA9, 0x0, 0xAC, 0xA6, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB0, 0xA9, 0x0, 0xEC, 0xA6, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC0, 0xA9, 0x0, 0x2C, 0xA7, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD0, 0xA9, 0x0, 0x6C, 0xA7, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE0, 0xA9, 0x0, 0xAC, 0xA7, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF0, 0xA9, 0x0, 0xEC, 0xA7, 0x2, 0x0, 0x0, 0xC, 0x0, 0x0, 0xAA, 0x0, 0x2C, 0xA8, 0x2, 0x0, 0x0, 0xC, 0x0, 0x10, 0xAA, 0x0, 0x6C, 0xA8, 0x2, 0x0, 0x0, 0xC, 0x0, 0x20, 0xAA, 0x0, 0xAC, 0xA8, 0x2, 0x0, 0x0, 0xC, 0x0, 0x30, 0xAA, 0x0, 0xEC, 0xA8, 0x2, 0x0, 0x0, 0xC, 0x0, 0x40, 0xAA, 0x0, 0x2C, 0xA9, 0x2, 0x0, 0x0, 0xC, 0x0, 0x50, 0xAA, 0x0, 0x6C, 0xA9, 0x2, 0x0, 0x0, 0xC, 0x0, 0x60, 0xAA, 0x0, 0xAC, 0xA9, 0x2, 0x0, 0x0, 0xC, 0x0, 0x70, 0xAA, 0x0, 0xEC, 0xA9, 0x2, 0x0, 0x0, 0xC, 0x0, 0x80, 0xAA, 0x0, 0x2C, 0xAA, 0x2, 0x0, 0x0, 0xC, 0x0, 0x90, 0xAA, 0x0, 0x6C, 0xAA, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA0, 0xAA, 0x0, 0xAC, 0xAA, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB0, 0xAA, 0x0, 0xEC, 0xAA, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC0, 0xAA, 0x0, 0x2C, 0xAB, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD0, 0xAA, 0x0, 0x6C, 0xAB, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE0, 0xAA, 0x0, 0xAC, 0xAB, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF0, 0xAA, 0x0, 0xC, 0x0, 0xF8, 0xAA, 0x0, 0xC, 0x0, 0x0, 0xAB, 0x0, 0xC, 0x0, 0x8, 0xAB, 0x0, 0xC, 0x0, 0x10, 0xAB, 0x0, 0xC, 0x0, 0x18, 0xAB, 0x0, 0xC, 0x0, 0x20, 0xAB, 0x0, 0xC, 0x0, 0x28, 0xAB, 0x0, 0xC, 0x0, 0x30, 0xAB, 0x0, 0xC, 0x0, 0x38, 0xAB, 0x0, 0xC, 0x0, 0x40, 0xAB, 0x0, 0xC, 0x0, 0x48, 0xAB, 0x0, 0xC, 0x0, 0x50, 0xAB, 0x0, 0xC, 0x0, 0x58, 0xAB, 0x0, 0xC, 0x0, 0x60, 0xAB, 0x0, 0xC, 0x0, 0x68, 0xAB, 0x0, 0xC, 0x0, 0x70, 0xAB, 0x0, 0xC, 0x0, 0x78, 0xAB, 0x0, 0xC, 0x0, 0x80, 0xAB, 0x0, 0xC, 0x0, 0x88, 0xAB, 0x0, 0xC, 0x0, 0x90, 0xAB, 0x0, 0xC, 0x0, 0x98, 0xAB, 0x0, 0xC, 0x0, 0xA0, 0xAB, 0x0, 0xC, 0x0, 0xA8, 0xAB, 0x0, 0xC, 0x0, 0xB0, 0xAB, 0x0, 0xC, 0x0, 0xB8, 0xAB, 0x0, 0xC, 0x0, 0xC0, 0xAB, 0x0, 0xC, 0x0, 0xC8, 0xAB, 0x0, 0xC, 0x0, 0xD0, 0xAB, 0x0, 0xC, 0x0, 0xD8, 0xAB, 0x0, 0xC, 0x0, 0xE0, 0xAB, 0x0, 0xC, 0x0, 0xE8, 0xAB, 0x0, 0xC, 0x0, 0xF0, 0xAB, 0x0, 0xC, 0x0, 0xF8, 0xAB, 0x0, 0xC, 0x0, 0x0, 0xAC, 0x0, 0xC, 0x0, 0x8, 0xAC, 0x0, 0xC, 0x0, 0x10, 0xAC, 0x0, 0xC, 0x0, 0x18, 0xAC, 0x0, 0xC, 0x0, 0x20, 0xAC, 0x0, 0xC, 0x0, 0x28, 0xAC, 0x0, 0xC, 0x0, 0x30, 0xAC, 0x0, 0xC, 0x0, 0x38, 0xAC, 0x0, 0xC, 0x0, 0x40, 0xAC, 0x0, 0xC, 0x0, 0x48, 0xAC, 0x0, 0xC, 0x0, 0x50, 0xAC, 0x0, 0xC, 0x0, 0x58, 0xAC, 0x0, 0xC, 0x0, 0x60, 0xAC, 0x0, 0xC, 0x0, 0x68, 0xAC, 0x0, 0xC, 0x0, 0x70, 0xAC, 0x0, 0xC, 0x0, 0x78, 0xAC, 0x0, 0xC, 0x0, 0x80, 0xAC, 0x0, 0xC, 0x0, 0x88, 0xAC, 0x0, 0xC, 0x0, 0x90, 0xAC, 0x0, 0xC, 0x0, 0x98, 0xAC, 0x0, 0xC, 0x0, 0xA0, 0xAC, 0x0, 0xC, 0x0, 0xA8, 0xAC, 0x0, 0xC, 0x0, 0xB0, 0xAC, 0x0, 0xC, 0x0, 0xB8, 0xAC, 0x0, 0xC, 0x0, 0xC0, 0xAC, 0x0, 0xC, 0x0, 0xC8, 0xAC, 0x0, 0xC, 0x0, 0xD0, 0xAC, 0x0, 0xC, 0x0, 0xD8, 0xAC, 0x0, 0xC, 0x0, 0xE0, 0xAC, 0x0, 0xC, 0x0, 0xE8, 0xAC, 0x0, 0xC, 0x0, 0xF0, 0xAC, 0x0, 0xC, 0x0, 0xF8, 0xAC, 0x0, 0xC, 0x0, 0x0, 0xAD, 0x0, 0xC, 0x0, 0x8, 0xAD, 0x0, 0xC, 0x0, 0x10, 0xAD, 0x0, 0xC, 0x0, 0x18, 0xAD, 0x0, 0xC, 0x0, 0x20, 0xAD, 0x0, 0xC, 0x0, 0x28, 0xAD, 0x0, 0xC, 0x0, 0x30, 0xAD, 0x0, 0xC, 0x0, 0x38, 0xAD, 0x0, 0xC, 0x0, 0x40, 0xAD, 0x0, 0xC, 0x0, 0x48, 0xAD, 0x0, 0xC, 0x0, 0x50, 0xAD, 0x0, 0x6C, 0xB5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x60, 0xAD, 0x0, 0xC, 0x0, 0x68, 0xAD, 0x0, 0xC, 0x0, 0x70, 0xAD, 0x0, 0xC, 0x0, 0x78, 0xAD, 0x0, 0xC, 0x0, 0x80, 0xAD, 0x0, 0xC, 0x0, 0x88, 0xAD, 0x0, 0xC, 0x0, 0x90, 0xAD, 0x0, 0xC, 0x0, 0x98, 0xAD, 0x0, 0xC, 0x0, 0xA0, 0xAD, 0x0, 0xC, 0x0, 0xA8, 0xAD, 0x0, 0xC, 0x0, 0xB0, 0xAD, 0x0, 0xC, 0x0, 0xB8, 0xAD, 0x0, 0xC, 0x0, 0xC0, 0xAD, 0x0, 0xC, 0x0, 0xC8, 0xAD, 0x0, 0xC, 0x0, 0xD0, 0xAD, 0x0, 0xC, 0x0, 0xD8, 0xAD, 0x0, 0xC, 0x0, 0xE0, 0xAD, 0x0, 0xC, 0x0, 0xE8, 0xAD, 0x0, 0xC, 0x0, 0xF0, 0xAD, 0x0, 0xC, 0x0, 0xF8, 0xAD, 0x0, 0xC, 0x0, 0x0, 0xAE, 0x0, 0xC, 0x0, 0x8, 0xAE, 0x0, 0xC, 0x0, 0x10, 0xAE, 0x0, 0xC, 0x0, 0x18, 0xAE, 0x0, 0xC, 0x0, 0x20, 0xAE, 0x0, 0xC, 0x0, 0x28, 0xAE, 0x0, 0xC, 0x0, 0x30, 0xAE, 0x0, 0xC, 0x0, 0x38, 0xAE, 0x0, 0xC, 0x0, 0x40, 0xAE, 0x0, 0xC, 0x0, 0x48, 0xAE, 0x0, 0xC, 0x0, 0x50, 0xAE, 0x0, 0xC, 0x0, 0x58, 0xAE, 0x0, 0xC, 0x0, 0x60, 0xAE, 0x0, 0xC, 0x0, 0x68, 0xAE, 0x0, 0xC, 0x0, 0x70, 0xAE, 0x0, 0xC, 0x0, 0x78, 0xAE, 0x0, 0xC, 0x0, 0x80, 0xAE, 0x0, 0xC, 0x0, 0x88, 0xAE, 0x0, 0xC, 0x0, 0x90, 0xAE, 0x0, 0xC, 0x0, 0x98, 0xAE, 0x0, 0xC, 0x0, 0xA0, 0xAE, 0x0, 0xC, 0x0, 0xA8, 0xAE, 0x0, 0xC, 0x0, 0xB0, 0xAE, 0x0, 0xC, 0x0, 0xB8, 0xAE, 0x0, 0xC, 0x0, 0xC0, 0xAE, 0x0, 0xC, 0x0, 0xC8, 0xAE, 0x0, 0xC, 0x0, 0xD0, 0xAE, 0x0, 0xC, 0x0, 0xD8, 0xAE, 0x0, 0xC, 0x0, 0xE0, 0xAE, 0x0, 0xC, 0x0, 0xE8, 0xAE, 0x0, 0xC, 0x0, 0xF0, 0xAE, 0x0, 0xC, 0x0, 0xF8, 0xAE, 0x0, 0xC, 0x0, 0x0, 0xAF, 0x0, 0xC, 0x0, 0x8, 0xAF, 0x0, 0xC, 0x0, 0x10, 0xAF, 0x0, 0xC, 0x0, 0x18, 0xAF, 0x0, 0xC, 0x0, 0x20, 0xAF, 0x0, 0xC, 0x0, 0x28, 0xAF, 0x0, 0xC, 0x0, 0x30, 0xAF, 0x0, 0xC, 0x0, 0x38, 0xAF, 0x0, 0xC, 0x0, 0x40, 0xAF, 0x0, 0xC, 0x0, 0x48, 0xAF, 0x0, 0xC, 0x0, 0x50, 0xAF, 0x0, 0xC, 0x0, 0x58, 0xAF, 0x0, 0xC, 0x0, 0x60, 0xAF, 0x0, 0xC, 0x0, 0x68, 0xAF, 0x0, 0xC, 0x0, 0x70, 0xAF, 0x0, 0xC, 0x0, 0x78, 0xAF, 0x0, 0xC, 0x0, 0x80, 0xAF, 0x0, 0xC, 0x0, 0x88, 0xAF, 0x0, 0xC, 0x0, 0x90, 0xAF, 0x0, 0xC, 0x0, 0x98, 0xAF, 0x0, 0xC, 0x0, 0xA0, 0xAF, 0x0, 0xC, 0x0, 0xA8, 0xAF, 0x0, 0xC, 0x0, 0xB0, 0xAF, 0x0, 0xC, 0x0, 0xB8, 0xAF, 0x0, 0xC, 0x0, 0xC0, 0xAF, 0x0, 0xC, 0x0, 0xC8, 0xAF, 0x0, 0xC, 0x0, 0xD0, 0xAF, 0x0, 0xC, 0x0, 0xD8, 0xAF, 0x0, 0xC, 0x0, 0xE0, 0xAF, 0x0, 0xC, 0x0, 0xE8, 0xAF, 0x0, 0xC, 0x0, 0xF0, 0xAF, 0x0, 0xC, 0x0, 0xF8, 0xAF, 0x0, 0xC, 0x0, 0x0, 0xB0, 0x0, 0xC, 0x0, 0x8, 0xB0, 0x0, 0xC, 0x0, 0x10, 0xB0, 0x0, 0xC, 0x0, 0x18, 0xB0, 0x0, 0xC, 0x0, 0x20, 0xB0, 0x0, 0xC, 0x0, 0x28, 0xB0, 0x0, 0xC, 0x0, 0x30, 0xB0, 0x0, 0xC, 0x0, 0x38, 0xB0, 0x0, 0xC, 0x0, 0x40, 0xB0, 0x0, 0xC, 0x0, 0x48, 0xB0, 0x0, 0xC, 0x0, 0x50, 0xB0, 0x0, 0xC, 0x0, 0x58, 0xB0, 0x0, 0xC, 0x0, 0x60, 0xB0, 0x0, 0xC, 0x0, 0x68, 0xB0, 0x0, 0xC, 0x0, 0x70, 0xB0, 0x0, 0xC, 0x0, 0x78, 0xB0, 0x0, 0xC, 0xC2, 0x2, 0x0, 0x0, 0x2C, 0xC2, 0x2, 0x0, 0x0, 0x4C, 0xC2, 0x2, 0x0, 0x0, 0x6C, 0xC2, 0x2, 0x0, 0x0, 0x8C, 0xC2, 0x2, 0x0, 0x0, 0xAC, 0xC2, 0x2, 0x0, 0x0, 0xCC, 0xC2, 0x2, 0x0, 0x0, 0xEC, 0xC2, 0x2, 0x0, 0x0, 0xC, 0xC3, 0x2, 0x0, 0x0, 0x2C, 0xC3, 0x2, 0x0, 0x0, 0x4C, 0xC3, 0x2, 0x0, 0x0, 0x6C, 0xC3, 0x2, 0x0, 0x0, 0x8C, 0xC3, 0x2, 0x0, 0x0, 0xAC, 0xC3, 0x2, 0x0, 0x0, 0xCC, 0xC3, 0x2, 0x0, 0x0, 0xEC, 0xC3, 0x2, 0x0, 0x0, 0xC, 0xC4, 0x2, 0x0, 0x0, 0x2C, 0xC4, 0x2, 0x0, 0x0, 0x4C, 0xC4, 0x2, 0x0, 0x0, 0x6C, 0xC4, 0x2, 0x0, 0x0, 0x8C, 0xC4, 0x2, 0x0, 0x0, 0xAC, 0xC4, 0x2, 0x0, 0x0, 0xCC, 0xC4, 0x2, 0x0, 0x0, 0xEC, 0xC4, 0x2, 0x0, 0x0, 0xC, 0xC5, 0x2, 0x0, 0x0, 0x2C, 0xC5, 0x2, 0x0, 0x0, 0x4C, 0xC5, 0x2, 0x0, 0x0, 0x6C, 0xC5, 0x2, 0x0, 0x0, 0x8C, 0xC5, 0x2, 0x0, 0x0, 0xAC, 0xC5, 0x2, 0x0, 0x0, 0xCC, 0xC5, 0x2, 0x0, 0x0, 0xEC, 0xC5, 0x2, 0x0, 0x0, 0xC, 0xC6, 0x2, 0x0, 0x0, 0x2C, 0xC6, 0x2, 0x0, 0x0, 0x4C, 0xC6, 0x2, 0x0, 0x0, 0x6C, 0xC6, 0x2, 0x0, 0x0, 0x8C, 0xC6, 0x2, 0x0, 0x0, 0xAC, 0xC6, 0x2, 0x0, 0x0, 0xCC, 0xC6, 0x2, 0x0, 0x0, 0xEC, 0xC6, 0x2, 0x0, 0x0, 0xC, 0xC7, 0x2, 0x0, 0x0, 0x2C, 0xC7, 0x2, 0x0, 0x0, 0x4C, 0xC7, 0x2, 0x0, 0x0, 0x6C, 0xC7, 0x2, 0x0, 0x0, 0x8C, 0xC7, 0x2, 0x0, 0x0, 0xAC, 0xC7, 0x2, 0x0, 0x0, 0xCC, 0xC7, 0x2, 0x0, 0x0, 0xEC, 0xC7, 0x2, 0x0, 0x0, 0xC, 0xC8, 0x2, 0x0, 0x0, 0x2C, 0xC8, 0x2, 0x0, 0x0, 0x4C, 0xC8, 0x2, 0x0, 0x0, 0x6C, 0xC8, 0x2, 0x0, 0x0, 0x8C, 0xC8, 0x2, 0x0, 0x0, 0xAC, 0xC8, 0x2, 0x0, 0x0, 0xCC, 0xC8, 0x2, 0x0, 0x0, 0xEC, 0xC8, 0x2, 0x0, 0x0, 0xC, 0xC9, 0x2, 0x0, 0x0, 0x2C, 0xC9, 0x2, 0x0, 0x0, 0x4C, 0xC9, 0x2, 0x0, 0x0, 0x6C, 0xC9, 0x2, 0x0, 0x0, 0x8C, 0xC9, 0x2, 0x0, 0x0, 0xAC, 0xC9, 0x2, 0x0, 0x0, 0xCC, 0xC9, 0x2, 0x0, 0x0, 0xEC, 0xC9, 0x2, 0x0, 0x0, 0xC, 0xCA, 0x2, 0x0, 0x0, 0x2C, 0xCA, 0x2, 0x0, 0x0, 0x4C, 0xCA, 0x2, 0x0, 0x0, 0x6C, 0xCA, 0x2, 0x0, 0x0, 0x8C, 0xCA, 0x2, 0x0, 0x0, 0xAC, 0xCA, 0x2, 0x0, 0x0, 0xCC, 0xCA, 0x2, 0x0, 0x0, 0xEC, 0xCA, 0x2, 0x0, 0x0, 0xC, 0xCB, 0x2, 0x0, 0x0, 0x2C, 0xCB, 0x2, 0x0, 0x0, 0x4C, 0xCB, 0x2, 0x0, 0x0, 0x6C, 0xCB, 0x2, 0x0, 0x0, 0x8C, 0xCB, 0x2, 0x0, 0x0, 0xAC, 0xCB, 0x2, 0x0, 0x0, 0xCC, 0xCB, 0x2, 0x0, 0x0, 0xEC, 0xCB, 0x2, 0x0, 0x0, 0xC, 0xCC, 0x2, 0x0, 0x0, 0x2C, 0xCC, 0x2, 0x0, 0x0, 0x4C, 0xCC, 0x2, 0x0, 0x0, 0x6C, 0xCC, 0x2, 0x0, 0x0, 0x8C, 0xCC, 0x2, 0x0, 0x0, 0xAC, 0xCC, 0x2, 0x0, 0x0, 0xCC, 0xCC, 0x2, 0x0, 0x0, 0xEC, 0xCC, 0x2, 0x0, 0x0, 0xC, 0xCD, 0x2, 0x0, 0x0, 0x2C, 0xCD, 0x2, 0x0, 0x0, 0x4C, 0xCD, 0x2, 0x0, 0x0, 0x6C, 0xCD, 0x2, 0x0, 0x0, 0x8C, 0xCD, 0x2, 0x0, 0x0, 0xAC, 0xCD, 0x2, 0x0, 0x0, 0xCC, 0xCD, 0x2, 0x0, 0x0, 0xEC, 0xCD, 0x2, 0x0, 0x0, 0xC, 0xCE, 0x2, 0x0, 0x0, 0x2C, 0xCE, 0x2, 0x0, 0x0, 0x4C, 0xCE, 0x2, 0x0, 0x0, 0x6C, 0xCE, 0x2, 0x0, 0x0, 0x8C, 0xCE, 0x2, 0x0, 0x0, 0xAC, 0xCE, 0x2, 0x0, 0x0, 0xCC, 0xCE, 0x2, 0x0, 0x0, 0xEC, 0xCE, 0x2, 0x0, 0x0, 0xC, 0xCF, 0x2, 0x0, 0x0, 0x2C, 0xCF, 0x2, 0x0, 0x0, 0x4C, 0xCF, 0x2, 0x0, 0x0, 0x6C, 0xCF, 0x2, 0x0, 0x0, 0x8C, 0xCF, 0x2, 0x0, 0x0, 0xAC, 0xCF, 0x2, 0x0, 0x0, 0xCC, 0xCF, 0x2, 0x0, 0x0, 0xEC, 0xCF, 0x2, 0x0, 0x0, 0xC, 0xD0, 0x2, 0x0, 0x0, 0x2C, 0xD0, 0x2, 0x0, 0x0, 0x4C, 0xD0, 0x2, 0x0, 0x0, 0x6C, 0xD0, 0x2, 0x0, 0x0, 0x8C, 0xD0, 0x2, 0x0, 0x0, 0xAC, 0xD0, 0x2, 0x0, 0x0, 0xCC, 0xD0, 0x2, 0x0, 0x0, 0xEC, 0xD0, 0x2, 0x0, 0x0, 0xC, 0xD1, 0x2, 0x0, 0x0, 0x2C, 0xD1, 0x2, 0x0, 0x0, 0x4C, 0xD1, 0x2, 0x0, 0x0, 0x6C, 0xD1, 0x2, 0x0, 0x0, 0x8C, 0xD1, 0x2, 0x0, 0x0, 0xAC, 0xD1, 0x2, 0x0, 0x0, 0xCC, 0xD1, 0x2, 0x0, 0x0, 0xEC, 0xD1, 0x2, 0x0, 0x0, 0xC, 0xD2, 0x2, 0x0, 0x0, 0x2C, 0xD2, 0x2, 0x0, 0x0, 0x4C, 0xD2, 0x2, 0x0, 0x0, 0x6C, 0xD2, 0x2, 0x0, 0x0, 0x8C, 0xD2, 0x2, 0x0, 0x0, 0xAC, 0xD2, 0x2, 0x0, 0x0, 0xCC, 0xD2, 0x2, 0x0, 0x0, 0xEC, 0xD2, 0x2, 0x0, 0x0, 0xC, 0xD3, 0x2, 0x0, 0x0, 0x2C, 0xD3, 0x2, 0x0, 0x0, 0x4C, 0xD3, 0x2, 0x0, 0x0, 0x6C, 0xD3, 0x2, 0x0, 0x0, 0x8C, 0xD3, 0x2, 0x0, 0x0, 0xAC, 0xD3, 0x2, 0x0, 0x0, 0xCC, 0xD3, 0x2, 0x0, 0x0, 0xEC, 0xD3, 0x2, 0x0, 0x0, 0xC, 0xD4, 0xA, 0xB5, 0x0, 0x4C, 0xD4, 0x2, 0x0, 0x0, 0x6C, 0xD4, 0x2, 0x0, 0x0, 0x8C, 0xD4, 0x2, 0x0, 0x0, 0xAC, 0xD4, 0x2, 0x0, 0x0, 0xCC, 0xD4, 0x2, 0x0, 0x0, 0xEC, 0xD4, 0x2, 0x0, 0x0, 0xC, 0xD5, 0x2, 0x0, 0x0, 0x2C, 0xD5, 0x2, 0x0, 0x0, 0x4C, 0xD5, 0x2, 0x0, 0x0, 0x6C, 0xD5, 0x2, 0x0, 0x0, 0x8C, 0xD5, 0x2, 0x0, 0x0, 0xAC, 0xD5, 0x2, 0x0, 0x0, 0xCC, 0xD5, 0x2, 0x0, 0x0, 0xEC, 0xD5, 0x2, 0x0, 0x0, 0xC, 0xD6, 0x2, 0x0, 0x0, 0x2C, 0xD6, 0x2, 0x0, 0x0, 0x4C, 0xD6, 0x2, 0x0, 0x0, 0x6C, 0xD6, 0x2, 0x0, 0x0, 0x8C, 0xD6, 0x2, 0x0, 0x0, 0xAC, 0xD6, 0x2, 0x0, 0x0, 0xCC, 0xD6, 0x2, 0x0, 0x0, 0xEC, 0xD6, 0x2, 0x0, 0x0, 0xC, 0xD7, 0x2, 0x0, 0x0, 0x2C, 0xD7, 0x2, 0x0, 0x0, 0x4C, 0xD7, 0x2, 0x0, 0x0, 0x6C, 0xD7, 0x2, 0x0, 0x0, 0x8C, 0xD7, 0x2, 0x0, 0x0, 0xAC, 0xD7, 0x2, 0x0, 0x0, 0xCC, 0xD7, 0x2, 0x0, 0x0, 0xEC, 0xD7, 0x2, 0x0, 0x0, 0xC, 0xD8, 0x2, 0x0, 0x0, 0x2C, 0xD8, 0x2, 0x0, 0x0, 0x4C, 0xD8, 0x2, 0x0, 0x0, 0x6C, 0xD8, 0x2, 0x0, 0x0, 0x8C, 0xD8, 0x2, 0x0, 0x0, 0xAC, 0xD8, 0x2, 0x0, 0x0, 0xCC, 0xD8, 0x2, 0x0, 0x0, 0xEC, 0xD8, 0x2, 0x0, 0x0, 0xC, 0xD9, 0x2, 0x0, 0x0, 0x2C, 0xD9, 0x2, 0x0, 0x0, 0x4C, 0xD9, 0x2, 0x0, 0x0, 0x6C, 0xD9, 0x2, 0x0, 0x0, 0x8C, 0xD9, 0x2, 0x0, 0x0, 0xAC, 0xD9, 0x2, 0x0, 0x0, 0xCC, 0xD9, 0x2, 0x0, 0x0, 0xEC, 0xD9, 0x2, 0x0, 0x0, 0xC, 0xDA, 0x2, 0x0, 0x0, 0x2C, 0xDA, 0x2, 0x0, 0x0, 0x4C, 0xDA, 0x2, 0x0, 0x0, 0x6C, 0xDA, 0x2, 0x0, 0x0, 0x8C, 0xDA, 0x2, 0x0, 0x0, 0xAC, 0xDA, 0x2, 0x0, 0x0, 0xCC, 0xDA, 0x2, 0x0, 0x0, 0xEC, 0xDA, 0x2, 0x0, 0x0, 0xC, 0xDB, 0x2, 0x0, 0x0, 0x2C, 0xDB, 0x2, 0x0, 0x0, 0x4C, 0xDB, 0x2, 0x0, 0x0, 0x6C, 0xDB, 0x2, 0x0, 0x0, 0x8C, 0xDB, 0x2, 0x0, 0x0, 0xAC, 0xDB, 0x2, 0x0, 0x0, 0xCC, 0xDB, 0x2, 0x0, 0x0, 0xEC, 0xDB, 0x2, 0x0, 0x0, 0xC, 0xDC, 0x2, 0x0, 0x0, 0x2C, 0xDC, 0x2, 0x0, 0x0, 0x4C, 0xDC, 0x2, 0x0, 0x0, 0x6C, 0xDC, 0x2, 0x0, 0x0, 0x8C, 0xDC, 0x2, 0x0, 0x0, 0xAC, 0xDC, 0x2, 0x0, 0x0, 0xCC, 0xDC, 0x2, 0x0, 0x0, 0xEC, 0xDC, 0x2, 0x0, 0x0, 0xC, 0xDD, 0x2, 0x0, 0x0, 0x2C, 0xDD, 0x2, 0x0, 0x0, 0x4C, 0xDD, 0x2, 0x0, 0x0, 0x6C, 0xDD, 0x2, 0x0, 0x0, 0x8C, 0xDD, 0x2, 0x0, 0x0, 0xAC, 0xDD, 0x2, 0x0, 0x0, 0xCC, 0xDD, 0x2, 0x0, 0x0, 0xEC, 0xDD, 0x2, 0x0, 0x0, 0xC, 0xDE, 0x2, 0x0, 0x0, 0x2C, 0xDE, 0x2, 0x0, 0x0, 0x4C, 0xDE, 0x2, 0x0, 0x0, 0x6C, 0xDE, 0x2, 0x0, 0x0, 0x8C, 0xDE, 0x2, 0x0, 0x0, 0xAC, 0xDE, 0x2, 0x0, 0x0, 0xCC, 0xDE, 0x2, 0x0, 0x0, 0xEC, 0xDE, 0x2, 0x0, 0x0, 0xC, 0xDF, 0x2, 0x0, 0x0, 0x2C, 0xDF, 0x2, 0x0, 0x0, 0x4C, 0xDF, 0x2, 0x0, 0x0, 0x6C, 0xDF, 0x2, 0x0, 0x0, 0x8C, 0xDF, 0x2, 0x0, 0x0, 0xAC, 0xDF, 0x2, 0x0, 0x0, 0xCC, 0xDF, 0x2, 0x0, 0x0, 0xEC, 0xDF, 0x2, 0x0, 0x0, 0xC, 0xE0, 0x2, 0x0, 0x0, 0x2C, 0xE0, 0x2, 0x0, 0x0, 0x4C, 0xE0, 0x2, 0x0, 0x0, 0x6C, 0xE0, 0x2, 0x0, 0x0, 0x8C, 0xE0, 0x2, 0x0, 0x0, 0xAC, 0xE0, 0x2, 0x0, 0x0, 0xCC, 0xE0, 0x2, 0x0, 0x0, 0xEC, 0xE0, 0x2, 0x0, 0x0, 0xC, 0xE1, 0x2, 0x0, 0x0, 0x2C, 0xE1, 0x2, 0x0, 0x0, 0x4C, 0xE1, 0x2, 0x0, 0x0, 0x6C, 0xE1, 0x2, 0x0, 0x0, 0x8C, 0xE1, 0x2, 0x0, 0x0, 0xAC, 0xE1, 0x2, 0x0, 0x0, 0xCC, 0xE1, 0x2, 0x0, 0x0, 0xEC, 0xE1, 0x2, 0x0, 0x0, 0xC, 0xE2, 0x2, 0x0, 0x0, 0x2C, 0xE2, 0x2, 0x0, 0x0, 0x4C, 0xE2, 0x2, 0x0, 0x0, 0x6C, 0xE2, 0x2, 0x0, 0x0, 0x8C, 0xE2, 0x2, 0x0, 0x0, 0xAC, 0xE2, 0x2, 0x0, 0x0, 0xCC, 0xE2, 0x2, 0x0, 0x0, 0xEC, 0xE2, 0x2, 0x0, 0x0, 0xC, 0xE3, 0x2, 0x0, 0x0, 0x2C, 0xE3, 0x2, 0x0, 0x0, 0x4C, 0xE3, 0x2, 0x0, 0x0, 0x6C, 0xE3, 0x2, 0x0, 0x0, 0x8C, 0xE3, 0x2, 0x0, 0x0, 0xAC, 0xE3, 0x2, 0x0, 0x0, 0xCC, 0xE3, 0x2, 0x0, 0x0, 0xEC, 0xE3, 0x2, 0x0, 0x0, 0xC, 0xE4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xB9, 0x0, 0xC, 0x0, 0x10, 0xB9, 0x0, 0xC, 0x0, 0x18, 0xB9, 0x0, 0xC, 0x0, 0x20, 0xB9, 0x0, 0xC, 0x0, 0x28, 0xB9, 0x0, 0xC, 0x0, 0x30, 0xB9, 0x0, 0xC, 0x0, 0x38, 0xB9, 0x0, 0xC, 0x0, 0x40, 0xB9, 0x0, 0xC, 0x0, 0x48, 0xB9, 0x0, 0xC, 0x0, 0x50, 0xB9, 0x0, 0xC, 0x0, 0x58, 0xB9, 0x0, 0xC, 0x0, 0x60, 0xB9, 0x0, 0xC, 0x0, 0x68, 0xB9, 0x0, 0xC, 0x0, 0x70, 0xB9, 0x0, 0xC, 0x0, 0x78, 0xB9, 0x0, 0xC, 0x0, 0x80, 0xB9, 0x0, 0xC, 0x0, 0x88, 0xB9, 0x0, 0xC, 0x0, 0x90, 0xB9, 0x0, 0xC, 0x0, 0x98, 0xB9, 0x0, 0xC, 0x0, 0xA0, 0xB9, 0x0, 0xC, 0x0, 0xA8, 0xB9, 0x0, 0xC, 0x0, 0xB0, 0xB9, 0x0, 0xC, 0x0, 0xB8, 0xB9, 0x0, 0xC, 0x0, 0xC0, 0xB9, 0x0, 0xC, 0x0, 0xC8, 0xB9, 0x0, 0xC, 0x0, 0xD0, 0xB9, 0x0, 0xC, 0x0, 0xD8, 0xB9, 0x0, 0xC, 0x0, 0xE0, 0xB9, 0x0, 0xC, 0x0, 0xE8, 0xB9, 0x0, 0xC, 0x0, 0xF0, 0xB9, 0x0, 0xC, 0x0, 0xF8, 0xB9, 0x0, 0xC, 0x0, 0x0, 0xBA, 0x0, 0xC, 0x0, 0x8, 0xBA, 0x0, 0xC, 0x0, 0x10, 0xBA, 0x0, 0xC, 0x0, 0x18, 0xBA, 0x0, 0xC, 0x0, 0x20, 0xBA, 0x0, 0xC, 0x0, 0x28, 0xBA, 0x0, 0xC, 0x0, 0x30, 0xBA, 0x0, 0xC, 0x0, 0x38, 0xBA, 0x0, 0xC, 0x0, 0x40, 0xBA, 0x0, 0xC, 0x0, 0x48, 0xBA, 0x0, 0xC, 0x0, 0x50, 0xBA, 0x0, 0xC, 0x0, 0x58, 0xBA, 0x0, 0xC, 0x0, 0x60, 0xBA, 0x0, 0xC, 0x0, 0x68, 0xBA, 0x0, 0xC, 0x0, 0x70, 0xBA, 0x0, 0xC, 0x0, 0x78, 0xBA, 0x0, 0xC, 0x0, 0x80, 0xBA, 0x0, 0xC, 0x0, 0x88, 0xBA, 0x0, 0xC, 0x0, 0x90, 0xBA, 0x0, 0xC, 0x0, 0x98, 0xBA, 0x0, 0xC, 0x0, 0xA0, 0xBA, 0x0, 0xC, 0x0, 0xA8, 0xBA, 0x0, 0xC, 0x0, 0xB0, 0xBA, 0x0, 0xC, 0x0, 0xB8, 0xBA, 0x0, 0xC, 0x0, 0xC0, 0xBA, 0x0, 0xC, 0x0, 0xC8, 0xBA, 0x0, 0xC, 0x0, 0xD0, 0xBA, 0x0, 0xC, 0x0, 0xD8, 0xBA, 0x0, 0xC, 0x0, 0xE0, 0xBA, 0x0, 0xC, 0x0, 0xE8, 0xBA, 0x0, 0xC, 0x0, 0xF0, 0xBA, 0x0, 0xC, 0x0, 0xF8, 0xBA, 0x0, 0xC, 0x0, 0x0, 0xBB, 0x0, 0xC, 0x0, 0x8, 0xBB, 0x0, 0xC, 0x0, 0x10, 0xBB, 0x0, 0xC, 0x0, 0x18, 0xBB, 0x0, 0xC, 0x0, 0x20, 0xBB, 0x0, 0xC, 0x0, 0x28, 0xBB, 0x0, 0xC, 0x0, 0x30, 0xBB, 0x0, 0xC, 0x0, 0x38, 0xBB, 0x0, 0xC, 0x0, 0x40, 0xBB, 0x0, 0xC, 0x0, 0x48, 0xBB, 0x0, 0xC, 0x0, 0x50, 0xBB, 0x0, 0xC, 0x0, 0x58, 0xBB, 0x0, 0xC, 0x0, 0x60, 0xBB, 0x0, 0xC, 0x0, 0x68, 0xBB, 0x0, 0xC, 0x0, 0x70, 0xBB, 0x0, 0xC, 0x0, 0x78, 0xBB, 0x0, 0xC, 0x0, 0x80, 0xBB, 0x0, 0xC, 0x0, 0x88, 0xBB, 0x0, 0xC, 0x0, 0x90, 0xBB, 0x0, 0xC, 0x0, 0x98, 0xBB, 0x0, 0xC, 0x0, 0xA0, 0xBB, 0x0, 0xC, 0x0, 0xA8, 0xBB, 0x0, 0xC, 0x0, 0xB0, 0xBB, 0x0, 0xC, 0x0, 0xB8, 0xBB, 0x0, 0xC, 0x0, 0xC0, 0xBB, 0x0, 0xC, 0x0, 0xC8, 0xBB, 0x0, 0xC, 0x0, 0xD0, 0xBB, 0x0, 0xC, 0x0, 0xD8, 0xBB, 0x0, 0xC, 0x0, 0xE0, 0xBB, 0x0, 0xC, 0x0, 0xE8, 0xBB, 0x0, 0xC, 0x0, 0xF0, 0xBB, 0x0, 0xC, 0x0, 0xF8, 0xBB, 0x0, 0xC, 0x0, 0x0, 0xBC, 0x0, 0xC, 0x0, 0x8, 0xBC, 0x0, 0xC, 0x0, 0x10, 0xBC, 0x0, 0xC, 0x0, 0x18, 0xBC, 0x0, 0xC, 0x0, 0x20, 0xBC, 0x0, 0xC, 0x0, 0x28, 0xBC, 0x0, 0xC, 0x0, 0x30, 0xBC, 0x0, 0xC, 0x0, 0x38, 0xBC, 0x0, 0xC, 0x0, 0x40, 0xBC, 0x0, 0xC, 0x0, 0x48, 0xBC, 0x0, 0xC, 0x0, 0x50, 0xBC, 0x0, 0xC, 0x0, 0x58, 0xBC, 0x0, 0xC, 0x0, 0x60, 0xBC, 0x0, 0xC, 0x0, 0x68, 0xBC, 0x0, 0xC, 0x0, 0x70, 0xBC, 0x0, 0xC, 0x0, 0x78, 0xBC, 0x0, 0xC, 0x0, 0x80, 0xBC, 0x0, 0xC, 0x0, 0x88, 0xBC, 0x0, 0xC, 0x0, 0x90, 0xBC, 0x0, 0xC, 0x0, 0x98, 0xBC, 0x0, 0xC, 0x0, 0xA0, 0xBC, 0x0, 0xC, 0x0, 0xA8, 0xBC, 0x0, 0xC, 0x0, 0xB0, 0xBC, 0x0, 0xC, 0x0, 0xB8, 0xBC, 0x0, 0xC, 0x0, 0xC0, 0xBC, 0x0, 0xC, 0x0, 0xC8, 0xBC, 0x0, 0xC, 0x0, 0xD0, 0xBC, 0x0, 0xC, 0x0, 0xD8, 0xBC, 0x0, 0xC, 0x0, 0xE0, 0xBC, 0x0, 0xC, 0x0, 0xE8, 0xBC, 0x0, 0xC, 0x0, 0xF0, 0xBC, 0x0, 0xC, 0x0, 0xF8, 0xBC, 0x0, 0xC, 0x0, 0x0, 0xBD, 0x0, 0xC, 0x0, 0x8, 0xBD, 0x0, 0xC, 0x0, 0x10, 0xBD, 0x0, 0xC, 0x0, 0x18, 0xBD, 0x0, 0xC, 0x0, 0x20, 0xBD, 0x0, 0xC, 0x0, 0x28, 0xBD, 0x0, 0xC, 0x0, 0x30, 0xBD, 0x0, 0xC, 0x0, 0x38, 0xBD, 0x0, 0xC, 0x0, 0x40, 0xBD, 0x0, 0xC, 0x0, 0x48, 0xBD, 0x0, 0xC, 0x0, 0x50, 0xBD, 0x0, 0xC, 0x0, 0x58, 0xBD, 0x0, 0xC, 0x0, 0x60, 0xBD, 0x0, 0xC, 0x0, 0x68, 0xBD, 0x0, 0xC, 0x0, 0x70, 0xBD, 0x0, 0xC, 0x0, 0x78, 0xBD, 0x0, 0xC, 0x0, 0x80, 0xBD, 0x0, 0xC, 0x0, 0x88, 0xBD, 0x0, 0xC, 0x0, 0x90, 0xBD, 0x0, 0xC, 0x0, 0x98, 0xBD, 0x0, 0xC, 0x0, 0xA0, 0xBD, 0x0, 0xC, 0x0, 0xA8, 0xBD, 0x0, 0xC, 0x0, 0xB0, 0xBD, 0x0, 0xC, 0x0, 0xB8, 0xBD, 0x0, 0xC, 0x0, 0xC0, 0xBD, 0x0, 0xC, 0x0, 0xC8, 0xBD, 0x0, 0xC, 0x0, 0xD0, 0xBD, 0x0, 0xC, 0x0, 0xD8, 0xBD, 0x0, 0xC, 0x0, 0xE0, 0xBD, 0x0, 0xC, 0x0, 0xE8, 0xBD, 0x0, 0xC, 0x0, 0xF0, 0xBD, 0x0, 0xC, 0x0, 0xF8, 0xBD, 0x0, 0xC, 0x0, 0x0, 0xBE, 0x0, 0xC, 0x0, 0x8, 0xBE, 0x0, 0xC, 0x0, 0x10, 0xBE, 0x0, 0xC, 0x0, 0x18, 0xBE, 0x0, 0xC, 0x0, 0x20, 0xBE, 0x0, 0xC, 0x0, 0x28, 0xBE, 0x0, 0xC, 0x0, 0x30, 0xBE, 0x0, 0xC, 0x0, 0x38, 0xBE, 0x0, 0xC, 0x0, 0x40, 0xBE, 0x0, 0xC, 0x0, 0x48, 0xBE, 0x0, 0xC, 0x0, 0x50, 0xBE, 0x0, 0xC, 0x0, 0x58, 0xBE, 0x0, 0xC, 0x0, 0x60, 0xBE, 0x0, 0xC, 0x0, 0x68, 0xBE, 0x0, 0xC, 0x0, 0x70, 0xBE, 0x0, 0xC, 0x0, 0x78, 0xBE, 0x0, 0xC, 0x0, 0x80, 0xBE, 0x0, 0xC, 0x0, 0x88, 0xBE, 0x0, 0xC, 0x0, 0x90, 0xBE, 0x0, 0xC, 0x0, 0x98, 0xBE, 0x0, 0xC, 0x0, 0xA0, 0xBE, 0x0, 0xC, 0x0, 0xA8, 0xBE, 0x0, 0xC, 0x0, 0xB0, 0xBE, 0x0, 0xC, 0x0, 0xB8, 0xBE, 0x0, 0xC, 0x0, 0xC0, 0xBE, 0x0, 0xC, 0x0, 0xC8, 0xBE, 0x0, 0xC, 0x0, 0xD0, 0xBE, 0x0, 0xC, 0x0, 0xD8, 0xBE, 0x0, 0xC, 0x0, 0xE0, 0xBE, 0x0, 0xC, 0x0, 0xE8, 0xBE, 0x0, 0xC, 0x0, 0xF0, 0xBE, 0x0, 0xC, 0x0, 0xF8, 0xBE, 0x0, 0xC, 0x0, 0x0, 0xBF, 0x0, 0xC, 0x0, 0x8, 0xBF, 0x0, 0xC, 0x0, 0x10, 0xBF, 0x0, 0xC, 0x0, 0x18, 0xBF, 0x0, 0xC, 0x0, 0x20, 0xBF, 0x0, 0xC, 0x0, 0x28, 0xBF, 0x0, 0xC, 0x0, 0x30, 0xBF, 0x0, 0xC, 0x0, 0x38, 0xBF, 0x0, 0xC, 0x0, 0x40, 0xBF, 0x0, 0xC, 0x0, 0x48, 0xBF, 0x0, 0xC, 0x0, 0x50, 0xBF, 0x0, 0xC, 0x0, 0x58, 0xBF, 0x0, 0xC, 0x0, 0x60, 0xBF, 0x0, 0xC, 0x0, 0x68, 0xBF, 0x0, 0xC, 0x0, 0x70, 0xBF, 0x0, 0xC, 0x0, 0x78, 0xBF, 0x0, 0xC, 0x0, 0x80, 0xBF, 0x0, 0xC, 0x0, 0x88, 0xBF, 0x0, 0xC, 0x0, 0x90, 0xBF, 0x0, 0xC, 0x0, 0x98, 0xBF, 0x0, 0xC, 0x0, 0xA0, 0xBF, 0x0, 0xC, 0x0, 0xA8, 0xBF, 0x0, 0xC, 0x0, 0xB0, 0xBF, 0x0, 0xC, 0x0, 0xB8, 0xBF, 0x0, 0xC, 0x0, 0xC0, 0xBF, 0x0, 0xC, 0x0, 0xC8, 0xBF, 0x0, 0xC, 0x0, 0xD0, 0xBF, 0x0, 0xC, 0x0, 0xD8, 0xBF, 0x0, 0xC, 0x0, 0xE0, 0xBF, 0x0, 0xC, 0x0, 0xE8, 0xBF, 0x0, 0xC, 0x0, 0xF0, 0xBF, 0x0, 0xC, 0x0, 0xF8, 0xBF, 0x0, 0xC, 0x0, 0x0, 0xC0, 0x0, 0xC, 0x0, 0x8, 0xC0, 0x0, 0xC, 0x0, 0x10, 0xC0, 0x0, 0xC, 0x0, 0x18, 0xC0, 0x0, 0xC, 0x0, 0x20, 0xC0, 0x0, 0xC, 0x0, 0x28, 0xC0, 0x0, 0xC, 0x0, 0x30, 0xC0, 0x0, 0xC, 0x0, 0x38, 0xC0, 0x0, 0xC, 0x0, 0x40, 0xC0, 0x0, 0xC, 0x0, 0x48, 0xC0, 0x0, 0xC, 0x0, 0x50, 0xC0, 0x0, 0xC, 0x0, 0x58, 0xC0, 0x0, 0xC, 0x0, 0x60, 0xC0, 0x0, 0xC, 0x0, 0x68, 0xC0, 0x0, 0xC, 0x0, 0x70, 0xC0, 0x0, 0xC, 0x0, 0x78, 0xC0, 0x0, 0xC, 0x0, 0x80, 0xC0, 0x0, 0xC, 0x0, 0x88, 0xC0, 0x0, 0xC, 0x0, 0x90, 0xC0, 0x0, 0xC, 0x0, 0x98, 0xC0, 0x0, 0xC, 0x0, 0xA0, 0xC0, 0x0, 0xC, 0x0, 0xA8, 0xC0, 0x0, 0xC, 0x0, 0xB0, 0xC0, 0x0, 0xC, 0x0, 0xB8, 0xC0, 0x0, 0xC, 0x0, 0xC0, 0xC0, 0x0, 0xC, 0x0, 0xC8, 0xC0, 0x0, 0xC, 0x0, 0xD0, 0xC0, 0x0, 0xC, 0x0, 0xD8, 0xC0, 0x0, 0xC, 0x0, 0xE0, 0xC0, 0x0, 0xC, 0x0, 0xE8, 0xC0, 0x0, 0xC, 0x0, 0xF0, 0xC0, 0x0, 0xC, 0x0, 0xF8, 0xC0, 0x0, 0xC, 0x0, 0x0, 0xC1, 0x0, 0xC, 0x0, 0x8, 0xC1, 0x0, 0xC, 0x0, 0x10, 0xC1, 0x0, 0xC, 0x0, 0x18, 0xC1, 0x0, 0xC, 0x0, 0x20, 0xC1, 0x0, 0xC, 0x0, 0x28, 0xC1, 0x0, 0xC, 0x0, 0x30, 0xC1, 0x0, 0xC, 0x0, 0x38, 0xC1, 0x0, 0xC, 0x0, 0x40, 0xC1, 0x0, 0xC, 0x0, 0x48, 0xC1, 0x0, 0xC, 0x0, 0x50, 0xC1, 0x0, 0xC, 0x0, 0x58, 0xC1, 0x0, 0xC, 0x0, 0x60, 0xC1, 0x0, 0xC, 0x0, 0x68, 0xC1, 0x0, 0xC, 0x0, 0x70, 0xC1, 0x0, 0xC, 0x0, 0x78, 0xC1, 0x0, 0xC, 0x0, 0x80, 0xC1, 0x0, 0xC, 0x0, 0x88, 0xC1, 0x0, 0xC, 0x0, 0x90, 0xC1, 0x0, 0xC, 0x0, 0x98, 0xC1, 0x0, 0xC, 0x0, 0xA0, 0xC1, 0x0, 0xC, 0x0, 0xA8, 0xC1, 0x0, 0xC, 0x0, 0xB0, 0xC1, 0x0, 0xC, 0x0, 0xB8, 0xC1, 0x0, 0xC, 0x0, 0xC0, 0xC1, 0x0, 0xC, 0x0, 0xC8, 0xC1, 0x0, 0xC, 0x0, 0xD0, 0xC1, 0x0, 0xC, 0x0, 0xD8, 0xC1, 0x0, 0xC, 0x0, 0xE0, 0xC1, 0x0, 0xC, 0x0, 0xE8, 0xC1, 0x0, 0xC, 0x0, 0xF0, 0xC1, 0x0, 0xC, 0x0, 0xF8, 0xC1, 0x0, 0xC, 0x0, 0x0, 0xC2, 0x0, 0xC, 0x0, 0x8, 0xC2, 0x0, 0xC, 0x0, 0x10, 0xC2, 0x0, 0xC, 0x0, 0x18, 0xC2, 0x0, 0xC, 0x0, 0x20, 0xC2, 0x0, 0xC, 0x0, 0x28, 0xC2, 0x0, 0xC, 0x0, 0x30, 0xC2, 0x0, 0xC, 0x0, 0x38, 0xC2, 0x0, 0xC, 0x0, 0x40, 0xC2, 0x0, 0xC, 0x0, 0x48, 0xC2, 0x0, 0xC, 0x0, 0x50, 0xC2, 0x0, 0xC, 0x0, 0x58, 0xC2, 0x0, 0xC, 0x0, 0x60, 0xC2, 0x0, 0xC, 0x0, 0x68, 0xC2, 0x0, 0xC, 0x0, 0x70, 0xC2, 0x0, 0xC, 0x0, 0x78, 0xC2, 0x0, 0xC, 0x0, 0x80, 0xC2, 0x0, 0xC, 0x0, 0x88, 0xC2, 0x0, 0xC, 0x0, 0x90, 0xC2, 0x0, 0xC, 0x0, 0x98, 0xC2, 0x0, 0xC, 0x0, 0xA0, 0xC2, 0x0, 0xC, 0x0, 0xA8, 0xC2, 0x0, 0xC, 0x0, 0xB0, 0xC2, 0x0, 0xC, 0x0, 0xB8, 0xC2, 0x0, 0xC, 0x0, 0xC0, 0xC2, 0x0, 0xC, 0x0, 0xC8, 0xC2, 0x0, 0xC, 0x0, 0xD0, 0xC2, 0x0, 0xC, 0x0, 0xD8, 0xC2, 0x0, 0xC, 0x0, 0xE0, 0xC2, 0x0, 0xC, 0x0, 0xE8, 0xC2, 0x0, 0xC, 0x0, 0xF0, 0xC2, 0x0, 0xC, 0x0, 0xF8, 0xC2, 0x0, 0xC, 0x0, 0x0, 0xC3, 0x0, 0xC, 0x0, 0x8, 0xC3, 0x0, 0xC, 0x0, 0x10, 0xC3, 0x0, 0xC, 0x0, 0x18, 0xC3, 0x0, 0xC, 0x0, 0x20, 0xC3, 0x0, 0xC, 0x0, 0x28, 0xC3, 0x0, 0xC, 0x0, 0x30, 0xC3, 0x0, 0xC, 0x0, 0x38, 0xC3, 0x0, 0xC, 0x0, 0x40, 0xC3, 0x0, 0xC, 0x0, 0x48, 0xC3, 0x0, 0xC, 0x0, 0x50, 0xC3, 0x0, 0xC, 0x0, 0x58, 0xC3, 0x0, 0xC, 0x0, 0x60, 0xC3, 0x0, 0xC, 0x0, 0x68, 0xC3, 0x0, 0xC, 0x0, 0x70, 0xC3, 0x0, 0xC, 0x0, 0x78, 0xC3, 0x0, 0xC, 0x0, 0x80, 0xC3, 0x0, 0xC, 0x0, 0x88, 0xC3, 0x0, 0xC, 0x0, 0x90, 0xC3, 0x0, 0xC, 0x0, 0x98, 0xC3, 0x0, 0xC, 0x0, 0xA0, 0xC3, 0x0, 0xC, 0x0, 0xA8, 0xC3, 0x0, 0xC, 0x0, 0xB0, 0xC3, 0x0, 0xC, 0x0, 0xB8, 0xC3, 0x0, 0xC, 0x0, 0xC0, 0xC3, 0x0, 0xC, 0x0, 0xC8, 0xC3, 0x0, 0xC, 0x0, 0xD0, 0xC3, 0x0, 0xC, 0x0, 0xD8, 0xC3, 0x0, 0xC, 0x0, 0xE0, 0xC3, 0x0, 0xC, 0x0, 0xE8, 0xC3, 0x0, 0xC, 0x0, 0xF0, 0xC3, 0x0, 0xC, 0x0, 0xF8, 0xC3, 0x0, 0xC, 0x0, 0x0, 0xC4, 0x0, 0xC, 0x0, 0x8, 0xC4, 0x0, 0xC, 0x0, 0x10, 0xC4, 0x0, 0xC, 0x0, 0x18, 0xC4, 0x0, 0xC, 0x0, 0x20, 0xC4, 0x0, 0xC, 0x0, 0x28, 0xC4, 0x0, 0xC, 0x0, 0x30, 0xC4, 0x0, 0xC, 0x0, 0x38, 0xC4, 0x0, 0xC, 0x0, 0x40, 0xC4, 0x0, 0xC, 0x0, 0x48, 0xC4, 0x0, 0xC, 0x0, 0x50, 0xC4, 0x0, 0xC, 0x0, 0x58, 0xC4, 0x0, 0xC, 0x0, 0x60, 0xC4, 0x0, 0xC, 0x0, 0x68, 0xC4, 0x0, 0xC, 0x0, 0x70, 0xC4, 0x0, 0xC, 0x0, 0x78, 0xC4, 0x0, 0xC, 0x0, 0x80, 0xC4, 0x0, 0xC, 0x0, 0x88, 0xC4, 0x0, 0xC, 0x0, 0x90, 0xC4, 0x0, 0xC, 0x0, 0x98, 0xC4, 0x0, 0xC, 0x0, 0xA0, 0xC4, 0x0, 0xC, 0x0, 0xA8, 0xC4, 0x0, 0xC, 0x0, 0xB0, 0xC4, 0x0, 0xC, 0x0, 0xB8, 0xC4, 0x0, 0xC, 0x0, 0xC0, 0xC4, 0x0, 0xC, 0x0, 0xC8, 0xC4, 0x0, 0xC, 0x0, 0xD0, 0xC4, 0x0, 0xC, 0x0, 0xD8, 0xC4, 0x0, 0xC, 0x0, 0xE0, 0xC4, 0x0, 0xC, 0x0, 0xE8, 0xC4, 0x0, 0xC, 0x0, 0xF0, 0xC4, 0x0, 0xC, 0x0, 0xF8, 0xC4, 0x0, 0xC, 0x0, 0x0, 0xC5, 0x0, 0xC, 0x0, 0x8, 0xC5, 0x0, 0xC, 0x0, 0x10, 0xC5, 0x0, 0xC, 0x0, 0x18, 0xC5, 0x0, 0xC, 0x0, 0x20, 0xC5, 0x0, 0xC, 0x0, 0x28, 0xC5, 0x0, 0xC, 0x0, 0x30, 0xC5, 0x0, 0xC, 0x0, 0x38, 0xC5, 0x0, 0xC, 0x0, 0x40, 0xC5, 0x0, 0xC, 0x0, 0x48, 0xC5, 0x0, 0xC, 0x0, 0x50, 0xC5, 0x0, 0xC, 0x0, 0x58, 0xC5, 0x0, 0xC, 0x0, 0x60, 0xC5, 0x0, 0xC, 0x0, 0x68, 0xC5, 0x0, 0xC, 0x0, 0x70, 0xC5, 0x0, 0xC, 0x0, 0x78, 0xC5, 0x0, 0xC, 0x0, 0x80, 0xC5, 0x0, 0xC, 0x0, 0x88, 0xC5, 0x0, 0xC, 0x0, 0x90, 0xC5, 0x0, 0xC, 0x0, 0x98, 0xC5, 0x0, 0xC, 0x0, 0xA0, 0xC5, 0x0, 0xC, 0x0, 0xA8, 0xC5, 0x0, 0xC, 0x0, 0xB0, 0xC5, 0x0, 0xC, 0x0, 0xB8, 0xC5, 0x0, 0xC, 0x0, 0xC0, 0xC5, 0x0, 0xC, 0x0, 0xC8, 0xC5, 0x0, 0xC, 0x0, 0xD0, 0xC5, 0x0, 0xC, 0x0, 0xD8, 0xC5, 0x0, 0xC, 0x0, 0xE0, 0xC5, 0x0, 0xC, 0x0, 0xE8, 0xC5, 0x0, 0xC, 0x0, 0xF0, 0xC5, 0x0, 0xC, 0x0, 0xF8, 0xC5, 0x0, 0xC, 0x0, 0x0, 0xC6, 0x0, 0xC, 0x0, 0x8, 0xC6, 0x0, 0xC, 0x0, 0x10, 0xC6, 0x0, 0xC, 0x0, 0x18, 0xC6, 0x0, 0xC, 0x0, 0x20, 0xC6, 0x0, 0xC, 0x0, 0x28, 0xC6, 0x0, 0xC, 0x0, 0x30, 0xC6, 0x0, 0xC, 0x0, 0x38, 0xC6, 0x0, 0xC, 0x0, 0x40, 0xC6, 0x0, 0xC, 0x0, 0x48, 0xC6, 0x0, 0xC, 0x0, 0x50, 0xC6, 0x0, 0xC, 0x0, 0x58, 0xC6, 0x0, 0xC, 0x0, 0x60, 0xC6, 0x0, 0xC, 0x0, 0x68, 0xC6, 0x0, 0xC, 0x0, 0x70, 0xC6, 0x0, 0xC, 0x0, 0x78, 0xC6, 0x0, 0xC, 0x0, 0x80, 0xC6, 0x0, 0xC, 0x0, 0x88, 0xC6, 0x0, 0xC, 0x0, 0x90, 0xC6, 0x0, 0xC, 0x0, 0x98, 0xC6, 0x0, 0xC, 0x0, 0xA0, 0xC6, 0x0, 0xC, 0x0, 0xA8, 0xC6, 0x0, 0xC, 0x0, 0xB0, 0xC6, 0x0, 0xC, 0x0, 0xB8, 0xC6, 0x0, 0xC, 0x0, 0xC0, 0xC6, 0x0, 0xC, 0x0, 0xC8, 0xC6, 0x0, 0xC, 0x0, 0xD0, 0xC6, 0x0, 0xC, 0x0, 0xD8, 0xC6, 0x0, 0xC, 0x0, 0xE0, 0xC6, 0x0, 0xC, 0x0, 0xE8, 0xC6, 0x0, 0xC, 0x0, 0xF0, 0xC6, 0x0, 0xC, 0x0, 0xF8, 0xC6, 0x0, 0xC, 0x0, 0x0, 0xC7, 0x0, 0xC, 0x0, 0x8, 0xC7, 0x0, 0xC, 0x0, 0x10, 0xC7, 0x0, 0xC, 0x0, 0x18, 0xC7, 0x0, 0xC, 0x0, 0x20, 0xC7, 0x0, 0xC, 0x0, 0x28, 0xC7, 0x0, 0xC, 0x0, 0x30, 0xC7, 0x0, 0xC, 0x0, 0x38, 0xC7, 0x0, 0xC, 0x0, 0x40, 0xC7, 0x0, 0xC, 0x0, 0x48, 0xC7, 0x0, 0xC, 0x0, 0x50, 0xC7, 0x0, 0x6D, 0x1D, 0x3, 0x0, 0x0, 0x8D, 0x1D, 0x3, 0x0, 0x0, 0xAD, 0x1D, 0x3, 0x0, 0x0, 0xCD, 0x1D, 0x3, 0x0, 0x0, 0xED, 0x1D, 0x3, 0x0, 0x0, 0xD, 0x1E, 0x3, 0x0, 0x0, 0x2D, 0x1E, 0x3, 0x0, 0x0, 0x4D, 0x1E, 0x3, 0x0, 0x0, 0x6D, 0x1E, 0x3, 0x0, 0x0, 0x8D, 0x1E, 0x3, 0x0, 0x0, 0xAD, 0x1E, 0x3, 0x0, 0x0, 0xCD, 0x1E, 0x3, 0x0, 0x0, 0xED, 0x1E, 0x3, 0x0, 0x0, 0xD, 0x1F, 0x3, 0x0, 0x0, 0x2D, 0x1F, 0x3, 0x0, 0x0, 0x4D, 0x1F, 0x3, 0x0, 0x0, 0x6D, 0x1F, 0x3, 0x0, 0x0, 0x8D, 0x1F, 0x3, 0x0, 0x0, 0xAD, 0x1F, 0x3, 0x0, 0x0, 0xCD, 0x1F, 0x3, 0x0, 0x0, 0xED, 0x1F, 0x3, 0x0, 0x0, 0xD, 0x20, 0x3, 0x0, 0x0, 0x2D, 0x20, 0x3, 0x0, 0x0, 0x4D, 0x20, 0x3, 0x0, 0x0, 0x6D, 0x20, 0x3, 0x0, 0x0, 0x8D, 0x20, 0x3, 0x0, 0x0, 0xAD, 0x20, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xC8, 0x0, 0xED, 0x20, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xC8, 0x0, 0x2D, 0x21, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xC8, 0x0, 0x6D, 0x21, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xC8, 0x0, 0xAD, 0x21, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xC8, 0x0, 0xED, 0x21, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xC8, 0x0, 0x2D, 0x22, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xC8, 0x0, 0x6D, 0x22, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xC8, 0x0, 0xAD, 0x22, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xC8, 0x0, 0xED, 0x22, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xC8, 0x0, 0x2D, 0x23, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xC8, 0x0, 0x6D, 0x23, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xC8, 0x0, 0xAD, 0x23, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xC8, 0x0, 0xED, 0x23, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xC9, 0x0, 0x2D, 0x24, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xC9, 0x0, 0x6D, 0x24, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xC9, 0x0, 0xAD, 0x24, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xC9, 0x0, 0xED, 0x24, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xC9, 0x0, 0x2D, 0x25, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xC9, 0x0, 0x6D, 0x25, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xC9, 0x0, 0xAD, 0x25, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xC9, 0x0, 0xED, 0x25, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xC9, 0x0, 0x2D, 0x26, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xC9, 0x0, 0x6D, 0x26, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xC9, 0x0, 0xAD, 0x26, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xC9, 0x0, 0xED, 0x26, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xC9, 0x0, 0x2D, 0x27, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xC9, 0x0, 0x6D, 0x27, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xC9, 0x0, 0xAD, 0x27, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xC9, 0x0, 0xED, 0x27, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCA, 0x0, 0x2D, 0x28, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCA, 0x0, 0x6D, 0x28, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCA, 0x0, 0xAD, 0x28, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xCA, 0x0, 0xED, 0x28, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xCA, 0x0, 0x2D, 0x29, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xCA, 0x0, 0x6D, 0x29, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xCA, 0x0, 0xAD, 0x29, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xCA, 0x0, 0xED, 0x29, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xCA, 0x0, 0x2D, 0x2A, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xCA, 0x0, 0x6D, 0x2A, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xCA, 0x0, 0xAD, 0x2A, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xCA, 0x0, 0xED, 0x2A, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xCA, 0x0, 0x2D, 0x2B, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCA, 0x0, 0x6D, 0x2B, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xCA, 0x0, 0xAD, 0x2B, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xCA, 0x0, 0xED, 0x2B, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCB, 0x0, 0x2D, 0x2C, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCB, 0x0, 0x6D, 0x2C, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCB, 0x0, 0xAD, 0x2C, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xCB, 0x0, 0xED, 0x2C, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xCB, 0x0, 0x2D, 0x2D, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xCB, 0x0, 0x6D, 0x2D, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xCB, 0x0, 0xAD, 0x2D, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xCB, 0x0, 0xED, 0x2D, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xCB, 0x0, 0x2D, 0x2E, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xCB, 0x0, 0x6D, 0x2E, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xCB, 0x0, 0xAD, 0x2E, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xCB, 0x0, 0xED, 0x2E, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xCB, 0x0, 0x2D, 0x2F, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCB, 0x0, 0x6D, 0x2F, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xCB, 0x0, 0xAD, 0x2F, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xCB, 0x0, 0xED, 0x2F, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCC, 0x0, 0x2D, 0x30, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCC, 0x0, 0x6D, 0x30, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCC, 0x0, 0xAD, 0x30, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xCC, 0x0, 0xED, 0x30, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xCC, 0x0, 0x2D, 0x31, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xCC, 0x0, 0x6D, 0x31, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xCC, 0x0, 0xAD, 0x31, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xCC, 0x0, 0xED, 0x31, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xCC, 0x0, 0x2D, 0x32, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xCC, 0x0, 0x6D, 0x32, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xCC, 0x0, 0xAD, 0x32, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xCC, 0x0, 0xED, 0x32, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xCC, 0x0, 0x2D, 0x33, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCC, 0x0, 0x6D, 0x33, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xCC, 0x0, 0xAD, 0x33, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xCC, 0x0, 0xED, 0x33, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCD, 0x0, 0x2D, 0x34, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCD, 0x0, 0x6D, 0x34, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCD, 0x0, 0xAD, 0x34, 0x3, 0x0, 0x0, 0xCD, 0x34, 0x3, 0x0, 0x0, 0xED, 0x34, 0x3, 0x0, 0x0, 0xD, 0x35, 0x3, 0x0, 0x0, 0x2D, 0x35, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xCD, 0x0, 0x6D, 0x35, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xCD, 0x0, 0xAD, 0x35, 0x3, 0x0, 0x0, 0xCD, 0x35, 0x3, 0x0, 0x0, 0xED, 0x35, 0x3, 0x0, 0x0, 0xD, 0x36, 0x3, 0x0, 0x0, 0x2D, 0x36, 0x3, 0x0, 0x0, 0x4D, 0x36, 0x3, 0x0, 0x0, 0x6D, 0x36, 0x3, 0x0, 0x0, 0x8D, 0x36, 0x3, 0x0, 0x0, 0xAD, 0x36, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xCD, 0x0, 0xED, 0x36, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xCD, 0x0, 0x2D, 0x37, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCD, 0x0, 0x6D, 0x37, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xCD, 0x0, 0xAD, 0x37, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xCD, 0x0, 0xED, 0x37, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCE, 0x0, 0x2D, 0x38, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCE, 0x0, 0x6D, 0x38, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCE, 0x0, 0xAD, 0x38, 0x3, 0x0, 0x0, 0xCD, 0x38, 0x3, 0x0, 0x0, 0xED, 0x38, 0x3, 0x0, 0x0, 0xD, 0x39, 0x3, 0x0, 0x0, 0x2D, 0x39, 0x3, 0x0, 0x0, 0x4D, 0x39, 0x3, 0x0, 0x0, 0x6D, 0x39, 0x3, 0x0, 0x0, 0x8D, 0x39, 0x3, 0x0, 0x0, 0xAD, 0x39, 0x3, 0x0, 0x0, 0xCD, 0x39, 0x3, 0x0, 0x0, 0xED, 0x39, 0x3, 0x0, 0x0, 0xD, 0x3A, 0x3, 0x0, 0x0, 0x2D, 0x3A, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xCE, 0x0, 0x6D, 0x3A, 0x3, 0x0, 0x0, 0x8D, 0x3A, 0x3, 0x0, 0x0, 0xAD, 0x3A, 0x3, 0x0, 0x0, 0xCD, 0x3A, 0x3, 0x0, 0x0, 0xED, 0x3A, 0x3, 0x0, 0x0, 0xD, 0x3B, 0x3, 0x0, 0x0, 0x2D, 0x3B, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCE, 0x0, 0x6D, 0x3B, 0x3, 0x0, 0x0, 0x8D, 0x3B, 0x3, 0x0, 0x0, 0xAD, 0x3B, 0x3, 0x0, 0x0, 0xCD, 0x3B, 0x3, 0x0, 0x0, 0xED, 0x3B, 0x3, 0x0, 0x0, 0xD, 0x3C, 0x3, 0x0, 0x0, 0x2D, 0x3C, 0x3, 0x0, 0x0, 0x4D, 0x3C, 0x3, 0x0, 0x0, 0x6D, 0x3C, 0x3, 0x0, 0x0, 0x8D, 0x3C, 0x3, 0x0, 0x0, 0xAD, 0x3C, 0x3, 0x0, 0x0, 0xCD, 0x3C, 0x3, 0x0, 0x0, 0xED, 0x3C, 0x3, 0x0, 0x0, 0xD, 0x3D, 0x3, 0x0, 0x0, 0x2D, 0x3D, 0x3, 0x0, 0x0, 0x4D, 0x3D, 0x3, 0x0, 0x0, 0x6D, 0x3D, 0x3, 0x0, 0x0, 0x8D, 0x3D, 0x3, 0x0, 0x0, 0xAD, 0x3D, 0x3, 0x0, 0x0, 0xCD, 0x3D, 0x3, 0x0, 0x0, 0xED, 0x3D, 0x3, 0x0, 0x0, 0xD, 0x3E, 0x3, 0x0, 0x0, 0x2D, 0x3E, 0x3, 0x0, 0x0, 0x4D, 0x3E, 0x3, 0x0, 0x0, 0x6D, 0x3E, 0x3, 0x0, 0x0, 0x8D, 0x3E, 0x3, 0x0, 0x0, 0xAD, 0x3E, 0x3, 0x0, 0x0, 0xCD, 0x3E, 0x3, 0x0, 0x0, 0xED, 0x3E, 0x3, 0x0, 0x0, 0xD, 0x3F, 0x3, 0x0, 0x0, 0x2D, 0x3F, 0x3, 0x0, 0x0, 0x4D, 0x3F, 0x3, 0x0, 0x0, 0x6D, 0x3F, 0x3, 0x0, 0x0, 0x8D, 0x3F, 0x3, 0x0, 0x0, 0xAD, 0x3F, 0x3, 0x0, 0x0, 0xCD, 0x3F, 0x3, 0x0, 0x0, 0xED, 0x3F, 0x3, 0x0, 0x0, 0xD, 0x40, 0x3, 0x0, 0x0, 0x2D, 0x40, 0x3, 0x0, 0x0, 0x4D, 0x40, 0x3, 0x0, 0x0, 0x6D, 0x40, 0x3, 0x0, 0x0, 0x8D, 0x40, 0x3, 0x0, 0x0, 0xAD, 0x40, 0x3, 0x0, 0x0, 0xCD, 0x40, 0x3, 0x0, 0x0, 0xED, 0x40, 0x3, 0x0, 0x0, 0xD, 0x41, 0x3, 0x0, 0x0, 0x2D, 0x41, 0x3, 0x0, 0x0, 0x4D, 0x41, 0x3, 0x0, 0x0, 0x6D, 0x41, 0x3, 0x0, 0x0, 0x8D, 0x41, 0x3, 0x0, 0x0, 0xAD, 0x41, 0x3, 0x0, 0x0, 0xCD, 0x41, 0x3, 0x0, 0x0, 0xED, 0x41, 0x3, 0x0, 0x0, 0xD, 0x42, 0x3, 0x0, 0x0, 0x2D, 0x42, 0x3, 0x0, 0x0, 0x4D, 0x42, 0x3, 0x0, 0x0, 0x6D, 0x42, 0x3, 0x0, 0x0, 0x8D, 0x42, 0x3, 0x0, 0x0, 0xAD, 0x42, 0x3, 0x0, 0x0, 0xCD, 0x42, 0x3, 0x0, 0x0, 0xED, 0x42, 0x3, 0x0, 0x0, 0xD, 0x43, 0x3, 0x0, 0x0, 0x2D, 0x43, 0x3, 0x0, 0x0, 0x4D, 0x43, 0x3, 0x0, 0x0, 0x6D, 0x43, 0x3, 0x0, 0x0, 0x8D, 0x43, 0x3, 0x0, 0x0, 0xAD, 0x43, 0x3, 0x0, 0x0, 0xCD, 0x43, 0x3, 0x0, 0x0, 0xED, 0x43, 0x3, 0x0, 0x0, 0xD, 0x44, 0x3, 0x0, 0x0, 0x2D, 0x44, 0x3, 0x0, 0x0, 0x4D, 0x44, 0x3, 0x0, 0x0, 0x6D, 0x44, 0x3, 0x0, 0x0, 0x8D, 0x44, 0x3, 0x0, 0x0, 0xAD, 0x44, 0x3, 0x0, 0x0, 0xCD, 0x44, 0x3, 0x0, 0x0, 0xED, 0x44, 0x3, 0x0, 0x0, 0xD, 0x45, 0x4B, 0xD1, 0x0, 0x4D, 0x45, 0x5B, 0xD1, 0x0, 0x8D, 0x45, 0x6B, 0xD1, 0x0, 0xCD, 0x45, 0x7B, 0xD1, 0x0, 0xD, 0x46, 0x8B, 0xD1, 0x0, 0x4D, 0x46, 0x9B, 0xD1, 0x0, 0x8D, 0x46, 0xAB, 0xD1, 0x0, 0xCD, 0x46, 0xBB, 0xD1, 0x0, 0xD, 0x47, 0xCB, 0xD1, 0x0, 0x4D, 0x47, 0xDB, 0xD1, 0x0, 0x8D, 0x47, 0xEB, 0xD1, 0x0, 0xCD, 0x47, 0xFB, 0xD1, 0x0, 0xD, 0x48, 0xB, 0xD2, 0x0, 0x4D, 0x48, 0x1B, 0xD2, 0x0, 0x8D, 0x48, 0x2B, 0xD2, 0x0, 0xCD, 0x48, 0x3B, 0xD2, 0x0, 0xD, 0x49, 0x4B, 0xD2, 0x0, 0x4D, 0x49, 0x5B, 0xD2, 0x0, 0x8D, 0x49, 0x6B, 0xD2, 0x0, 0xCD, 0x49, 0x7B, 0xD2, 0x0, 0xD, 0x4A, 0x8B, 0xD2, 0x0, 0x4D, 0x4A, 0x9B, 0xD2, 0x0, 0x8D, 0x4A, 0xAB, 0xD2, 0x0, 0xCD, 0x4A, 0xBB, 0xD2, 0x0, 0xD, 0x4B, 0xCB, 0xD2, 0x0, 0x4D, 0x4B, 0xDB, 0xD2, 0x0, 0x8D, 0x4B, 0xEB, 0xD2, 0x0, 0xCD, 0x4B, 0xFB, 0xD2, 0x0, 0xD, 0x4C, 0xB, 0xD3, 0x0, 0x4D, 0x4C, 0x1B, 0xD3, 0x0, 0x8D, 0x4C, 0x2B, 0xD3, 0x0, 0xCD, 0x4C, 0x3B, 0xD3, 0x0, 0xD, 0x4D, 0x4B, 0xD3, 0x0, 0x4D, 0x4D, 0x5B, 0xD3, 0x0, 0x8D, 0x4D, 0x6B, 0xD3, 0x0, 0xCD, 0x4D, 0x7B, 0xD3, 0x0, 0xD, 0x4E, 0x8B, 0xD3, 0x0, 0x4D, 0x4E, 0x9B, 0xD3, 0x0, 0x8D, 0x4E, 0xAB, 0xD3, 0x0, 0xCD, 0x4E, 0xBB, 0xD3, 0x0, 0xD, 0x4F, 0x3, 0x0, 0x0, 0x2D, 0x4F, 0x3, 0x0, 0x0, 0x4D, 0x4F, 0x3, 0x0, 0x0, 0x6D, 0x4F, 0x3, 0x0, 0x0, 0x8D, 0x4F, 0x3, 0x0, 0x0, 0xAD, 0x4F, 0x3, 0x0, 0x0, 0xCD, 0x4F, 0x3, 0x0, 0x0, 0xED, 0x4F, 0x3, 0x0, 0x0, 0xD, 0x50, 0x3, 0x0, 0x0, 0x2D, 0x50, 0x3, 0x0, 0x0, 0x4D, 0x50, 0x3, 0x0, 0x0, 0x6D, 0x50, 0x3, 0x0, 0x0, 0x8D, 0x50, 0x3, 0x0, 0x0, 0xAD, 0x50, 0x3, 0x0, 0x0, 0xCD, 0x50, 0x3, 0x0, 0x0, 0xED, 0x50, 0x3, 0x0, 0x0, 0xD, 0x51, 0x3, 0x0, 0x0, 0x2D, 0x51, 0x3, 0x0, 0x0, 0x4D, 0x51, 0x3, 0x0, 0x0, 0x6D, 0x51, 0x3, 0x0, 0x0, 0x8D, 0x51, 0x3, 0x0, 0x0, 0xAD, 0x51, 0x3, 0x0, 0x0, 0xCD, 0x51, 0x3, 0x0, 0x0, 0xED, 0x51, 0x3, 0x0, 0x0, 0xD, 0x52, 0x3, 0x0, 0x0, 0x2D, 0x52, 0x3, 0x0, 0x0, 0x4D, 0x52, 0x3, 0x0, 0x0, 0x6D, 0x52, 0x3, 0x0, 0x0, 0x8D, 0x52, 0x3, 0x0, 0x0, 0xAD, 0x52, 0x3, 0x0, 0x0, 0xCD, 0x52, 0x3, 0x0, 0x0, 0xED, 0x52, 0x3, 0x0, 0x0, 0xD, 0x53, 0x3, 0x0, 0x0, 0x2D, 0x53, 0x3, 0x0, 0x0, 0x4D, 0x53, 0x3, 0x0, 0x0, 0x6D, 0x53, 0x3, 0x0, 0x0, 0x8D, 0x53, 0x3, 0x0, 0x0, 0xAD, 0x53, 0x3, 0x0, 0x0, 0xCD, 0x53, 0x3, 0x0, 0x0, 0xED, 0x53, 0x3, 0x0, 0x0, 0xD, 0x54, 0x3, 0x0, 0x0, 0x2D, 0x54, 0x3, 0x0, 0x0, 0x4D, 0x54, 0x3, 0x0, 0x0, 0x6D, 0x54, 0x3, 0x0, 0x0, 0x8D, 0x54, 0x3, 0x0, 0x0, 0xAD, 0x54, 0x3, 0x0, 0x0, 0xCD, 0x54, 0x3, 0x0, 0x0, 0xED, 0x54, 0x3, 0x0, 0x0, 0xD, 0x55, 0x3, 0x0, 0x0, 0x2D, 0x55, 0x3, 0x0, 0x0, 0x4D, 0x55, 0x3, 0x0, 0x0, 0x6D, 0x55, 0x3, 0x0, 0x0, 0x8D, 0x55, 0x3, 0x0, 0x0, 0xAD, 0x55, 0x73, 0xD5, 0x0, 0xED, 0x55, 0x83, 0xD5, 0x0, 0x2D, 0x56, 0x3, 0x0, 0x0, 0x4D, 0x56, 0x3, 0x0, 0x0, 0x6D, 0x56, 0xA3, 0xD5, 0x0, 0xAD, 0x56, 0xB3, 0xD5, 0x0, 0xED, 0x56, 0xC3, 0xD5, 0x0, 0x2D, 0x57, 0xD3, 0xD5, 0x0, 0x6D, 0x57, 0x3, 0x0, 0x0, 0x8D, 0x57, 0x3, 0x0, 0x0, 0xAD, 0x57, 0x3, 0x0, 0x0, 0xCD, 0x57, 0xFB, 0xD5, 0x0, 0xD, 0x58, 0xB, 0xD6, 0x0, 0x4D, 0x58, 0x1B, 0xD6, 0x0, 0x8D, 0x58, 0x2B, 0xD6, 0x0, 0xCD, 0x58, 0x3B, 0xD6, 0x0, 0xD, 0x59, 0x3, 0x0, 0x0, 0x2D, 0x59, 0x3, 0x0, 0x0, 0x4D, 0x59, 0x3, 0x0, 0x0, 0x6D, 0x59, 0x3, 0x0, 0x0, 0x8D, 0x59, 0x3, 0x0, 0x0, 0xAD, 0x59, 0x3, 0x0, 0x0, 0xCD, 0x59, 0x3, 0x0, 0x0, 0xED, 0x59, 0x3, 0x0, 0x0, 0xD, 0x5A, 0x3, 0x0, 0x0, 0x2D, 0x5A, 0x3, 0x0, 0x0, 0x4D, 0x5A, 0x3, 0x0, 0x0, 0x6D, 0x5A, 0x3, 0x0, 0x0, 0x8D, 0x5A, 0x3, 0x0, 0x0, 0xAD, 0x5A, 0x3, 0x0, 0x0, 0xCD, 0x5A, 0x3, 0x0, 0x0, 0xED, 0x5A, 0x3, 0x0, 0x0, 0xD, 0x5B, 0x3, 0x0, 0x0, 0x2D, 0x5B, 0x3, 0x0, 0x0, 0x4D, 0x5B, 0x3, 0x0, 0x0, 0x6D, 0x5B, 0x3, 0x0, 0x0, 0x8D, 0x5B, 0x3, 0x0, 0x0, 0xAD, 0x5B, 0x3, 0x0, 0x0, 0xCD, 0x5B, 0x3, 0x0, 0x0, 0xED, 0x5B, 0x3, 0x0, 0x0, 0xD, 0x5C, 0x3, 0x0, 0x0, 0x2D, 0x5C, 0x3, 0x0, 0x0, 0x4D, 0x5C, 0x3, 0x0, 0x0, 0x6D, 0x5C, 0x3, 0x0, 0x0, 0x8D, 0x5C, 0x3, 0x0, 0x0, 0xAD, 0x5C, 0x3, 0x0, 0x0, 0xCD, 0x5C, 0x3, 0x0, 0x0, 0xED, 0x5C, 0x3, 0x0, 0x0, 0xD, 0x5D, 0x3, 0x0, 0x0, 0x2D, 0x5D, 0x3, 0x0, 0x0, 0x4D, 0x5D, 0x3, 0x0, 0x0, 0x6D, 0x5D, 0x3, 0x0, 0x0, 0x8D, 0x5D, 0x3, 0x0, 0x0, 0xAD, 0x5D, 0x3, 0x0, 0x0, 0xCD, 0x5D, 0x3, 0x0, 0x0, 0xED, 0x5D, 0x3, 0x0, 0x0, 0xD, 0x5E, 0x3, 0x0, 0x0, 0x2D, 0x5E, 0x3, 0x0, 0x0, 0x4D, 0x5E, 0x3, 0x0, 0x0, 0x6D, 0x5E, 0x3, 0x0, 0x0, 0x8D, 0x5E, 0x3, 0x0, 0x0, 0xAD, 0x5E, 0x3, 0x0, 0x0, 0xCD, 0x5E, 0x3, 0x0, 0x0, 0xED, 0x5E, 0x3, 0x0, 0x0, 0xD, 0x5F, 0x3, 0x0, 0x0, 0x2D, 0x5F, 0x3, 0x0, 0x0, 0x4D, 0x5F, 0x3, 0x0, 0x0, 0x6D, 0x5F, 0x3, 0x0, 0x0, 0x8D, 0x5F, 0x3, 0x0, 0x0, 0xAD, 0x5F, 0x3, 0x0, 0x0, 0xCD, 0x5F, 0x3, 0x0, 0x0, 0xED, 0x5F, 0x3, 0x0, 0x0, 0xD, 0x60, 0x3, 0x0, 0x0, 0x2D, 0x60, 0x3, 0x0, 0x0, 0x4D, 0x60, 0x3, 0x0, 0x0, 0x6D, 0x60, 0x3, 0x0, 0x0, 0x8D, 0x60, 0x3, 0x0, 0x0, 0xAD, 0x60, 0x3, 0x0, 0x0, 0xCD, 0x60, 0x3, 0x0, 0x0, 0xED, 0x60, 0x3, 0x0, 0x0, 0xD, 0x61, 0x3, 0x0, 0x0, 0x2D, 0x61, 0x3, 0x0, 0x0, 0x4D, 0x61, 0x3, 0x0, 0x0, 0x6D, 0x61, 0x3, 0x0, 0x0, 0x8D, 0x61, 0x3, 0x0, 0x0, 0xAD, 0x61, 0x3, 0x0, 0x0, 0xCD, 0x61, 0x3, 0x0, 0x0, 0xED, 0x61, 0x3, 0x0, 0x0, 0xD, 0x62, 0x3, 0x0, 0x0, 0x2D, 0x62, 0x3, 0x0, 0x0, 0x4D, 0x62, 0x3, 0x0, 0x0, 0x6D, 0x62, 0x3, 0x0, 0x0, 0x8D, 0x62, 0x3, 0x0, 0x0, 0xAD, 0x62, 0x3, 0x0, 0x0, 0xCD, 0x62, 0x3, 0x0, 0x0, 0xED, 0x62, 0x3, 0x0, 0x0, 0xD, 0x63, 0x3, 0x0, 0x0, 0x2D, 0x63, 0x3, 0x0, 0x0, 0x4D, 0x63, 0x3, 0x0, 0x0, 0x6D, 0x63, 0x3, 0x0, 0x0, 0x8D, 0x63, 0x3, 0x0, 0x0, 0xAD, 0x63, 0x3, 0x0, 0x0, 0xCD, 0x63, 0x3, 0x0, 0x0, 0xED, 0x63, 0x3, 0x0, 0x0, 0xD, 0x64, 0x3, 0x0, 0x0, 0x2D, 0x64, 0x3, 0x0, 0x0, 0x4D, 0x64, 0x3, 0x0, 0x0, 0x6D, 0x64, 0x3, 0x0, 0x0, 0x8D, 0x64, 0x2B, 0xD9, 0x0, 0xCD, 0x64, 0x3B, 0xD9, 0x0, 0xD, 0x65, 0x4B, 0xD9, 0x0, 0xD, 0x0, 0x50, 0xD9, 0x0, 0xD, 0x0, 0x58, 0xD9, 0x0, 0xD, 0x0, 0x60, 0xD9, 0x0, 0xD, 0x0, 0x68, 0xD9, 0x0, 0xD, 0x0, 0x70, 0xD9, 0x0, 0xD, 0x0, 0x78, 0xD9, 0x0, 0xD, 0x0, 0x80, 0xD9, 0x0, 0xD, 0x0, 0x88, 0xD9, 0x0, 0xD, 0x0, 0x90, 0xD9, 0x0, 0xD, 0x0, 0x98, 0xD9, 0x0, 0xD, 0x0, 0xA0, 0xD9, 0x0, 0xD, 0x0, 0xA8, 0xD9, 0x0, 0xD, 0x0, 0xB0, 0xD9, 0x0, 0xD, 0x0, 0xB8, 0xD9, 0x0, 0xD, 0x0, 0xC0, 0xD9, 0x0, 0xD, 0x0, 0xC8, 0xD9, 0x0, 0xD, 0x0, 0xD0, 0xD9, 0x0, 0xD, 0x0, 0xD8, 0xD9, 0x0, 0xD, 0x0, 0xE0, 0xD9, 0x0, 0xD, 0x0, 0xE8, 0xD9, 0x0, 0xD, 0x0, 0xF0, 0xD9, 0x0, 0xD, 0x0, 0xF8, 0xD9, 0x0, 0xD, 0x0, 0x0, 0xDA, 0x0, 0xD, 0x0, 0x8, 0xDA, 0x0, 0xD, 0x0, 0x10, 0xDA, 0x0, 0xD, 0x0, 0x18, 0xDA, 0x0, 0xD, 0x0, 0x20, 0xDA, 0x0, 0xD, 0x0, 0x28, 0xDA, 0x0, 0xD, 0x0, 0x30, 0xDA, 0x0, 0xD, 0x0, 0x38, 0xDA, 0x0, 0xD, 0x0, 0x40, 0xDA, 0x0, 0xD, 0x0, 0x48, 0xDA, 0x0, 0xD, 0x0, 0x50, 0xDA, 0x0, 0xD, 0x0, 0x58, 0xDA, 0x0, 0xD, 0x0, 0x60, 0xDA, 0x0, 0xD, 0x0, 0x68, 0xDA, 0x0, 0xD, 0x0, 0x70, 0xDA, 0x0, 0xD, 0x0, 0x78, 0xDA, 0x0, 0xD, 0x0, 0x80, 0xDA, 0x0, 0xD, 0x0, 0x88, 0xDA, 0x0, 0xD, 0x0, 0x90, 0xDA, 0x0, 0xD, 0x0, 0x98, 0xDA, 0x0, 0xD, 0x0, 0xA0, 0xDA, 0x0, 0xD, 0x0, 0xA8, 0xDA, 0x0, 0xD, 0x0, 0xB0, 0xDA, 0x0, 0xD, 0x0, 0xB8, 0xDA, 0x0, 0xD, 0x0, 0xC0, 0xDA, 0x0, 0xD, 0x0, 0xC8, 0xDA, 0x0, 0xD, 0x0, 0xD0, 0xDA, 0x0, 0xD, 0x0, 0xD8, 0xDA, 0x0, 0xD, 0x0, 0xE0, 0xDA, 0x0, 0xD, 0x0, 0xE8, 0xDA, 0x0, 0xD, 0x0, 0xF0, 0xDA, 0x0, 0xD, 0x0, 0xF8, 0xDA, 0x0, 0xD, 0x0, 0x0, 0xDB, 0x0, 0xD, 0x0, 0x8, 0xDB, 0x0, 0xD, 0x0, 0x10, 0xDB, 0x0, 0xD, 0x0, 0x18, 0xDB, 0x0, 0xD, 0x0, 0x20, 0xDB, 0x0, 0xD, 0x0, 0x28, 0xDB, 0x0, 0xD, 0x0, 0x30, 0xDB, 0x0, 0xD, 0x0, 0x38, 0xDB, 0x0, 0xD, 0x0, 0x40, 0xDB, 0x0, 0xD, 0x0, 0x48, 0xDB, 0x0, 0xD, 0x0, 0x50, 0xDB, 0x0, 0xD, 0x0, 0x58, 0xDB, 0x0, 0xD, 0x0, 0x60, 0xDB, 0x0, 0xD, 0x0, 0x68, 0xDB, 0x0, 0xD, 0x0, 0x70, 0xDB, 0x0, 0xD, 0x0, 0x78, 0xDB, 0x0, 0xD, 0x0, 0x80, 0xDB, 0x0, 0xD, 0x0, 0x88, 0xDB, 0x0, 0xD, 0x0, 0x90, 0xDB, 0x0, 0xD, 0x0, 0x98, 0xDB, 0x0, 0xD, 0x0, 0xA0, 0xDB, 0x0, 0xD, 0x0, 0xA8, 0xDB, 0x0, 0xD, 0x0, 0xB0, 0xDB, 0x0, 0xD, 0x0, 0xB8, 0xDB, 0x0, 0xD, 0x0, 0xC0, 0xDB, 0x0, 0xD, 0x0, 0xC8, 0xDB, 0x0, 0xD, 0x0, 0xD0, 0xDB, 0x0, 0xD, 0x0, 0xD8, 0xDB, 0x0, 0xD, 0x0, 0xE0, 0xDB, 0x0, 0xD, 0x0, 0xE8, 0xDB, 0x0, 0xD, 0x0, 0xF0, 0xDB, 0x0, 0xD, 0x0, 0xF8, 0xDB, 0x0, 0xD, 0x0, 0x0, 0xDC, 0x0, 0xD, 0x0, 0x8, 0xDC, 0x0, 0xD, 0x0, 0x10, 0xDC, 0x0, 0xD, 0x0, 0x18, 0xDC, 0x0, 0xD, 0x0, 0x20, 0xDC, 0x0, 0xD, 0x0, 0x28, 0xDC, 0x0, 0xD, 0x0, 0x30, 0xDC, 0x0, 0xD, 0x0, 0x38, 0xDC, 0x0, 0xD, 0x0, 0x40, 0xDC, 0x0, 0xD, 0x0, 0x48, 0xDC, 0x0, 0xD, 0x0, 0x50, 0xDC, 0x0, 0xD, 0x0, 0x58, 0xDC, 0x0, 0xD, 0x0, 0x60, 0xDC, 0x0, 0xD, 0x0, 0x68, 0xDC, 0x0, 0xD, 0x0, 0x70, 0xDC, 0x0, 0xD, 0x0, 0x78, 0xDC, 0x0, 0xD, 0x0, 0x80, 0xDC, 0x0, 0xD, 0x0, 0x88, 0xDC, 0x0, 0xD, 0x0, 0x90, 0xDC, 0x0, 0xD, 0x0, 0x98, 0xDC, 0x0, 0xD, 0x0, 0xA0, 0xDC, 0x0, 0xD, 0x0, 0xA8, 0xDC, 0x0, 0xD, 0x0, 0xB0, 0xDC, 0x0, 0xD, 0x0, 0xB8, 0xDC, 0x0, 0xD, 0x0, 0xC0, 0xDC, 0x0, 0xD, 0x0, 0xC8, 0xDC, 0x0, 0xD, 0x0, 0xD0, 0xDC, 0x0, 0xD, 0x0, 0xD8, 0xDC, 0x0, 0xD, 0x0, 0xE0, 0xDC, 0x0, 0xD, 0x0, 0xE8, 0xDC, 0x0, 0xD, 0x0, 0xF0, 0xDC, 0x0, 0xD, 0x0, 0xF8, 0xDC, 0x0, 0xD, 0x0, 0x0, 0xDD, 0x0, 0xD, 0x0, 0x8, 0xDD, 0x0, 0xD, 0x0, 0x10, 0xDD, 0x0, 0xD, 0x0, 0x18, 0xDD, 0x0, 0xD, 0x0, 0x20, 0xDD, 0x0, 0xD, 0x0, 0x28, 0xDD, 0x0, 0xD, 0x0, 0x30, 0xDD, 0x0, 0xD, 0x0, 0x38, 0xDD, 0x0, 0xD, 0x0, 0x40, 0xDD, 0x0, 0xD, 0x0, 0x48, 0xDD, 0x0, 0xD, 0x0, 0x50, 0xDD, 0x0, 0xD, 0x0, 0x58, 0xDD, 0x0, 0xD, 0x0, 0x60, 0xDD, 0x0, 0xD, 0x0, 0x68, 0xDD, 0x0, 0xD, 0x0, 0x70, 0xDD, 0x0, 0xD, 0x0, 0x78, 0xDD, 0x0, 0xD, 0x0, 0x80, 0xDD, 0x0, 0xD, 0x0, 0x88, 0xDD, 0x0, 0xD, 0x0, 0x90, 0xDD, 0x0, 0xD, 0x0, 0x98, 0xDD, 0x0, 0xD, 0x0, 0xA0, 0xDD, 0x0, 0xD, 0x0, 0xA8, 0xDD, 0x0, 0xD, 0x0, 0xB0, 0xDD, 0x0, 0xD, 0x0, 0xB8, 0xDD, 0x0, 0xD, 0x0, 0xC0, 0xDD, 0x0, 0xD, 0x0, 0xC8, 0xDD, 0x0, 0xD, 0x0, 0xD0, 0xDD, 0x0, 0xD, 0x0, 0xD8, 0xDD, 0x0, 0xD, 0x0, 0xE0, 0xDD, 0x0, 0xD, 0x0, 0xE8, 0xDD, 0x0, 0xD, 0x0, 0xF0, 0xDD, 0x0, 0xD, 0x0, 0xF8, 0xDD, 0x0, 0xD, 0x0, 0x0, 0xDE, 0x0, 0xD, 0x0, 0x8, 0xDE, 0x0, 0xD, 0x0, 0x10, 0xDE, 0x0, 0xD, 0x0, 0x18, 0xDE, 0x0, 0xD, 0x0, 0x20, 0xDE, 0x0, 0xD, 0x0, 0x28, 0xDE, 0x0, 0xD, 0x0, 0x30, 0xDE, 0x0, 0xD, 0x0, 0x38, 0xDE, 0x0, 0xD, 0x0, 0x40, 0xDE, 0x0, 0xD, 0x0, 0x48, 0xDE, 0x0, 0xD, 0x0, 0x50, 0xDE, 0x0, 0xD, 0x0, 0x58, 0xDE, 0x0, 0xD, 0x0, 0x60, 0xDE, 0x0, 0xD, 0x0, 0x68, 0xDE, 0x0, 0xD, 0x0, 0x70, 0xDE, 0x0, 0xD, 0x0, 0x78, 0xDE, 0x0, 0xD, 0x0, 0x80, 0xDE, 0x0, 0xD, 0x0, 0x88, 0xDE, 0x0, 0xD, 0x0, 0x90, 0xDE, 0x0, 0xD, 0x0, 0x98, 0xDE, 0x0, 0xD, 0x0, 0xA0, 0xDE, 0x0, 0xD, 0x0, 0xA8, 0xDE, 0x0, 0xD, 0x0, 0xB0, 0xDE, 0x0, 0xD, 0x0, 0xB8, 0xDE, 0x0, 0xD, 0x0, 0xC0, 0xDE, 0x0, 0xD, 0x0, 0xC8, 0xDE, 0x0, 0xD, 0x0, 0xD0, 0xDE, 0x0, 0xD, 0x0, 0xD8, 0xDE, 0x0, 0xD, 0x0, 0xE0, 0xDE, 0x0, 0xD, 0x0, 0xE8, 0xDE, 0x0, 0xD, 0x0, 0xF0, 0xDE, 0x0, 0xD, 0x0, 0xF8, 0xDE, 0x0, 0xD, 0x0, 0x0, 0xDF, 0x0, 0xD, 0x0, 0x8, 0xDF, 0x0, 0xD, 0x0, 0x10, 0xDF, 0x0, 0xD, 0x0, 0x18, 0xDF, 0x0, 0xD, 0x0, 0x20, 0xDF, 0x0, 0xD, 0x0, 0x28, 0xDF, 0x0, 0xD, 0x0, 0x30, 0xDF, 0x0, 0xD, 0x0, 0x38, 0xDF, 0x0, 0xD, 0x0, 0x40, 0xDF, 0x0, 0xD, 0x0, 0x48, 0xDF, 0x0, 0xD, 0x0, 0x50, 0xDF, 0x0, 0xD, 0x0, 0x58, 0xDF, 0x0, 0xD, 0x0, 0x60, 0xDF, 0x0, 0xD, 0x0, 0x68, 0xDF, 0x0, 0xD, 0x0, 0x70, 0xDF, 0x0, 0xD, 0x0, 0x78, 0xDF, 0x0, 0xD, 0x0, 0x80, 0xDF, 0x0, 0xD, 0x0, 0x88, 0xDF, 0x0, 0xD, 0x0, 0x90, 0xDF, 0x0, 0xD, 0x0, 0x98, 0xDF, 0x0, 0xD, 0x0, 0xA0, 0xDF, 0x0, 0xD, 0x0, 0xA8, 0xDF, 0x0, 0xD, 0x0, 0xB0, 0xDF, 0x0, 0xD, 0x0, 0xB8, 0xDF, 0x0, 0xD, 0x0, 0xC0, 0xDF, 0x0, 0xD, 0x0, 0xC8, 0xDF, 0x0, 0xD, 0x0, 0xD0, 0xDF, 0x0, 0xD, 0x0, 0xD8, 0xDF, 0x0, 0xD, 0x0, 0xE0, 0xDF, 0x0, 0xD, 0x0, 0xE8, 0xDF, 0x0, 0xD, 0x0, 0xF0, 0xDF, 0x0, 0xD, 0x0, 0xF8, 0xDF, 0x0, 0xD, 0x0, 0x0, 0xE0, 0x0, 0xD, 0x0, 0x8, 0xE0, 0x0, 0xD, 0x0, 0x10, 0xE0, 0x0, 0xD, 0x0, 0x18, 0xE0, 0x0, 0xD, 0x0, 0x20, 0xE0, 0x0, 0xD, 0x0, 0x28, 0xE0, 0x0, 0xD, 0x0, 0x30, 0xE0, 0x0, 0xD, 0x0, 0x38, 0xE0, 0x0, 0xD, 0x0, 0x40, 0xE0, 0x0, 0xD, 0x0, 0x48, 0xE0, 0x0, 0xD, 0x0, 0x50, 0xE0, 0x0, 0xD, 0x0, 0x58, 0xE0, 0x0, 0xD, 0x0, 0x60, 0xE0, 0x0, 0xD, 0x0, 0x68, 0xE0, 0x0, 0xD, 0x0, 0x70, 0xE0, 0x0, 0xD, 0x0, 0x78, 0xE0, 0x0, 0xD, 0x0, 0x80, 0xE0, 0x0, 0xD, 0x0, 0x88, 0xE0, 0x0, 0xD, 0x0, 0x90, 0xE0, 0x0, 0xD, 0x0, 0x98, 0xE0, 0x0, 0xD, 0x0, 0xA0, 0xE0, 0x0, 0xD, 0x0, 0xA8, 0xE0, 0x0, 0xD, 0x0, 0xB0, 0xE0, 0x0, 0xD, 0x0, 0xB8, 0xE0, 0x0, 0xD, 0x0, 0xC0, 0xE0, 0x0, 0xD, 0x0, 0xC8, 0xE0, 0x0, 0xD, 0x0, 0xD0, 0xE0, 0x0, 0xD, 0x0, 0xD8, 0xE0, 0x0, 0xD, 0x0, 0xE0, 0xE0, 0x0, 0xD, 0x0, 0xE8, 0xE0, 0x0, 0xD, 0x0, 0xF0, 0xE0, 0x0, 0xD, 0x0, 0xF8, 0xE0, 0x0, 0xD, 0x0, 0x0, 0xE1, 0x0, 0xD, 0x0, 0x8, 0xE1, 0x0, 0xD, 0x0, 0x10, 0xE1, 0x0, 0xD, 0x0, 0x18, 0xE1, 0x0, 0xD, 0x0, 0x20, 0xE1, 0x0, 0xD, 0x0, 0x28, 0xE1, 0x0, 0xD, 0x0, 0x30, 0xE1, 0x0, 0xD, 0x0, 0x38, 0xE1, 0x0, 0xD, 0x0, 0x40, 0xE1, 0x0, 0xD, 0x0, 0x48, 0xE1, 0x0, 0xD, 0x0, 0x50, 0xE1, 0x0, 0xD, 0x0, 0x58, 0xE1, 0x0, 0xD, 0x0, 0x60, 0xE1, 0x0, 0xD, 0x0, 0x68, 0xE1, 0x0, 0xD, 0x0, 0x70, 0xE1, 0x0, 0xD, 0x0, 0x78, 0xE1, 0x0, 0xD, 0x0, 0x80, 0xE1, 0x0, 0xD, 0x0, 0x88, 0xE1, 0x0, 0xD, 0x0, 0x90, 0xE1, 0x0, 0xD, 0x0, 0x98, 0xE1, 0x0, 0xD, 0x0, 0xA0, 0xE1, 0x0, 0xD, 0x0, 0xA8, 0xE1, 0x0, 0xD, 0x0, 0xB0, 0xE1, 0x0, 0xD, 0x0, 0xB8, 0xE1, 0x0, 0xD, 0x0, 0xC0, 0xE1, 0x0, 0xD, 0x0, 0xC8, 0xE1, 0x0, 0xD, 0x0, 0xD0, 0xE1, 0x0, 0xD, 0x0, 0xD8, 0xE1, 0x0, 0xD, 0x0, 0xE0, 0xE1, 0x0, 0xD, 0x0, 0xE8, 0xE1, 0x0, 0xD, 0x0, 0xF0, 0xE1, 0x0, 0xD, 0x0, 0xF8, 0xE1, 0x0, 0xD, 0x0, 0x0, 0xE2, 0x0, 0xD, 0x0, 0x8, 0xE2, 0x0, 0xD, 0x0, 0x10, 0xE2, 0x0, 0xD, 0x0, 0x18, 0xE2, 0x0, 0xD, 0x0, 0x20, 0xE2, 0x0, 0xD, 0x0, 0x28, 0xE2, 0x0, 0xD, 0x0, 0x30, 0xE2, 0x0, 0xD, 0x0, 0x38, 0xE2, 0x0, 0xD, 0x0, 0x40, 0xE2, 0x0, 0xD, 0x0, 0x48, 0xE2, 0x0, 0xD, 0x0, 0x50, 0xE2, 0x0, 0xD, 0x0, 0x58, 0xE2, 0x0, 0xD, 0x0, 0x60, 0xE2, 0x0, 0xD, 0x0, 0x68, 0xE2, 0x0, 0xD, 0x0, 0x70, 0xE2, 0x0, 0xD, 0x0, 0x78, 0xE2, 0x0, 0xD, 0x0, 0x80, 0xE2, 0x0, 0xD, 0x0, 0x88, 0xE2, 0x0, 0xD, 0x0, 0x90, 0xE2, 0x0, 0xD, 0x0, 0x98, 0xE2, 0x0, 0xD, 0x0, 0xA0, 0xE2, 0x0, 0xD, 0x0, 0xA8, 0xE2, 0x0, 0xD, 0x0, 0xB0, 0xE2, 0x0, 0xD, 0x0, 0xB8, 0xE2, 0x0, 0xD, 0x0, 0xC0, 0xE2, 0x0, 0xD, 0x0, 0xC8, 0xE2, 0x0, 0xD, 0x0, 0xD0, 0xE2, 0x0, 0xD, 0x0, 0xD8, 0xE2, 0x0, 0xD, 0x0, 0xE0, 0xE2, 0x0, 0xD, 0x0, 0xE8, 0xE2, 0x0, 0xD, 0x0, 0xF0, 0xE2, 0x0, 0xD, 0x0, 0xF8, 0xE2, 0x0, 0xD, 0x0, 0x0, 0xE3, 0x0, 0xD, 0x0, 0x8, 0xE3, 0x0, 0xD, 0x0, 0x10, 0xE3, 0x0, 0xD, 0x0, 0x18, 0xE3, 0x0, 0xD, 0x0, 0x20, 0xE3, 0x0, 0xD, 0x0, 0x28, 0xE3, 0x0, 0xD, 0x0, 0x30, 0xE3, 0x0, 0xD, 0x0, 0x38, 0xE3, 0x0, 0xD, 0x0, 0x40, 0xE3, 0x0, 0xD, 0x0, 0x48, 0xE3, 0x0, 0xD, 0x0, 0x50, 0xE3, 0x0, 0xD, 0x0, 0x58, 0xE3, 0x0, 0xD, 0x0, 0x60, 0xE3, 0x0, 0xD, 0x0, 0x68, 0xE3, 0x0, 0xD, 0x0, 0x70, 0xE3, 0x0, 0xD, 0x0, 0x78, 0xE3, 0x0, 0xD, 0x0, 0x80, 0xE3, 0x0, 0xD, 0x0, 0x88, 0xE3, 0x0, 0xD, 0x0, 0x90, 0xE3, 0x0, 0xD, 0x0, 0x98, 0xE3, 0x0, 0xD, 0x0, 0xA0, 0xE3, 0x0, 0xD, 0x0, 0xA8, 0xE3, 0x0, 0xD, 0x0, 0xB0, 0xE3, 0x0, 0xD, 0x0, 0xB8, 0xE3, 0x0, 0xD, 0x0, 0xC0, 0xE3, 0x0, 0xD, 0x0, 0xC8, 0xE3, 0x0, 0xD, 0x0, 0xD0, 0xE3, 0x0, 0xD, 0x0, 0xD8, 0xE3, 0x0, 0xD, 0x0, 0xE0, 0xE3, 0x0, 0xD, 0x0, 0xE8, 0xE3, 0x0, 0xD, 0x0, 0xF0, 0xE3, 0x0, 0xD, 0x0, 0xF8, 0xE3, 0x0, 0xD, 0x0, 0x0, 0xE4, 0x0, 0xD, 0x0, 0x8, 0xE4, 0x0, 0xD, 0x0, 0x10, 0xE4, 0x0, 0xD, 0x0, 0x18, 0xE4, 0x0, 0xD, 0x0, 0x20, 0xE4, 0x0, 0xD, 0x0, 0x28, 0xE4, 0x0, 0xD, 0x0, 0x30, 0xE4, 0x0, 0xD, 0x0, 0x38, 0xE4, 0x0, 0xD, 0x0, 0x40, 0xE4, 0x0, 0xD, 0x0, 0x48, 0xE4, 0x0, 0xD, 0x0, 0x50, 0xE4, 0x0, 0xD, 0x0, 0x58, 0xE4, 0x0, 0xD, 0x0, 0x60, 0xE4, 0x0, 0xD, 0x0, 0x68, 0xE4, 0x0, 0xD, 0x0, 0x70, 0xE4, 0x0, 0xD, 0x0, 0x78, 0xE4, 0x0, 0xD, 0x0, 0x80, 0xE4, 0x0, 0xD, 0x0, 0x88, 0xE4, 0x0, 0xD, 0x0, 0x90, 0xE4, 0x0, 0xD, 0x0, 0x98, 0xE4, 0x0, 0xD, 0x0, 0xA0, 0xE4, 0x0, 0xD, 0x0, 0xA8, 0xE4, 0x0, 0xD, 0x0, 0xB0, 0xE4, 0x0, 0xD, 0x0, 0xB8, 0xE4, 0x0, 0xD, 0x0, 0xC0, 0xE4, 0x0, 0xD, 0x0, 0xC8, 0xE4, 0x0, 0xD, 0x0, 0xD0, 0xE4, 0x0, 0xD, 0x0, 0xD8, 0xE4, 0x0, 0xD, 0x0, 0xE0, 0xE4, 0x0, 0xD, 0x0, 0xE8, 0xE4, 0x0, 0xD, 0x0, 0xF0, 0xE4, 0x0, 0xD, 0x0, 0xF8, 0xE4, 0x0, 0xD, 0x0, 0x0, 0xE5, 0x0, 0xD, 0x0, 0x8, 0xE5, 0x0, 0xD, 0x0, 0x10, 0xE5, 0x0, 0xD, 0x0, 0x18, 0xE5, 0x0, 0xD, 0x0, 0x20, 0xE5, 0x0, 0xD, 0x0, 0x28, 0xE5, 0x0, 0xD, 0x0, 0x30, 0xE5, 0x0, 0xD, 0x0, 0x38, 0xE5, 0x0, 0xD, 0x0, 0x40, 0xE5, 0x0, 0xD, 0x0, 0x48, 0xE5, 0x0, 0xD, 0x0, 0x50, 0xE5, 0x0, 0xD, 0x0, 0x58, 0xE5, 0x0, 0xD, 0x0, 0x60, 0xE5, 0x0, 0xD, 0x0, 0x68, 0xE5, 0x0, 0xD, 0x0, 0x70, 0xE5, 0x0, 0xD, 0x0, 0x78, 0xE5, 0x0, 0xD, 0x0, 0x80, 0xE5, 0x0, 0xD, 0x0, 0x88, 0xE5, 0x0, 0xD, 0x0, 0x90, 0xE5, 0x0, 0xD, 0x0, 0x98, 0xE5, 0x0, 0xD, 0x0, 0xA0, 0xE5, 0x0, 0xD, 0x0, 0xA8, 0xE5, 0x0, 0xD, 0x0, 0xB0, 0xE5, 0x0, 0xD, 0x0, 0xB8, 0xE5, 0x0, 0xD, 0x0, 0xC0, 0xE5, 0x0, 0xD, 0x0, 0xC8, 0xE5, 0x0, 0xD, 0x0, 0xD0, 0xE5, 0x0, 0xD, 0x0, 0xD8, 0xE5, 0x0, 0xD, 0x0, 0xE0, 0xE5, 0x0, 0xD, 0x0, 0xE8, 0xE5, 0x0, 0xD, 0x0, 0xF0, 0xE5, 0x0, 0xD, 0x0, 0xF8, 0xE5, 0x0, 0xD, 0x0, 0x0, 0xE6, 0x0, 0xD, 0x0, 0x8, 0xE6, 0x0, 0xD, 0x0, 0x10, 0xE6, 0x0, 0xD, 0x0, 0x18, 0xE6, 0x0, 0xD, 0x0, 0x20, 0xE6, 0x0, 0xD, 0x0, 0x28, 0xE6, 0x0, 0xD, 0x0, 0x30, 0xE6, 0x0, 0xD, 0x0, 0x38, 0xE6, 0x0, 0xD, 0x0, 0x40, 0xE6, 0x0, 0xD, 0x0, 0x48, 0xE6, 0x0, 0xD, 0x0, 0x50, 0xE6, 0x0, 0xD, 0x0, 0x58, 0xE6, 0x0, 0xD, 0x0, 0x60, 0xE6, 0x0, 0xD, 0x0, 0x68, 0xE6, 0x0, 0xD, 0x0, 0x70, 0xE6, 0x0, 0xD, 0x0, 0x78, 0xE6, 0x0, 0xD, 0x0, 0x80, 0xE6, 0x0, 0xD, 0x0, 0x88, 0xE6, 0x0, 0xD, 0x0, 0x90, 0xE6, 0x0, 0xD, 0x0, 0x98, 0xE6, 0x0, 0xD, 0x0, 0xA0, 0xE6, 0x0, 0xD, 0x0, 0xA8, 0xE6, 0x0, 0xD, 0x0, 0xB0, 0xE6, 0x0, 0xD, 0x0, 0xB8, 0xE6, 0x0, 0xD, 0x0, 0xC0, 0xE6, 0x0, 0xD, 0x0, 0xC8, 0xE6, 0x0, 0xD, 0x0, 0xD0, 0xE6, 0x0, 0xD, 0x0, 0xD8, 0xE6, 0x0, 0xD, 0x0, 0xE0, 0xE6, 0x0, 0xD, 0x0, 0xE8, 0xE6, 0x0, 0xD, 0x0, 0xF0, 0xE6, 0x0, 0xD, 0x0, 0xF8, 0xE6, 0x0, 0xD, 0x0, 0x0, 0xE7, 0x0, 0xD, 0x0, 0x8, 0xE7, 0x0, 0xD, 0x0, 0x10, 0xE7, 0x0, 0xD, 0x0, 0x18, 0xE7, 0x0, 0xD, 0x0, 0x20, 0xE7, 0x0, 0xD, 0x0, 0x28, 0xE7, 0x0, 0xD, 0x0, 0x30, 0xE7, 0x0, 0xD, 0x0, 0x38, 0xE7, 0x0, 0xD, 0x0, 0x40, 0xE7, 0x0, 0xD, 0x0, 0x48, 0xE7, 0x0, 0xD, 0x0, 0x50, 0xE7, 0x0, 0xD, 0x0, 0x58, 0xE7, 0x0, 0xD, 0x0, 0x60, 0xE7, 0x0, 0xD, 0x0, 0x68, 0xE7, 0x0, 0xD, 0x0, 0x70, 0xE7, 0x0, 0xD, 0x0, 0x78, 0xE7, 0x0, 0xD, 0x0, 0x80, 0xE7, 0x0, 0xD, 0x0, 0x88, 0xE7, 0x0, 0xD, 0x0, 0x90, 0xE7, 0x0, 0xD, 0x0, 0x98, 0xE7, 0x0, 0xD, 0x0, 0xA0, 0xE7, 0x0, 0xD, 0x0, 0xA8, 0xE7, 0x0, 0xD, 0x0, 0xB0, 0xE7, 0x0, 0xD, 0x0, 0xB8, 0xE7, 0x0, 0xD, 0x0, 0xC0, 0xE7, 0x0, 0xD, 0x0, 0xC8, 0xE7, 0x0, 0xD, 0x0, 0xD0, 0xE7, 0x0, 0xD, 0x0, 0xD8, 0xE7, 0x0, 0xD, 0x0, 0xE0, 0xE7, 0x0, 0xD, 0x0, 0xE8, 0xE7, 0x0, 0xD, 0x0, 0xF0, 0xE7, 0x0, 0xD, 0x0, 0xF8, 0xE7, 0x0, 0xD, 0x0, 0x0, 0xE8, 0x0, 0xD, 0x0, 0x8, 0xE8, 0x0, 0xD, 0x0, 0x10, 0xE8, 0x0, 0xD, 0x0, 0x18, 0xE8, 0x0, 0xD, 0x0, 0x20, 0xE8, 0x0, 0xD, 0x0, 0x28, 0xE8, 0x0, 0xD, 0x0, 0x30, 0xE8, 0x0, 0xD, 0x0, 0x38, 0xE8, 0x0, 0xD, 0x0, 0x40, 0xE8, 0x0, 0xD, 0x0, 0x48, 0xE8, 0x0, 0xD, 0x0, 0x50, 0xE8, 0x0, 0xD, 0x0, 0x58, 0xE8, 0x0, 0xD, 0x0, 0x60, 0xE8, 0x0, 0xD, 0x0, 0x68, 0xE8, 0x0, 0xD, 0x0, 0x70, 0xE8, 0x0, 0xD, 0x0, 0x78, 0xE8, 0x0, 0xD, 0x0, 0x80, 0xE8, 0x0, 0xD, 0x0, 0x88, 0xE8, 0x0, 0xD, 0x0, 0x90, 0xE8, 0x0, 0xD, 0x0, 0x98, 0xE8, 0x0, 0xD, 0x0, 0xA0, 0xE8, 0x0, 0xD, 0x0, 0xA8, 0xE8, 0x0, 0xD, 0x0, 0xB0, 0xE8, 0x0, 0xD, 0x0, 0xB8, 0xE8, 0x0, 0xD, 0x0, 0xC0, 0xE8, 0x0, 0xD, 0x0, 0xC8, 0xE8, 0x0, 0xD, 0x0, 0xD0, 0xE8, 0x0, 0xD, 0x0, 0xD8, 0xE8, 0x0, 0xD, 0x0, 0xE0, 0xE8, 0x0, 0xD, 0x0, 0xE8, 0xE8, 0x0, 0xD, 0x0, 0xF0, 0xE8, 0x0, 0xD, 0x0, 0xF8, 0xE8, 0x0, 0xD, 0x0, 0x0, 0xE9, 0x0, 0xD, 0x0, 0x8, 0xE9, 0x0, 0xD, 0x0, 0x10, 0xE9, 0x0, 0xD, 0x0, 0x18, 0xE9, 0x0, 0xD, 0x0, 0x20, 0xE9, 0x0, 0xD, 0x0, 0x28, 0xE9, 0x0, 0xD, 0x0, 0x30, 0xE9, 0x0, 0xD, 0x0, 0x38, 0xE9, 0x0, 0xD, 0x0, 0x40, 0xE9, 0x0, 0xD, 0x0, 0x48, 0xE9, 0x0, 0xD, 0x0, 0x50, 0xE9, 0x0, 0xD, 0x0, 0x58, 0xE9, 0x0, 0xD, 0x0, 0x60, 0xE9, 0x0, 0xD, 0x0, 0x68, 0xE9, 0x0, 0xD, 0x0, 0x70, 0xE9, 0x0, 0xD, 0x0, 0x78, 0xE9, 0x0, 0xD, 0x0, 0x80, 0xE9, 0x0, 0xD, 0x0, 0x88, 0xE9, 0x0, 0xD, 0x0, 0x90, 0xE9, 0x0, 0xD, 0x0, 0x98, 0xE9, 0x0, 0xD, 0x0, 0xA0, 0xE9, 0x0, 0xD, 0x0, 0xA8, 0xE9, 0x0, 0xD, 0x0, 0xB0, 0xE9, 0x0, 0xD, 0x0, 0xB8, 0xE9, 0x0, 0xD, 0x0, 0xC0, 0xE9, 0x0, 0xD, 0x0, 0xC8, 0xE9, 0x0, 0xD, 0x0, 0xD0, 0xE9, 0x0, 0xD, 0x0, 0xD8, 0xE9, 0x0, 0xD, 0x0, 0xE0, 0xE9, 0x0, 0xD, 0x0, 0xE8, 0xE9, 0x0, 0xD, 0x0, 0xF0, 0xE9, 0x0, 0xD, 0x0, 0xF8, 0xE9, 0x0, 0xD, 0x0, 0x0, 0xEA, 0x0, 0xD, 0x0, 0x8, 0xEA, 0x0, 0xD, 0x0, 0x10, 0xEA, 0x0, 0xD, 0x0, 0x18, 0xEA, 0x0, 0xD, 0x0, 0x20, 0xEA, 0x0, 0xD, 0x0, 0x28, 0xEA, 0x0, 0xD, 0x0, 0x30, 0xEA, 0x0, 0xD, 0x0, 0x38, 0xEA, 0x0, 0xD, 0x0, 0x40, 0xEA, 0x0, 0xD, 0x0, 0x48, 0xEA, 0x0, 0xD, 0x0, 0x50, 0xEA, 0x0, 0xD, 0x0, 0x58, 0xEA, 0x0, 0xD, 0x0, 0x60, 0xEA, 0x0, 0xD, 0x0, 0x68, 0xEA, 0x0, 0xD, 0x0, 0x70, 0xEA, 0x0, 0xD, 0x0, 0x78, 0xEA, 0x0, 0xD, 0x0, 0x80, 0xEA, 0x0, 0xD, 0x0, 0x88, 0xEA, 0x0, 0xD, 0x0, 0x90, 0xEA, 0x0, 0xD, 0x0, 0x98, 0xEA, 0x0, 0xD, 0x0, 0xA0, 0xEA, 0x0, 0xD, 0x0, 0xA8, 0xEA, 0x0, 0xD, 0x0, 0xB0, 0xEA, 0x0, 0xD, 0x0, 0xB8, 0xEA, 0x0, 0xD, 0x0, 0xC0, 0xEA, 0x0, 0xD, 0x0, 0xC8, 0xEA, 0x0, 0xD, 0x0, 0xD0, 0xEA, 0x0, 0xD, 0x0, 0xD8, 0xEA, 0x0, 0xD, 0x0, 0xE0, 0xEA, 0x0, 0xD, 0x0, 0xE8, 0xEA, 0x0, 0xD, 0x0, 0xF0, 0xEA, 0x0, 0xD, 0x0, 0xF8, 0xEA, 0x0, 0xD, 0x0, 0x0, 0xEB, 0x0, 0xD, 0x0, 0x8, 0xEB, 0x0, 0xD, 0x0, 0x10, 0xEB, 0x0, 0xD, 0x0, 0x18, 0xEB, 0x0, 0xD, 0x0, 0x20, 0xEB, 0x0, 0xD, 0x0, 0x28, 0xEB, 0x0, 0xD, 0x0, 0x30, 0xEB, 0x0, 0xD, 0x0, 0x38, 0xEB, 0x0, 0xD, 0x0, 0x40, 0xEB, 0x0, 0xD, 0x0, 0x48, 0xEB, 0x0, 0xD, 0x0, 0x50, 0xEB, 0x0, 0xD, 0x0, 0x58, 0xEB, 0x0, 0xD, 0x0, 0x60, 0xEB, 0x0, 0xD, 0x0, 0x68, 0xEB, 0x0, 0xD, 0x0, 0x70, 0xEB, 0x0, 0xD, 0x0, 0x78, 0xEB, 0x0, 0xD, 0x0, 0x80, 0xEB, 0x0, 0xD, 0x0, 0x88, 0xEB, 0x0, 0xD, 0x0, 0x90, 0xEB, 0x0, 0xD, 0x0, 0x98, 0xEB, 0x0, 0xD, 0x0, 0xA0, 0xEB, 0x0, 0xD, 0x0, 0xA8, 0xEB, 0x0, 0xD, 0x0, 0xB0, 0xEB, 0x0, 0xD, 0x0, 0xB8, 0xEB, 0x0, 0xD, 0x0, 0xC0, 0xEB, 0x0, 0xD, 0x0, 0xC8, 0xEB, 0x0, 0xD, 0x0, 0xD0, 0xEB, 0x0, 0xD, 0x0, 0xD8, 0xEB, 0x0, 0xD, 0x0, 0xE0, 0xEB, 0x0, 0xD, 0x0, 0xE8, 0xEB, 0x0, 0xD, 0x0, 0xF0, 0xEB, 0x0, 0xD, 0x0, 0xF8, 0xEB, 0x0, 0xD, 0x0, 0x0, 0xEC, 0x0, 0xD, 0x0, 0x8, 0xEC, 0x0, 0xD, 0x0, 0x10, 0xEC, 0x0, 0xD, 0x0, 0x18, 0xEC, 0x0, 0xD, 0x0, 0x20, 0xEC, 0x0, 0xD, 0x0, 0x28, 0xEC, 0x0, 0xD, 0x0, 0x30, 0xEC, 0x0, 0xD, 0x0, 0x38, 0xEC, 0x0, 0xD, 0x0, 0x40, 0xEC, 0x0, 0xD, 0x0, 0x48, 0xEC, 0x0, 0xD, 0x0, 0x50, 0xEC, 0x0, 0xD, 0x0, 0x58, 0xEC, 0x0, 0xD, 0x0, 0x60, 0xEC, 0x0, 0xD, 0x0, 0x68, 0xEC, 0x0, 0xD, 0x0, 0x70, 0xEC, 0x0, 0xD, 0x0, 0x78, 0xEC, 0x0, 0xD, 0x0, 0x80, 0xEC, 0x0, 0xD, 0x0, 0x88, 0xEC, 0x0, 0xD, 0x0, 0x90, 0xEC, 0x0, 0xD, 0x0, 0x98, 0xEC, 0x0, 0xD, 0x0, 0xA0, 0xEC, 0x0, 0xD, 0x0, 0xA8, 0xEC, 0x0, 0xD, 0x0, 0xB0, 0xEC, 0x0, 0xD, 0x0, 0xB8, 0xEC, 0x0, 0xD, 0x0, 0xC0, 0xEC, 0x0, 0xD, 0x0, 0xC8, 0xEC, 0x0, 0xD, 0x0, 0xD0, 0xEC, 0x0, 0xD, 0x0, 0xD8, 0xEC, 0x0, 0xD, 0x0, 0xE0, 0xEC, 0x0, 0xD, 0x0, 0xE8, 0xEC, 0x0, 0xD, 0x0, 0xF0, 0xEC, 0x0, 0xD, 0x0, 0xF8, 0xEC, 0x0, 0xD, 0x0, 0x0, 0xED, 0x0, 0xD, 0x0, 0x8, 0xED, 0x0, 0xD, 0x0, 0x10, 0xED, 0x0, 0xD, 0x0, 0x18, 0xED, 0x0, 0xD, 0x0, 0x20, 0xED, 0x0, 0xD, 0x0, 0x28, 0xED, 0x0, 0xD, 0x0, 0x30, 0xED, 0x0, 0xD, 0x0, 0x38, 0xED, 0x0, 0xD, 0x0, 0x40, 0xED, 0x0, 0xD, 0x0, 0x48, 0xED, 0x0, 0xD, 0x0, 0x50, 0xED, 0x0, 0xD, 0x0, 0x58, 0xED, 0x0, 0xD, 0x0, 0x60, 0xED, 0x0, 0xD, 0x0, 0x68, 0xED, 0x0, 0xD, 0x0, 0x70, 0xED, 0x0, 0xD, 0x0, 0x78, 0xED, 0x0, 0xD, 0x0, 0x80, 0xED, 0x0, 0xD, 0x0, 0x88, 0xED, 0x0, 0xD, 0x0, 0x90, 0xED, 0x0, 0xD, 0x0, 0x98, 0xED, 0x0, 0xD, 0x0, 0xA0, 0xED, 0x0, 0xD, 0x0, 0xA8, 0xED, 0x0, 0xD, 0x0, 0xB0, 0xED, 0x0, 0xD, 0x0, 0xB8, 0xED, 0x0, 0xD, 0x0, 0xC0, 0xED, 0x0, 0xD, 0x0, 0xC8, 0xED, 0x0, 0xD, 0x0, 0xD0, 0xED, 0x0, 0xD, 0x0, 0xD8, 0xED, 0x0, 0xD, 0x0, 0xE0, 0xED, 0x0, 0xD, 0x0, 0xE8, 0xED, 0x0, 0xD, 0x0, 0xF0, 0xED, 0x0, 0xD, 0x0, 0xF8, 0xED, 0x0, 0xD, 0x0, 0x0, 0xEE, 0x0, 0xD, 0x0, 0x8, 0xEE, 0x0, 0xD, 0x0, 0x10, 0xEE, 0x0, 0xD, 0x0, 0x18, 0xEE, 0x0, 0xD, 0x0, 0x20, 0xEE, 0x0, 0xD, 0x0, 0x28, 0xEE, 0x0, 0xD, 0x0, 0x30, 0xEE, 0x0, 0xD, 0x0, 0x38, 0xEE, 0x0, 0xD, 0x0, 0x40, 0xEE, 0x0, 0xD, 0x0, 0x48, 0xEE, 0x0, 0xD, 0x0, 0x50, 0xEE, 0x0, 0xD, 0x0, 0x58, 0xEE, 0x0, 0xD, 0x0, 0x60, 0xEE, 0x0, 0xD, 0x0, 0x68, 0xEE, 0x0, 0xD, 0x0, 0x70, 0xEE, 0x0, 0xD, 0x0, 0x78, 0xEE, 0x0, 0xD, 0x0, 0x80, 0xEE, 0x0, 0xD, 0x0, 0x88, 0xEE, 0x0, 0xD, 0x0, 0x90, 0xEE, 0x0, 0xD, 0x0, 0x98, 0xEE, 0x0, 0xD, 0x0, 0xA0, 0xEE, 0x0, 0xD, 0x0, 0xA8, 0xEE, 0x0, 0xD, 0x0, 0xB0, 0xEE, 0x0, 0xD, 0x0, 0xB8, 0xEE, 0x0, 0xD, 0x0, 0xC0, 0xEE, 0x0, 0xD, 0x0, 0xC8, 0xEE, 0x0, 0xD, 0x0, 0xD0, 0xEE, 0x0, 0xD, 0x0, 0xD8, 0xEE, 0x0, 0xD, 0x0, 0xE0, 0xEE, 0x0, 0xD, 0x0, 0xE8, 0xEE, 0x0, 0xD, 0x0, 0xF0, 0xEE, 0x0, 0xD, 0x0, 0xF8, 0xEE, 0x0, 0xD, 0x0, 0x0, 0xEF, 0x0, 0xD, 0x0, 0x8, 0xEF, 0x0, 0xD, 0x0, 0x10, 0xEF, 0x0, 0xD, 0x0, 0x18, 0xEF, 0x0, 0xD, 0x0, 0x20, 0xEF, 0x0, 0xD, 0x0, 0x28, 0xEF, 0x0, 0xD, 0x0, 0x30, 0xEF, 0x0, 0xD, 0x0, 0x38, 0xEF, 0x0, 0xD, 0x0, 0x40, 0xEF, 0x0, 0xD, 0x0, 0x48, 0xEF, 0x0, 0xD, 0x0, 0x50, 0xEF, 0x0, 0xD, 0x0, 0x58, 0xEF, 0x0, 0xD, 0x0, 0x60, 0xEF, 0x0, 0xD, 0x0, 0x68, 0xEF, 0x0, 0xD, 0x0, 0x70, 0xEF, 0x0, 0xD, 0x0, 0x78, 0xEF, 0x0, 0xD, 0x0, 0x80, 0xEF, 0x0, 0xD, 0x0, 0x88, 0xEF, 0x0, 0xD, 0x0, 0x90, 0xEF, 0x0, 0xD, 0x0, 0x98, 0xEF, 0x0, 0xD, 0x0, 0xA0, 0xEF, 0x0, 0xD, 0x0, 0xA8, 0xEF, 0x0, 0xD, 0x0, 0xB0, 0xEF, 0x0, 0xD, 0x0, 0xB8, 0xEF, 0x0, 0xD, 0x0, 0xC0, 0xEF, 0x0, 0xD, 0x0, 0xC8, 0xEF, 0x0, 0xD, 0x0, 0xD0, 0xEF, 0x0, 0xD, 0x0, 0xD8, 0xEF, 0x0, 0xD, 0x0, 0xE0, 0xEF, 0x0, 0xD, 0x0, 0xE8, 0xEF, 0x0, 0xD, 0x0, 0xF0, 0xEF, 0x0, 0xD, 0x0, 0xF8, 0xEF, 0x0, 0xD, 0x0, 0x0, 0xF0, 0x0, 0xD, 0x0, 0x8, 0xF0, 0x0, 0xD, 0x0, 0x10, 0xF0, 0x0, 0xD, 0x0, 0x18, 0xF0, 0x0, 0x8E, 0xC0, 0x3, 0x0, 0x0, 0xAE, 0xC0, 0x3, 0x0, 0x0, 0xCE, 0xC0, 0x3, 0x0, 0x0, 0xEE, 0xC0, 0x3, 0x0, 0x0, 0xE, 0xC1, 0x3, 0x0, 0x0, 0x2E, 0xC1, 0x3, 0x0, 0x0, 0x4E, 0xC1, 0x3, 0x0, 0x0, 0x6E, 0xC1, 0x3, 0x0, 0x0, 0x8E, 0xC1, 0x3, 0x0, 0x0, 0xAE, 0xC1, 0x3, 0x0, 0x0, 0xCE, 0xC1, 0x3, 0x0, 0x0, 0xEE, 0xC1, 0x3, 0x0, 0x0, 0xE, 0xC2, 0x3, 0x0, 0x0, 0x2E, 0xC2, 0x3, 0x0, 0x0, 0x4E, 0xC2, 0x3, 0x0, 0x0, 0x6E, 0xC2, 0x3, 0x0, 0x0, 0x8E, 0xC2, 0x3, 0x0, 0x0, 0xAE, 0xC2, 0x3, 0x0, 0x0, 0xCE, 0xC2, 0x3, 0x0, 0x0, 0xEE, 0xC2, 0x3, 0x0, 0x0, 0xE, 0xC3, 0x3, 0x0, 0x0, 0x2E, 0xC3, 0x3, 0x0, 0x0, 0x4E, 0xC3, 0x3, 0x0, 0x0, 0x6E, 0xC3, 0x3, 0x0, 0x0, 0x8E, 0xC3, 0x3, 0x0, 0x0, 0xAE, 0xC3, 0x3, 0x0, 0x0, 0xE, 0x0, 0xF0, 0xF0, 0x0, 0xE, 0x0, 0xF8, 0xF0, 0x0, 0xE, 0x0, 0x0, 0xF1, 0x0, 0xE, 0x0, 0x8, 0xF1, 0x0, 0xE, 0x0, 0x10, 0xF1, 0x0, 0xE, 0x0, 0x18, 0xF1, 0x0, 0xE, 0x0, 0x20, 0xF1, 0x0, 0xE, 0x0, 0x28, 0xF1, 0x0, 0xE, 0x0, 0x30, 0xF1, 0x0, 0xE, 0x0, 0x38, 0xF1, 0x0, 0xE, 0x0, 0x40, 0xF1, 0x0, 0xE, 0x0, 0x48, 0xF1, 0x0, 0xE, 0x0, 0x50, 0xF1, 0x0, 0xE, 0x0, 0x58, 0xF1, 0x0, 0xE, 0x0, 0x60, 0xF1, 0x0, 0xE, 0x0, 0x68, 0xF1, 0x0, 0xE, 0x0, 0x70, 0xF1, 0x0, 0xE, 0x0, 0x78, 0xF1, 0x0, 0xE, 0x0, 0x80, 0xF1, 0x0, 0xE, 0x0, 0x88, 0xF1, 0x0, 0xE, 0x0, 0x90, 0xF1, 0x0, 0xE, 0x0, 0x98, 0xF1, 0x0, 0xE, 0x0, 0xA0, 0xF1, 0x0, 0xE, 0x0, 0xA8, 0xF1, 0x0, 0xE, 0x0, 0xB0, 0xF1, 0x0, 0xE, 0x0, 0xB8, 0xF1, 0x0, 0xE, 0x0, 0xC0, 0xF1, 0x0, 0xE, 0x0, 0xC8, 0xF1, 0x0, 0xE, 0x0, 0xD0, 0xF1, 0x0, 0xE, 0x0, 0xD8, 0xF1, 0x0, 0xE, 0x0, 0xE0, 0xF1, 0x0, 0xE, 0x0, 0xE8, 0xF1, 0x0, 0xE, 0x0, 0xF0, 0xF1, 0x0, 0xE, 0x0, 0xF8, 0xF1, 0x0, 0xE, 0x0, 0x0, 0xF2, 0x0, 0xE, 0x0, 0x8, 0xF2, 0x0, 0xE, 0x0, 0x10, 0xF2, 0x0, 0xE, 0x0, 0x18, 0xF2, 0x0, 0xE, 0x0, 0x20, 0xF2, 0x0, 0xE, 0x0, 0x28, 0xF2, 0x0, 0xE, 0x0, 0x30, 0xF2, 0x0, 0xE, 0x0, 0x38, 0xF2, 0x0, 0xE, 0x0, 0x40, 0xF2, 0x0, 0xE, 0x0, 0x48, 0xF2, 0x0, 0xE, 0x0, 0x50, 0xF2, 0x0, 0xE, 0x0, 0x58, 0xF2, 0x0, 0xE, 0x0, 0x60, 0xF2, 0x0, 0xE, 0x0, 0x68, 0xF2, 0x0, 0xE, 0x0, 0x70, 0xF2, 0x0, 0xE, 0x0, 0x78, 0xF2, 0x0, 0xE, 0x0, 0x80, 0xF2, 0x0, 0xE, 0x0, 0x88, 0xF2, 0x0, 0xE, 0x0, 0x90, 0xF2, 0x0, 0xE, 0x0, 0x98, 0xF2, 0x0, 0xE, 0x0, 0xA0, 0xF2, 0x0, 0xE, 0x0, 0xA8, 0xF2, 0x0, 0xE, 0x0, 0xB0, 0xF2, 0x0, 0xE, 0x0, 0xB8, 0xF2, 0x0, 0xE, 0x0, 0xC0, 0xF2, 0x0, 0xE, 0x0, 0xC8, 0xF2, 0x0, 0xE, 0x0, 0xD0, 0xF2, 0x0, 0xE, 0x0, 0xD8, 0xF2, 0x0, 0xE, 0x0, 0xE0, 0xF2, 0x0, 0xE, 0x0, 0xE8, 0xF2, 0x0, 0xE, 0x0, 0xF0, 0xF2, 0x0, 0xE, 0x0, 0xF8, 0xF2, 0x0, 0xE, 0x0, 0x0, 0xF3, 0x0, 0xE, 0x0, 0x8, 0xF3, 0x0, 0xE, 0x0, 0x10, 0xF3, 0x0, 0xE, 0x0, 0x18, 0xF3, 0x0, 0xE, 0x0, 0x20, 0xF3, 0x0, 0xE, 0x0, 0x28, 0xF3, 0x0, 0xE, 0x0, 0x30, 0xF3, 0x0, 0xE, 0x0, 0x38, 0xF3, 0x0, 0xE, 0x0, 0x40, 0xF3, 0x0, 0xE, 0x0, 0x48, 0xF3, 0x0, 0xE, 0x0, 0x50, 0xF3, 0x0, 0xE, 0x0, 0x58, 0xF3, 0x0, 0xE, 0x0, 0x60, 0xF3, 0x0, 0xE, 0x0, 0x68, 0xF3, 0x0, 0xE, 0x0, 0x70, 0xF3, 0x0, 0xE, 0x0, 0x78, 0xF3, 0x0, 0xE, 0x0, 0x80, 0xF3, 0x0, 0xE, 0x0, 0x88, 0xF3, 0x0, 0xE, 0x0, 0x90, 0xF3, 0x0, 0xE, 0x0, 0x98, 0xF3, 0x0, 0xE, 0x0, 0xA0, 0xF3, 0x0, 0xE, 0x0, 0xA8, 0xF3, 0x0, 0xE, 0x0, 0xB0, 0xF3, 0x0, 0xE, 0x0, 0xB8, 0xF3, 0x0, 0xE, 0x0, 0xC0, 0xF3, 0x0, 0xE, 0x0, 0xC8, 0xF3, 0x0, 0xE, 0x0, 0xD0, 0xF3, 0x0, 0xE, 0x0, 0xD8, 0xF3, 0x0, 0xE, 0x0, 0xE0, 0xF3, 0x0, 0xE, 0x0, 0xE8, 0xF3, 0x0, 0xE, 0x0, 0xF0, 0xF3, 0x0, 0xE, 0x0, 0xF8, 0xF3, 0x0, 0xE, 0x0, 0x0, 0xF4, 0x0, 0xE, 0x0, 0x8, 0xF4, 0x0, 0xE, 0x0, 0x10, 0xF4, 0x0, 0xE, 0x0, 0x18, 0xF4, 0x0, 0xE, 0x0, 0x20, 0xF4, 0x0, 0xE, 0x0, 0x28, 0xF4, 0x0, 0xE, 0x0, 0x30, 0xF4, 0x0, 0xE, 0x0, 0x38, 0xF4, 0x0, 0xE, 0x0, 0x40, 0xF4, 0x0, 0xE, 0x0, 0x48, 0xF4, 0x0, 0xE, 0x0, 0x50, 0xF4, 0x0, 0xE, 0x0, 0x58, 0xF4, 0x0, 0xE, 0x0, 0x60, 0xF4, 0x0, 0xE, 0x0, 0x68, 0xF4, 0x0, 0xE, 0x0, 0x70, 0xF4, 0x0, 0xE, 0x0, 0x78, 0xF4, 0x0, 0xE, 0x0, 0x80, 0xF4, 0x0, 0xE, 0x0, 0x88, 0xF4, 0x0, 0xE, 0x0, 0x90, 0xF4, 0x0, 0xE, 0x0, 0x98, 0xF4, 0x0, 0xE, 0x0, 0xA0, 0xF4, 0x0, 0xE, 0x0, 0xA8, 0xF4, 0x0, 0xE, 0x0, 0xB0, 0xF4, 0x0, 0xE, 0x0, 0xB8, 0xF4, 0x0, 0xE, 0x0, 0xC0, 0xF4, 0x0, 0xE, 0x0, 0xC8, 0xF4, 0x0, 0xE, 0x0, 0xD0, 0xF4, 0x0, 0xE, 0x0, 0xD8, 0xF4, 0x0, 0xE, 0x0, 0xE0, 0xF4, 0x0, 0xE, 0x0, 0xE8, 0xF4, 0x0, 0xE, 0x0, 0xF0, 0xF4, 0x0, 0xE, 0x0, 0xF8, 0xF4, 0x0, 0xE, 0x0, 0x0, 0xF5, 0x0, 0xE, 0x0, 0x8, 0xF5, 0x0, 0xE, 0x0, 0x10, 0xF5, 0x0, 0xE, 0x0, 0x18, 0xF5, 0x0, 0xE, 0x0, 0x20, 0xF5, 0x0, 0xE, 0x0, 0x28, 0xF5, 0x0, 0xE, 0x0, 0x30, 0xF5, 0x0, 0xE, 0x0, 0x38, 0xF5, 0x0, 0xE, 0x0, 0x40, 0xF5, 0x0, 0xE, 0x0, 0x48, 0xF5, 0x0, 0xE, 0x0, 0x50, 0xF5, 0x0, 0xE, 0x0, 0x58, 0xF5, 0x0, 0xE, 0x0, 0x60, 0xF5, 0x0, 0xE, 0x0, 0x68, 0xF5, 0x0, 0xE, 0x0, 0x70, 0xF5, 0x0, 0xE, 0x0, 0x78, 0xF5, 0x0, 0xE, 0x0, 0x80, 0xF5, 0x0, 0xE, 0x0, 0x88, 0xF5, 0x0, 0xE, 0x0, 0x90, 0xF5, 0x0, 0xE, 0x0, 0x98, 0xF5, 0x0, 0xE, 0x0, 0xA0, 0xF5, 0x0, 0xE, 0x0, 0xA8, 0xF5, 0x0, 0xE, 0x0, 0xB0, 0xF5, 0x0, 0xE, 0x0, 0xB8, 0xF5, 0x0, 0xE, 0x0, 0xC0, 0xF5, 0x0, 0xE, 0x0, 0xC8, 0xF5, 0x0, 0xE, 0x0, 0xD0, 0xF5, 0x0, 0xE, 0x0, 0xD8, 0xF5, 0x0, 0xE, 0x0, 0xE0, 0xF5, 0x0, 0xE, 0x0, 0xE8, 0xF5, 0x0, 0xE, 0x0, 0xF0, 0xF5, 0x0, 0xE, 0x0, 0xF8, 0xF5, 0x0, 0xE, 0x0, 0x0, 0xF6, 0x0, 0xE, 0x0, 0x8, 0xF6, 0x0, 0xE, 0x0, 0x10, 0xF6, 0x0, 0xE, 0x0, 0x18, 0xF6, 0x0, 0xE, 0x0, 0x20, 0xF6, 0x0, 0xE, 0x0, 0x28, 0xF6, 0x0, 0xE, 0x0, 0x30, 0xF6, 0x0, 0xE, 0x0, 0x38, 0xF6, 0x0, 0xE, 0x0, 0x40, 0xF6, 0x0, 0xE, 0x0, 0x48, 0xF6, 0x0, 0xE, 0x0, 0x50, 0xF6, 0x0, 0xE, 0x0, 0x58, 0xF6, 0x0, 0xE, 0x0, 0x60, 0xF6, 0x0, 0xE, 0x0, 0x68, 0xF6, 0x0, 0xE, 0x0, 0x70, 0xF6, 0x0, 0xE, 0x0, 0x78, 0xF6, 0x0, 0xE, 0x0, 0x80, 0xF6, 0x0, 0xE, 0x0, 0x88, 0xF6, 0x0, 0xE, 0x0, 0x90, 0xF6, 0x0, 0xE, 0x0, 0x98, 0xF6, 0x0, 0xE, 0x0, 0xA0, 0xF6, 0x0, 0xE, 0x0, 0xA8, 0xF6, 0x0, 0xE, 0x0, 0xB0, 0xF6, 0x0, 0xE, 0x0, 0xB8, 0xF6, 0x0, 0xE, 0x0, 0xC0, 0xF6, 0x0, 0xE, 0x0, 0xC8, 0xF6, 0x0, 0xE, 0x0, 0xD0, 0xF6, 0x0, 0xE, 0x0, 0xD8, 0xF6, 0x0, 0xE, 0x0, 0xE0, 0xF6, 0x0, 0xE, 0x0, 0xE8, 0xF6, 0x0, 0xE, 0x0, 0xF0, 0xF6, 0x0, 0xE, 0x0, 0xF8, 0xF6, 0x0, 0xE, 0x0, 0x0, 0xF7, 0x0, 0xE, 0x0, 0x8, 0xF7, 0x0, 0xE, 0x0, 0x10, 0xF7, 0x0, 0xE, 0x0, 0x18, 0xF7, 0x0, 0xE, 0x0, 0x20, 0xF7, 0x0, 0xE, 0x0, 0x28, 0xF7, 0x0, 0xE, 0x0, 0x30, 0xF7, 0x0, 0xE, 0x0, 0x38, 0xF7, 0x0, 0xE, 0x0, 0x40, 0xF7, 0x0, 0xE, 0x0, 0x48, 0xF7, 0x0, 0xE, 0x0, 0x50, 0xF7, 0x0, 0xE, 0x0, 0x58, 0xF7, 0x0, 0xE, 0x0, 0x60, 0xF7, 0x0, 0xE, 0x0, 0x68, 0xF7, 0x0, 0xE, 0x0, 0x70, 0xF7, 0x0, 0xE, 0x0, 0x78, 0xF7, 0x0, 0xE, 0x0, 0x80, 0xF7, 0x0, 0xE, 0x0, 0x88, 0xF7, 0x0, 0xE, 0x0, 0x90, 0xF7, 0x0, 0xE, 0x0, 0x98, 0xF7, 0x0, 0xE, 0x0, 0xA0, 0xF7, 0x0, 0xE, 0x0, 0xA8, 0xF7, 0x0, 0xE, 0x0, 0xB0, 0xF7, 0x0, 0xE, 0x0, 0xB8, 0xF7, 0x0, 0xE, 0x0, 0xC0, 0xF7, 0x0, 0xE, 0x0, 0xC8, 0xF7, 0x0, 0xE, 0x0, 0xD0, 0xF7, 0x0, 0xE, 0x0, 0xD8, 0xF7, 0x0, 0xE, 0x0, 0xE0, 0xF7, 0x0, 0xE, 0x0, 0xE8, 0xF7, 0x0, 0xE, 0x0, 0xF0, 0xF7, 0x0, 0xE, 0x0, 0xF8, 0xF7, 0x0, 0xE, 0x0, 0x0, 0xF8, 0x0, 0xE, 0x0, 0x8, 0xF8, 0x0, 0xE, 0x0, 0x10, 0xF8, 0x0, 0xE, 0x0, 0x18, 0xF8, 0x0, 0xE, 0x0, 0x20, 0xF8, 0x0, 0xE, 0x0, 0x28, 0xF8, 0x0, 0xE, 0x0, 0x30, 0xF8, 0x0, 0xE, 0x0, 0x38, 0xF8, 0x0, 0xE, 0x0, 0x40, 0xF8, 0x0, 0xE, 0x0, 0x48, 0xF8, 0x0, 0xE, 0x0, 0x50, 0xF8, 0x0, 0xE, 0x0, 0x58, 0xF8, 0x0, 0xE, 0x0, 0x60, 0xF8, 0x0, 0xE, 0x0, 0x68, 0xF8, 0x0, 0xE, 0x0, 0x70, 0xF8, 0x0, 0xE, 0x0, 0x78, 0xF8, 0x0, 0xE, 0x0, 0x80, 0xF8, 0x0, 0xE, 0x0, 0x88, 0xF8, 0x0, 0xE, 0x0, 0x90, 0xF8, 0x0, 0xE, 0x0, 0x98, 0xF8, 0x0, 0xE, 0x0, 0xA0, 0xF8, 0x0, 0xE, 0x0, 0xA8, 0xF8, 0x0, 0xE, 0x0, 0xB0, 0xF8, 0x0, 0xE, 0x0, 0xB8, 0xF8, 0x0, 0xE, 0x0, 0xC0, 0xF8, 0x0, 0xE, 0x0, 0xC8, 0xF8, 0x0, 0xE, 0x0, 0xD0, 0xF8, 0x0, 0xE, 0x0, 0xD8, 0xF8, 0x0, 0xE, 0x0, 0xE0, 0xF8, 0x0, 0xE, 0x0, 0xE8, 0xF8, 0x0, 0xE, 0x0, 0xF0, 0xF8, 0x0, 0xE, 0x0, 0xF8, 0xF8, 0x0, 0xE, 0x0, 0x0, 0xF9, 0x0, 0xE, 0x0, 0x8, 0xF9, 0x0, 0xE, 0x0, 0x10, 0xF9, 0x0, 0xE, 0x0, 0x18, 0xF9, 0x0, 0xE, 0x0, 0x20, 0xF9, 0x0, 0xE, 0x0, 0x28, 0xF9, 0x0, 0xE, 0x0, 0x30, 0xF9, 0x0, 0xE, 0x0, 0x38, 0xF9, 0x0, 0xE, 0x0, 0x40, 0xF9, 0x0, 0xE, 0x0, 0x48, 0xF9, 0x0, 0xE, 0x0, 0x50, 0xF9, 0x0, 0xE, 0x0, 0x58, 0xF9, 0x0, 0xE, 0x0, 0x60, 0xF9, 0x0, 0xE, 0x0, 0x68, 0xF9, 0x0, 0xE, 0x0, 0x70, 0xF9, 0x0, 0xE, 0x0, 0x78, 0xF9, 0x0, 0xE, 0x0, 0x80, 0xF9, 0x0, 0xE, 0x0, 0x88, 0xF9, 0x0, 0xE, 0x0, 0x90, 0xF9, 0x0, 0xE, 0x0, 0x98, 0xF9, 0x0, 0xE, 0x0, 0xA0, 0xF9, 0x0, 0xE, 0x0, 0xA8, 0xF9, 0x0, 0xE, 0x0, 0xB0, 0xF9, 0x0, 0xE, 0x0, 0xB8, 0xF9, 0x0, 0xE, 0x0, 0xC0, 0xF9, 0x0, 0xE, 0x0, 0xC8, 0xF9, 0x0, 0xE, 0x0, 0xD0, 0xF9, 0x0, 0xE, 0x0, 0xD8, 0xF9, 0x0, 0xE, 0x0, 0xE0, 0xF9, 0x0, 0xE, 0x0, 0xE8, 0xF9, 0x0, 0xE, 0x0, 0xF0, 0xF9, 0x0, 0xE, 0x0, 0xF8, 0xF9, 0x0, 0xE, 0x0, 0x0, 0xFA, 0x0, 0xE, 0x0, 0x8, 0xFA, 0x0, 0xE, 0x0, 0x10, 0xFA, 0x0, 0xE, 0x0, 0x18, 0xFA, 0x0, 0xE, 0x0, 0x20, 0xFA, 0x0, 0xE, 0x0, 0x28, 0xFA, 0x0, 0xE, 0x0, 0x30, 0xFA, 0x0, 0xE, 0x0, 0x38, 0xFA, 0x0, 0xE, 0x0, 0x40, 0xFA, 0x0, 0xE, 0x0, 0x48, 0xFA, 0x0, 0xE, 0x0, 0x50, 0xFA, 0x0, 0xE, 0x0, 0x58, 0xFA, 0x0, 0xE, 0x0, 0x60, 0xFA, 0x0, 0xE, 0x0, 0x68, 0xFA, 0x0, 0xE, 0x0, 0x70, 0xFA, 0x0, 0xE, 0x0, 0x78, 0xFA, 0x0, 0xE, 0x0, 0x80, 0xFA, 0x0, 0xE, 0x0, 0x88, 0xFA, 0x0, 0xE, 0x0, 0x90, 0xFA, 0x0, 0xE, 0x0, 0x98, 0xFA, 0x0, 0xE, 0x0, 0xA0, 0xFA, 0x0, 0xE, 0x0, 0xA8, 0xFA, 0x0, 0xE, 0x0, 0xB0, 0xFA, 0x0, 0xE, 0x0, 0xB8, 0xFA, 0x0, 0xE, 0x0, 0xC0, 0xFA, 0x0, 0xE, 0x0, 0xC8, 0xFA, 0x0, 0xE, 0x0, 0xD0, 0xFA, 0x0, 0xE, 0x0, 0xD8, 0xFA, 0x0, 0xE, 0x0, 0xE0, 0xFA, 0x0, 0xE, 0x0, 0xE8, 0xFA, 0x0, 0xE, 0x0, 0xF0, 0xFA, 0x0, 0xE, 0x0, 0xF8, 0xFA, 0x0, 0xE, 0x0, 0x0, 0xFB, 0x0, 0xE, 0x0, 0x8, 0xFB, 0x0, 0xE, 0x0, 0x10, 0xFB, 0x0, 0xE, 0x0, 0x18, 0xFB, 0x0, 0xE, 0x0, 0x20, 0xFB, 0x0, 0xE, 0x0, 0x28, 0xFB, 0x0, 0xE, 0x0, 0x30, 0xFB, 0x0, 0xE, 0x0, 0x38, 0xFB, 0x0, 0xE, 0x0, 0x40, 0xFB, 0x0, 0xE, 0x0, 0x48, 0xFB, 0x0, 0xE, 0x0, 0x50, 0xFB, 0x0, 0xE, 0x0, 0x58, 0xFB, 0x0, 0xE, 0x0, 0x60, 0xFB, 0x0, 0xE, 0x0, 0x68, 0xFB, 0x0, 0xE, 0x0, 0x70, 0xFB, 0x0, 0xE, 0x0, 0x78, 0xFB, 0x0, 0xE, 0x0, 0x80, 0xFB, 0x0, 0xE, 0x0, 0x88, 0xFB, 0x0, 0xE, 0x0, 0x90, 0xFB, 0x0, 0xE, 0x0, 0x98, 0xFB, 0x0, 0xE, 0x0, 0xA0, 0xFB, 0x0, 0xE, 0x0, 0xA8, 0xFB, 0x0, 0xE, 0x0, 0xB0, 0xFB, 0x0, 0xE, 0x0, 0xB8, 0xFB, 0x0, 0xE, 0x0, 0xC0, 0xFB, 0x0, 0xE, 0x0, 0xC8, 0xFB, 0x0, 0xE, 0x0, 0xD0, 0xFB, 0x0, 0xE, 0x0, 0xD8, 0xFB, 0x0, 0xE, 0x0, 0xE0, 0xFB, 0x0, 0xE, 0x0, 0xE8, 0xFB, 0x0, 0xE, 0x0, 0xF0, 0xFB, 0x0, 0xE, 0x0, 0xF8, 0xFB, 0x0, 0xE, 0x0, 0x0, 0xFC, 0x0, 0xE, 0x0, 0x8, 0xFC, 0x0, 0xE, 0x0, 0x10, 0xFC, 0x0, 0xE, 0x0, 0x18, 0xFC, 0x0, 0xE, 0x0, 0x20, 0xFC, 0x0, 0xE, 0x0, 0x28, 0xFC, 0x0, 0xE, 0x0, 0x30, 0xFC, 0x0, 0xE, 0x0, 0x38, 0xFC, 0x0, 0xE, 0x0, 0x40, 0xFC, 0x0, 0xE, 0x0, 0x48, 0xFC, 0x0, 0xE, 0x0, 0x50, 0xFC, 0x0, 0xE, 0x0, 0x58, 0xFC, 0x0, 0xE, 0x0, 0x60, 0xFC, 0x0, 0xE, 0x0, 0x68, 0xFC, 0x0, 0xE, 0x0, 0x70, 0xFC, 0x0, 0xE, 0x0, 0x78, 0xFC, 0x0, 0xE, 0x0, 0x80, 0xFC, 0x0, 0xE, 0x0, 0x88, 0xFC, 0x0, 0xE, 0x0, 0x90, 0xFC, 0x0, 0xE, 0x0, 0x98, 0xFC, 0x0, 0xE, 0x0, 0xA0, 0xFC, 0x0, 0xE, 0x0, 0xA8, 0xFC, 0x0, 0xE, 0x0, 0xB0, 0xFC, 0x0, 0xE, 0x0, 0xB8, 0xFC, 0x0, 0xE, 0x0, 0xC0, 0xFC, 0x0, 0xE, 0x0, 0xC8, 0xFC, 0x0, 0xE, 0x0, 0xD0, 0xFC, 0x0, 0xE, 0x0, 0xD8, 0xFC, 0x0, 0xE, 0x0, 0xE0, 0xFC, 0x0, 0xE, 0x0, 0xE8, 0xFC, 0x0, 0xE, 0x0, 0xF0, 0xFC, 0x0, 0xE, 0x0, 0xF8, 0xFC, 0x0, 0xE, 0x0, 0x0, 0xFD, 0x0, 0xE, 0x0, 0x8, 0xFD, 0x0, 0xE, 0x0, 0x10, 0xFD, 0x0, 0xE, 0x0, 0x18, 0xFD, 0x0, 0xE, 0x0, 0x20, 0xFD, 0x0, 0xE, 0x0, 0x28, 0xFD, 0x0, 0xE, 0x0, 0x30, 0xFD, 0x0, 0xE, 0x0, 0x38, 0xFD, 0x0, 0xE, 0x0, 0x40, 0xFD, 0x0, 0xE, 0x0, 0x48, 0xFD, 0x0, 0xE, 0x0, 0x50, 0xFD, 0x0, 0xE, 0x0, 0x58, 0xFD, 0x0, 0xE, 0x0, 0x60, 0xFD, 0x0, 0xE, 0x0, 0x68, 0xFD, 0x0, 0xE, 0x0, 0x70, 0xFD, 0x0, 0xE, 0x0, 0x78, 0xFD, 0x0, 0xE, 0x0, 0x80, 0xFD, 0x0, 0xE, 0x0, 0x88, 0xFD, 0x0, 0xE, 0x0, 0x90, 0xFD, 0x0, 0xE, 0x0, 0x98, 0xFD, 0x0, 0xE, 0x0, 0xA0, 0xFD, 0x0, 0xE, 0x0, 0xA8, 0xFD, 0x0, 0xE, 0x0, 0xB0, 0xFD, 0x0, 0xE, 0x0, 0xB8, 0xFD, 0x0, 0xE, 0x0, 0xC0, 0xFD, 0x0, 0xE, 0x0, 0xC8, 0xFD, 0x0, 0xE, 0x0, 0xD0, 0xFD, 0x0, 0xE, 0x0, 0xD8, 0xFD, 0x0, 0xE, 0x0, 0xE0, 0xFD, 0x0, 0xE, 0x0, 0xE8, 0xFD, 0x0, 0xE, 0x0, 0xF0, 0xFD, 0x0, 0xE, 0x0, 0xF8, 0xFD, 0x0, 0xE, 0x0, 0x0, 0xFE, 0x0, 0xE, 0x0, 0x8, 0xFE, 0x0, 0xE, 0x0, 0x10, 0xFE, 0x0, 0xE, 0x0, 0x18, 0xFE, 0x0, 0xE, 0x0, 0x20, 0xFE, 0x0, 0xE, 0x0, 0x28, 0xFE, 0x0, 0xE, 0x0, 0x30, 0xFE, 0x0, 0xE, 0x0, 0x38, 0xFE, 0x0, 0xE, 0x0, 0x40, 0xFE, 0x0, 0xE, 0x0, 0x48, 0xFE, 0x0, 0xE, 0x0, 0x50, 0xFE, 0x0, 0xE, 0x0, 0x58, 0xFE, 0x0, 0xE, 0x0, 0x60, 0xFE, 0x0, 0xE, 0x0, 0x68, 0xFE, 0x0, 0xE, 0x0, 0x70, 0xFE, 0x0, 0xE, 0x0, 0x78, 0xFE, 0x0, 0xE, 0x0, 0x80, 0xFE, 0x0, 0xE, 0x0, 0x88, 0xFE, 0x0, 0xE, 0x0, 0x90, 0xFE, 0x0, 0xE, 0x0, 0x98, 0xFE, 0x0, 0xE, 0x0, 0xA0, 0xFE, 0x0, 0xE, 0x0, 0xA8, 0xFE, 0x0, 0xE, 0x0, 0xB0, 0xFE, 0x0, 0xE, 0x0, 0xB8, 0xFE, 0x0, 0xE, 0x0, 0xC0, 0xFE, 0x0, 0xE, 0x0, 0xC8, 0xFE, 0x0, 0xE, 0x0, 0xD0, 0xFE, 0x0, 0xE, 0x0, 0xD8, 0xFE, 0x0, 0xE, 0x0, 0xE0, 0xFE, 0x0, 0xE, 0x0, 0xE8, 0xFE, 0x0, 0xE, 0x0, 0xF0, 0xFE, 0x0, 0xE, 0x0, 0xF8, 0xFE, 0x0, 0xE, 0x0, 0x0, 0xFF, 0x0, 0xE, 0x0, 0x8, 0xFF, 0x0, 0xE, 0x0, 0x10, 0xFF, 0x0, 0xE, 0x0, 0x18, 0xFF, 0x0, 0xE, 0x0, 0x20, 0xFF, 0x0, 0xE, 0x0, 0x28, 0xFF, 0x0, 0xE, 0x0, 0x30, 0xFF, 0x0, 0xE, 0x0, 0x38, 0xFF, 0x0, 0xE, 0x0, 0x40, 0xFF, 0x0, 0xE, 0x0, 0x48, 0xFF, 0x0, 0xE, 0x0, 0x50, 0xFF, 0x0, 0xE, 0x0, 0x58, 0xFF, 0x0, 0xE, 0x0, 0x60, 0xFF, 0x0, 0xE, 0x0, 0x68, 0xFF, 0x0, 0xE, 0x0, 0x70, 0xFF, 0x0, 0xE, 0x0, 0x78, 0xFF, 0x0, 0xE, 0x0, 0x80, 0xFF, 0x0, 0xE, 0x0, 0x88, 0xFF, 0x0, 0xE, 0x0, 0x90, 0xFF, 0x0, 0xE, 0x0, 0x98, 0xFF, 0x0, 0xE, 0x0, 0xA0, 0xFF, 0x0, 0xE, 0x0, 0xA8, 0xFF, 0x0, 0xE, 0x0, 0xB0, 0xFF, 0x0, 0xE, 0x0, 0xB8, 0xFF, 0x0, 0xE, 0x0, 0xC0, 0xFF, 0x0, 0xE, 0x0, 0xC8, 0xFF, 0x0, 0xE, 0x0, 0xD0, 0xFF, 0x0, 0xE, 0x0, 0xD8, 0xFF, 0x0, 0xE, 0x0, 0xE0, 0xFF, 0x0, 0xE, 0x0, 0xE8, 0xFF, 0x0, 0xE, 0x0, 0xF0, 0xFF, 0x0, 0xE, 0x0, 0xF8, 0xFF, 0x0, 0xE, 0x0, 0x0, 0x0, 0x1, 0xE, 0x0, 0x8, 0x0, 0x1, 0xE, 0x0, 0x10, 0x0, 0x1, 0xE, 0x0, 0x18, 0x0, 0x1, 0xE, 0x0, 0x20, 0x0, 0x1, 0xE, 0x0, 0x28, 0x0, 0x1, 0xE, 0x0, 0x30, 0x0, 0x1, 0xE, 0x0, 0x38, 0x0, 0x1, 0xE, 0x0, 0x40, 0x0, 0x1, 0xE, 0x0, 0x48, 0x0, 0x1, 0xE, 0x0, 0x50, 0x0, 0x1, 0xE, 0x0, 0x58, 0x0, 0x1, 0xE, 0x0, 0x60, 0x0, 0x1, 0xE, 0x0, 0x68, 0x0, 0x1, 0xE, 0x0, 0x70, 0x0, 0x1, 0xE, 0x0, 0x78, 0x0, 0x1, 0xE, 0x0, 0x80, 0x0, 0x1, 0xE, 0x0, 0x88, 0x0, 0x1, 0xE, 0x0, 0x90, 0x0, 0x1, 0xE, 0x0, 0x98, 0x0, 0x1, 0xE, 0x0, 0xA0, 0x0, 0x1, 0xE, 0x0, 0xA8, 0x0, 0x1, 0xE, 0x0, 0xB0, 0x0, 0x1, 0xE, 0x0, 0xB8, 0x0, 0x1, 0xE, 0x0, 0xC0, 0x0, 0x1, 0xE, 0x0, 0xC8, 0x0, 0x1, 0xE, 0x0, 0xD0, 0x0, 0x1, 0xE, 0x0, 0xD8, 0x0, 0x1, 0xE, 0x0, 0xE0, 0x0, 0x1, 0xE, 0x0, 0xE8, 0x0, 0x1, 0xE, 0x0, 0xF0, 0x0, 0x1, 0xE, 0x0, 0xF8, 0x0, 0x1, 0xE, 0x0, 0x0, 0x1, 0x1, 0xE, 0x0, 0x8, 0x1, 0x1, 0xE, 0x0, 0x10, 0x1, 0x1, 0xE, 0x0, 0x18, 0x1, 0x1, 0xE, 0x0, 0x20, 0x1, 0x1, 0xE, 0x0, 0x28, 0x1, 0x1, 0xE, 0x0, 0x30, 0x1, 0x1, 0xE, 0x0, 0x38, 0x1, 0x1, 0xE, 0x0, 0x40, 0x1, 0x1, 0xE, 0x0, 0x48, 0x1, 0x1, 0xE, 0x0, 0x50, 0x1, 0x1, 0xE, 0x0, 0x58, 0x1, 0x1, 0xE, 0x0, 0x60, 0x1, 0x1, 0xE, 0x0, 0x68, 0x1, 0x1, 0xE, 0x0, 0x70, 0x1, 0x1, 0xE, 0x0, 0x78, 0x1, 0x1, 0xE, 0x0, 0x80, 0x1, 0x1, 0xE, 0x0, 0x88, 0x1, 0x1, 0xE, 0x0, 0x90, 0x1, 0x1, 0xE, 0x0, 0x98, 0x1, 0x1, 0xE, 0x0, 0xA0, 0x1, 0x1, 0xE, 0x0, 0xA8, 0x1, 0x1, 0xE, 0x0, 0xB0, 0x1, 0x1, 0xE, 0x0, 0xB8, 0x1, 0x1, 0xE, 0x0, 0xC0, 0x1, 0x1, 0xE, 0x0, 0xC8, 0x1, 0x1, 0xE, 0x0, 0xD0, 0x1, 0x1, 0xE, 0x0, 0xD8, 0x1, 0x1, 0xE, 0x0, 0xE0, 0x1, 0x1, 0xE, 0x0, 0xE8, 0x1, 0x1, 0xE, 0x0, 0xF0, 0x1, 0x1, 0xE, 0x0, 0xF8, 0x1, 0x1, 0xE, 0x0, 0x0, 0x2, 0x1, 0xE, 0x0, 0x8, 0x2, 0x1, 0xE, 0x0, 0x10, 0x2, 0x1, 0xE, 0x0, 0x18, 0x2, 0x1, 0xE, 0x0, 0x20, 0x2, 0x1, 0xE, 0x0, 0x28, 0x2, 0x1, 0xE, 0x0, 0x30, 0x2, 0x1, 0xE, 0x0, 0x38, 0x2, 0x1, 0xE, 0x0, 0x40, 0x2, 0x1, 0xE, 0x0, 0x48, 0x2, 0x1, 0xE, 0x0, 0x50, 0x2, 0x1, 0xE, 0x0, 0x58, 0x2, 0x1, 0xE, 0x0, 0x60, 0x2, 0x1, 0xE, 0x0, 0x68, 0x2, 0x1, 0xE, 0x0, 0x70, 0x2, 0x1, 0xE, 0x0, 0x78, 0x2, 0x1, 0xE, 0x0, 0x80, 0x2, 0x1, 0xE, 0x0, 0x88, 0x2, 0x1, 0xE, 0x0, 0x90, 0x2, 0x1, 0xE, 0x0, 0x98, 0x2, 0x1, 0xE, 0x0, 0xA0, 0x2, 0x1, 0xE, 0x0, 0xA8, 0x2, 0x1, 0xE, 0x0, 0xB0, 0x2, 0x1, 0xE, 0x0, 0xB8, 0x2, 0x1, 0xE, 0x0, 0xC0, 0x2, 0x1, 0xE, 0x0, 0xC8, 0x2, 0x1, 0xE, 0x0, 0xD0, 0x2, 0x1, 0xE, 0x0, 0xD8, 0x2, 0x1, 0xE, 0x0, 0xE0, 0x2, 0x1, 0xE, 0x0, 0xE8, 0x2, 0x1, 0xE, 0x0, 0xF0, 0x2, 0x1, 0xE, 0x0, 0xF8, 0x2, 0x1, 0xE, 0x0, 0x0, 0x3, 0x1, 0xE, 0x0, 0x8, 0x3, 0x1, 0xE, 0x0, 0x10, 0x3, 0x1, 0xE, 0x0, 0x18, 0x3, 0x1, 0xE, 0x0, 0x20, 0x3, 0x1, 0xE, 0x0, 0x28, 0x3, 0x1, 0xE, 0x0, 0x30, 0x3, 0x1, 0xE, 0x0, 0x38, 0x3, 0x1, 0xE, 0x0, 0x40, 0x3, 0x1, 0xE, 0x0, 0x48, 0x3, 0x1, 0xE, 0x0, 0x50, 0x3, 0x1, 0xE, 0x0, 0x58, 0x3, 0x1, 0xE, 0x0, 0x60, 0x3, 0x1, 0xE, 0x0, 0x68, 0x3, 0x1, 0xE, 0x0, 0x70, 0x3, 0x1, 0xE, 0x0, 0x78, 0x3, 0x1, 0xE, 0x0, 0x80, 0x3, 0x1, 0xE, 0x0, 0x88, 0x3, 0x1, 0xE, 0x0, 0x90, 0x3, 0x1, 0xE, 0x0, 0x98, 0x3, 0x1, 0xE, 0x0, 0xA0, 0x3, 0x1, 0xE, 0x0, 0xA8, 0x3, 0x1, 0xE, 0x0, 0xB0, 0x3, 0x1, 0xE, 0x0, 0xB8, 0x3, 0x1, 0xE, 0x0, 0xC0, 0x3, 0x1, 0xE, 0x0, 0xC8, 0x3, 0x1, 0xE, 0x0, 0xD0, 0x3, 0x1, 0xE, 0x0, 0xD8, 0x3, 0x1, 0xE, 0x0, 0xE0, 0x3, 0x1, 0xE, 0x0, 0xE8, 0x3, 0x1, 0xE, 0x0, 0xF0, 0x3, 0x1, 0xE, 0x0, 0xF8, 0x3, 0x1, 0xE, 0x0, 0x0, 0x4, 0x1, 0xE, 0x0, 0x8, 0x4, 0x1, 0xE, 0x0, 0x10, 0x4, 0x1, 0xE, 0x0, 0x18, 0x4, 0x1, 0xE, 0x0, 0x20, 0x4, 0x1, 0xE, 0x0, 0x28, 0x4, 0x1, 0xE, 0x0, 0x30, 0x4, 0x1, 0xE, 0x0, 0x38, 0x4, 0x1, 0xE, 0x0, 0x40, 0x4, 0x1, 0xE, 0x0, 0x48, 0x4, 0x1, 0xE, 0x0, 0x50, 0x4, 0x1, 0xE, 0x0, 0x58, 0x4, 0x1, 0xE, 0x0, 0x60, 0x4, 0x1, 0xE, 0x0, 0x68, 0x4, 0x1, 0xE, 0x0, 0x70, 0x4, 0x1, 0xE, 0x0, 0x78, 0x4, 0x1, 0xE, 0x0, 0x80, 0x4, 0x1, 0xE, 0x0, 0x88, 0x4, 0x1, 0xE, 0x0, 0x90, 0x4, 0x1, 0xE, 0x0, 0x98, 0x4, 0x1, 0xE, 0x0, 0xA0, 0x4, 0x1, 0xE, 0x0, 0xA8, 0x4, 0x1, 0xE, 0x0, 0xB0, 0x4, 0x1, 0xE, 0x0, 0xB8, 0x4, 0x1, 0xE, 0x0, 0xC0, 0x4, 0x1, 0xE, 0x0, 0xC8, 0x4, 0x1, 0xE, 0x0, 0xD0, 0x4, 0x1, 0xE, 0x0, 0xD8, 0x4, 0x1, 0xE, 0x0, 0xE0, 0x4, 0x1, 0xE, 0x0, 0xE8, 0x4, 0x1, 0xE, 0x0, 0xF0, 0x4, 0x1, 0xE, 0x0, 0xF8, 0x4, 0x1, 0xE, 0x0, 0x0, 0x5, 0x1, 0xE, 0x0, 0x8, 0x5, 0x1, 0xE, 0x0, 0x10, 0x5, 0x1, 0xE, 0x0, 0x18, 0x5, 0x1, 0xE, 0x0, 0x20, 0x5, 0x1, 0xE, 0x0, 0x28, 0x5, 0x1, 0xE, 0x0, 0x30, 0x5, 0x1, 0xE, 0x0, 0x38, 0x5, 0x1, 0xE, 0x0, 0x40, 0x5, 0x1, 0xE, 0x0, 0x48, 0x5, 0x1, 0xE, 0x0, 0x50, 0x5, 0x1, 0xE, 0x0, 0x58, 0x5, 0x1, 0xE, 0x0, 0x60, 0x5, 0x1, 0xE, 0x0, 0x68, 0x5, 0x1, 0xE, 0x0, 0x70, 0x5, 0x1, 0xE, 0x0, 0x78, 0x5, 0x1, 0xE, 0x0, 0x80, 0x5, 0x1, 0xE, 0x0, 0x88, 0x5, 0x1, 0xE, 0x0, 0x90, 0x5, 0x1, 0xE, 0x0, 0x98, 0x5, 0x1, 0xE, 0x0, 0xA0, 0x5, 0x1, 0xE, 0x0, 0xA8, 0x5, 0x1, 0xE, 0x0, 0xB0, 0x5, 0x1, 0xE, 0x0, 0xB8, 0x5, 0x1, 0xE, 0x0, 0xC0, 0x5, 0x1, 0xE, 0x0, 0xC8, 0x5, 0x1, 0xE, 0x0, 0xD0, 0x5, 0x1, 0xE, 0x0, 0xD8, 0x5, 0x1, 0xE, 0x0, 0xE0, 0x5, 0x1, 0xE, 0x0, 0xE8, 0x5, 0x1, 0xE, 0x0, 0xF0, 0x5, 0x1, 0xE, 0x0, 0xF8, 0x5, 0x1, 0xE, 0x0, 0x0, 0x6, 0x1, 0xE, 0x0, 0x8, 0x6, 0x1, 0xE, 0x0, 0x10, 0x6, 0x1, 0xE, 0x0, 0x18, 0x6, 0x1, 0xE, 0x0, 0x20, 0x6, 0x1, 0xE, 0x0, 0x28, 0x6, 0x1, 0xE, 0x0, 0x30, 0x6, 0x1, 0xE, 0x0, 0x38, 0x6, 0x1, 0xE, 0x0, 0x40, 0x6, 0x1, 0xE, 0x0, 0x48, 0x6, 0x1, 0xE, 0x0, 0x50, 0x6, 0x1, 0xE, 0x0, 0x58, 0x6, 0x1, 0xE, 0x0, 0x60, 0x6, 0x1, 0xE, 0x0, 0x68, 0x6, 0x1, 0xE, 0x0, 0x70, 0x6, 0x1, 0xE, 0x0, 0x78, 0x6, 0x1, 0xE, 0x0, 0x80, 0x6, 0x1, 0xE, 0x0, 0x88, 0x6, 0x1, 0xE, 0x0, 0x90, 0x6, 0x1, 0xE, 0x0, 0x98, 0x6, 0x1, 0xE, 0x0, 0xA0, 0x6, 0x1, 0xE, 0x0, 0xA8, 0x6, 0x1, 0xE, 0x0, 0xB0, 0x6, 0x1, 0xE, 0x0, 0xB8, 0x6, 0x1, 0xE, 0x0, 0xC0, 0x6, 0x1, 0xE, 0x0, 0xC8, 0x6, 0x1, 0xE, 0x0, 0xD0, 0x6, 0x1, 0xE, 0x0, 0xD8, 0x6, 0x1, 0xE, 0x0, 0xE0, 0x6, 0x1, 0xE, 0x0, 0xE8, 0x6, 0x1, 0xE, 0x0, 0xF0, 0x6, 0x1, 0xE, 0x0, 0xF8, 0x6, 0x1, 0xE, 0x0, 0x0, 0x7, 0x1, 0xE, 0x0, 0x8, 0x7, 0x1, 0xE, 0x0, 0x10, 0x7, 0x1, 0xE, 0x0, 0x18, 0x7, 0x1, 0xE, 0x0, 0x20, 0x7, 0x1, 0xE, 0x0, 0x28, 0x7, 0x1, 0xE, 0x0, 0x30, 0x7, 0x1, 0xE, 0x0, 0x38, 0x7, 0x1, 0xE, 0x0, 0x40, 0x7, 0x1, 0xE, 0x0, 0x48, 0x7, 0x1, 0xE, 0x0, 0x50, 0x7, 0x1, 0xE, 0x0, 0x58, 0x7, 0x1, 0xE, 0x0, 0x60, 0x7, 0x1, 0xE, 0x0, 0x68, 0x7, 0x1, 0xE, 0x0, 0x70, 0x7, 0x1, 0xE, 0x0, 0x78, 0x7, 0x1, 0xE, 0x0, 0x80, 0x7, 0x1, 0xE, 0x0, 0x88, 0x7, 0x1, 0xE, 0x0, 0x90, 0x7, 0x1, 0xE, 0x0, 0x98, 0x7, 0x1, 0xE, 0x0, 0xA0, 0x7, 0x1, 0xE, 0x0, 0xA8, 0x7, 0x1, 0xE, 0x0, 0xB0, 0x7, 0x1, 0xE, 0x0, 0xB8, 0x7, 0x1, 0xE, 0x0, 0xC0, 0x7, 0x1, 0xE, 0x0, 0xC8, 0x7, 0x1, 0xE, 0x0, 0xD0, 0x7, 0x1, 0xE, 0x0, 0xD8, 0x7, 0x1, 0xE, 0x0, 0xE0, 0x7, 0x1, 0xE, 0x0, 0xE8, 0x7, 0x1, 0xE, 0x0, 0xF0, 0x7, 0x1, 0xE, 0x0, 0xF8, 0x7, 0x1, 0xE, 0x0, 0x0, 0x8, 0x1, 0xE, 0x0, 0x8, 0x8, 0x1, 0xE, 0x0, 0x10, 0x8, 0x1, 0xE, 0x0, 0x18, 0x8, 0x1, 0xE, 0x0, 0x20, 0x8, 0x1, 0xE, 0x0, 0x28, 0x8, 0x1, 0xE, 0x0, 0x30, 0x8, 0x1, 0xE, 0x0, 0x38, 0x8, 0x1, 0xE, 0x0, 0x40, 0x8, 0x1, 0xE, 0x0, 0x48, 0x8, 0x1, 0xE, 0x0, 0x50, 0x8, 0x1, 0xE, 0x0, 0x58, 0x8, 0x1, 0xE, 0x0, 0x60, 0x8, 0x1, 0xE, 0x0, 0x68, 0x8, 0x1, 0xE, 0x0, 0x70, 0x8, 0x1, 0xE, 0x0, 0x78, 0x8, 0x1, 0xE, 0x0, 0x80, 0x8, 0x1, 0xE, 0x0, 0x88, 0x8, 0x1, 0xE, 0x0, 0x90, 0x8, 0x1, 0xE, 0x0, 0x98, 0x8, 0x1, 0xE, 0x0, 0xA0, 0x8, 0x1, 0xE, 0x0, 0xA8, 0x8, 0x1, 0xE, 0x0, 0xB0, 0x8, 0x1, 0xE, 0x0, 0xB8, 0x8, 0x1, 0xE, 0x0, 0xC0, 0x8, 0x1, 0xE, 0x0, 0xC8, 0x8, 0x1, 0xE, 0x0, 0xD0, 0x8, 0x1, 0xE, 0x0, 0xD8, 0x8, 0x1, 0xE, 0x0, 0xE0, 0x8, 0x1, 0xE, 0x0, 0xE8, 0x8, 0x1, 0xE, 0x0, 0xF0, 0x8, 0x1, 0xE, 0x0, 0xF8, 0x8, 0x1, 0xE, 0x0, 0x0, 0x9, 0x1, 0xE, 0x0, 0x8, 0x9, 0x1, 0xE, 0x0, 0x10, 0x9, 0x1, 0xE, 0x0, 0x18, 0x9, 0x1, 0xE, 0x0, 0x20, 0x9, 0x1, 0xE, 0x0, 0x28, 0x9, 0x1, 0xE, 0x0, 0x30, 0x9, 0x1, 0xE, 0x0, 0x38, 0x9, 0x1, 0xE, 0x0, 0x40, 0x9, 0x1, 0xE, 0x0, 0x48, 0x9, 0x1, 0xE, 0x0, 0x50, 0x9, 0x1, 0xE, 0x0, 0x58, 0x9, 0x1, 0xE, 0x0, 0x60, 0x9, 0x1, 0xE, 0x0, 0x68, 0x9, 0x1, 0xE, 0x0, 0x70, 0x9, 0x1, 0xE, 0x0, 0x78, 0x9, 0x1, 0xE, 0x0, 0x80, 0x9, 0x1, 0xE, 0x0, 0x88, 0x9, 0x1, 0xE, 0x0, 0x90, 0x9, 0x1, 0xE, 0x0, 0x98, 0x9, 0x1, 0xE, 0x0, 0xA0, 0x9, 0x1, 0xE, 0x0, 0xA8, 0x9, 0x1, 0xE, 0x0, 0xB0, 0x9, 0x1, 0xE, 0x0, 0xB8, 0x9, 0x1, 0xE, 0x0, 0xC0, 0x9, 0x1, 0xE, 0x0, 0xC8, 0x9, 0x1, 0xE, 0x0, 0xD0, 0x9, 0x1, 0xE, 0x0, 0xD8, 0x9, 0x1, 0xE, 0x0, 0xE0, 0x9, 0x1, 0xE, 0x0, 0xE8, 0x9, 0x1, 0xE, 0x0, 0xF0, 0x9, 0x1, 0xE, 0x0, 0xF8, 0x9, 0x1, 0xE, 0x0, 0x0, 0xA, 0x1, 0xE, 0x0, 0x8, 0xA, 0x1, 0xE, 0x0, 0x10, 0xA, 0x1, 0xE, 0x0, 0x18, 0xA, 0x1, 0xE, 0x0, 0x20, 0xA, 0x1, 0xE, 0x0, 0x28, 0xA, 0x1, 0xE, 0x0, 0x30, 0xA, 0x1, 0xE, 0x0, 0x38, 0xA, 0x1, 0xE, 0x0, 0x40, 0xA, 0x1, 0xE, 0x0, 0x48, 0xA, 0x1, 0xE, 0x0, 0x50, 0xA, 0x1, 0xE, 0x0, 0x58, 0xA, 0x1, 0xE, 0x0, 0x60, 0xA, 0x1, 0xE, 0x0, 0x68, 0xA, 0x1, 0xE, 0x0, 0x70, 0xA, 0x1, 0xE, 0x0, 0x78, 0xA, 0x1, 0xE, 0x0, 0x80, 0xA, 0x1, 0xE, 0x0, 0x88, 0xA, 0x1, 0xE, 0x0, 0x90, 0xA, 0x1, 0xE, 0x0, 0x98, 0xA, 0x1, 0xE, 0x0, 0xA0, 0xA, 0x1, 0xE, 0x0, 0xA8, 0xA, 0x1, 0xE, 0x0, 0xB0, 0xA, 0x1, 0xE, 0x0, 0xB8, 0xA, 0x1, 0xE, 0x0, 0xC0, 0xA, 0x1, 0xE, 0x0, 0xC8, 0xA, 0x1, 0xE, 0x0, 0xD0, 0xA, 0x1, 0xE, 0x0, 0xD8, 0xA, 0x1, 0xE, 0x0, 0xE0, 0xA, 0x1, 0xE, 0x0, 0xE8, 0xA, 0x1, 0xE, 0x0, 0xF0, 0xA, 0x1, 0xE, 0x0, 0xF8, 0xA, 0x1, 0xE, 0x0, 0x0, 0xB, 0x1, 0xE, 0x0, 0x8, 0xB, 0x1, 0xE, 0x0, 0x10, 0xB, 0x1, 0xE, 0x0, 0x18, 0xB, 0x1, 0xE, 0x0, 0x20, 0xB, 0x1, 0xE, 0x0, 0x28, 0xB, 0x1, 0xE, 0x0, 0x30, 0xB, 0x1, 0xE, 0x0, 0x38, 0xB, 0x1, 0xE, 0x0, 0x40, 0xB, 0x1, 0xE, 0x0, 0x48, 0xB, 0x1, 0xE, 0x0, 0x50, 0xB, 0x1, 0xE, 0x0, 0x58, 0xB, 0x1, 0xE, 0x0, 0x60, 0xB, 0x1, 0xE, 0x0, 0x68, 0xB, 0x1, 0xE, 0x0, 0x70, 0xB, 0x1, 0xE, 0x0, 0x78, 0xB, 0x1, 0xE, 0x0, 0x80, 0xB, 0x1, 0xE, 0x0, 0x88, 0xB, 0x1, 0xE, 0x0, 0x90, 0xB, 0x1, 0xE, 0x0, 0x98, 0xB, 0x1, 0xE, 0x0, 0xA0, 0xB, 0x1, 0xE, 0x0, 0xA8, 0xB, 0x1, 0xE, 0x0, 0xB0, 0xB, 0x1, 0xE, 0x0, 0xB8, 0xB, 0x1, 0xE, 0x0, 0xC0, 0xB, 0x1, 0xE, 0x0, 0xC8, 0xB, 0x1, 0xE, 0x0, 0xD0, 0xB, 0x1, 0xE, 0x0, 0xD8, 0xB, 0x1, 0xE, 0x0, 0xE0, 0xB, 0x1, 0xE, 0x0, 0xE8, 0xB, 0x1, 0xE, 0x0, 0xF0, 0xB, 0x1, 0xE, 0x0, 0xF8, 0xB, 0x1, 0xE, 0x0, 0x0, 0xC, 0x1, 0xE, 0x0, 0x8, 0xC, 0x1, 0xE, 0x0, 0x10, 0xC, 0x1, 0xE, 0x0, 0x18, 0xC, 0x1, 0xE, 0x0, 0x20, 0xC, 0x1, 0xE, 0x0, 0x28, 0xC, 0x1, 0xE, 0x0, 0x30, 0xC, 0x1, 0xE, 0x0, 0x38, 0xC, 0x1, 0xE, 0x0, 0x40, 0xC, 0x1, 0xE, 0x0, 0x48, 0xC, 0x1, 0xE, 0x0, 0x50, 0xC, 0x1, 0xE, 0x0, 0x58, 0xC, 0x1, 0xE, 0x0, 0x60, 0xC, 0x1, 0xE, 0x0, 0x68, 0xC, 0x1, 0xE, 0x0, 0x70, 0xC, 0x1, 0xE, 0x0, 0x78, 0xC, 0x1, 0xE, 0x0, 0x80, 0xC, 0x1, 0xE, 0x0, 0x88, 0xC, 0x1, 0xE, 0x0, 0x90, 0xC, 0x1, 0xE, 0x0, 0x98, 0xC, 0x1, 0xE, 0x0, 0xA0, 0xC, 0x1, 0xE, 0x0, 0xA8, 0xC, 0x1, 0xE, 0x0, 0xB0, 0xC, 0x1, 0xE, 0x0, 0xB8, 0xC, 0x1, 0xE, 0x0, 0xC0, 0xC, 0x1, 0xE, 0x0, 0xC8, 0xC, 0x1, 0xE, 0x0, 0xD0, 0xC, 0x1, 0xE, 0x0, 0xD8, 0xC, 0x1, 0xE, 0x0, 0xE0, 0xC, 0x1, 0xE, 0x0, 0xE8, 0xC, 0x1, 0xE, 0x0, 0xF0, 0xC, 0x1, 0xE, 0x0, 0xF8, 0xC, 0x1, 0xE, 0x0, 0x0, 0xD, 0x1, 0xE, 0x0, 0x8, 0xD, 0x1, 0xE, 0x0, 0x10, 0xD, 0x1, 0xE, 0x0, 0x18, 0xD, 0x1, 0xE, 0x0, 0x20, 0xD, 0x1, 0xE, 0x0, 0x28, 0xD, 0x1, 0xE, 0x0, 0x30, 0xD, 0x1, 0xE, 0x0, 0x38, 0xD, 0x1, 0xE, 0x0, 0x40, 0xD, 0x1, 0xE, 0x0, 0x48, 0xD, 0x1, 0xE, 0x0, 0x50, 0xD, 0x1, 0xE, 0x0, 0x58, 0xD, 0x1, 0xE, 0x0, 0x60, 0xD, 0x1, 0xE, 0x0, 0x68, 0xD, 0x1, 0xE, 0x0, 0x70, 0xD, 0x1, 0xE, 0x0, 0x78, 0xD, 0x1, 0xE, 0x0, 0x80, 0xD, 0x1, 0xE, 0x0, 0x88, 0xD, 0x1, 0xE, 0x0, 0x90, 0xD, 0x1, 0xE, 0x0, 0x98, 0xD, 0x1, 0xE, 0x0, 0xA0, 0xD, 0x1, 0xE, 0x0, 0xA8, 0xD, 0x1, 0xE, 0x0, 0xB0, 0xD, 0x1, 0xE, 0x0, 0xB8, 0xD, 0x1, 0xE, 0x0, 0xC0, 0xD, 0x1, 0xE, 0x0, 0xC8, 0xD, 0x1, 0xE, 0x0, 0xD0, 0xD, 0x1, 0xE, 0x0, 0xD8, 0xD, 0x1, 0xE, 0x0, 0xE0, 0xD, 0x1, 0xE, 0x0, 0xE8, 0xD, 0x1, 0xE, 0x0, 0xF0, 0xD, 0x1, 0xE, 0x0, 0xF8, 0xD, 0x1, 0xE, 0x0, 0x0, 0xE, 0x1, 0xE, 0x0, 0x8, 0xE, 0x1, 0xE, 0x0, 0x10, 0xE, 0x1, 0xE, 0x0, 0x18, 0xE, 0x1, 0xE, 0x0, 0x20, 0xE, 0x1, 0xE, 0x0, 0x28, 0xE, 0x1, 0xE, 0x0, 0x30, 0xE, 0x1, 0xE, 0x0, 0x38, 0xE, 0x1, 0xE, 0x0, 0x40, 0xE, 0x1, 0xE, 0x0, 0x48, 0xE, 0x1, 0xE, 0x0, 0x50, 0xE, 0x1, 0xE, 0x0, 0x58, 0xE, 0x1, 0xE, 0x0, 0x60, 0xE, 0x1, 0xE, 0x0, 0x68, 0xE, 0x1, 0xE, 0x0, 0x70, 0xE, 0x1, 0xE, 0x0, 0x78, 0xE, 0x1, 0xE, 0x0, 0x80, 0xE, 0x1, 0xE, 0x0, 0x88, 0xE, 0x1, 0xE, 0x0, 0x90, 0xE, 0x1, 0xE, 0x0, 0x98, 0xE, 0x1, 0xE, 0x0, 0xA0, 0xE, 0x1, 0xE, 0x0, 0xA8, 0xE, 0x1, 0xE, 0x0, 0xB0, 0xE, 0x1, 0xE, 0x0, 0xB8, 0xE, 0x1, 0xE, 0x0, 0xC0, 0xE, 0x1, 0xE, 0x0, 0xC8, 0xE, 0x1, 0xE, 0x0, 0xD0, 0xE, 0x1, 0xE, 0x0, 0xD8, 0xE, 0x1, 0xE, 0x0, 0xE0, 0xE, 0x1, 0xE, 0x0, 0xE8, 0xE, 0x1, 0xE, 0x0, 0xF0, 0xE, 0x1, 0xE, 0x0, 0xF8, 0xE, 0x1, 0xE, 0x0, 0x0, 0xF, 0x1, 0xE, 0x0, 0x8, 0xF, 0x1, 0xE, 0x0, 0x10, 0xF, 0x1, 0xE, 0x0, 0x18, 0xF, 0x1, 0xE, 0x0, 0x20, 0xF, 0x1, 0xE, 0x0, 0x28, 0xF, 0x1, 0xE, 0x0, 0x30, 0xF, 0x1, 0xE, 0x0, 0x38, 0xF, 0x1, 0xE, 0x0, 0x40, 0xF, 0x1, 0xE, 0x0, 0x48, 0xF, 0x1, 0xE, 0x0, 0x50, 0xF, 0x1, 0xE, 0x0, 0x58, 0xF, 0x1, 0xE, 0x0, 0x60, 0xF, 0x1, 0xE, 0x0, 0x68, 0xF, 0x1, 0xE, 0x0, 0x70, 0xF, 0x1, 0xE, 0x0, 0x78, 0xF, 0x1, 0xE, 0x0, 0x80, 0xF, 0x1, 0xE, 0x0, 0x88, 0xF, 0x1, 0xE, 0x0, 0x90, 0xF, 0x1, 0xE, 0x0, 0x98, 0xF, 0x1, 0xE, 0x0, 0xA0, 0xF, 0x1, 0xE, 0x0, 0xA8, 0xF, 0x1, 0xE, 0x0, 0xB0, 0xF, 0x1, 0xE, 0x0, 0xB8, 0xF, 0x1, 0xE, 0x0, 0xC0, 0xF, 0x1, 0xE, 0x0, 0xC8, 0xF, 0x1, 0xE, 0x0, 0xD0, 0xF, 0x1, 0xE, 0x0, 0xD8, 0xF, 0x1, 0xE, 0x0, 0xE0, 0xF, 0x1, 0xE, 0x0, 0xE8, 0xF, 0x1, 0xE, 0x0, 0xF0, 0xF, 0x1, 0xE, 0x0, 0xF8, 0xF, 0x1, 0xE, 0x0, 0x0, 0x10, 0x1, 0xE, 0x0, 0x8, 0x10, 0x1, 0xE, 0x0, 0x10, 0x10, 0x1, 0xE, 0x0, 0x18, 0x10, 0x1, 0xE, 0x0, 0x20, 0x10, 0x1, 0xE, 0x0, 0x28, 0x10, 0x1, 0xE, 0x0, 0x30, 0x10, 0x1, 0xE, 0x0, 0x38, 0x10, 0x1, 0xE, 0x0, 0x40, 0x10, 0x1, 0xE, 0x0, 0x48, 0x10, 0x1, 0xE, 0x0, 0x50, 0x10, 0x1, 0xE, 0x0, 0x58, 0x10, 0x1, 0xE, 0x0, 0x60, 0x10, 0x1, 0xE, 0x0, 0x68, 0x10, 0x1, 0xE, 0x0, 0x70, 0x10, 0x1, 0xE, 0x0, 0x78, 0x10, 0x1, 0xE, 0x0, 0x80, 0x10, 0x1, 0xE, 0x0, 0x88, 0x10, 0x1, 0xE, 0x0, 0x90, 0x10, 0x1, 0xE, 0x0, 0x98, 0x10, 0x1, 0xE, 0x0, 0xA0, 0x10, 0x1, 0xE, 0x0, 0xA8, 0x10, 0x1, 0xE, 0x0, 0xB0, 0x10, 0x1, 0xE, 0x0, 0xB8, 0x10, 0x1, 0xE, 0x0, 0xC0, 0x10, 0x1, 0xE, 0x0, 0xC8, 0x10, 0x1, 0xE, 0x0, 0xD0, 0x10, 0x1, 0xE, 0x0, 0xD8, 0x10, 0x1, 0xE, 0x0, 0xE0, 0x10, 0x1, 0xE, 0x0, 0xE8, 0x10, 0x1, 0xE, 0x0, 0xF0, 0x10, 0x1, 0xE, 0x0, 0xF8, 0x10, 0x1, 0xE, 0x0, 0x0, 0x11, 0x1, 0xE, 0x0, 0x8, 0x11, 0x1, 0xE, 0x0, 0x10, 0x11, 0x1, 0xE, 0x0, 0x18, 0x11, 0x1, 0xE, 0x0, 0x20, 0x11, 0x1, 0xE, 0x0, 0x28, 0x11, 0x1, 0xE, 0x0, 0x30, 0x11, 0x1, 0xE, 0x0, 0x38, 0x11, 0x1, 0xE, 0x0, 0x40, 0x11, 0x1, 0xE, 0x0, 0x48, 0x11, 0x1, 0xE, 0x0, 0x50, 0x11, 0x1, 0xE, 0x0, 0x58, 0x11, 0x1, 0xE, 0x0, 0x60, 0x11, 0x1, 0xE, 0x0, 0x68, 0x11, 0x1, 0xE, 0x0, 0x70, 0x11, 0x1, 0xE, 0x0, 0x78, 0x11, 0x1, 0xE, 0x0, 0x80, 0x11, 0x1, 0xE, 0x0, 0x88, 0x11, 0x1, 0xE, 0x0, 0x90, 0x11, 0x1, 0xE, 0x0, 0x98, 0x11, 0x1, 0xE, 0x0, 0xA0, 0x11, 0x1, 0xE, 0x0, 0xA8, 0x11, 0x1, 0xE, 0x0, 0xB0, 0x11, 0x1, 0xE, 0x0, 0xB8, 0x11, 0x1, 0xE, 0x0, 0xC0, 0x11, 0x1, 0xE, 0x0, 0xC8, 0x11, 0x1, 0xE, 0x0, 0xD0, 0x11, 0x1, 0xE, 0x0, 0xD8, 0x11, 0x1, 0xE, 0x0, 0xE0, 0x11, 0x1, 0xE, 0x0, 0xE8, 0x11, 0x1, 0xE, 0x0, 0xF0, 0x11, 0x1, 0xE, 0x0, 0xF8, 0x11, 0x1, 0xE, 0x0, 0x0, 0x12, 0x1, 0xE, 0x0, 0x8, 0x12, 0x1, 0xE, 0x0, 0x10, 0x12, 0x1, 0xE, 0x0, 0x18, 0x12, 0x1, 0xE, 0x0, 0x20, 0x12, 0x1, 0xE, 0x0, 0x28, 0x12, 0x1, 0xE, 0x0, 0x30, 0x12, 0x1, 0xE, 0x0, 0x38, 0x12, 0x1, 0xE, 0x0, 0x40, 0x12, 0x1, 0xE, 0x0, 0x48, 0x12, 0x1, 0xE, 0x0, 0x50, 0x12, 0x1, 0xE, 0x0, 0x58, 0x12, 0x1, 0xE, 0x0, 0x60, 0x12, 0x1, 0xE, 0x0, 0x68, 0x12, 0x1, 0xE, 0x0, 0x70, 0x12, 0x1, 0xE, 0x0, 0x78, 0x12, 0x1, 0xE, 0x0, 0x80, 0x12, 0x1, 0xE, 0x0, 0x88, 0x12, 0x1, 0xE, 0x0, 0x90, 0x12, 0x1, 0xE, 0x0, 0x98, 0x12, 0x1, 0xE, 0x0, 0xA0, 0x12, 0x1, 0xE, 0x0, 0xA8, 0x12, 0x1, 0xE, 0x0, 0xB0, 0x12, 0x1, 0xE, 0x0, 0xB8, 0x12, 0x1, 0xE, 0x0, 0xC0, 0x12, 0x1, 0xE, 0x0, 0xC8, 0x12, 0x1, 0xE, 0x0, 0xD0, 0x12, 0x1, 0xE, 0x0, 0xD8, 0x12, 0x1, 0xE, 0x0, 0xE0, 0x12, 0x1, 0xE, 0x0, 0xE8, 0x12, 0x1, 0xE, 0x0, 0xF0, 0x12, 0x1, 0xE, 0x0, 0xF8, 0x12, 0x1, 0xE, 0x0, 0x0, 0x13, 0x1, 0xE, 0x0, 0x8, 0x13, 0x1, 0xE, 0x0, 0x10, 0x13, 0x1, 0xE, 0x0, 0x18, 0x13, 0x1, 0xE, 0x0, 0x20, 0x13, 0x1, 0xE, 0x0, 0x28, 0x13, 0x1, 0xE, 0x0, 0x30, 0x13, 0x1, 0xE, 0x0, 0x38, 0x13, 0x1, 0xE, 0x0, 0x40, 0x13, 0x1, 0xE, 0x0, 0x48, 0x13, 0x1, 0xE, 0x0, 0x50, 0x13, 0x1, 0xE, 0x0, 0x58, 0x13, 0x1, 0xE, 0x0, 0x60, 0x13, 0x1, 0xE, 0x0, 0x68, 0x13, 0x1, 0xE, 0x0, 0x70, 0x13, 0x1, 0xE, 0x0, 0x78, 0x13, 0x1, 0xE, 0x0, 0x80, 0x13, 0x1, 0xE, 0x0, 0x88, 0x13, 0x1, 0xE, 0x0, 0x90, 0x13, 0x1, 0xE, 0x0, 0x98, 0x13, 0x1, 0xE, 0x0, 0xA0, 0x13, 0x1, 0xE, 0x0, 0xA8, 0x13, 0x1, 0xE, 0x0, 0xB0, 0x13, 0x1, 0xE, 0x0, 0xB8, 0x13, 0x1, 0xE, 0x0, 0xC0, 0x13, 0x1, 0xE, 0x0, 0xC8, 0x13, 0x1, 0xE, 0x0, 0xD0, 0x13, 0x1, 0xE, 0x0, 0xD8, 0x13, 0x1, 0xE, 0x0, 0xE0, 0x13, 0x1, 0xE, 0x0, 0xE8, 0x13, 0x1, 0xE, 0x0, 0xF0, 0x13, 0x1, 0xE, 0x0, 0xF8, 0x13, 0x1, 0xE, 0x0, 0x0, 0x14, 0x1, 0xE, 0x0, 0x8, 0x14, 0x1, 0xE, 0x0, 0x10, 0x14, 0x1, 0xE, 0x0, 0x18, 0x14, 0x1, 0xE, 0x0, 0x20, 0x14, 0x1, 0xE, 0x0, 0x28, 0x14, 0x1, 0xE, 0x0, 0x30, 0x14, 0x1, 0xE, 0x0, 0x38, 0x14, 0x1, 0xE, 0x0, 0x40, 0x14, 0x1, 0xE, 0x0, 0x48, 0x14, 0x1, 0xE, 0x0, 0x50, 0x14, 0x1, 0xE, 0x0, 0x58, 0x14, 0x1, 0xE, 0x0, 0x60, 0x14, 0x1, 0xE, 0x0, 0x68, 0x14, 0x1, 0xE, 0x0, 0x70, 0x14, 0x1, 0xE, 0x0, 0x78, 0x14, 0x1, 0xE, 0x0, 0x80, 0x14, 0x1, 0xE, 0x0, 0x88, 0x14, 0x1, 0xE, 0x0, 0x90, 0x14, 0x1, 0xE, 0x0, 0x98, 0x14, 0x1, 0xE, 0x0, 0xA0, 0x14, 0x1, 0xE, 0x0, 0xA8, 0x14, 0x1, 0xE, 0x0, 0xB0, 0x14, 0x1, 0xE, 0x0, 0xB8, 0x14, 0x1, 0xE, 0x0, 0xC0, 0x14, 0x1, 0xE, 0x0, 0xC8, 0x14, 0x1, 0xE, 0x0, 0xD0, 0x14, 0x1, 0xE, 0x0, 0xD8, 0x14, 0x1, 0xE, 0x0, 0xE0, 0x14, 0x1, 0xE, 0x0, 0xE8, 0x14, 0x1, 0xE, 0x0, 0xF0, 0x14, 0x1, 0xE, 0x0, 0xF8, 0x14, 0x1, 0xE, 0x0, 0x0, 0x15, 0x1, 0xE, 0x0, 0x8, 0x15, 0x1, 0xE, 0x0, 0x10, 0x15, 0x1, 0xE, 0x0, 0x18, 0x15, 0x1, 0xE, 0x0, 0x20, 0x15, 0x1, 0xE, 0x0, 0x28, 0x15, 0x1, 0xE, 0x0, 0x30, 0x15, 0x1, 0xE, 0x0, 0x38, 0x15, 0x1, 0xE, 0x0, 0x40, 0x15, 0x1, 0xE, 0x0, 0x48, 0x15, 0x1, 0xE, 0x0, 0x50, 0x15, 0x1, 0xE, 0x0, 0x58, 0x15, 0x1, 0xE, 0x0, 0x60, 0x15, 0x1, 0xE, 0x0, 0x68, 0x15, 0x1, 0xE, 0x0, 0x70, 0x15, 0x1, 0xE, 0x0, 0x78, 0x15, 0x1, 0xE, 0x0, 0x80, 0x15, 0x1, 0xE, 0x0, 0x88, 0x15, 0x1, 0xE, 0x0, 0x90, 0x15, 0x1, 0xE, 0x0, 0x98, 0x15, 0x1, 0xE, 0x0, 0xA0, 0x15, 0x1, 0xE, 0x0, 0xA8, 0x15, 0x1, 0xE, 0x0, 0xB0, 0x15, 0x1, 0xE, 0x0, 0xB8, 0x15, 0x1, 0xE, 0x0, 0xC0, 0x15, 0x1, 0xE, 0x0, 0xC8, 0x15, 0x1, 0xE, 0x0, 0xD0, 0x15, 0x1, 0xE, 0x0, 0xD8, 0x15, 0x1, 0xE, 0x0, 0xE0, 0x15, 0x1, 0xE, 0x0, 0xE8, 0x15, 0x1, 0xE, 0x0, 0xF0, 0x15, 0x1, 0xE, 0x0, 0xF8, 0x15, 0x1, 0xE, 0x0, 0x0, 0x16, 0x1, 0xE, 0x0, 0x8, 0x16, 0x1, 0xE, 0x0, 0x10, 0x16, 0x1, 0xE, 0x0, 0x18, 0x16, 0x1, 0xE, 0x0, 0x20, 0x16, 0x1, 0xE, 0x0, 0x28, 0x16, 0x1, 0xE, 0x0, 0x30, 0x16, 0x1, 0xE, 0x0, 0x38, 0x16, 0x1, 0xE, 0x0, 0x40, 0x16, 0x1, 0xE, 0x0, 0x48, 0x16, 0x1, 0xE, 0x0, 0x50, 0x16, 0x1, 0xE, 0x0, 0x58, 0x16, 0x1, 0xE, 0x0, 0x60, 0x16, 0x1, 0xE, 0x0, 0x68, 0x16, 0x1, 0xE, 0x0, 0x70, 0x16, 0x1, 0xE, 0x0, 0x78, 0x16, 0x1, 0xE, 0x0, 0x80, 0x16, 0x1, 0xE, 0x0, 0x88, 0x16, 0x1, 0xE, 0x0, 0x90, 0x16, 0x1, 0xE, 0x0, 0x98, 0x16, 0x1, 0xE, 0x0, 0xA0, 0x16, 0x1, 0xE, 0x0, 0xA8, 0x16, 0x1, 0xE, 0x0, 0xB0, 0x16, 0x1, 0xE, 0x0, 0xB8, 0x16, 0x1, 0xE, 0x0, 0xC0, 0x16, 0x1, 0xE, 0x0, 0xC8, 0x16, 0x1, 0xE, 0x0, 0xD0, 0x16, 0x1, 0xE, 0x0, 0xD8, 0x16, 0x1, 0xE, 0x0, 0xE0, 0x16, 0x1, 0xE, 0x0, 0xE8, 0x16, 0x1, 0xE, 0x0, 0xF0, 0x16, 0x1, 0xE, 0x0, 0xF8, 0x16, 0x1, 0xE, 0x0, 0x0, 0x17, 0x1, 0xE, 0x0, 0x8, 0x17, 0x1, 0xE, 0x0, 0x10, 0x17, 0x1, 0xE, 0x0, 0x18, 0x17, 0x1, 0xE, 0x0, 0x20, 0x17, 0x1, 0xE, 0x0, 0x28, 0x17, 0x1, 0xE, 0x0, 0x30, 0x17, 0x1, 0xEF, 0x5C, 0x4, 0x0, 0x0, 0xF, 0x5D, 0x4, 0x0, 0x0, 0x2F, 0x5D, 0x4, 0x0, 0x0, 0x4F, 0x5D, 0x4, 0x0, 0x0, 0x6F, 0x5D, 0x4, 0x0, 0x0, 0x8F, 0x5D, 0x4, 0x0, 0x0, 0xAF, 0x5D, 0x4, 0x0, 0x0, 0xCF, 0x5D, 0x4, 0x0, 0x0, 0xEF, 0x5D, 0x4, 0x0, 0x0, 0xF, 0x5E, 0x4, 0x0, 0x0, 0x2F, 0x5E, 0x4, 0x0, 0x0, 0x4F, 0x5E, 0x4, 0x0, 0x0, 0x6F, 0x5E, 0x4, 0x0, 0x0, 0x8F, 0x5E, 0x4, 0x0, 0x0, 0xAF, 0x5E, 0x4, 0x0, 0x0, 0xCF, 0x5E, 0x4, 0x0, 0x0, 0xEF, 0x5E, 0x4, 0x0, 0x0, 0xF, 0x5F, 0x4, 0x0, 0x0, 0x2F, 0x5F, 0x4, 0x0, 0x0, 0x4F, 0x5F, 0x4, 0x0, 0x0, 0x6F, 0x5F, 0x4, 0x0, 0x0, 0x8F, 0x5F, 0x4, 0x0, 0x0, 0xAF, 0x5F, 0x4, 0x0, 0x0, 0xCF, 0x5F, 0x4, 0x0, 0x0, 0xEF, 0x5F, 0x4, 0x0, 0x0, 0xF, 0x60, 0x4, 0x0, 0x0, 0x2F, 0x60, 0x14, 0x18, 0x1, 0x6F, 0x60, 0x24, 0x18, 0x1, 0xAF, 0x60, 0x34, 0x18, 0x1, 0xEF, 0x60, 0x44, 0x18, 0x1, 0x2F, 0x61, 0x54, 0x18, 0x1, 0x6F, 0x61, 0x64, 0x18, 0x1, 0xAF, 0x61, 0x74, 0x18, 0x1, 0xEF, 0x61, 0x84, 0x18, 0x1, 0x2F, 0x62, 0x94, 0x18, 0x1, 0x6F, 0x62, 0xA4, 0x18, 0x1, 0xAF, 0x62, 0xB4, 0x18, 0x1, 0xEF, 0x62, 0xC4, 0x18, 0x1, 0x2F, 0x63, 0xD4, 0x18, 0x1, 0x6F, 0x63, 0xE4, 0x18, 0x1, 0xAF, 0x63, 0xF4, 0x18, 0x1, 0xEF, 0x63, 0x4, 0x19, 0x1, 0x2F, 0x64, 0x14, 0x19, 0x1, 0x6F, 0x64, 0x24, 0x19, 0x1, 0xAF, 0x64, 0x34, 0x19, 0x1, 0xEF, 0x64, 0x44, 0x19, 0x1, 0x2F, 0x65, 0x54, 0x19, 0x1, 0x6F, 0x65, 0x64, 0x19, 0x1, 0xAF, 0x65, 0x74, 0x19, 0x1, 0xEF, 0x65, 0x84, 0x19, 0x1, 0x2F, 0x66, 0x94, 0x19, 0x1, 0x6F, 0x66, 0xA4, 0x19, 0x1, 0xAF, 0x66, 0xB4, 0x19, 0x1, 0xEF, 0x66, 0xC4, 0x19, 0x1, 0x2F, 0x67, 0xD4, 0x19, 0x1, 0x6F, 0x67, 0xE4, 0x19, 0x1, 0xAF, 0x67, 0xF4, 0x19, 0x1, 0xEF, 0x67, 0x4, 0x1A, 0x1, 0x2F, 0x68, 0x14, 0x1A, 0x1, 0x6F, 0x68, 0x24, 0x1A, 0x1, 0xAF, 0x68, 0x34, 0x1A, 0x1, 0xEF, 0x68, 0x44, 0x1A, 0x1, 0x2F, 0x69, 0x54, 0x1A, 0x1, 0x6F, 0x69, 0x64, 0x1A, 0x1, 0xAF, 0x69, 0x74, 0x1A, 0x1, 0xEF, 0x69, 0x84, 0x1A, 0x1, 0x2F, 0x6A, 0x94, 0x1A, 0x1, 0x6F, 0x6A, 0xA4, 0x1A, 0x1, 0xAF, 0x6A, 0xB4, 0x1A, 0x1, 0xEF, 0x6A, 0xC4, 0x1A, 0x1, 0x2F, 0x6B, 0xD4, 0x1A, 0x1, 0x6F, 0x6B, 0xE4, 0x1A, 0x1, 0xAF, 0x6B, 0xF4, 0x1A, 0x1, 0xEF, 0x6B, 0x4, 0x1B, 0x1, 0x2F, 0x6C, 0x14, 0x1B, 0x1, 0x6F, 0x6C, 0x24, 0x1B, 0x1, 0xAF, 0x6C, 0x34, 0x1B, 0x1, 0xEF, 0x6C, 0x44, 0x1B, 0x1, 0x2F, 0x6D, 0x54, 0x1B, 0x1, 0x6F, 0x6D, 0x64, 0x1B, 0x1, 0xAF, 0x6D, 0x74, 0x1B, 0x1, 0xEF, 0x6D, 0x84, 0x1B, 0x1, 0x2F, 0x6E, 0x94, 0x1B, 0x1, 0x6F, 0x6E, 0xA4, 0x1B, 0x1, 0xAF, 0x6E, 0xB4, 0x1B, 0x1, 0xEF, 0x6E, 0xC4, 0x1B, 0x1, 0x2F, 0x6F, 0xD4, 0x1B, 0x1, 0x6F, 0x6F, 0xE4, 0x1B, 0x1, 0xAF, 0x6F, 0xF4, 0x1B, 0x1, 0xEF, 0x6F, 0x4, 0x1C, 0x1, 0x2F, 0x70, 0x14, 0x1C, 0x1, 0x6F, 0x70, 0x24, 0x1C, 0x1, 0xAF, 0x70, 0x34, 0x1C, 0x1, 0xEF, 0x70, 0x44, 0x1C, 0x1, 0x2F, 0x71, 0x54, 0x1C, 0x1, 0x6F, 0x71, 0x64, 0x1C, 0x1, 0xAF, 0x71, 0x74, 0x1C, 0x1, 0xEF, 0x71, 0x84, 0x1C, 0x1, 0x2F, 0x72, 0x94, 0x1C, 0x1, 0x6F, 0x72, 0xA4, 0x1C, 0x1, 0xAF, 0x72, 0xB4, 0x1C, 0x1, 0xEF, 0x72, 0xC4, 0x1C, 0x1, 0x2F, 0x73, 0xD4, 0x1C, 0x1, 0x6F, 0x73, 0xE4, 0x1C, 0x1, 0xAF, 0x73, 0xF4, 0x1C, 0x1, 0xEF, 0x73, 0x4, 0x1D, 0x1, 0x2F, 0x74, 0x4, 0x0, 0x0, 0x4F, 0x74, 0x4, 0x0, 0x0, 0x6F, 0x74, 0x4, 0x0, 0x0, 0x8F, 0x74, 0x4, 0x0, 0x0, 0xAF, 0x74, 0x34, 0x1D, 0x1, 0xEF, 0x74, 0x44, 0x1D, 0x1, 0x2F, 0x75, 0x4, 0x0, 0x0, 0x4F, 0x75, 0x4, 0x0, 0x0, 0x6F, 0x75, 0x4, 0x0, 0x0, 0x8F, 0x75, 0x4, 0x0, 0x0, 0xAF, 0x75, 0x4, 0x0, 0x0, 0xCF, 0x75, 0x4, 0x0, 0x0, 0xEF, 0x75, 0x4, 0x0, 0x0, 0xF, 0x76, 0x4, 0x0, 0x0, 0x2F, 0x76, 0x94, 0x1D, 0x1, 0x6F, 0x76, 0xA4, 0x1D, 0x1, 0xAF, 0x76, 0xB4, 0x1D, 0x1, 0xEF, 0x76, 0xC4, 0x1D, 0x1, 0x2F, 0x77, 0xD4, 0x1D, 0x1, 0x6F, 0x77, 0xE4, 0x1D, 0x1, 0xAF, 0x77, 0xF4, 0x1D, 0x1, 0xEF, 0x77, 0x4, 0x1E, 0x1, 0x2F, 0x78, 0x4, 0x0, 0x0, 0x4F, 0x78, 0x4, 0x0, 0x0, 0x6F, 0x78, 0x4, 0x0, 0x0, 0x8F, 0x78, 0x4, 0x0, 0x0, 0xAF, 0x78, 0x4, 0x0, 0x0, 0xCF, 0x78, 0x4, 0x0, 0x0, 0xEF, 0x78, 0x4, 0x0, 0x0, 0xF, 0x79, 0x4, 0x0, 0x0, 0x2F, 0x79, 0x4, 0x0, 0x0, 0x4F, 0x79, 0x4, 0x0, 0x0, 0x6F, 0x79, 0x4, 0x0, 0x0, 0x8F, 0x79, 0x4, 0x0, 0x0, 0xAF, 0x79, 0x74, 0x1E, 0x1, 0xEF, 0x79, 0x4, 0x0, 0x0, 0xF, 0x7A, 0x4, 0x0, 0x0, 0x2F, 0x7A, 0x4, 0x0, 0x0, 0x4F, 0x7A, 0x4, 0x0, 0x0, 0x6F, 0x7A, 0x4, 0x0, 0x0, 0x8F, 0x7A, 0x4, 0x0, 0x0, 0xAF, 0x7A, 0xB4, 0x1E, 0x1, 0xEF, 0x7A, 0x4, 0x0, 0x0, 0xF, 0x7B, 0x4, 0x0, 0x0, 0x2F, 0x7B, 0x4, 0x0, 0x0, 0x4F, 0x7B, 0x4, 0x0, 0x0, 0x6F, 0x7B, 0x4, 0x0, 0x0, 0x8F, 0x7B, 0x4, 0x0, 0x0, 0xAF, 0x7B, 0x4, 0x0, 0x0, 0xCF, 0x7B, 0x4, 0x0, 0x0, 0xEF, 0x7B, 0x4, 0x0, 0x0, 0xF, 0x7C, 0x4, 0x0, 0x0, 0x2F, 0x7C, 0x4, 0x0, 0x0, 0x4F, 0x7C, 0x4, 0x0, 0x0, 0x6F, 0x7C, 0x4, 0x0, 0x0, 0x8F, 0x7C, 0x4, 0x0, 0x0, 0xAF, 0x7C, 0x4, 0x0, 0x0, 0xCF, 0x7C, 0x4, 0x0, 0x0, 0xEF, 0x7C, 0x4, 0x0, 0x0, 0xF, 0x7D, 0x4, 0x0, 0x0, 0x2F, 0x7D, 0x4, 0x0, 0x0, 0x4F, 0x7D, 0x4, 0x0, 0x0, 0x6F, 0x7D, 0x4, 0x0, 0x0, 0x8F, 0x7D, 0x4, 0x0, 0x0, 0xAF, 0x7D, 0x4, 0x0, 0x0, 0xCF, 0x7D, 0x4, 0x0, 0x0, 0xEF, 0x7D, 0x4, 0x0, 0x0, 0xF, 0x7E, 0x4, 0x0, 0x0, 0x2F, 0x7E, 0x4, 0x0, 0x0, 0x4F, 0x7E, 0x4, 0x0, 0x0, 0x6F, 0x7E, 0x4, 0x0, 0x0, 0x8F, 0x7E, 0x4, 0x0, 0x0, 0xAF, 0x7E, 0x4, 0x0, 0x0, 0xCF, 0x7E, 0x4, 0x0, 0x0, 0xEF, 0x7E, 0x4, 0x0, 0x0, 0xF, 0x7F, 0x4, 0x0, 0x0, 0x2F, 0x7F, 0x4, 0x0, 0x0, 0x4F, 0x7F, 0x4, 0x0, 0x0, 0x6F, 0x7F, 0x4, 0x0, 0x0, 0x8F, 0x7F, 0x4, 0x0, 0x0, 0xAF, 0x7F, 0x4, 0x0, 0x0, 0xCF, 0x7F, 0x4, 0x0, 0x0, 0xEF, 0x7F, 0x4, 0x0, 0x0, 0xF, 0x80, 0x4, 0x0, 0x0, 0x2F, 0x80, 0x4, 0x0, 0x0, 0x4F, 0x80, 0x4, 0x0, 0x0, 0x6F, 0x80, 0x4, 0x0, 0x0, 0x8F, 0x80, 0x4, 0x0, 0x0, 0xAF, 0x80, 0x4, 0x0, 0x0, 0xCF, 0x80, 0x4, 0x0, 0x0, 0xEF, 0x80, 0x4, 0x0, 0x0, 0xF, 0x81, 0x4, 0x0, 0x0, 0x2F, 0x81, 0x4, 0x0, 0x0, 0x4F, 0x81, 0x4, 0x0, 0x0, 0x6F, 0x81, 0x4, 0x0, 0x0, 0x8F, 0x81, 0x4, 0x0, 0x0, 0xAF, 0x81, 0x4, 0x0, 0x0, 0xCF, 0x81, 0x4, 0x0, 0x0, 0xEF, 0x81, 0x4, 0x0, 0x0, 0xF, 0x82, 0x4, 0x0, 0x0, 0x2F, 0x82, 0x4, 0x0, 0x0, 0x4F, 0x82, 0x4, 0x0, 0x0, 0x6F, 0x82, 0x4, 0x0, 0x0, 0x8F, 0x82, 0x4, 0x0, 0x0, 0xAF, 0x82, 0x4, 0x0, 0x0, 0xCF, 0x82, 0x4, 0x0, 0x0, 0xEF, 0x82, 0x4, 0x0, 0x0, 0xF, 0x83, 0x4, 0x0, 0x0, 0x2F, 0x83, 0x4, 0x0, 0x0, 0x4F, 0x83, 0x4, 0x0, 0x0, 0x6F, 0x83, 0x4, 0x0, 0x0, 0x8F, 0x83, 0x4, 0x0, 0x0, 0xAF, 0x83, 0x4, 0x0, 0x0, 0xCF, 0x83, 0x4, 0x0, 0x0, 0xEF, 0x83, 0x4, 0x0, 0x0, 0xF, 0x84, 0x4, 0x0, 0x0, 0x2F, 0x84, 0x4, 0x0, 0x0, 0x4F, 0x84, 0x4, 0x0, 0x0, 0x6F, 0x84, 0x4, 0x0, 0x0, 0xF, 0x0, 0x20, 0x21, 0x1, 0xF, 0x0, 0x28, 0x21, 0x1, 0xF, 0x0, 0x30, 0x21, 0x1, 0xF, 0x0, 0x38, 0x21, 0x1, 0xF, 0x0, 0x40, 0x21, 0x1, 0xF, 0x0, 0x48, 0x21, 0x1, 0xF, 0x0, 0x50, 0x21, 0x1, 0xF, 0x0, 0x58, 0x21, 0x1, 0xF, 0x0, 0x60, 0x21, 0x1, 0xF, 0x0, 0x68, 0x21, 0x1, 0xF, 0x0, 0x70, 0x21, 0x1, 0xF, 0x0, 0x78, 0x21, 0x1, 0xF, 0x0, 0x80, 0x21, 0x1, 0xF, 0x0, 0x88, 0x21, 0x1, 0xF, 0x0, 0x90, 0x21, 0x1, 0xF, 0x0, 0x98, 0x21, 0x1, 0xF, 0x0, 0xA0, 0x21, 0x1, 0xF, 0x0, 0xA8, 0x21, 0x1, 0xF, 0x0, 0xB0, 0x21, 0x1, 0xF, 0x0, 0xB8, 0x21, 0x1, 0xF, 0x0, 0xC0, 0x21, 0x1, 0xF, 0x0, 0xC8, 0x21, 0x1, 0xF, 0x0, 0xD0, 0x21, 0x1, 0xF, 0x0, 0xD8, 0x21, 0x1, 0xF, 0x0, 0xE0, 0x21, 0x1, 0xF, 0x0, 0xE8, 0x21, 0x1, 0xF, 0x0, 0xF0, 0x21, 0x1, 0xF, 0x0, 0xF8, 0x21, 0x1, 0xF, 0x0, 0x0, 0x22, 0x1, 0xF, 0x0, 0x8, 0x22, 0x1, 0xF, 0x0, 0x10, 0x22, 0x1, 0xF, 0x0, 0x18, 0x22, 0x1, 0xF, 0x0, 0x20, 0x22, 0x1, 0xF, 0x0, 0x28, 0x22, 0x1, 0xF, 0x0, 0x30, 0x22, 0x1, 0xF, 0x0, 0x38, 0x22, 0x1, 0xF, 0x0, 0x40, 0x22, 0x1, 0xF, 0x0, 0x48, 0x22, 0x1, 0xF, 0x0, 0x50, 0x22, 0x1, 0xF, 0x0, 0x58, 0x22, 0x1, 0xF, 0x0, 0x60, 0x22, 0x1, 0xF, 0x0, 0x68, 0x22, 0x1, 0xF, 0x0, 0x70, 0x22, 0x1, 0xF, 0x0, 0x78, 0x22, 0x1, 0xF, 0x0, 0x80, 0x22, 0x1, 0xF, 0x0, 0x88, 0x22, 0x1, 0xF, 0x0, 0x90, 0x22, 0x1, 0xF, 0x0, 0x98, 0x22, 0x1, 0xF, 0x0, 0xA0, 0x22, 0x1, 0xF, 0x0, 0xA8, 0x22, 0x1, 0xF, 0x0, 0xB0, 0x22, 0x1, 0xF, 0x0, 0xB8, 0x22, 0x1, 0xF, 0x0, 0xC0, 0x22, 0x1, 0xF, 0x0, 0xC8, 0x22, 0x1, 0xF, 0x0, 0xD0, 0x22, 0x1, 0xF, 0x0, 0xD8, 0x22, 0x1, 0xF, 0x0, 0xE0, 0x22, 0x1, 0xF, 0x0, 0xE8, 0x22, 0x1, 0xF, 0x0, 0xF0, 0x22, 0x1, 0xF, 0x0, 0xF8, 0x22, 0x1, 0xF, 0x0, 0x0, 0x23, 0x1, 0xF, 0x0, 0x8, 0x23, 0x1, 0xF, 0x0, 0x10, 0x23, 0x1, 0xF, 0x0, 0x18, 0x23, 0x1, 0xF, 0x0, 0x20, 0x23, 0x1, 0xF, 0x0, 0x28, 0x23, 0x1, 0xF, 0x0, 0x30, 0x23, 0x1, 0xF, 0x0, 0x38, 0x23, 0x1, 0xF, 0x0, 0x40, 0x23, 0x1, 0xF, 0x0, 0x48, 0x23, 0x1, 0xF, 0x0, 0x50, 0x23, 0x1, 0xF, 0x0, 0x58, 0x23, 0x1, 0xF, 0x0, 0x60, 0x23, 0x1, 0xF, 0x0, 0x68, 0x23, 0x1, 0xF, 0x0, 0x70, 0x23, 0x1, 0xF, 0x0, 0x78, 0x23, 0x1, 0xF, 0x0, 0x80, 0x23, 0x1, 0xF, 0x0, 0x88, 0x23, 0x1, 0xF, 0x0, 0x90, 0x23, 0x1, 0xF, 0x0, 0x98, 0x23, 0x1, 0xF, 0x0, 0xA0, 0x23, 0x1, 0xF, 0x0, 0xA8, 0x23, 0x1, 0xF, 0x0, 0xB0, 0x23, 0x1, 0xF, 0x0, 0xB8, 0x23, 0x1, 0xF, 0x0, 0xC0, 0x23, 0x1, 0xF, 0x0, 0xC8, 0x23, 0x1, 0xF, 0x0, 0xD0, 0x23, 0x1, 0xF, 0x0, 0xD8, 0x23, 0x1, 0xF, 0x0, 0xE0, 0x23, 0x1, 0xF, 0x0, 0xE8, 0x23, 0x1, 0xF, 0x0, 0xF0, 0x23, 0x1, 0xF, 0x0, 0xF8, 0x23, 0x1, 0xF, 0x0, 0x0, 0x24, 0x1, 0xF, 0x0, 0x8, 0x24, 0x1, 0xF, 0x0, 0x10, 0x24, 0x1, 0xF, 0x0, 0x18, 0x24, 0x1, 0xF, 0x0, 0x20, 0x24, 0x1, 0xF, 0x0, 0x28, 0x24, 0x1, 0xF, 0x0, 0x30, 0x24, 0x1, 0xF, 0x0, 0x38, 0x24, 0x1, 0xF, 0x0, 0x40, 0x24, 0x1, 0xF, 0x0, 0x48, 0x24, 0x1, 0xF, 0x0, 0x50, 0x24, 0x1, 0xF, 0x0, 0x58, 0x24, 0x1, 0xF, 0x0, 0x60, 0x24, 0x1, 0xF, 0x0, 0x68, 0x24, 0x1, 0xF, 0x0, 0x70, 0x24, 0x1, 0xF, 0x0, 0x78, 0x24, 0x1, 0xF, 0x0, 0x80, 0x24, 0x1, 0xF, 0x0, 0x88, 0x24, 0x1, 0xF, 0x0, 0x90, 0x24, 0x1, 0xF, 0x0, 0x98, 0x24, 0x1, 0xF, 0x0, 0xA0, 0x24, 0x1, 0xF, 0x0, 0xA8, 0x24, 0x1, 0xF, 0x0, 0xB0, 0x24, 0x1, 0xF, 0x0, 0xB8, 0x24, 0x1, 0xF, 0x0, 0xC0, 0x24, 0x1, 0xF, 0x0, 0xC8, 0x24, 0x1, 0xF, 0x0, 0xD0, 0x24, 0x1, 0xF, 0x0, 0xD8, 0x24, 0x1, 0xF, 0x0, 0xE0, 0x24, 0x1, 0xF, 0x0, 0xE8, 0x24, 0x1, 0xF, 0x0, 0xF0, 0x24, 0x1, 0xF, 0x0, 0xF8, 0x24, 0x1, 0xF, 0x0, 0x0, 0x25, 0x1, 0xF, 0x0, 0x8, 0x25, 0x1, 0xF, 0x0, 0x10, 0x25, 0x1, 0xF, 0x0, 0x18, 0x25, 0x1, 0xF, 0x0, 0x20, 0x25, 0x1, 0xF, 0x0, 0x28, 0x25, 0x1, 0xF, 0x0, 0x30, 0x25, 0x1, 0xF, 0x0, 0x38, 0x25, 0x1, 0xF, 0x0, 0x40, 0x25, 0x1, 0xF, 0x0, 0x48, 0x25, 0x1, 0xF, 0x0, 0x50, 0x25, 0x1, 0xF, 0x0, 0x58, 0x25, 0x1, 0xF, 0x0, 0x60, 0x25, 0x1, 0xF, 0x0, 0x68, 0x25, 0x1, 0xF, 0x0, 0x70, 0x25, 0x1, 0xF, 0x0, 0x78, 0x25, 0x1, 0xF, 0x0, 0x80, 0x25, 0x1, 0xF, 0x0, 0x88, 0x25, 0x1, 0xF, 0x0, 0x90, 0x25, 0x1, 0xF, 0x0, 0x98, 0x25, 0x1, 0xF, 0x0, 0xA0, 0x25, 0x1, 0xF, 0x0, 0xA8, 0x25, 0x1, 0xF, 0x0, 0xB0, 0x25, 0x1, 0xF, 0x0, 0xB8, 0x25, 0x1, 0xF, 0x0, 0xC0, 0x25, 0x1, 0xF, 0x0, 0xC8, 0x25, 0x1, 0xF, 0x0, 0xD0, 0x25, 0x1, 0xF, 0x0, 0xD8, 0x25, 0x1, 0xF, 0x0, 0xE0, 0x25, 0x1, 0xF, 0x0, 0xE8, 0x25, 0x1, 0xF, 0x0, 0xF0, 0x25, 0x1, 0xF, 0x0, 0xF8, 0x25, 0x1, 0xF, 0x0, 0x0, 0x26, 0x1, 0xF, 0x0, 0x8, 0x26, 0x1, 0xF, 0x0, 0x10, 0x26, 0x1, 0xF, 0x0, 0x18, 0x26, 0x1, 0xF, 0x0, 0x20, 0x26, 0x1, 0xF, 0x0, 0x28, 0x26, 0x1, 0xF, 0x0, 0x30, 0x26, 0x1, 0xF, 0x0, 0x38, 0x26, 0x1, 0xF, 0x0, 0x40, 0x26, 0x1, 0xF, 0x0, 0x48, 0x26, 0x1, 0xF, 0x0, 0x50, 0x26, 0x1, 0xF, 0x0, 0x58, 0x26, 0x1, 0xF, 0x0, 0x60, 0x26, 0x1, 0xF, 0x0, 0x68, 0x26, 0x1, 0xF, 0x0, 0x70, 0x26, 0x1, 0xF, 0x0, 0x78, 0x26, 0x1, 0xF, 0x0, 0x80, 0x26, 0x1, 0xF, 0x0, 0x88, 0x26, 0x1, 0xF, 0x0, 0x90, 0x26, 0x1, 0xF, 0x0, 0x98, 0x26, 0x1, 0xF, 0x0, 0xA0, 0x26, 0x1, 0xF, 0x0, 0xA8, 0x26, 0x1, 0xF, 0x0, 0xB0, 0x26, 0x1, 0xF, 0x0, 0xB8, 0x26, 0x1, 0xF, 0x0, 0xC0, 0x26, 0x1, 0xF, 0x0, 0xC8, 0x26, 0x1, 0xF, 0x0, 0xD0, 0x26, 0x1, 0xF, 0x0, 0xD8, 0x26, 0x1, 0xF, 0x0, 0xE0, 0x26, 0x1, 0xF, 0x0, 0xE8, 0x26, 0x1, 0xF, 0x0, 0xF0, 0x26, 0x1, 0xF, 0x0, 0xF8, 0x26, 0x1, 0xF, 0x0, 0x0, 0x27, 0x1, 0xF, 0x0, 0x8, 0x27, 0x1, 0xF, 0x0, 0x10, 0x27, 0x1, 0xF, 0x0, 0x18, 0x27, 0x1, 0xF, 0x0, 0x20, 0x27, 0x1, 0xF, 0x0, 0x28, 0x27, 0x1, 0xF, 0x0, 0x30, 0x27, 0x1, 0xF, 0x0, 0x38, 0x27, 0x1, 0xF, 0x0, 0x40, 0x27, 0x1, 0xF, 0x0, 0x48, 0x27, 0x1, 0xF, 0x0, 0x50, 0x27, 0x1, 0xF, 0x0, 0x58, 0x27, 0x1, 0xF, 0x0, 0x60, 0x27, 0x1, 0xF, 0x0, 0x68, 0x27, 0x1, 0xF, 0x0, 0x70, 0x27, 0x1, 0xF, 0x0, 0x78, 0x27, 0x1, 0xF, 0x0, 0x80, 0x27, 0x1, 0xF, 0x0, 0x88, 0x27, 0x1, 0xF, 0x0, 0x90, 0x27, 0x1, 0xF, 0x0, 0x98, 0x27, 0x1, 0xF, 0x0, 0xA0, 0x27, 0x1, 0xF, 0x0, 0xA8, 0x27, 0x1, 0xF, 0x0, 0xB0, 0x27, 0x1, 0xF, 0x0, 0xB8, 0x27, 0x1, 0xF, 0x0, 0xC0, 0x27, 0x1, 0xF, 0x0, 0xC8, 0x27, 0x1, 0xF, 0x0, 0xD0, 0x27, 0x1, 0xF, 0x0, 0xD8, 0x27, 0x1, 0xF, 0x0, 0xE0, 0x27, 0x1, 0xF, 0x0, 0xE8, 0x27, 0x1, 0xF, 0x0, 0xF0, 0x27, 0x1, 0xF, 0x0, 0xF8, 0x27, 0x1, 0xF, 0x0, 0x0, 0x28, 0x1, 0xF, 0x0, 0x8, 0x28, 0x1, 0xF, 0x0, 0x10, 0x28, 0x1, 0xF, 0x0, 0x18, 0x28, 0x1, 0xF, 0x0, 0x20, 0x28, 0x1, 0xF, 0x0, 0x28, 0x28, 0x1, 0xF, 0x0, 0x30, 0x28, 0x1, 0xF, 0x0, 0x38, 0x28, 0x1, 0xF, 0x0, 0x40, 0x28, 0x1, 0xF, 0x0, 0x48, 0x28, 0x1, 0xF, 0x0, 0x50, 0x28, 0x1, 0xF, 0x0, 0x58, 0x28, 0x1, 0xF, 0x0, 0x60, 0x28, 0x1, 0xF, 0x0, 0x68, 0x28, 0x1, 0xF, 0x0, 0x70, 0x28, 0x1, 0xF, 0x0, 0x78, 0x28, 0x1, 0xF, 0x0, 0x80, 0x28, 0x1, 0xF, 0x0, 0x88, 0x28, 0x1, 0xF, 0x0, 0x90, 0x28, 0x1, 0xF, 0x0, 0x98, 0x28, 0x1, 0xF, 0x0, 0xA0, 0x28, 0x1, 0xF, 0x0, 0xA8, 0x28, 0x1, 0xF, 0x0, 0xB0, 0x28, 0x1, 0xF, 0x0, 0xB8, 0x28, 0x1, 0xF, 0x0, 0xC0, 0x28, 0x1, 0xF, 0x0, 0xC8, 0x28, 0x1, 0xF, 0x0, 0xD0, 0x28, 0x1, 0xF, 0x0, 0xD8, 0x28, 0x1, 0xF, 0x0, 0xE0, 0x28, 0x1, 0xF, 0x0, 0xE8, 0x28, 0x1, 0xF, 0x0, 0xF0, 0x28, 0x1, 0xF, 0x0, 0xF8, 0x28, 0x1, 0xF, 0x0, 0x0, 0x29, 0x1, 0xF, 0x0, 0x8, 0x29, 0x1, 0xF, 0x0, 0x10, 0x29, 0x1, 0xF, 0x0, 0x18, 0x29, 0x1, 0xF, 0x0, 0x20, 0x29, 0x1, 0xF, 0x0, 0x28, 0x29, 0x1, 0xF, 0x0, 0x30, 0x29, 0x1, 0xF, 0x0, 0x38, 0x29, 0x1, 0xF, 0x0, 0x40, 0x29, 0x1, 0xF, 0x0, 0x48, 0x29, 0x1, 0xF, 0x0, 0x50, 0x29, 0x1, 0xF, 0x0, 0x58, 0x29, 0x1, 0xF, 0x0, 0x60, 0x29, 0x1, 0xF, 0x0, 0x68, 0x29, 0x1, 0xF, 0x0, 0x70, 0x29, 0x1, 0xF, 0x0, 0x78, 0x29, 0x1, 0xF, 0x0, 0x80, 0x29, 0x1, 0xF, 0x0, 0x88, 0x29, 0x1, 0xF, 0x0, 0x90, 0x29, 0x1, 0xF, 0x0, 0x98, 0x29, 0x1, 0xF, 0x0, 0xA0, 0x29, 0x1, 0xF, 0x0, 0xA8, 0x29, 0x1, 0xF, 0x0, 0xB0, 0x29, 0x1, 0xF, 0x0, 0xB8, 0x29, 0x1, 0xF, 0x0, 0xC0, 0x29, 0x1, 0xF, 0x0, 0xC8, 0x29, 0x1, 0xF, 0x0, 0xD0, 0x29, 0x1, 0xF, 0x0, 0xD8, 0x29, 0x1, 0xF, 0x0, 0xE0, 0x29, 0x1, 0xF, 0x0, 0xE8, 0x29, 0x1, 0xF, 0x0, 0xF0, 0x29, 0x1, 0xF, 0x0, 0xF8, 0x29, 0x1, 0xF, 0x0, 0x0, 0x2A, 0x1, 0xF, 0x0, 0x8, 0x2A, 0x1, 0xF, 0x0, 0x10, 0x2A, 0x1, 0xF, 0x0, 0x18, 0x2A, 0x1, 0xF, 0x0, 0x20, 0x2A, 0x1, 0xF, 0x0, 0x28, 0x2A, 0x1, 0xF, 0x0, 0x30, 0x2A, 0x1, 0xF, 0x0, 0x38, 0x2A, 0x1, 0xF, 0x0, 0x40, 0x2A, 0x1, 0xF, 0x0, 0x48, 0x2A, 0x1, 0xF, 0x0, 0x50, 0x2A, 0x1, 0xF, 0x0, 0x58, 0x2A, 0x1, 0xF, 0x0, 0x60, 0x2A, 0x1, 0xF, 0x0, 0x68, 0x2A, 0x1, 0xF, 0x0, 0x70, 0x2A, 0x1, 0xF, 0x0, 0x78, 0x2A, 0x1, 0xF, 0x0, 0x80, 0x2A, 0x1, 0xF, 0x0, 0x88, 0x2A, 0x1, 0xF, 0x0, 0x90, 0x2A, 0x1, 0xF, 0x0, 0x98, 0x2A, 0x1, 0xF, 0x0, 0xA0, 0x2A, 0x1, 0xF, 0x0, 0xA8, 0x2A, 0x1, 0xF, 0x0, 0xB0, 0x2A, 0x1, 0xF, 0x0, 0xB8, 0x2A, 0x1, 0xF, 0x0, 0xC0, 0x2A, 0x1, 0xF, 0x0, 0xC8, 0x2A, 0x1, 0xF, 0x0, 0xD0, 0x2A, 0x1, 0xF, 0x0, 0xD8, 0x2A, 0x1, 0xF, 0x0, 0xE0, 0x2A, 0x1, 0xF, 0x0, 0xE8, 0x2A, 0x1, 0xF, 0x0, 0xF0, 0x2A, 0x1, 0xF, 0x0, 0xF8, 0x2A, 0x1, 0xF, 0x0, 0x0, 0x2B, 0x1, 0xF, 0x0, 0x8, 0x2B, 0x1, 0xF, 0x0, 0x10, 0x2B, 0x1, 0xF, 0x0, 0x18, 0x2B, 0x1, 0xF, 0x0, 0x20, 0x2B, 0x1, 0xF, 0x0, 0x28, 0x2B, 0x1, 0xF, 0x0, 0x30, 0x2B, 0x1, 0xF, 0x0, 0x38, 0x2B, 0x1, 0xF, 0x0, 0x40, 0x2B, 0x1, 0xF, 0x0, 0x48, 0x2B, 0x1, 0xF, 0x0, 0x50, 0x2B, 0x1, 0xF, 0x0, 0x58, 0x2B, 0x1, 0xF, 0x0, 0x60, 0x2B, 0x1, 0xF, 0x0, 0x68, 0x2B, 0x1, 0xF, 0x0, 0x70, 0x2B, 0x1, 0xF, 0x0, 0x78, 0x2B, 0x1, 0xF, 0x0, 0x80, 0x2B, 0x1, 0xF, 0x0, 0x88, 0x2B, 0x1, 0xF, 0x0, 0x90, 0x2B, 0x1, 0xF, 0x0, 0x98, 0x2B, 0x1, 0xF, 0x0, 0xA0, 0x2B, 0x1, 0xF, 0x0, 0xA8, 0x2B, 0x1, 0xF, 0x0, 0xB0, 0x2B, 0x1, 0xF, 0x0, 0xB8, 0x2B, 0x1, 0xF, 0x0, 0xC0, 0x2B, 0x1, 0xF, 0x0, 0xC8, 0x2B, 0x1, 0xF, 0x0, 0xD0, 0x2B, 0x1, 0xF, 0x0, 0xD8, 0x2B, 0x1, 0xF, 0x0, 0xE0, 0x2B, 0x1, 0xF, 0x0, 0xE8, 0x2B, 0x1, 0xF, 0x0, 0xF0, 0x2B, 0x1, 0xF, 0x0, 0xF8, 0x2B, 0x1, 0xF, 0x0, 0x0, 0x2C, 0x1, 0xF, 0x0, 0x8, 0x2C, 0x1, 0xF, 0x0, 0x10, 0x2C, 0x1, 0xF, 0x0, 0x18, 0x2C, 0x1, 0xF, 0x0, 0x20, 0x2C, 0x1, 0xF, 0x0, 0x28, 0x2C, 0x1, 0xF, 0x0, 0x30, 0x2C, 0x1, 0xF, 0x0, 0x38, 0x2C, 0x1, 0xF, 0x0, 0x40, 0x2C, 0x1, 0xF, 0x0, 0x48, 0x2C, 0x1, 0xF, 0x0, 0x50, 0x2C, 0x1, 0xF, 0x0, 0x58, 0x2C, 0x1, 0xF, 0x0, 0x60, 0x2C, 0x1, 0xF, 0x0, 0x68, 0x2C, 0x1, 0xF, 0x0, 0x70, 0x2C, 0x1, 0xF, 0x0, 0x78, 0x2C, 0x1, 0xF, 0x0, 0x80, 0x2C, 0x1, 0xF, 0x0, 0x88, 0x2C, 0x1, 0xF, 0x0, 0x90, 0x2C, 0x1, 0xF, 0x0, 0x98, 0x2C, 0x1, 0xF, 0x0, 0xA0, 0x2C, 0x1, 0xF, 0x0, 0xA8, 0x2C, 0x1, 0xF, 0x0, 0xB0, 0x2C, 0x1, 0xF, 0x0, 0xB8, 0x2C, 0x1, 0xF, 0x0, 0xC0, 0x2C, 0x1, 0xF, 0x0, 0xC8, 0x2C, 0x1, 0xF, 0x0, 0xD0, 0x2C, 0x1, 0xF, 0x0, 0xD8, 0x2C, 0x1, 0xF, 0x0, 0xE0, 0x2C, 0x1, 0xF, 0x0, 0xE8, 0x2C, 0x1, 0xF, 0x0, 0xF0, 0x2C, 0x1, 0xF, 0x0, 0xF8, 0x2C, 0x1, 0xF, 0x0, 0x0, 0x2D, 0x1, 0xF, 0x0, 0x8, 0x2D, 0x1, 0xF, 0x0, 0x10, 0x2D, 0x1, 0xF, 0x0, 0x18, 0x2D, 0x1, 0xF, 0x0, 0x20, 0x2D, 0x1, 0xF, 0x0, 0x28, 0x2D, 0x1, 0xF, 0x0, 0x30, 0x2D, 0x1, 0xF, 0x0, 0x38, 0x2D, 0x1, 0xF, 0x0, 0x40, 0x2D, 0x1, 0xF, 0x0, 0x48, 0x2D, 0x1, 0xF, 0x0, 0x50, 0x2D, 0x1, 0xF, 0x0, 0x58, 0x2D, 0x1, 0xF, 0x0, 0x60, 0x2D, 0x1, 0xF, 0x0, 0x68, 0x2D, 0x1, 0xF, 0x0, 0x70, 0x2D, 0x1, 0xF, 0x0, 0x78, 0x2D, 0x1, 0xF, 0x0, 0x80, 0x2D, 0x1, 0xF, 0x0, 0x88, 0x2D, 0x1, 0xF, 0x0, 0x90, 0x2D, 0x1, 0xF, 0x0, 0x98, 0x2D, 0x1, 0xF, 0x0, 0xA0, 0x2D, 0x1, 0xF, 0x0, 0xA8, 0x2D, 0x1, 0xF, 0x0, 0xB0, 0x2D, 0x1, 0xF, 0x0, 0xB8, 0x2D, 0x1, 0xF, 0x0, 0xC0, 0x2D, 0x1, 0xF, 0x0, 0xC8, 0x2D, 0x1, 0xF, 0x0, 0xD0, 0x2D, 0x1, 0xF, 0x0, 0xD8, 0x2D, 0x1, 0xF, 0x0, 0xE0, 0x2D, 0x1, 0xF, 0x0, 0xE8, 0x2D, 0x1, 0xF, 0x0, 0xF0, 0x2D, 0x1, 0xF, 0x0, 0xF8, 0x2D, 0x1, 0xF, 0x0, 0x0, 0x2E, 0x1, 0xF, 0x0, 0x8, 0x2E, 0x1, 0xF, 0x0, 0x10, 0x2E, 0x1, 0xF, 0x0, 0x18, 0x2E, 0x1, 0xF, 0x0, 0x20, 0x2E, 0x1, 0xF, 0x0, 0x28, 0x2E, 0x1, 0xF, 0x0, 0x30, 0x2E, 0x1, 0xF, 0x0, 0x38, 0x2E, 0x1, 0xF, 0x0, 0x40, 0x2E, 0x1, 0xF, 0x0, 0x48, 0x2E, 0x1, 0xF, 0x0, 0x50, 0x2E, 0x1, 0xF, 0x0, 0x58, 0x2E, 0x1, 0xF, 0x0, 0x60, 0x2E, 0x1, 0xF, 0x0, 0x68, 0x2E, 0x1, 0xF, 0x0, 0x70, 0x2E, 0x1, 0xF, 0x0, 0x78, 0x2E, 0x1, 0xF, 0x0, 0x80, 0x2E, 0x1, 0xF, 0x0, 0x88, 0x2E, 0x1, 0xF, 0x0, 0x90, 0x2E, 0x1, 0xF, 0x0, 0x98, 0x2E, 0x1, 0xF, 0x0, 0xA0, 0x2E, 0x1, 0xF, 0x0, 0xA8, 0x2E, 0x1, 0xF, 0x0, 0xB0, 0x2E, 0x1, 0xF, 0x0, 0xB8, 0x2E, 0x1, 0xF, 0x0, 0xC0, 0x2E, 0x1, 0xF, 0x0, 0xC8, 0x2E, 0x1, 0xF, 0x0, 0xD0, 0x2E, 0x1, 0xF, 0x0, 0xD8, 0x2E, 0x1, 0xF, 0x0, 0xE0, 0x2E, 0x1, 0xF, 0x0, 0xE8, 0x2E, 0x1, 0xF, 0x0, 0xF0, 0x2E, 0x1, 0xF, 0x0, 0xF8, 0x2E, 0x1, 0xF, 0x0, 0x0, 0x2F, 0x1, 0xF, 0x0, 0x8, 0x2F, 0x1, 0xF, 0x0, 0x10, 0x2F, 0x1, 0xF, 0x0, 0x18, 0x2F, 0x1, 0xF, 0x0, 0x20, 0x2F, 0x1, 0xF, 0x0, 0x28, 0x2F, 0x1, 0xF, 0x0, 0x30, 0x2F, 0x1, 0xF, 0x0, 0x38, 0x2F, 0x1, 0xF, 0x0, 0x40, 0x2F, 0x1, 0xF, 0x0, 0x48, 0x2F, 0x1, 0xF, 0x0, 0x50, 0x2F, 0x1, 0xF, 0x0, 0x58, 0x2F, 0x1, 0xF, 0x0, 0x60, 0x2F, 0x1, 0xF, 0x0, 0x68, 0x2F, 0x1, 0xF, 0x0, 0x70, 0x2F, 0x1, 0xF, 0x0, 0x78, 0x2F, 0x1, 0xF, 0x0, 0x80, 0x2F, 0x1, 0xF, 0x0, 0x88, 0x2F, 0x1, 0xF, 0x0, 0x90, 0x2F, 0x1, 0xF, 0x0, 0x98, 0x2F, 0x1, 0xF, 0x0, 0xA0, 0x2F, 0x1, 0xF, 0x0, 0xA8, 0x2F, 0x1, 0xF, 0x0, 0xB0, 0x2F, 0x1, 0xF, 0x0, 0xB8, 0x2F, 0x1, 0xF, 0x0, 0xC0, 0x2F, 0x1, 0xF, 0x0, 0xC8, 0x2F, 0x1, 0xF, 0x0, 0xD0, 0x2F, 0x1, 0xF, 0x0, 0xD8, 0x2F, 0x1, 0xF, 0x0, 0xE0, 0x2F, 0x1, 0xF, 0x0, 0xE8, 0x2F, 0x1, 0xF, 0x0, 0xF0, 0x2F, 0x1, 0xF, 0x0, 0xF8, 0x2F, 0x1, 0xF, 0x0, 0x0, 0x30, 0x1, 0xF, 0x0, 0x8, 0x30, 0x1, 0xF, 0x0, 0x10, 0x30, 0x1, 0xF, 0x0, 0x18, 0x30, 0x1, 0xF, 0x0, 0x20, 0x30, 0x1, 0xF, 0x0, 0x28, 0x30, 0x1, 0xF, 0x0, 0x30, 0x30, 0x1, 0xF, 0x0, 0x38, 0x30, 0x1, 0xF, 0x0, 0x40, 0x30, 0x1, 0xF, 0x0, 0x48, 0x30, 0x1, 0xF, 0x0, 0x50, 0x30, 0x1, 0xF, 0x0, 0x58, 0x30, 0x1, 0xF, 0x0, 0x60, 0x30, 0x1, 0xF, 0x0, 0x68, 0x30, 0x1, 0xF, 0x0, 0x70, 0x30, 0x1, 0xF, 0x0, 0x78, 0x30, 0x1, 0xF, 0x0, 0x80, 0x30, 0x1, 0xF, 0x0, 0x88, 0x30, 0x1, 0xF, 0x0, 0x90, 0x30, 0x1, 0xF, 0x0, 0x98, 0x30, 0x1, 0xF, 0x0, 0xA0, 0x30, 0x1, 0xF, 0x0, 0xA8, 0x30, 0x1, 0xF, 0x0, 0xB0, 0x30, 0x1, 0xF, 0x0, 0xB8, 0x30, 0x1, 0xF, 0x0, 0xC0, 0x30, 0x1, 0xF, 0x0, 0xC8, 0x30, 0x1, 0xF, 0x0, 0xD0, 0x30, 0x1, 0xF, 0x0, 0xD8, 0x30, 0x1, 0xF, 0x0, 0xE0, 0x30, 0x1, 0xF, 0x0, 0xE8, 0x30, 0x1, 0xF, 0x0, 0xF0, 0x30, 0x1, 0xF, 0x0, 0xF8, 0x30, 0x1, 0xF, 0x0, 0x0, 0x31, 0x1, 0xF, 0x0, 0x8, 0x31, 0x1, 0xF, 0x0, 0x10, 0x31, 0x1, 0xF, 0x0, 0x18, 0x31, 0x1, 0xF, 0x0, 0x20, 0x31, 0x1, 0xF, 0x0, 0x28, 0x31, 0x1, 0xF, 0x0, 0x30, 0x31, 0x1, 0xF, 0x0, 0x38, 0x31, 0x1, 0xF, 0x0, 0x40, 0x31, 0x1, 0xF, 0x0, 0x48, 0x31, 0x1, 0xF, 0x0, 0x50, 0x31, 0x1, 0xF, 0x0, 0x58, 0x31, 0x1, 0xF, 0x0, 0x60, 0x31, 0x1, 0xF, 0x0, 0x68, 0x31, 0x1, 0xF, 0x0, 0x70, 0x31, 0x1, 0xF, 0x0, 0x78, 0x31, 0x1, 0xF, 0x0, 0x80, 0x31, 0x1, 0xF, 0x0, 0x88, 0x31, 0x1, 0xF, 0x0, 0x90, 0x31, 0x1, 0xF, 0x0, 0x98, 0x31, 0x1, 0xF, 0x0, 0xA0, 0x31, 0x1, 0xF, 0x0, 0xA8, 0x31, 0x1, 0xF, 0x0, 0xB0, 0x31, 0x1, 0xF, 0x0, 0xB8, 0x31, 0x1, 0xF, 0x0, 0xC0, 0x31, 0x1, 0xF, 0x0, 0xC8, 0x31, 0x1, 0xF, 0x0, 0xD0, 0x31, 0x1, 0xF, 0x0, 0xD8, 0x31, 0x1, 0xF, 0x0, 0xE0, 0x31, 0x1, 0xF, 0x0, 0xE8, 0x31, 0x1, 0xF, 0x0, 0xF0, 0x31, 0x1, 0xF, 0x0, 0xF8, 0x31, 0x1, 0xF, 0x0, 0x0, 0x32, 0x1, 0xF, 0x0, 0x8, 0x32, 0x1, 0xF, 0x0, 0x10, 0x32, 0x1, 0xF, 0x0, 0x18, 0x32, 0x1, 0xF, 0x0, 0x20, 0x32, 0x1, 0xF, 0x0, 0x28, 0x32, 0x1, 0xF, 0x0, 0x30, 0x32, 0x1, 0xF, 0x0, 0x38, 0x32, 0x1, 0xF, 0x0, 0x40, 0x32, 0x1, 0xF, 0x0, 0x48, 0x32, 0x1, 0xF, 0x0, 0x50, 0x32, 0x1, 0xF, 0x0, 0x58, 0x32, 0x1, 0xF, 0x0, 0x60, 0x32, 0x1, 0xF, 0x0, 0x68, 0x32, 0x1, 0xF, 0x0, 0x70, 0x32, 0x1, 0xF, 0x0, 0x78, 0x32, 0x1, 0xF, 0x0, 0x80, 0x32, 0x1, 0xF, 0x0, 0x88, 0x32, 0x1, 0xF, 0x0, 0x90, 0x32, 0x1, 0xF, 0x0, 0x98, 0x32, 0x1, 0xF, 0x0, 0xA0, 0x32, 0x1, 0xF, 0x0, 0xA8, 0x32, 0x1, 0xF, 0x0, 0xB0, 0x32, 0x1, 0xF, 0x0, 0xB8, 0x32, 0x1, 0xF, 0x0, 0xC0, 0x32, 0x1, 0xF, 0x0, 0xC8, 0x32, 0x1, 0xF, 0x0, 0xD0, 0x32, 0x1, 0xF, 0x0, 0xD8, 0x32, 0x1, 0xF, 0x0, 0xE0, 0x32, 0x1, 0xF, 0x0, 0xE8, 0x32, 0x1, 0xF, 0x0, 0xF0, 0x32, 0x1, 0xF, 0x0, 0xF8, 0x32, 0x1, 0xF, 0x0, 0x0, 0x33, 0x1, 0xF, 0x0, 0x8, 0x33, 0x1, 0xF, 0x0, 0x10, 0x33, 0x1, 0xF, 0x0, 0x18, 0x33, 0x1, 0xF, 0x0, 0x20, 0x33, 0x1, 0xF, 0x0, 0x28, 0x33, 0x1, 0xF, 0x0, 0x30, 0x33, 0x1, 0xF, 0x0, 0x38, 0x33, 0x1, 0xF, 0x0, 0x40, 0x33, 0x1, 0xF, 0x0, 0x48, 0x33, 0x1, 0xF, 0x0, 0x50, 0x33, 0x1, 0xF, 0x0, 0x58, 0x33, 0x1, 0xF, 0x0, 0x60, 0x33, 0x1, 0xF, 0x0, 0x68, 0x33, 0x1, 0xF, 0x0, 0x70, 0x33, 0x1, 0xF, 0x0, 0x78, 0x33, 0x1, 0xF, 0x0, 0x80, 0x33, 0x1, 0xF, 0x0, 0x88, 0x33, 0x1, 0xF, 0x0, 0x90, 0x33, 0x1, 0xF, 0x0, 0x98, 0x33, 0x1, 0xF, 0x0, 0xA0, 0x33, 0x1, 0xF, 0x0, 0xA8, 0x33, 0x1, 0xF, 0x0, 0xB0, 0x33, 0x1, 0xF, 0x0, 0xB8, 0x33, 0x1, 0xF, 0x0, 0xC0, 0x33, 0x1, 0xF, 0x0, 0xC8, 0x33, 0x1, 0xF, 0x0, 0xD0, 0x33, 0x1, 0xF, 0x0, 0xD8, 0x33, 0x1, 0xF, 0x0, 0xE0, 0x33, 0x1, 0xF, 0x0, 0xE8, 0x33, 0x1, 0xF, 0x0, 0xF0, 0x33, 0x1, 0xF, 0x0, 0xF8, 0x33, 0x1, 0xF, 0x0, 0x0, 0x34, 0x1, 0xF, 0x0, 0x8, 0x34, 0x1, 0xF, 0x0, 0x10, 0x34, 0x1, 0xF, 0x0, 0x18, 0x34, 0x1, 0xF, 0x0, 0x20, 0x34, 0x1, 0xF, 0x0, 0x28, 0x34, 0x1, 0xF, 0x0, 0x30, 0x34, 0x1, 0xF, 0x0, 0x38, 0x34, 0x1, 0xF, 0x0, 0x40, 0x34, 0x1, 0xF, 0x0, 0x48, 0x34, 0x1, 0xF, 0x0, 0x50, 0x34, 0x1, 0xF, 0x0, 0x58, 0x34, 0x1, 0xF, 0x0, 0x60, 0x34, 0x1, 0xF, 0x0, 0x68, 0x34, 0x1, 0xF, 0x0, 0x70, 0x34, 0x1, 0xF, 0x0, 0x78, 0x34, 0x1, 0xF, 0x0, 0x80, 0x34, 0x1, 0xF, 0x0, 0x88, 0x34, 0x1, 0xF, 0x0, 0x90, 0x34, 0x1, 0xF, 0x0, 0x98, 0x34, 0x1, 0xF, 0x0, 0xA0, 0x34, 0x1, 0xF, 0x0, 0xA8, 0x34, 0x1, 0xF, 0x0, 0xB0, 0x34, 0x1, 0xF, 0x0, 0xB8, 0x34, 0x1, 0xF, 0x0, 0xC0, 0x34, 0x1, 0xF, 0x0, 0xC8, 0x34, 0x1, 0xF, 0x0, 0xD0, 0x34, 0x1, 0xF, 0x0, 0xD8, 0x34, 0x1, 0xF, 0x0, 0xE0, 0x34, 0x1, 0xF, 0x0, 0xE8, 0x34, 0x1, 0xF, 0x0, 0xF0, 0x34, 0x1, 0xF, 0x0, 0xF8, 0x34, 0x1, 0xF, 0x0, 0x0, 0x35, 0x1, 0xF, 0x0, 0x8, 0x35, 0x1, 0xF, 0x0, 0x10, 0x35, 0x1, 0xF, 0x0, 0x18, 0x35, 0x1, 0xF, 0x0, 0x20, 0x35, 0x1, 0xF, 0x0, 0x28, 0x35, 0x1, 0xF, 0x0, 0x30, 0x35, 0x1, 0xF, 0x0, 0x38, 0x35, 0x1, 0xF, 0x0, 0x40, 0x35, 0x1, 0xF, 0x0, 0x48, 0x35, 0x1, 0xF, 0x0, 0x50, 0x35, 0x1, 0xF, 0x0, 0x58, 0x35, 0x1, 0xF, 0x0, 0x60, 0x35, 0x1, 0xF, 0x0, 0x68, 0x35, 0x1, 0xF, 0x0, 0x70, 0x35, 0x1, 0xF, 0x0, 0x78, 0x35, 0x1, 0xF, 0x0, 0x80, 0x35, 0x1, 0xF, 0x0, 0x88, 0x35, 0x1, 0xF, 0x0, 0x90, 0x35, 0x1, 0xF, 0x0, 0x98, 0x35, 0x1, 0xF, 0x0, 0xA0, 0x35, 0x1, 0xF, 0x0, 0xA8, 0x35, 0x1, 0xF, 0x0, 0xB0, 0x35, 0x1, 0xF, 0x0, 0xB8, 0x35, 0x1, 0xF, 0x0, 0xC0, 0x35, 0x1, 0xF, 0x0, 0xC8, 0x35, 0x1, 0xF, 0x0, 0xD0, 0x35, 0x1, 0xF, 0x0, 0xD8, 0x35, 0x1, 0xF, 0x0, 0xE0, 0x35, 0x1, 0xF, 0x0, 0xE8, 0x35, 0x1, 0xF, 0x0, 0xF0, 0x35, 0x1, 0xF, 0x0, 0xF8, 0x35, 0x1, 0xF, 0x0, 0x0, 0x36, 0x1, 0xF, 0x0, 0x8, 0x36, 0x1, 0xF, 0x0, 0x10, 0x36, 0x1, 0xF, 0x0, 0x18, 0x36, 0x1, 0xF, 0x0, 0x20, 0x36, 0x1, 0xF, 0x0, 0x28, 0x36, 0x1, 0xF, 0x0, 0x30, 0x36, 0x1, 0xF, 0x0, 0x38, 0x36, 0x1, 0xF, 0x0, 0x40, 0x36, 0x1, 0xF, 0x0, 0x48, 0x36, 0x1, 0xF, 0x0, 0x50, 0x36, 0x1, 0xF, 0x0, 0x58, 0x36, 0x1, 0xF, 0x0, 0x60, 0x36, 0x1, 0xF, 0x0, 0x68, 0x36, 0x1, 0xF, 0x0, 0x70, 0x36, 0x1, 0xF, 0x0, 0x78, 0x36, 0x1, 0xF, 0x0, 0x80, 0x36, 0x1, 0xF, 0x0, 0x88, 0x36, 0x1, 0xF, 0x0, 0x90, 0x36, 0x1, 0xF, 0x0, 0x98, 0x36, 0x1, 0xF, 0x0, 0xA0, 0x36, 0x1, 0xF, 0x0, 0xA8, 0x36, 0x1, 0xF, 0x0, 0xB0, 0x36, 0x1, 0xF, 0x0, 0xB8, 0x36, 0x1, 0xF, 0x0, 0xC0, 0x36, 0x1, 0xF, 0x0, 0xC8, 0x36, 0x1, 0xF, 0x0, 0xD0, 0x36, 0x1, 0xF, 0x0, 0xD8, 0x36, 0x1, 0xF, 0x0, 0xE0, 0x36, 0x1, 0xF, 0x0, 0xE8, 0x36, 0x1, 0xF, 0x0, 0xF0, 0x36, 0x1, 0xF, 0x0, 0xF8, 0x36, 0x1, 0xF, 0x0, 0x0, 0x37, 0x1, 0xF, 0x0, 0x8, 0x37, 0x1, 0xF, 0x0, 0x10, 0x37, 0x1, 0xF, 0x0, 0x18, 0x37, 0x1, 0xF, 0x0, 0x20, 0x37, 0x1, 0xF, 0x0, 0x28, 0x37, 0x1, 0xF, 0x0, 0x30, 0x37, 0x1, 0xF, 0x0, 0x38, 0x37, 0x1, 0xF, 0x0, 0x40, 0x37, 0x1, 0xF, 0x0, 0x48, 0x37, 0x1, 0xF, 0x0, 0x50, 0x37, 0x1, 0xF, 0x0, 0x58, 0x37, 0x1, 0xF, 0x0, 0x60, 0x37, 0x1, 0xF, 0x0, 0x68, 0x37, 0x1, 0xF, 0x0, 0x70, 0x37, 0x1, 0xF, 0x0, 0x78, 0x37, 0x1, 0xF, 0x0, 0x80, 0x37, 0x1, 0xF, 0x0, 0x88, 0x37, 0x1, 0xF, 0x0, 0x90, 0x37, 0x1, 0xF, 0x0, 0x98, 0x37, 0x1, 0xF, 0x0, 0xA0, 0x37, 0x1, 0xF, 0x0, 0xA8, 0x37, 0x1, 0xF, 0x0, 0xB0, 0x37, 0x1, 0xF, 0x0, 0xB8, 0x37, 0x1, 0xF, 0x0, 0xC0, 0x37, 0x1, 0xF, 0x0, 0xC8, 0x37, 0x1, 0xF, 0x0, 0xD0, 0x37, 0x1, 0xF, 0x0, 0xD8, 0x37, 0x1, 0xF, 0x0, 0xE0, 0x37, 0x1, 0xF, 0x0, 0xE8, 0x37, 0x1, 0xF, 0x0, 0xF0, 0x37, 0x1, 0xF, 0x0, 0xF8, 0x37, 0x1, 0xF, 0x0, 0x0, 0x38, 0x1, 0xF, 0x0, 0x8, 0x38, 0x1, 0xF, 0x0, 0x10, 0x38, 0x1, 0xF, 0x0, 0x18, 0x38, 0x1, 0xF, 0x0, 0x20, 0x38, 0x1, 0xF, 0x0, 0x28, 0x38, 0x1, 0xF, 0x0, 0x30, 0x38, 0x1, 0xF, 0x0, 0x38, 0x38, 0x1, 0xF, 0x0, 0x40, 0x38, 0x1, 0xF, 0x0, 0x48, 0x38, 0x1, 0xF, 0x0, 0x50, 0x38, 0x1, 0xF, 0x0, 0x58, 0x38, 0x1, 0xF, 0x0, 0x60, 0x38, 0x1, 0xF, 0x0, 0x68, 0x38, 0x1, 0xF, 0x0, 0x70, 0x38, 0x1, 0xF, 0x0, 0x78, 0x38, 0x1, 0xF, 0x0, 0x80, 0x38, 0x1, 0xF, 0x0, 0x88, 0x38, 0x1, 0xF, 0x0, 0x90, 0x38, 0x1, 0xF, 0x0, 0x98, 0x38, 0x1, 0xF, 0x0, 0xA0, 0x38, 0x1, 0xF, 0x0, 0xA8, 0x38, 0x1, 0xF, 0x0, 0xB0, 0x38, 0x1, 0xF, 0x0, 0xB8, 0x38, 0x1, 0xF, 0x0, 0xC0, 0x38, 0x1, 0xF, 0x0, 0xC8, 0x38, 0x1, 0xF, 0x0, 0xD0, 0x38, 0x1, 0xF, 0x0, 0xD8, 0x38, 0x1, 0xF, 0x0, 0xE0, 0x38, 0x1, 0xF, 0x0, 0xE8, 0x38, 0x1, 0xF, 0x0, 0xF0, 0x38, 0x1, 0xF, 0x0, 0xF8, 0x38, 0x1, 0xF, 0x0, 0x0, 0x39, 0x1, 0xF, 0x0, 0x8, 0x39, 0x1, 0xF, 0x0, 0x10, 0x39, 0x1, 0xF, 0x0, 0x18, 0x39, 0x1, 0xF, 0x0, 0x20, 0x39, 0x1, 0xF, 0x0, 0x28, 0x39, 0x1, 0xF, 0x0, 0x30, 0x39, 0x1, 0xF, 0x0, 0x38, 0x39, 0x1, 0xF, 0x0, 0x40, 0x39, 0x1, 0xF, 0x0, 0x48, 0x39, 0x1, 0xF, 0x0, 0x50, 0x39, 0x1, 0xF, 0x0, 0x58, 0x39, 0x1, 0xF, 0x0, 0x60, 0x39, 0x1, 0xF, 0x0, 0x68, 0x39, 0x1, 0xF, 0x0, 0x70, 0x39, 0x1, 0xF, 0x0, 0x78, 0x39, 0x1, 0xF, 0x0, 0x80, 0x39, 0x1, 0xF, 0x0, 0x88, 0x39, 0x1, 0xF, 0x0, 0x90, 0x39, 0x1, 0xF, 0x0, 0x98, 0x39, 0x1, 0xF, 0x0, 0xA0, 0x39, 0x1, 0xF, 0x0, 0xA8, 0x39, 0x1, 0xF, 0x0, 0xB0, 0x39, 0x1, 0xF, 0x0, 0xB8, 0x39, 0x1, 0xF, 0x0, 0xC0, 0x39, 0x1, 0xF, 0x0, 0xC8, 0x39, 0x1, 0xF, 0x0, 0xD0, 0x39, 0x1, 0xF, 0x0, 0xD8, 0x39, 0x1, 0xF, 0x0, 0xE0, 0x39, 0x1, 0xF, 0x0, 0xE8, 0x39, 0x1, 0xF, 0x0, 0xF0, 0x39, 0x1, 0xF, 0x0, 0xF8, 0x39, 0x1, 0xF, 0x0, 0x0, 0x3A, 0x1, 0xF, 0x0, 0x8, 0x3A, 0x1, 0xF, 0x0, 0x10, 0x3A, 0x1, 0xF, 0x0, 0x18, 0x3A, 0x1, 0xF, 0x0, 0x20, 0x3A, 0x1, 0xF, 0x0, 0x28, 0x3A, 0x1, 0xF, 0x0, 0x30, 0x3A, 0x1, 0xF, 0x0, 0x38, 0x3A, 0x1, 0xF, 0x0, 0x40, 0x3A, 0x1, 0xF, 0x0, 0x48, 0x3A, 0x1, 0xF, 0x0, 0x50, 0x3A, 0x1, 0xF, 0x0, 0x58, 0x3A, 0x1, 0xF, 0x0, 0x60, 0x3A, 0x1, 0xF, 0x0, 0x68, 0x3A, 0x1, 0xF, 0x0, 0x70, 0x3A, 0x1, 0xF, 0x0, 0x78, 0x3A, 0x1, 0xF, 0x0, 0x80, 0x3A, 0x1, 0xF, 0x0, 0x88, 0x3A, 0x1, 0xF, 0x0, 0x90, 0x3A, 0x1, 0xF, 0x0, 0x98, 0x3A, 0x1, 0xF, 0x0, 0xA0, 0x3A, 0x1, 0xF, 0x0, 0xA8, 0x3A, 0x1, 0xF, 0x0, 0xB0, 0x3A, 0x1, 0xF, 0x0, 0xB8, 0x3A, 0x1, 0xF, 0x0, 0xC0, 0x3A, 0x1, 0xF, 0x0, 0xC8, 0x3A, 0x1, 0xF, 0x0, 0xD0, 0x3A, 0x1, 0xF, 0x0, 0xD8, 0x3A, 0x1, 0xF, 0x0, 0xE0, 0x3A, 0x1, 0xF, 0x0, 0xE8, 0x3A, 0x1, 0xF, 0x0, 0xF0, 0x3A, 0x1, 0xF, 0x0, 0xF8, 0x3A, 0x1, 0xF, 0x0, 0x0, 0x3B, 0x1, 0xF, 0x0, 0x8, 0x3B, 0x1, 0xF, 0x0, 0x10, 0x3B, 0x1, 0xF, 0x0, 0x18, 0x3B, 0x1, 0xF, 0x0, 0x20, 0x3B, 0x1, 0xF, 0x0, 0x28, 0x3B, 0x1, 0xF, 0x0, 0x30, 0x3B, 0x1, 0xF, 0x0, 0x38, 0x3B, 0x1, 0xF, 0x0, 0x40, 0x3B, 0x1, 0xF, 0x0, 0x48, 0x3B, 0x1, 0xF, 0x0, 0x50, 0x3B, 0x1, 0xF, 0x0, 0x58, 0x3B, 0x1, 0xF, 0x0, 0x60, 0x3B, 0x1, 0xF, 0x0, 0x68, 0x3B, 0x1, 0xF, 0x0, 0x70, 0x3B, 0x1, 0xF, 0x0, 0x78, 0x3B, 0x1, 0xF, 0x0, 0x80, 0x3B, 0x1, 0xF, 0x0, 0x88, 0x3B, 0x1, 0xF, 0x0, 0x90, 0x3B, 0x1, 0xF, 0x0, 0x98, 0x3B, 0x1, 0xF, 0x0, 0xA0, 0x3B, 0x1, 0xF, 0x0, 0xA8, 0x3B, 0x1, 0xF, 0x0, 0xB0, 0x3B, 0x1, 0xF, 0x0, 0xB8, 0x3B, 0x1, 0xF, 0x0, 0xC0, 0x3B, 0x1, 0xF, 0x0, 0xC8, 0x3B, 0x1, 0xF, 0x0, 0xD0, 0x3B, 0x1, 0xF, 0x0, 0xD8, 0x3B, 0x1, 0xF, 0x0, 0xE0, 0x3B, 0x1, 0xF, 0x0, 0xE8, 0x3B, 0x1, 0xF, 0x0, 0xF0, 0x3B, 0x1, 0xF, 0x0, 0xF8, 0x3B, 0x1, 0xF, 0x0, 0x0, 0x3C, 0x1, 0xF, 0x0, 0x8, 0x3C, 0x1, 0xF, 0x0, 0x10, 0x3C, 0x1, 0xF, 0x0, 0x18, 0x3C, 0x1, 0xF, 0x0, 0x20, 0x3C, 0x1, 0xF, 0x0, 0x28, 0x3C, 0x1, 0xF, 0x0, 0x30, 0x3C, 0x1, 0xF, 0x0, 0x38, 0x3C, 0x1, 0xF, 0x0, 0x40, 0x3C, 0x1, 0xF, 0x0, 0x48, 0x3C, 0x1, 0xF, 0x0, 0x50, 0x3C, 0x1, 0xF, 0x0, 0x58, 0x3C, 0x1, 0xF, 0x0, 0x60, 0x3C, 0x1, 0xF, 0x0, 0x68, 0x3C, 0x1, 0xF, 0x0, 0x70, 0x3C, 0x1, 0xF, 0x0, 0x78, 0x3C, 0x1, 0xF, 0x0, 0x80, 0x3C, 0x1, 0xF, 0x0, 0x88, 0x3C, 0x1, 0xF, 0x0, 0x90, 0x3C, 0x1, 0xF, 0x0, 0x98, 0x3C, 0x1, 0xF, 0x0, 0xA0, 0x3C, 0x1, 0xF, 0x0, 0xA8, 0x3C, 0x1, 0xF, 0x0, 0xB0, 0x3C, 0x1, 0xF, 0x0, 0xB8, 0x3C, 0x1, 0xF, 0x0, 0xC0, 0x3C, 0x1, 0xF, 0x0, 0xC8, 0x3C, 0x1, 0xF, 0x0, 0xD0, 0x3C, 0x1, 0xF, 0x0, 0xD8, 0x3C, 0x1, 0xF, 0x0, 0xE0, 0x3C, 0x1, 0xF, 0x0, 0xE8, 0x3C, 0x1, 0xF, 0x0, 0xF0, 0x3C, 0x1, 0xF, 0x0, 0xF8, 0x3C, 0x1, 0xF, 0x0, 0x0, 0x3D, 0x1, 0xF, 0x0, 0x8, 0x3D, 0x1, 0xF, 0x0, 0x10, 0x3D, 0x1, 0xF, 0x0, 0x18, 0x3D, 0x1, 0xF, 0x0, 0x20, 0x3D, 0x1, 0xF, 0x0, 0x28, 0x3D, 0x1, 0xF, 0x0, 0x30, 0x3D, 0x1, 0xF, 0x0, 0x38, 0x3D, 0x1, 0xF, 0x0, 0x40, 0x3D, 0x1, 0xF, 0x0, 0x48, 0x3D, 0x1, 0xF, 0x0, 0x50, 0x3D, 0x1, 0xF, 0x0, 0x58, 0x3D, 0x1, 0xF, 0x0, 0x60, 0x3D, 0x1, 0xF, 0x0, 0x68, 0x3D, 0x1, 0xF, 0x0, 0x70, 0x3D, 0x1, 0xF, 0x0, 0x78, 0x3D, 0x1, 0xF, 0x0, 0x80, 0x3D, 0x1, 0xF, 0x0, 0x88, 0x3D, 0x1, 0xF, 0x0, 0x90, 0x3D, 0x1, 0xF, 0x0, 0x98, 0x3D, 0x1, 0xF, 0x0, 0xA0, 0x3D, 0x1, 0xF, 0x0, 0xA8, 0x3D, 0x1, 0xF, 0x0, 0xB0, 0x3D, 0x1, 0xF, 0x0, 0xB8, 0x3D, 0x1, 0xF, 0x0, 0xC0, 0x3D, 0x1, 0xF, 0x0, 0xC8, 0x3D, 0x1, 0xF, 0x0, 0xD0, 0x3D, 0x1, 0xF, 0x0, 0xD8, 0x3D, 0x1, 0xF, 0x0, 0xE0, 0x3D, 0x1, 0xF, 0x0, 0xE8, 0x3D, 0x1, 0xF, 0x0, 0xF0, 0x3D, 0x1, 0xF, 0x0, 0xF8, 0x3D, 0x1, 0xF, 0x0, 0x0, 0x3E, 0x1, 0xF, 0x0, 0x8, 0x3E, 0x1, 0xF, 0x0, 0x10, 0x3E, 0x1, 0xF, 0x0, 0x18, 0x3E, 0x1, 0xF, 0x0, 0x20, 0x3E, 0x1, 0xF, 0x0, 0x28, 0x3E, 0x1, 0xF, 0x0, 0x30, 0x3E, 0x1, 0xF, 0x0, 0x38, 0x3E, 0x1, 0xF, 0x0, 0x40, 0x3E, 0x1, 0xF, 0x0, 0x48, 0x3E, 0x1, 0x10, 0x0, 0x50, 0x3E, 0x1, 0x70, 0xF9, 0x64, 0x3E, 0x1, 0xB0, 0xF9, 0x74, 0x3E, 0x1, 0xF0, 0xF9, 0x84, 0x3E, 0x1, 0x30, 0xFA, 0x94, 0x3E, 0x1, 0x70, 0xFA, 0xA4, 0x3E, 0x1, 0xB0, 0xFA, 0xB4, 0x3E, 0x1, 0xF0, 0xFA, 0xC4, 0x3E, 0x1, 0x30, 0xFB, 0xD4, 0x3E, 0x1, 0x70, 0xFB, 0xE4, 0x3E, 0x1, 0xB0, 0xFB, 0xF4, 0x3E, 0x1, 0xF0, 0xFB, 0x4, 0x3F, 0x1, 0x30, 0xFC, 0x14, 0x3F, 0x1, 0x70, 0xFC, 0x4, 0x0, 0x0, 0x90, 0xFC, 0x2C, 0x3F, 0x1, 0xD0, 0xFC, 0x3C, 0x3F, 0x1, 0x10, 0xFD, 0x4C, 0x3F, 0x1, 0x50, 0xFD, 0x5C, 0x3F, 0x1, 0x90, 0xFD, 0x6C, 0x3F, 0x1, 0xD0, 0xFD, 0x7C, 0x3F, 0x1, 0x10, 0xFE, 0x8C, 0x3F, 0x1, 0x50, 0xFE, 0x9C, 0x3F, 0x1, 0x90, 0xFE, 0xAC, 0x3F, 0x1, 0xD0, 0xFE, 0xBC, 0x3F, 0x1, 0x10, 0xFF, 0xCC, 0x3F, 0x1, 0x50, 0xFF, 0xDC, 0x3F, 0x1, 0x90, 0xFF, 0xEC, 0x3F, 0x1, 0xD0, 0xFF, 0xFC, 0x3F, 0x1, 0x10, 0x0, 0xD, 0x40, 0x1, 0x50, 0x0, 0x1D, 0x40, 0x1, 0x90, 0x0, 0x2D, 0x40, 0x1, 0xD0, 0x0, 0x3D, 0x40, 0x1, 0x10, 0x1, 0x4D, 0x40, 0x1, 0x50, 0x1, 0x5D, 0x40, 0x1, 0x90, 0x1, 0x6D, 0x40, 0x1, 0xD0, 0x1, 0x7D, 0x40, 0x1, 0x10, 0x2, 0x8D, 0x40, 0x1, 0x50, 0x2, 0x9D, 0x40, 0x1, 0x90, 0x2, 0xAD, 0x40, 0x1, 0xD0, 0x2, 0xBD, 0x40, 0x1, 0x10, 0x3, 0xCD, 0x40, 0x1, 0x50, 0x3, 0xDD, 0x40, 0x1, 0x90, 0x3, 0xED, 0x40, 0x1, 0xD0, 0x3, 0xFD, 0x40, 0x1, 0x10, 0x4, 0xD, 0x41, 0x1, 0x50, 0x4, 0x1D, 0x41, 0x1, 0x90, 0x4, 0x2D, 0x41, 0x1, 0xD0, 0x4, 0x3D, 0x41, 0x1, 0x10, 0x5, 0x4D, 0x41, 0x1, 0x50, 0x5, 0x5D, 0x41, 0x1, 0x90, 0x5, 0x6D, 0x41, 0x1, 0xD0, 0x5, 0x7D, 0x41, 0x1, 0x10, 0x6, 0x8D, 0x41, 0x1, 0x50, 0x6, 0x9D, 0x41, 0x1, 0x90, 0x6, 0x5, 0x0, 0x0, 0x10, 0x0, 0xA8, 0x41, 0x1, 0xB0, 0x6, 0x5, 0x0, 0x0, 0x10, 0x0, 0xB0, 0x41, 0x1, 0xD0, 0x6, 0xBD, 0x41, 0x1, 0xF0, 0x6, 0xC5, 0x41, 0x1, 0x30, 0x7, 0xD5, 0x41, 0x1, 0x90, 0x6, 0x15, 0x42, 0x1, 0x70, 0x8, 0x25, 0x42, 0x1, 0x10, 0x0, 0x28, 0x42, 0x1, 0xD0, 0x8, 0x3D, 0x42, 0x1, 0x10, 0x9, 0x4D, 0x42, 0x1, 0x10, 0x0, 0xD0, 0x41, 0x1, 0xD0, 0xA, 0xBD, 0x42, 0x1, 0xF0, 0xA, 0x5, 0x0, 0x0, 0xB0, 0xB, 0xF5, 0x42, 0x1, 0xD0, 0xB, 0xFD, 0x42, 0x1, 0xF0, 0xB, 0x5, 0x0, 0x0, 0x70, 0x15, 0x5, 0x0, 0x0, 0x90, 0x15, 0x5, 0x0, 0x0, 0xB0, 0x15, 0x75, 0x45, 0x1, 0xF0, 0x15, 0x85, 0x45, 0x1, 0x30, 0x16, 0x95, 0x45, 0x1, 0x70, 0x16, 0xA5, 0x45, 0x1, 0xB0, 0x16, 0xB5, 0x45, 0x1, 0xF0, 0x16, 0xC5, 0x45, 0x1, 0x30, 0x17, 0xD5, 0x45, 0x1, 0x70, 0x17, 0xE5, 0x45, 0x1, 0xB0, 0x17, 0xF5, 0x45, 0x1, 0xF0, 0x17, 0x5, 0x46, 0x1, 0x30, 0x18, 0x15, 0x46, 0x1, 0x70, 0x18, 0x25, 0x46, 0x1, 0xB0, 0x18, 0x35, 0x46, 0x1, 0xF0, 0x18, 0x45, 0x46, 0x1, 0x30, 0x19, 0x55, 0x46, 0x1, 0x70, 0x19, 0x65, 0x46, 0x1, 0xB0, 0x19, 0x75, 0x46, 0x1, 0xF0, 0x19, 0x85, 0x46, 0x1, 0x30, 0x1A, 0x95, 0x46, 0x1, 0x10, 0x0, 0xA0, 0x46, 0x1, 0x90, 0x1A, 0xAD, 0x46, 0x1, 0xB0, 0x1A, 0x5, 0x0, 0x0, 0x10, 0x21, 0x4D, 0x48, 0x1, 0x10, 0x0, 0x50, 0x48, 0x1, 0x50, 0x21, 0x5, 0x0, 0x0, 0x10, 0x0, 0x60, 0x48, 0x1, 0xB0, 0x21, 0x75, 0x48, 0x1, 0xF0, 0x21, 0x85, 0x48, 0x1, 0x10, 0x22, 0x8D, 0x48, 0x1, 0x30, 0x22, 0x95, 0x48, 0x1, 0x50, 0x22, 0x9D, 0x48, 0x1, 0x90, 0x22, 0xAD, 0x48, 0x1, 0xD0, 0x22, 0xBD, 0x48, 0x1, 0x10, 0x0, 0xC8, 0x48, 0x1, 0x50, 0x23, 0xDD, 0x48, 0x1, 0x90, 0x23, 0xED, 0x48, 0x1, 0xD0, 0x23, 0xFD, 0x48, 0x1, 0x10, 0x24, 0xD, 0x49, 0x1, 0x50, 0x24, 0x1D, 0x49, 0x1, 0x90, 0x24, 0x2D, 0x49, 0x1, 0xD0, 0x24, 0x3D, 0x49, 0x1, 0x10, 0x25, 0x4D, 0x49, 0x1, 0x50, 0x25, 0x5D, 0x49, 0x1, 0x90, 0x25, 0x6D, 0x49, 0x1, 0xD0, 0x25, 0x7D, 0x49, 0x1, 0x10, 0x26, 0x8D, 0x49, 0x1, 0x50, 0x26, 0x9D, 0x49, 0x1, 0x90, 0x26, 0xAD, 0x49, 0x1, 0xD0, 0x26, 0xBD, 0x49, 0x1, 0x10, 0x27, 0xCD, 0x49, 0x1, 0x50, 0x27, 0xDD, 0x49, 0x1, 0x90, 0x27, 0xED, 0x49, 0x1, 0xD0, 0x27, 0xFD, 0x49, 0x1, 0x10, 0x28, 0xD, 0x4A, 0x1, 0x50, 0x28, 0x1D, 0x4A, 0x1, 0x90, 0x28, 0x2D, 0x4A, 0x1, 0xD0, 0x28, 0x3D, 0x4A, 0x1, 0x10, 0x29, 0x4D, 0x4A, 0x1, 0x50, 0x29, 0x5D, 0x4A, 0x1, 0x90, 0x29, 0x6D, 0x4A, 0x1, 0xD0, 0x29, 0x7D, 0x4A, 0x1, 0x10, 0x2A, 0x8D, 0x4A, 0x1, 0x50, 0x2A, 0x9D, 0x4A, 0x1, 0x90, 0x2A, 0xAD, 0x4A, 0x1, 0xD0, 0x2A, 0xBD, 0x4A, 0x1, 0x10, 0x2B, 0xCD, 0x4A, 0x1, 0x50, 0x2B, 0xDD, 0x4A, 0x1, 0x90, 0x2B, 0xED, 0x4A, 0x1, 0xD0, 0x2B, 0xFD, 0x4A, 0x1, 0x10, 0x2C, 0xD, 0x4B, 0x1, 0x10, 0x0, 0x10, 0x4B, 0x1, 0x50, 0x2C, 0x5, 0x0, 0x0, 0x70, 0x2C, 0x25, 0x4B, 0x1, 0xB0, 0x2C, 0x35, 0x4B, 0x1, 0xF0, 0x2C, 0x45, 0x4B, 0x1, 0x30, 0x2D, 0x55, 0x4B, 0x1, 0x70, 0x2D, 0x65, 0x4B, 0x1, 0xB0, 0x2D, 0x75, 0x4B, 0x1, 0xF0, 0x2D, 0x85, 0x4B, 0x1, 0x30, 0x2E, 0x95, 0x4B, 0x1, 0x10, 0x0, 0x98, 0x4B, 0x1, 0x90, 0x2E, 0xAD, 0x4B, 0x1, 0x10, 0x0, 0xB0, 0x4B, 0x1, 0x10, 0x0, 0xB8, 0x4B, 0x1, 0x10, 0x2F, 0xCD, 0x4B, 0x1, 0x50, 0x2F, 0xDD, 0x4B, 0x1, 0xF0, 0x2E, 0x5, 0x0, 0x0, 0x10, 0x0, 0xE0, 0x4B, 0x1, 0xB0, 0x2F, 0xF5, 0x4B, 0x1, 0xF0, 0x2F, 0x5, 0x4C, 0x1, 0x90, 0x2F, 0x5, 0x0, 0x0, 0x30, 0x30, 0x15, 0x4C, 0x1, 0x70, 0x30, 0x25, 0x4C, 0x1, 0x10, 0x0, 0x28, 0x4C, 0x1, 0xD0, 0x30, 0x3D, 0x4C, 0x1, 0x10, 0x31, 0x4D, 0x4C, 0x1, 0xB0, 0x30, 0x5, 0x0, 0x0, 0x10, 0x0, 0x50, 0x4C, 0x1, 0x70, 0x31, 0x65, 0x4C, 0x1, 0xB0, 0x31, 0x75, 0x4C, 0x1, 0x50, 0x31, 0x5, 0x0, 0x0, 0xF0, 0x31, 0x85, 0x4C, 0x1, 0x30, 0x32, 0x95, 0x4C, 0x1, 0x70, 0x32, 0xA5, 0x4C, 0x1, 0xB0, 0x32, 0xB5, 0x4C, 0x1, 0xF0, 0x32, 0xC5, 0x4C, 0x1, 0x30, 0x33, 0xD5, 0x4C, 0x1, 0x70, 0x33, 0xE5, 0x4C, 0x1, 0xB0, 0x33, 0xF5, 0x4C, 0x1, 0xF0, 0x33, 0x5, 0x4D, 0x1, 0x30, 0x34, 0x15, 0x4D, 0x1, 0x70, 0x34, 0x25, 0x4D, 0x1, 0xB0, 0x34, 0x35, 0x4D, 0x1, 0xF0, 0x34, 0x45, 0x4D, 0x1, 0x30, 0x35, 0x55, 0x4D, 0x1, 0x70, 0x35, 0x65, 0x4D, 0x1, 0xB0, 0x35, 0x75, 0x4D, 0x1, 0xF0, 0x35, 0x5, 0x0, 0x0, 0x10, 0x36, 0x5, 0x0, 0x0, 0x30, 0x36, 0x5, 0x0, 0x0, 0x50, 0x36, 0x5, 0x0, 0x0, 0x70, 0x36, 0xA5, 0x4D, 0x1, 0xB0, 0x36, 0xB5, 0x4D, 0x1, 0xF0, 0x36, 0xC5, 0x4D, 0x1, 0x30, 0x37, 0xD5, 0x4D, 0x1, 0x70, 0x37, 0xE5, 0x4D, 0x1, 0xB0, 0x37, 0xF5, 0x4D, 0x1, 0xF0, 0x37, 0x5, 0x4E, 0x1, 0x30, 0x38, 0x15, 0x4E, 0x1, 0x70, 0x38, 0x25, 0x4E, 0x1, 0xB0, 0x38, 0x35, 0x4E, 0x1, 0xF0, 0x38, 0x45, 0x4E, 0x1, 0x30, 0x39, 0x55, 0x4E, 0x1, 0x70, 0x39, 0x65, 0x4E, 0x1, 0xB0, 0x39, 0x75, 0x4E, 0x1, 0xF0, 0x39, 0x85, 0x4E, 0x1, 0x30, 0x3A, 0x95, 0x4E, 0x1, 0x70, 0x3A, 0xA5, 0x4E, 0x1, 0xB0, 0x3A, 0xB5, 0x4E, 0x1, 0x10, 0x0, 0x38, 0x50, 0x1, 0x10, 0x0, 0xC0, 0x41, 0x1, 0xD0, 0x22, 0x5, 0x0, 0x0, 0xB0, 0xB, 0x5, 0x0, 0x0, 0x70, 0x4A, 0xA5, 0x52, 0x1, 0xB0, 0x4A, 0x5, 0x0, 0x0, 0x10, 0x0, 0xB0, 0x52, 0x1, 0xF0, 0x4A, 0xC5, 0x52, 0x1, 0x30, 0x4B, 0xD5, 0x52, 0x1, 0x70, 0x4B, 0xE5, 0x52, 0x1, 0xB0, 0x4B, 0xF5, 0x52, 0x1, 0xF0, 0x4B, 0x5, 0x53, 0x1, 0x30, 0x4C, 0x15, 0x53, 0x1, 0x70, 0x4C, 0x25, 0x53, 0x1, 0xB0, 0x4C, 0x35, 0x53, 0x1, 0xF0, 0x4C, 0x45, 0x53, 0x1, 0x30, 0x4D, 0x55, 0x53, 0x1, 0x70, 0x4D, 0x65, 0x53, 0x1, 0xB0, 0x4D, 0x75, 0x53, 0x1, 0xF0, 0x4D, 0x85, 0x53, 0x1, 0x30, 0x4E, 0x95, 0x53, 0x1, 0x70, 0x4E, 0xA5, 0x53, 0x1, 0xB0, 0x4E, 0xB5, 0x53, 0x1, 0xF0, 0x4E, 0xC5, 0x53, 0x1, 0x30, 0x4F, 0xD5, 0x53, 0x1, 0x70, 0x4F, 0xE5, 0x53, 0x1, 0xB0, 0x4F, 0xF5, 0x53, 0x1, 0xF0, 0x4F, 0x5, 0x54, 0x1, 0x30, 0x50, 0x15, 0x54, 0x1, 0x70, 0x50, 0x25, 0x54, 0x1, 0xB0, 0x50, 0x35, 0x54, 0x1, 0x10, 0x0, 0x38, 0x54, 0x1, 0x10, 0x51, 0x4D, 0x54, 0x1, 0x50, 0x51, 0x5D, 0x54, 0x1, 0x90, 0x51, 0x6D, 0x54, 0x1, 0xD0, 0x51, 0x7D, 0x54, 0x1, 0x10, 0x52, 0x8D, 0x54, 0x1, 0x50, 0x52, 0x9D, 0x54, 0x1, 0x90, 0x52, 0xAD, 0x54, 0x1, 0xD0, 0x52, 0xBD, 0x54, 0x1, 0x10, 0x53, 0xCD, 0x54, 0x1, 0x50, 0x53, 0xDD, 0x54, 0x1, 0x90, 0x53, 0xED, 0x54, 0x1, 0xD0, 0x53, 0xFD, 0x54, 0x1, 0x10, 0x54, 0xD, 0x55, 0x1, 0x50, 0x54, 0x1D, 0x55, 0x1, 0x90, 0x54, 0x2D, 0x55, 0x1, 0xD0, 0x54, 0x3D, 0x55, 0x1, 0x10, 0x55, 0x4D, 0x55, 0x1, 0x50, 0x55, 0x5D, 0x55, 0x1, 0x90, 0x55, 0x5, 0x0, 0x0, 0xB0, 0x5B, 0xF5, 0x56, 0x1, 0xD0, 0x5B, 0xFD, 0x56, 0x1, 0xF0, 0x5B, 0x5, 0x57, 0x1, 0x10, 0x5C, 0xD, 0x57, 0x1, 0x30, 0x5C, 0x15, 0x57, 0x1, 0x50, 0x5C, 0x1D, 0x57, 0x1, 0x70, 0x5C, 0x25, 0x57, 0x1, 0x90, 0x5C, 0xED, 0x56, 0x1, 0x30, 0x62, 0x95, 0x58, 0x1, 0x70, 0x62, 0xA5, 0x58, 0x1, 0xB0, 0x62, 0xB5, 0x58, 0x1, 0xF0, 0x62, 0xC5, 0x58, 0x1, 0x30, 0x63, 0xD5, 0x58, 0x1, 0x70, 0x63, 0xE5, 0x58, 0x1, 0xB0, 0x63, 0xF5, 0x58, 0x1, 0xF0, 0x63, 0x5, 0x59, 0x1, 0x30, 0x64, 0x15, 0x59, 0x1, 0x70, 0x64, 0x25, 0x59, 0x1, 0xB0, 0x64, 0x35, 0x59, 0x1, 0xF0, 0x64, 0x45, 0x59, 0x1, 0x30, 0x65, 0x55, 0x59, 0x1, 0x70, 0x65, 0x65, 0x59, 0x1, 0xB0, 0x65, 0x75, 0x59, 0x1, 0xF0, 0x65, 0x85, 0x59, 0x1, 0x30, 0x66, 0x95, 0x59, 0x1, 0x70, 0x66, 0xA5, 0x59, 0x1, 0xB0, 0x66, 0xB5, 0x59, 0x1, 0xF0, 0x66, 0xC5, 0x59, 0x1, 0x30, 0x67, 0xD5, 0x59, 0x1, 0x70, 0x67, 0xE5, 0x59, 0x1, 0xB0, 0x67, 0xF5, 0x59, 0x1, 0xF0, 0x67, 0x5, 0x5A, 0x1, 0x30, 0x68, 0x15, 0x5A, 0x1, 0x70, 0x68, 0x5, 0x0, 0x0, 0xB0, 0x68, 0x35, 0x5A, 0x1, 0xD0, 0x68, 0x5, 0x0, 0x0, 0x10, 0x0, 0x38, 0x5A, 0x1, 0x10, 0x69, 0x2D, 0x5A, 0x1, 0xB0, 0x6A, 0x5, 0x0, 0x0, 0xB0, 0x6A, 0xB5, 0x5A, 0x1, 0xF0, 0x6A, 0xC5, 0x5A, 0x1, 0x30, 0x6B, 0xD5, 0x5A, 0x1, 0xD0, 0x2E, 0xDD, 0x5A, 0x1, 0x90, 0x6B, 0xED, 0x5A, 0x1, 0xD0, 0x6B, 0xFD, 0x5A, 0x1, 0x10, 0x6C, 0x5, 0x0, 0x0, 0x30, 0x6C, 0x15, 0x5B, 0x1, 0x70, 0x6C, 0x25, 0x5B, 0x1, 0xB0, 0x6C, 0x35, 0x5B, 0x1, 0xF0, 0x6C, 0x45, 0x5B, 0x1, 0x30, 0x6D, 0x3D, 0x5A, 0x1, 0x50, 0x6D, 0x5D, 0x5B, 0x1, 0x90, 0x6D, 0x6D, 0x5B, 0x1, 0xD0, 0x6D, 0x7D, 0x5B, 0x1, 0x10, 0x6E, 0x5, 0x0, 0x0, 0x30, 0x6E, 0x95, 0x5B, 0x1, 0x70, 0x6E, 0xA5, 0x5B, 0x1, 0xD0, 0x6A, 0xBD, 0x5A, 0x1, 0x10, 0x0, 0xC0, 0x5A, 0x1, 0x10, 0x0, 0x88, 0x5B, 0x1, 0x50, 0x6E, 0x9D, 0x5B, 0x1, 0x10, 0x0, 0xA0, 0x5B, 0x1, 0x10, 0x69, 0x5, 0x0, 0x0, 0x10, 0x0, 0x20, 0x42, 0x1, 0x50, 0x8, 0x5, 0x0, 0x0, 0x10, 0x0, 0xC0, 0x5B, 0x1, 0x10, 0x0, 0xC8, 0x5B, 0x1, 0x50, 0x6F, 0xDD, 0x5B, 0x1, 0x90, 0x6F, 0xED, 0x5B, 0x1, 0x70, 0x8, 0x5, 0x0, 0x0, 0xD0, 0x6F, 0xCD, 0x41, 0x1, 0x10, 0x0, 0xF8, 0x5B, 0x1, 0xB0, 0x22, 0x5, 0x0, 0x0, 0x10, 0x70, 0x5, 0x0, 0x0, 0x10, 0x0, 0x8, 0x5C, 0x1, 0xD0, 0x21, 0x5, 0x0, 0x0, 0x50, 0x70, 0x5, 0x0, 0x0, 0x10, 0x0, 0x30, 0x42, 0x1, 0xF0, 0x22, 0x2D, 0x42, 0x1, 0x70, 0x70, 0x25, 0x5C, 0x1, 0x10, 0x0, 0x48, 0x42, 0x1, 0xD0, 0xA, 0x5, 0x0, 0x0, 0xB0, 0x70, 0x5, 0x0, 0x0, 0xF0, 0x8, 0x35, 0x5C, 0x1, 0x10, 0x0, 0x40, 0x42, 0x1, 0xF0, 0x70, 0x5, 0x0, 0x0, 0x10, 0x71, 0x5, 0x0, 0x0, 0x30, 0x71, 0x55, 0x5C, 0x1, 0x10, 0x0, 0x58, 0x5C, 0x1, 0x90, 0x71, 0x65, 0x48, 0x1, 0xF0, 0x21, 0x6D, 0x48, 0x1, 0x30, 0x6F, 0xE5, 0x5B, 0x1, 0x50, 0x72, 0x9D, 0x5C, 0x1, 0x70, 0x72, 0x45, 0x48, 0x1, 0x30, 0x21, 0x9D, 0x48, 0x1, 0x90, 0x72, 0xAD, 0x5C, 0x1, 0xB0, 0x72, 0xA5, 0x48, 0x1, 0x10, 0x0, 0xF8, 0x5C, 0x1, 0x90, 0x76, 0xAD, 0x5D, 0x1, 0xF0, 0x76, 0x5, 0x0, 0x0, 0x30, 0x78, 0x15, 0x5E, 0x1, 0x50, 0x78, 0x1D, 0x5E, 0x1, 0x70, 0x78, 0x25, 0x5E, 0x1, 0x90, 0x78, 0x2D, 0x5E, 0x1, 0xB0, 0x78, 0x35, 0x5E, 0x1, 0xD0, 0x78, 0x3D, 0x5E, 0x1, 0xF0, 0x78, 0x45, 0x5E, 0x1, 0x10, 0x79, 0x4D, 0x5E, 0x1, 0x30, 0x79, 0x55, 0x5E, 0x1, 0x70, 0x79, 0x65, 0x5E, 0x1, 0x90, 0x76, 0x5, 0x0, 0x0, 0x10, 0x6F, 0x7D, 0x5E, 0x1, 0xF0, 0x79, 0x85, 0x5E, 0x1, 0x10, 0x7A, 0xD5, 0x5B, 0x1, 0x70, 0x6F, 0x8D, 0x5E, 0x1, 0x30, 0x7A, 0xED, 0x5B, 0x1, 0xD0, 0x6F, 0x9D, 0x5E, 0x1, 0x70, 0x7A, 0xFD, 0x5B, 0x1, 0x10, 0x70, 0xFD, 0x5C, 0x1, 0x30, 0x70, 0x15, 0x5C, 0x1, 0x10, 0x0, 0xA0, 0x5C, 0x1, 0x90, 0x70, 0x1D, 0x5C, 0x1, 0xB0, 0x76, 0x2D, 0x5C, 0x1, 0xD0, 0x70, 0xC5, 0x5E, 0x1, 0x10, 0x7B, 0x3D, 0x5C, 0x1, 0x10, 0x71, 0xD, 0x5E, 0x1, 0x10, 0x0, 0xC8, 0x5E, 0x1, 0x30, 0x7B, 0x4D, 0x5C, 0x1, 0x50, 0x71, 0xD5, 0x5E, 0x1, 0x50, 0x7B, 0x5D, 0x5C, 0x1, 0x90, 0x71, 0x95, 0x5C, 0x1, 0x10, 0x0, 0xE8, 0x5E, 0x1, 0xB0, 0x7B, 0xF5, 0x5E, 0x1, 0xD0, 0x7B, 0xFD, 0x5E, 0x1, 0xF0, 0x7B, 0x5, 0x5F, 0x1, 0x10, 0x0, 0xC0, 0x5F, 0x1, 0x10, 0x7F, 0xCD, 0x5F, 0x1, 0x30, 0x7F, 0xD5, 0x5F, 0x1, 0x50, 0x7F, 0xDD, 0x5F, 0x1, 0x70, 0x7F, 0xE5, 0x5F, 0x1, 0x90, 0x7F, 0xED, 0x5F, 0x1, 0xB0, 0x7F, 0xF5, 0x5F, 0x1, 0xD0, 0x7F, 0xFD, 0x5F, 0x1, 0xF0, 0x7F, 0x5, 0x0, 0x0, 0x10, 0x0, 0x18, 0x60, 0x1, 0x10, 0x7C, 0xE5, 0x60, 0x1, 0xB0, 0x83, 0xF5, 0x60, 0x1, 0xF0, 0x83, 0x5, 0x61, 0x1, 0x30, 0x84, 0x15, 0x61, 0x1, 0x10, 0x0, 0x18, 0x61, 0x1, 0x90, 0x84, 0x2D, 0x61, 0x1, 0xD0, 0x84, 0x3D, 0x61, 0x1, 0x10, 0x85, 0x4D, 0x61, 0x1, 0x50, 0x85, 0x5D, 0x61, 0x1, 0x90, 0x85, 0x6D, 0x61, 0x1, 0xD0, 0x85, 0x7D, 0x61, 0x1, 0x10, 0x86, 0x8D, 0x61, 0x1, 0x50, 0x86, 0x9D, 0x61, 0x1, 0x90, 0x2E, 0xA5, 0x61, 0x1, 0xB0, 0x86, 0xB5, 0x61, 0x1, 0xF0, 0x86, 0xC5, 0x61, 0x1, 0xF0, 0x40, 0xE5, 0x60, 0x1, 0x10, 0x0, 0xC8, 0x61, 0x1, 0x50, 0x87, 0xDD, 0x61, 0x1, 0x90, 0x87, 0xED, 0x61, 0x1, 0xD0, 0x87, 0xFD, 0x61, 0x1, 0x10, 0x88, 0xD, 0x62, 0x1, 0x50, 0x88, 0x1D, 0x62, 0x1, 0x90, 0x88, 0x2D, 0x62, 0x1, 0xD0, 0x88, 0x3D, 0x62, 0x1, 0xB0, 0x2E, 0x45, 0x62, 0x1, 0x70, 0x80, 0x4D, 0x62, 0x1, 0x50, 0x89, 0x5D, 0x62, 0x1, 0x90, 0x89, 0x6D, 0x62, 0x1, 0xD0, 0x89, 0x7D, 0x62, 0x1, 0x10, 0x8A, 0x5, 0x0, 0x0, 0x31, 0x8A, 0x95, 0x62, 0x1, 0x71, 0x8A, 0xA5, 0x62, 0x1, 0xB1, 0x8A, 0xB5, 0x62, 0x1, 0xF1, 0x8A, 0xC5, 0x62, 0x1, 0x31, 0x8B, 0xD5, 0x62, 0x1, 0x71, 0x8B, 0xE5, 0x62, 0x1, 0xB1, 0x8B, 0xF5, 0x62, 0x1, 0xF1, 0x8B, 0x5, 0x63, 0x1, 0x31, 0x8C, 0x15, 0x63, 0x1, 0x71, 0x8C, 0x25, 0x63, 0x1, 0xB1, 0x8C, 0x35, 0x63, 0x1, 0xF1, 0x8C, 0x45, 0x63, 0x1, 0x31, 0x8D, 0x55, 0x63, 0x1, 0x71, 0x8D, 0x65, 0x63, 0x1, 0xB1, 0x8D, 0x75, 0x63, 0x1, 0xF1, 0x8D, 0x85, 0x63, 0x1, 0x31, 0x8E, 0x95, 0x63, 0x1, 0x71, 0x8E, 0xA5, 0x63, 0x1, 0xB1, 0x8E, 0xB5, 0x63, 0x1, 0xF1, 0x8E, 0xC5, 0x63, 0x1, 0x31, 0x8F, 0xD5, 0x63, 0x1, 0x71, 0x8F, 0xE5, 0x63, 0x1, 0xB1, 0x8F, 0xF5, 0x63, 0x1, 0xF1, 0x8F, 0x5, 0x64, 0x1, 0x31, 0x90, 0x15, 0x64, 0x1, 0x71, 0x90, 0x25, 0x64, 0x1, 0xB1, 0x90, 0x35, 0x64, 0x1, 0xF1, 0x90, 0x5, 0x0, 0x0, 0x11, 0x91, 0x4D, 0x64, 0x1, 0x51, 0x91, 0x5D, 0x64, 0x1, 0x91, 0x91, 0x6D, 0x64, 0x1, 0x71, 0x7, 0x5, 0x0, 0x0, 0x91, 0x7, 0xED, 0x41, 0x1, 0xD1, 0x7, 0xFD, 0x41, 0x1, 0x11, 0x8, 0xD, 0x42, 0x1, 0xD1, 0x91, 0x7D, 0x64, 0x1, 0x11, 0x92, 0x8D, 0x64, 0x1, 0x51, 0x92, 0x55, 0x42, 0x1, 0x71, 0x9, 0x65, 0x42, 0x1, 0xB1, 0x9, 0x75, 0x42, 0x1, 0xF1, 0x9, 0x85, 0x42, 0x1, 0x31, 0xA, 0x95, 0x42, 0x1, 0x71, 0xA, 0x9D, 0x64, 0x1, 0x91, 0xA, 0xAD, 0x42, 0x1, 0x11, 0x0, 0xA0, 0x64, 0x1, 0xB1, 0x92, 0x5, 0x0, 0x0, 0x11, 0xB, 0xCD, 0x42, 0x1, 0x51, 0xB, 0xDD, 0x42, 0x1, 0x91, 0xB, 0xB5, 0x64, 0x1, 0xF1, 0x92, 0xC5, 0x64, 0x1, 0x11, 0xC, 0xD, 0x43, 0x1, 0x51, 0xC, 0x1D, 0x43, 0x1, 0x91, 0xC, 0x2D, 0x43, 0x1, 0xD1, 0xC, 0x3D, 0x43, 0x1, 0x11, 0xD, 0x4D, 0x43, 0x1, 0x51, 0xD, 0x5D, 0x43, 0x1, 0x91, 0xD, 0x6D, 0x43, 0x1, 0xD1, 0xD, 0x7D, 0x43, 0x1, 0x11, 0xE, 0x8D, 0x43, 0x1, 0x51, 0xE, 0x9D, 0x43, 0x1, 0x91, 0xE, 0xAD, 0x43, 0x1, 0xD1, 0xE, 0xBD, 0x43, 0x1, 0x11, 0xF, 0xCD, 0x43, 0x1, 0x51, 0xF, 0xDD, 0x43, 0x1, 0x91, 0xF, 0xED, 0x43, 0x1, 0xD1, 0xF, 0x5, 0x0, 0x0, 0xF1, 0xF, 0x5, 0x44, 0x1, 0x31, 0x10, 0x15, 0x44, 0x1, 0x71, 0x10, 0x25, 0x44, 0x1, 0xB1, 0x10, 0x5, 0x0, 0x0, 0xD1, 0x10, 0x3D, 0x44, 0x1, 0x11, 0x11, 0x4D, 0x44, 0x1, 0x51, 0x11, 0x5D, 0x44, 0x1, 0x91, 0x11, 0x6D, 0x44, 0x1, 0xD1, 0x11, 0x7D, 0x44, 0x1, 0x11, 0x12, 0x8D, 0x44, 0x1, 0x51, 0x12, 0x9D, 0x44, 0x1, 0x11, 0x0, 0xA0, 0x44, 0x1, 0xB1, 0x12, 0xB5, 0x44, 0x1, 0xF1, 0x12, 0xC5, 0x44, 0x1, 0x31, 0x13, 0xD5, 0x44, 0x1, 0x71, 0x13, 0xE5, 0x44, 0x1, 0xB1, 0x13, 0xF5, 0x44, 0x1, 0xF1, 0x13, 0x5, 0x45, 0x1, 0x31, 0x14, 0x15, 0x45, 0x1, 0x71, 0x14, 0x25, 0x45, 0x1, 0xB1, 0x14, 0x35, 0x45, 0x1, 0xF1, 0x14, 0x45, 0x45, 0x1, 0x31, 0x15, 0x55, 0x45, 0x1, 0x11, 0x0, 0xC8, 0x64, 0x1, 0x51, 0x93, 0xDD, 0x64, 0x1, 0x91, 0x93, 0xED, 0x64, 0x1, 0xD1, 0x93, 0xFD, 0x64, 0x1, 0x11, 0x94, 0xD, 0x65, 0x1, 0x51, 0x94, 0x1D, 0x65, 0x1, 0x91, 0x94, 0x2D, 0x65, 0x1, 0xD1, 0x94, 0x3D, 0x65, 0x1, 0x11, 0x95, 0x4D, 0x65, 0x1, 0x51, 0x95, 0x5D, 0x65, 0x1, 0x91, 0x95, 0x6D, 0x65, 0x1, 0x71, 0x1A, 0x5, 0x0, 0x0, 0xD1, 0x95, 0x7D, 0x65, 0x1, 0x11, 0x96, 0x5, 0x0, 0x0, 0xD1, 0x1A, 0xBD, 0x46, 0x1, 0x11, 0x1B, 0xCD, 0x46, 0x1, 0x51, 0x1B, 0xDD, 0x46, 0x1, 0x91, 0x1B, 0xED, 0x46, 0x1, 0xD1, 0x1B, 0xFD, 0x46, 0x1, 0x11, 0x1C, 0xD, 0x47, 0x1, 0x51, 0x1C, 0x1D, 0x47, 0x1, 0x91, 0x1C, 0x2D, 0x47, 0x1, 0xD1, 0x1C, 0x3D, 0x47, 0x1, 0x11, 0x1D, 0x4D, 0x47, 0x1, 0x51, 0x1D, 0x5D, 0x47, 0x1, 0x91, 0x1D, 0x6D, 0x47, 0x1, 0xD1, 0x1D, 0x7D, 0x47, 0x1, 0x11, 0x1E, 0x8D, 0x47, 0x1, 0x51, 0x1E, 0x9D, 0x47, 0x1, 0x91, 0x1E, 0xAD, 0x47, 0x1, 0xD1, 0x1E, 0xBD, 0x47, 0x1, 0x11, 0x1F, 0xCD, 0x47, 0x1, 0x51, 0x1F, 0xDD, 0x47, 0x1, 0x91, 0x1F, 0xED, 0x47, 0x1, 0xD1, 0x1F, 0xFD, 0x47, 0x1, 0x11, 0x20, 0xD, 0x48, 0x1, 0x51, 0x20, 0x1D, 0x48, 0x1, 0x91, 0x20, 0x2D, 0x48, 0x1, 0xD1, 0x20, 0x3D, 0x48, 0x1, 0x31, 0x96, 0x5, 0x0, 0x0, 0x51, 0x96, 0x9D, 0x65, 0x1, 0x71, 0x21, 0xA5, 0x65, 0x1, 0xB1, 0x96, 0xB5, 0x65, 0x1, 0xF1, 0x96, 0xC5, 0x65, 0x1, 0x31, 0x97, 0xD5, 0x65, 0x1, 0x71, 0x97, 0xC5, 0x48, 0x1, 0x91, 0x97, 0xED, 0x65, 0x1, 0xD1, 0x97, 0xFD, 0x65, 0x1, 0x11, 0x98, 0xD, 0x66, 0x1, 0x51, 0x98, 0x1D, 0x66, 0x1, 0x91, 0x98, 0x2D, 0x66, 0x1, 0xD1, 0x98, 0x3D, 0x66, 0x1, 0x11, 0x99, 0x4D, 0x66, 0x1, 0x51, 0x99, 0x5D, 0x66, 0x1, 0x91, 0x99, 0x6D, 0x66, 0x1, 0xD1, 0x99, 0x7D, 0x66, 0x1, 0x11, 0x9A, 0x8D, 0x66, 0x1, 0x51, 0x9A, 0x9D, 0x66, 0x1, 0x11, 0x0, 0xA0, 0x66, 0x1, 0xB1, 0x9A, 0xB5, 0x66, 0x1, 0xF1, 0x9A, 0xC5, 0x66, 0x1, 0x31, 0x9B, 0xD5, 0x66, 0x1, 0x71, 0x9B, 0xE5, 0x66, 0x1, 0xB1, 0x9B, 0xF5, 0x66, 0x1, 0xF1, 0x9B, 0x5, 0x67, 0x1, 0x91, 0x9A, 0xAD, 0x66, 0x1, 0xD1, 0x9A, 0xBD, 0x66, 0x1, 0x11, 0x9B, 0xCD, 0x66, 0x1, 0x51, 0x9B, 0xDD, 0x66, 0x1, 0x91, 0x9B, 0xED, 0x66, 0x1, 0xD1, 0x9B, 0xFD, 0x66, 0x1, 0x11, 0x9C, 0x5, 0x0, 0x0, 0x11, 0x0, 0x8, 0x67, 0x1, 0x51, 0x9C, 0x5, 0x0, 0x0, 0x71, 0x9C, 0x25, 0x67, 0x1, 0xB1, 0x9C, 0x35, 0x67, 0x1, 0xF1, 0x9C, 0x45, 0x67, 0x1, 0x31, 0x9D, 0x55, 0x67, 0x1, 0x71, 0x9D, 0x5, 0x0, 0x0, 0x91, 0x9D, 0x5, 0x0, 0x0, 0xB1, 0x9D, 0x5, 0x0, 0x0, 0x11, 0x0, 0x70, 0x67, 0x1, 0xF1, 0x9D, 0x85, 0x67, 0x1, 0x31, 0x9E, 0x5, 0x0, 0x0, 0x11, 0x0, 0x90, 0x67, 0x1, 0x71, 0x9E, 0xA5, 0x67, 0x1, 0x11, 0x0, 0xA8, 0x67, 0x1, 0x11, 0x0, 0xA0, 0x67, 0x1, 0xD1, 0x9E, 0xBD, 0x67, 0x1, 0x11, 0x0, 0xB8, 0x67, 0x1, 0x11, 0x0, 0xC0, 0x67, 0x1, 0x31, 0x9F, 0xD5, 0x67, 0x1, 0x71, 0x9F, 0x5, 0x0, 0x0, 0x11, 0x0, 0xE0, 0x67, 0x1, 0xB1, 0x9F, 0xF5, 0x67, 0x1, 0xF1, 0x9F, 0xF5, 0x67, 0x1, 0x11, 0xA0, 0xD, 0x68, 0x1, 0x51, 0xA0, 0x1D, 0x68, 0x1, 0x91, 0xA0, 0x2D, 0x68, 0x1, 0xD1, 0xA0, 0x3D, 0x68, 0x1, 0x11, 0xA1, 0x4D, 0x68, 0x1, 0x51, 0xA1, 0x5D, 0x68, 0x1, 0x11, 0x0, 0x78, 0x67, 0x1, 0x71, 0x9E, 0x85, 0x67, 0x1, 0xD1, 0x9E, 0xCD, 0x67, 0x1, 0x51, 0x9F, 0xED, 0x67, 0x1, 0x91, 0xA1, 0x6D, 0x68, 0x1, 0xD1, 0xA1, 0x7D, 0x68, 0x1, 0x11, 0xA2, 0x8D, 0x68, 0x1, 0x51, 0xA2, 0x9D, 0x68, 0x1, 0x11, 0x0, 0xA0, 0x68, 0x1, 0xB1, 0xA2, 0xB5, 0x68, 0x1, 0xF1, 0xA2, 0xC5, 0x68, 0x1, 0x31, 0xA3, 0xD5, 0x68, 0x1, 0x71, 0xA3, 0xE5, 0x68, 0x1, 0xB1, 0xA3, 0xF5, 0x68, 0x1, 0x11, 0x0, 0xF8, 0x68, 0x1, 0x11, 0xA4, 0xD, 0x69, 0x1, 0x51, 0xA4, 0x1D, 0x69, 0x1, 0x91, 0xA4, 0x2D, 0x69, 0x1, 0xF1, 0x3A, 0xC5, 0x4E, 0x1, 0x31, 0x3B, 0xD5, 0x4E, 0x1, 0x71, 0x3B, 0xE5, 0x4E, 0x1, 0xB1, 0x3B, 0xF5, 0x4E, 0x1, 0xF1, 0x3B, 0x5, 0x4F, 0x1, 0x31, 0x3C, 0x15, 0x4F, 0x1, 0x71, 0x3C, 0x25, 0x4F, 0x1, 0xB1, 0x3C, 0x35, 0x4F, 0x1, 0xF1, 0x3C, 0x45, 0x4F, 0x1, 0x31, 0x3D, 0x55, 0x4F, 0x1, 0x71, 0x3D, 0x65, 0x4F, 0x1, 0xB1, 0x3D, 0x75, 0x4F, 0x1, 0xF1, 0x3D, 0x85, 0x4F, 0x1, 0x31, 0x3E, 0x95, 0x4F, 0x1, 0x71, 0x3E, 0xA5, 0x4F, 0x1, 0xB1, 0x3E, 0xB5, 0x4F, 0x1, 0xF1, 0x3E, 0xC5, 0x4F, 0x1, 0x31, 0x3F, 0xD5, 0x4F, 0x1, 0x71, 0x3F, 0xE5, 0x4F, 0x1, 0xB1, 0x3F, 0xF5, 0x4F, 0x1, 0xF1, 0x3F, 0x5, 0x50, 0x1, 0x31, 0x40, 0x15, 0x50, 0x1, 0x71, 0x40, 0x25, 0x50, 0x1, 0xB1, 0x40, 0x35, 0x50, 0x1, 0xD1, 0xA4, 0x5, 0x0, 0x0, 0x11, 0x0, 0x40, 0x50, 0x1, 0x31, 0x41, 0x55, 0x50, 0x1, 0x71, 0x41, 0x65, 0x50, 0x1, 0xB1, 0x41, 0x75, 0x50, 0x1, 0xF1, 0x41, 0x85, 0x50, 0x1, 0x31, 0x42, 0x95, 0x50, 0x1, 0x71, 0x42, 0xA5, 0x50, 0x1, 0xB1, 0x42, 0xB5, 0x50, 0x1, 0xF1, 0x42, 0xC5, 0x50, 0x1, 0x31, 0x43, 0xD5, 0x50, 0x1, 0x71, 0x43, 0xE5, 0x50, 0x1, 0xB1, 0x43, 0xF5, 0x50, 0x1, 0xF1, 0x43, 0x5, 0x51, 0x1, 0x31, 0x44, 0x15, 0x51, 0x1, 0x71, 0x44, 0x25, 0x51, 0x1, 0xB1, 0x44, 0x35, 0x51, 0x1, 0xF1, 0x44, 0x45, 0x51, 0x1, 0x31, 0x45, 0x55, 0x51, 0x1, 0x71, 0x45, 0x65, 0x51, 0x1, 0xB1, 0x45, 0x75, 0x51, 0x1, 0xF1, 0x45, 0x85, 0x51, 0x1, 0x31, 0x46, 0x95, 0x51, 0x1, 0x71, 0x46, 0xA5, 0x51, 0x1, 0xB1, 0x46, 0xB5, 0x51, 0x1, 0xF1, 0x46, 0xC5, 0x51, 0x1, 0x31, 0x47, 0xD5, 0x51, 0x1, 0x71, 0x47, 0xE5, 0x51, 0x1, 0xB1, 0x47, 0xF5, 0x51, 0x1, 0xF1, 0x47, 0x5, 0x52, 0x1, 0x31, 0x48, 0x15, 0x52, 0x1, 0x71, 0x48, 0x25, 0x52, 0x1, 0xB1, 0x48, 0x35, 0x52, 0x1, 0xF1, 0x48, 0x45, 0x52, 0x1, 0x31, 0x49, 0x55, 0x52, 0x1, 0x71, 0x49, 0x65, 0x52, 0x1, 0xB1, 0x49, 0x75, 0x52, 0x1, 0xF1, 0x49, 0x85, 0x52, 0x1, 0x31, 0x4A, 0x95, 0x52, 0x1, 0xF1, 0xA4, 0x5, 0x0, 0x0, 0x11, 0x0, 0x40, 0x69, 0x1, 0x11, 0x0, 0x48, 0x69, 0x1, 0x51, 0xA5, 0x5D, 0x69, 0x1, 0x91, 0xA5, 0x6D, 0x69, 0x1, 0xD1, 0xA5, 0x7D, 0x69, 0x1, 0x11, 0xA6, 0x8D, 0x69, 0x1, 0x51, 0xA6, 0x9D, 0x69, 0x1, 0x91, 0xA6, 0xAD, 0x69, 0x1, 0xD1, 0xA6, 0xBD, 0x69, 0x1, 0x11, 0xA7, 0xCD, 0x69, 0x1, 0x51, 0xA7, 0xDD, 0x69, 0x1, 0x91, 0xA7, 0xED, 0x69, 0x1, 0xD1, 0xA7, 0xFD, 0x69, 0x1, 0x11, 0xA8, 0xD, 0x6A, 0x1, 0x11, 0x0, 0x10, 0x6A, 0x1, 0x71, 0xA8, 0x25, 0x6A, 0x1, 0xB1, 0xA8, 0x35, 0x6A, 0x1, 0xF1, 0xA8, 0x45, 0x6A, 0x1, 0x31, 0xA9, 0x55, 0x6A, 0x1, 0x71, 0xA9, 0x65, 0x6A, 0x1, 0xB1, 0xA9, 0x75, 0x6A, 0x1, 0xF1, 0xA9, 0x85, 0x6A, 0x1, 0x31, 0xAA, 0x95, 0x6A, 0x1, 0x71, 0xAA, 0xA5, 0x6A, 0x1, 0xB1, 0xAA, 0xB5, 0x6A, 0x1, 0xF1, 0xAA, 0xC5, 0x6A, 0x1, 0xB1, 0x55, 0x75, 0x55, 0x1, 0xF1, 0x55, 0x85, 0x55, 0x1, 0x31, 0x56, 0x95, 0x55, 0x1, 0x71, 0x56, 0xA5, 0x55, 0x1, 0xB1, 0x56, 0xB5, 0x55, 0x1, 0xF1, 0x56, 0xC5, 0x55, 0x1, 0x31, 0x57, 0xD5, 0x55, 0x1, 0x71, 0x57, 0xE5, 0x55, 0x1, 0xB1, 0x57, 0xF5, 0x55, 0x1, 0xF1, 0x57, 0x5, 0x56, 0x1, 0x31, 0x58, 0x15, 0x56, 0x1, 0x71, 0x58, 0x25, 0x56, 0x1, 0xB1, 0x58, 0x35, 0x56, 0x1, 0xF1, 0x58, 0x45, 0x56, 0x1, 0x31, 0x59, 0x55, 0x56, 0x1, 0x71, 0x59, 0x65, 0x56, 0x1, 0xB1, 0x59, 0x75, 0x56, 0x1, 0xF1, 0x59, 0x85, 0x56, 0x1, 0x31, 0x5A, 0x95, 0x56, 0x1, 0x71, 0x5A, 0xA5, 0x56, 0x1, 0xB1, 0x5A, 0xB5, 0x56, 0x1, 0xF1, 0x5A, 0xC5, 0x56, 0x1, 0x31, 0x5B, 0xD5, 0x56, 0x1, 0x71, 0x5B, 0xE5, 0x56, 0x1, 0x31, 0xAB, 0xD5, 0x6A, 0x1, 0x71, 0xAB, 0xE5, 0x6A, 0x1, 0xB1, 0xAB, 0xF5, 0x6A, 0x1, 0xF1, 0xAB, 0x5, 0x6B, 0x1, 0xB1, 0x5C, 0x35, 0x57, 0x1, 0xF1, 0x5C, 0x45, 0x57, 0x1, 0x31, 0x5D, 0x55, 0x57, 0x1, 0x71, 0x5D, 0x65, 0x57, 0x1, 0xB1, 0x5D, 0x75, 0x57, 0x1, 0xF1, 0x5D, 0x85, 0x57, 0x1, 0x31, 0x5E, 0x95, 0x57, 0x1, 0x71, 0x5E, 0xA5, 0x57, 0x1, 0xB1, 0x5E, 0xB5, 0x57, 0x1, 0xF1, 0x5E, 0xC5, 0x57, 0x1, 0x31, 0x5F, 0xD5, 0x57, 0x1, 0x71, 0x5F, 0xE5, 0x57, 0x1, 0xB1, 0x5F, 0xF5, 0x57, 0x1, 0xF1, 0x5F, 0x5, 0x0, 0x0, 0x11, 0x0, 0x0, 0x58, 0x1, 0x31, 0x60, 0x15, 0x58, 0x1, 0x71, 0x60, 0x25, 0x58, 0x1, 0xB1, 0x60, 0x35, 0x58, 0x1, 0xF1, 0x60, 0x45, 0x58, 0x1, 0x31, 0x61, 0x55, 0x58, 0x1, 0x71, 0x61, 0x65, 0x58, 0x1, 0xB1, 0x61, 0x75, 0x58, 0x1, 0xF1, 0x61, 0x85, 0x58, 0x1, 0x31, 0xAC, 0x15, 0x6B, 0x1, 0x71, 0xAC, 0x25, 0x6B, 0x1, 0xB1, 0xAC, 0x35, 0x6B, 0x1, 0xF1, 0xAC, 0x45, 0x6B, 0x1, 0x31, 0xAD, 0x55, 0x6B, 0x1, 0x71, 0xAD, 0x65, 0x6B, 0x1, 0xB1, 0xAD, 0x75, 0x6B, 0x1, 0xF1, 0xAD, 0x85, 0x6B, 0x1, 0x31, 0xAE, 0x95, 0x6B, 0x1, 0x71, 0xAE, 0xA5, 0x6B, 0x1, 0xB1, 0xAE, 0xB5, 0x6B, 0x1, 0xF1, 0xAE, 0xC5, 0x6B, 0x1, 0x31, 0xAF, 0xD5, 0x6B, 0x1, 0x91, 0x68, 0xDD, 0x6B, 0x1, 0x91, 0xAF, 0xED, 0x6B, 0x1, 0xD1, 0xAF, 0x5, 0x0, 0x0, 0x31, 0x69, 0x55, 0x5A, 0x1, 0x71, 0x69, 0x65, 0x5A, 0x1, 0xB1, 0x69, 0x75, 0x5A, 0x1, 0xF1, 0x69, 0x85, 0x5A, 0x1, 0x31, 0x6A, 0x95, 0x5A, 0x1, 0x71, 0x6A, 0xA5, 0x5A, 0x1, 0xF1, 0xAF, 0x5, 0x0, 0x0, 0x11, 0xB0, 0xD, 0x6C, 0x1, 0x51, 0xB0, 0x1D, 0x6C, 0x1, 0x91, 0xB0, 0x2D, 0x6C, 0x1, 0xD1, 0xB0, 0x3D, 0x6C, 0x1, 0x11, 0xB1, 0x4D, 0x6C, 0x1, 0x51, 0xB1, 0x5D, 0x6C, 0x1, 0x91, 0xB1, 0x6D, 0x6C, 0x1, 0xD1, 0xB1, 0x7D, 0x6C, 0x1, 0x11, 0xB2, 0x8D, 0x6C, 0x1, 0x51, 0xB2, 0x9D, 0x6C, 0x1, 0x91, 0xB2, 0xAD, 0x6C, 0x1, 0xD1, 0xB2, 0x5, 0x0, 0x0, 0xF1, 0xB2, 0xCD, 0x6B, 0x1, 0x51, 0xAF, 0x5, 0x0, 0x0, 0xB1, 0x6E, 0x5, 0x0, 0x0, 0xD1, 0x6E, 0xBD, 0x5B, 0x1, 0x11, 0xB3, 0xCD, 0x6C, 0x1, 0x51, 0xB3, 0x5, 0x0, 0x0, 0x11, 0x0, 0xD8, 0x6C, 0x1, 0x91, 0xB3, 0xED, 0x6C, 0x1, 0xD1, 0xB3, 0x5, 0x0, 0x0, 0xF1, 0xB3, 0x5, 0x6D, 0x1, 0x11, 0x0, 0x8, 0x6D, 0x1, 0x11, 0x0, 0x10, 0x6D, 0x1, 0x71, 0xB4, 0x25, 0x6D, 0x1, 0xB1, 0xB4, 0x35, 0x6D, 0x1, 0xF1, 0xB4, 0x45, 0x6D, 0x1, 0x31, 0xB5, 0x55, 0x6D, 0x1, 0x71, 0xB5, 0x65, 0x6D, 0x1, 0x11, 0x0, 0x68, 0x6D, 0x1, 0xD1, 0xB5, 0x7D, 0x6D, 0x1, 0x11, 0xB6, 0x8D, 0x6D, 0x1, 0x51, 0xB6, 0x9D, 0x6D, 0x1, 0xB1, 0x71, 0x75, 0x5C, 0x1, 0xF1, 0x71, 0x85, 0x5C, 0x1, 0x31, 0x72, 0xA5, 0x6D, 0x1, 0xB1, 0xB6, 0xB5, 0x6D, 0x1, 0xF1, 0xB6, 0xC5, 0x6D, 0x1, 0x31, 0xB7, 0x5, 0x0, 0x0, 0xD1, 0x72, 0xBD, 0x5C, 0x1, 0x11, 0x73, 0xCD, 0x5C, 0x1, 0x51, 0x73, 0xDD, 0x5C, 0x1, 0x91, 0x73, 0xED, 0x5C, 0x1, 0xD1, 0x73, 0xD5, 0x6D, 0x1, 0x11, 0x74, 0xD, 0x5D, 0x1, 0x51, 0x74, 0x1D, 0x5D, 0x1, 0x91, 0x74, 0x2D, 0x5D, 0x1, 0xD1, 0x74, 0x3D, 0x5D, 0x1, 0x11, 0x75, 0x4D, 0x5D, 0x1, 0x51, 0x75, 0x5D, 0x5D, 0x1, 0x91, 0x75, 0x6D, 0x5D, 0x1, 0xD1, 0x75, 0x7D, 0x5D, 0x1, 0x11, 0x76, 0x8D, 0x5D, 0x1, 0x51, 0x76, 0x9D, 0x5D, 0x1, 0x71, 0xB7, 0xB5, 0x5D, 0x1, 0xF1, 0x76, 0xE5, 0x6D, 0x1, 0x11, 0x77, 0xCD, 0x5D, 0x1, 0x51, 0x77, 0xDD, 0x5D, 0x1, 0x91, 0x77, 0xED, 0x5D, 0x1, 0xD1, 0x77, 0xFD, 0x5D, 0x1, 0x11, 0x78, 0xED, 0x6D, 0x1, 0xD1, 0xB7, 0xFD, 0x6D, 0x1, 0x11, 0xB8, 0xD, 0x6E, 0x1, 0x51, 0xB8, 0x1D, 0x6E, 0x1, 0x91, 0xB8, 0x2D, 0x6E, 0x1, 0x51, 0x79, 0x5D, 0x5E, 0x1, 0xD1, 0xB8, 0x65, 0x5E, 0x1, 0xF1, 0xB8, 0x6D, 0x5E, 0x1, 0x11, 0x0, 0x70, 0x5E, 0x1, 0x11, 0xB9, 0x4D, 0x6E, 0x1, 0x51, 0xB9, 0x5D, 0x6E, 0x1, 0x91, 0xB9, 0x95, 0x5E, 0x1, 0x11, 0x0, 0x68, 0x6E, 0x1, 0xD1, 0xB9, 0xA5, 0x5E, 0x1, 0xB1, 0x7A, 0xB5, 0x5E, 0x1, 0xF1, 0xB9, 0x85, 0x6E, 0x1, 0x31, 0xBA, 0xBD, 0x5E, 0x1, 0x51, 0xBA, 0x9D, 0x6E, 0x1, 0x91, 0xBA, 0xAD, 0x6E, 0x1, 0xD1, 0xBA, 0xBD, 0x6E, 0x1, 0x11, 0xBB, 0xCD, 0x6E, 0x1, 0x51, 0xBB, 0xDD, 0x5E, 0x1, 0x91, 0x7B, 0xDD, 0x6E, 0x1, 0x91, 0xBB, 0xED, 0x6E, 0x1, 0xD1, 0xBB, 0xFD, 0x6E, 0x1, 0x31, 0x7C, 0x15, 0x5F, 0x1, 0x71, 0x7C, 0x25, 0x5F, 0x1, 0xB1, 0x7C, 0x35, 0x5F, 0x1, 0xF1, 0x7C, 0x45, 0x5F, 0x1, 0x31, 0x7D, 0x55, 0x5F, 0x1, 0x71, 0x7D, 0x65, 0x5F, 0x1, 0xB1, 0x7D, 0x75, 0x5F, 0x1, 0xF1, 0x7D, 0x85, 0x5F, 0x1, 0x31, 0x7E, 0x95, 0x5F, 0x1, 0x71, 0x7E, 0xA5, 0x5F, 0x1, 0xB1, 0x7E, 0xB5, 0x5F, 0x1, 0xF1, 0x7E, 0x5, 0x6F, 0x1, 0x31, 0xBC, 0x15, 0x6F, 0x1, 0x71, 0xBC, 0x25, 0x6F, 0x1, 0xB1, 0xBC, 0x35, 0x6F, 0x1, 0xF1, 0xBC, 0x45, 0x6F, 0x1, 0x11, 0x80, 0xD, 0x60, 0x1, 0x51, 0x80, 0x4D, 0x6F, 0x1, 0x91, 0x80, 0x2D, 0x60, 0x1, 0xD1, 0x80, 0x3D, 0x60, 0x1, 0x11, 0x81, 0x4D, 0x60, 0x1, 0x51, 0x81, 0x5D, 0x60, 0x1, 0x91, 0x81, 0x6D, 0x60, 0x1, 0xD1, 0x81, 0x7D, 0x60, 0x1, 0x11, 0x82, 0x8D, 0x60, 0x1, 0x51, 0x82, 0x9D, 0x60, 0x1, 0x91, 0x82, 0xAD, 0x60, 0x1, 0xD1, 0x82, 0xBD, 0x60, 0x1, 0x11, 0x83, 0xCD, 0x60, 0x1, 0x51, 0x83, 0xDD, 0x60, 0x1, 0x51, 0xBD, 0x5D, 0x6F, 0x1, 0x91, 0xBD, 0x6D, 0x6F, 0x1, 0xD1, 0xBD, 0x7D, 0x6F, 0x1, 0x11, 0xBE, 0x8D, 0x6F, 0x1, 0x51, 0xBE, 0x9D, 0x6F, 0x1, 0x91, 0xBE, 0xAD, 0x6F, 0x1, 0xD1, 0xBE, 0xBD, 0x6F, 0x1, 0x11, 0xBF, 0xCD, 0x6F, 0x1, 0x51, 0xBF, 0x5D, 0x6F, 0x1, 0x71, 0xBF, 0xE5, 0x6F, 0x1, 0xB1, 0xBF, 0xF5, 0x6F, 0x1, 0xF1, 0xBF, 0x5, 0x70, 0x1, 0x31, 0xC0, 0x15, 0x70, 0x1, 0x71, 0xC0, 0x25, 0x70, 0x1, 0xB1, 0xC0, 0x35, 0x70, 0x1, 0xF1, 0xC0, 0x45, 0x70, 0x1, 0x12, 0x0, 0x48, 0x70, 0x1, 0x52, 0xC1, 0x5D, 0x70, 0x1, 0x92, 0xC1, 0x6D, 0x70, 0x1, 0xD2, 0xC1, 0x7D, 0x70, 0x1, 0x12, 0xC2, 0x8D, 0x70, 0x1, 0x52, 0xC2, 0x9D, 0x70, 0x1, 0x92, 0xC2, 0xAD, 0x70, 0x1, 0xD2, 0xC2, 0xBD, 0x70, 0x1, 0x12, 0xC3, 0xCD, 0x70, 0x1, 0x52, 0xC3, 0xDD, 0x70, 0x1, 0x92, 0xC3, 0xED, 0x70, 0x1, 0xD2, 0xC3, 0xFD, 0x70, 0x1, 0x12, 0xC4, 0xD, 0x71, 0x1, 0x52, 0xC4, 0x1D, 0x71, 0x1, 0x12, 0x0, 0x20, 0x71, 0x1, 0xB2, 0xC4, 0x5, 0x0, 0x0, 0x12, 0x0, 0x30, 0x71, 0x1, 0xF2, 0xC4, 0x45, 0x71, 0x1, 0x32, 0xC5, 0x55, 0x71, 0x1, 0x72, 0xC5, 0x65, 0x71, 0x1, 0xB2, 0xC5, 0x75, 0x71, 0x1, 0xF2, 0xC5, 0x85, 0x71, 0x1, 0x32, 0xC6, 0x95, 0x71, 0x1, 0x72, 0xC6, 0xA5, 0x71, 0x1, 0xB2, 0xC6, 0xB5, 0x71, 0x1, 0xF2, 0xC6, 0xC5, 0x71, 0x1, 0x32, 0xC7, 0xD5, 0x71, 0x1, 0x72, 0xC7, 0xE5, 0x71, 0x1, 0xB2, 0xC7, 0xF5, 0x71, 0x1, 0xF2, 0xC7, 0x5, 0x72, 0x1, 0x32, 0xC8, 0x15, 0x72, 0x1, 0x72, 0xC8, 0x25, 0x72, 0x1, 0xB2, 0xC8, 0x35, 0x72, 0x1, 0xF2, 0xC8, 0x45, 0x72, 0x1, 0x32, 0xC9, 0x55, 0x72, 0x1, 0x72, 0xC9, 0x65, 0x72, 0x1, 0xB2, 0xC9, 0x75, 0x72, 0x1, 0x12, 0x0, 0x78, 0x72, 0x1, 0x12, 0xCA, 0x8D, 0x72, 0x1, 0x52, 0xCA, 0x9D, 0x72, 0x1, 0x92, 0xCA, 0xAD, 0x72, 0x1, 0xD2, 0xCA, 0xBD, 0x72, 0x1, 0x12, 0xCB, 0xCD, 0x72, 0x1, 0x52, 0xCB, 0xDD, 0x72, 0x1, 0x92, 0xCB, 0xED, 0x72, 0x1, 0xD2, 0xCB, 0xFD, 0x72, 0x1, 0x12, 0xCC, 0xD, 0x73, 0x1, 0x52, 0xCC, 0x5, 0x0, 0x0, 0x72, 0xCC, 0x25, 0x73, 0x1, 0xB2, 0xCC, 0x35, 0x73, 0x1, 0xF2, 0xCC, 0x45, 0x73, 0x1, 0x32, 0xCD, 0x55, 0x73, 0x1, 0x72, 0xCD, 0x65, 0x73, 0x1, 0x12, 0x0, 0x68, 0x73, 0x1, 0xD2, 0xCD, 0x7D, 0x73, 0x1, 0x12, 0x0, 0x80, 0x73, 0x1, 0x32, 0xCE, 0x95, 0x73, 0x1, 0x72, 0xCE, 0xA5, 0x73, 0x1, 0xB2, 0xCE, 0xB5, 0x73, 0x1, 0xF2, 0xCE, 0xC5, 0x73, 0x1, 0x32, 0xCF, 0xD5, 0x73, 0x1, 0x72, 0xCF, 0xE5, 0x73, 0x1, 0xB2, 0xCF, 0xF5, 0x73, 0x1, 0xF2, 0xCF, 0x5, 0x74, 0x1, 0x32, 0xD0, 0x15, 0x74, 0x1, 0x72, 0xD0, 0x25, 0x74, 0x1, 0xB2, 0xD0, 0x35, 0x74, 0x1, 0xF2, 0xD0, 0x45, 0x74, 0x1, 0x32, 0xD1, 0x5, 0x0, 0x0, 0x52, 0xD1, 0x5D, 0x74, 0x1, 0x92, 0xD1, 0x6D, 0x74, 0x1, 0xD2, 0xD1, 0x7D, 0x74, 0x1, 0x12, 0xD2, 0x8D, 0x74, 0x1, 0x52, 0xD2, 0x9D, 0x74, 0x1, 0x92, 0xD2, 0xAD, 0x74, 0x1, 0xD2, 0xD2, 0xBD, 0x74, 0x1, 0x12, 0xD3, 0xCD, 0x74, 0x1, 0x52, 0xD3, 0xDD, 0x74, 0x1, 0x12, 0x0, 0xE0, 0x74, 0x1, 0xB2, 0xD3, 0xF5, 0x74, 0x1, 0xF2, 0xD3, 0x5, 0x75, 0x1, 0x32, 0xD4, 0x15, 0x75, 0x1, 0x72, 0xD4, 0x25, 0x75, 0x1, 0xB2, 0xD4, 0x35, 0x75, 0x1, 0xF2, 0xD4, 0x45, 0x75, 0x1, 0x32, 0xD5, 0x5, 0x0, 0x0, 0x52, 0xD5, 0x5D, 0x75, 0x1, 0x92, 0xD5, 0x6D, 0x75, 0x1, 0xD2, 0xD5, 0x7D, 0x75, 0x1, 0x12, 0xD6, 0x5, 0x0, 0x0, 0x12, 0x0, 0x80, 0x75, 0x1, 0x12, 0x0, 0x88, 0x75, 0x1, 0x52, 0xD6, 0x5, 0x0, 0x0, 0x72, 0xD6, 0xA5, 0x75, 0x1, 0x12, 0x0, 0xA8, 0x75, 0x1, 0xD2, 0xD6, 0xBD, 0x75, 0x1, 0x12, 0xD7, 0xCD, 0x75, 0x1, 0x12, 0x0, 0xD0, 0x75, 0x1, 0x12, 0x0, 0xD8, 0x75, 0x1, 0x92, 0xD7, 0xED, 0x75, 0x1, 0x12, 0x0, 0xF0, 0x75, 0x1, 0xF2, 0xD7, 0x5, 0x76, 0x1, 0x12, 0x0, 0x8, 0x76, 0x1, 0x52, 0xD8, 0x1D, 0x76, 0x1, 0x92, 0xD8, 0x2D, 0x76, 0x1, 0xD2, 0xD8, 0x3D, 0x76, 0x1, 0x12, 0xD9, 0x4D, 0x76, 0x1, 0x52, 0xD9, 0x5D, 0x76, 0x1, 0x92, 0xD9, 0x6D, 0x76, 0x1, 0xD2, 0xD9, 0x7D, 0x76, 0x1, 0x12, 0xDA, 0x8D, 0x76, 0x1, 0x52, 0xDA, 0x9D, 0x76, 0x1, 0x92, 0xDA, 0xAD, 0x76, 0x1, 0xD2, 0xDA, 0xBD, 0x76, 0x1, 0x12, 0xDB, 0xCD, 0x76, 0x1, 0x52, 0xDB, 0xDD, 0x76, 0x1, 0x92, 0xDB, 0xED, 0x76, 0x1, 0xD2, 0xDB, 0xFD, 0x76, 0x1, 0x12, 0xDC, 0xD, 0x77, 0x1, 0x52, 0xDC, 0x1D, 0x77, 0x1, 0x92, 0xDC, 0x2D, 0x77, 0x1, 0xD2, 0xDC, 0x3D, 0x77, 0x1, 0x12, 0xDD, 0x4D, 0x77, 0x1, 0x52, 0xDD, 0x5D, 0x77, 0x1, 0x92, 0xDD, 0x6D, 0x77, 0x1, 0xD2, 0xDD, 0x7D, 0x77, 0x1, 0x12, 0xDE, 0x8D, 0x77, 0x1, 0x52, 0xDE, 0x5, 0x0, 0x0, 0x72, 0xDE, 0xA5, 0x77, 0x1, 0xB2, 0xDE, 0xB5, 0x77, 0x1, 0xF2, 0xDE, 0xC5, 0x77, 0x1, 0x32, 0xDF, 0xD5, 0x77, 0x1, 0x72, 0xDF, 0xE5, 0x77, 0x1, 0xB2, 0xDF, 0xF5, 0x77, 0x1, 0xF2, 0xDF, 0x5, 0x78, 0x1, 0x32, 0xE0, 0x15, 0x78, 0x1, 0x72, 0xE0, 0x25, 0x78, 0x1, 0xB2, 0xE0, 0x35, 0x78, 0x1, 0xF2, 0xE0, 0x45, 0x78, 0x1, 0x32, 0xE1, 0x55, 0x78, 0x1, 0x72, 0xE1, 0x65, 0x78, 0x1, 0xB2, 0xE1, 0x75, 0x78, 0x1, 0xF2, 0xE1, 0x85, 0x78, 0x1, 0x32, 0xE2, 0x95, 0x78, 0x1, 0x72, 0xE2, 0xA5, 0x78, 0x1, 0xB2, 0xE2, 0xB5, 0x78, 0x1, 0xF2, 0xE2, 0xC5, 0x78, 0x1, 0x32, 0xE3, 0x5, 0x0, 0x0, 0x52, 0xE3, 0xDD, 0x78, 0x1, 0x92, 0xE3, 0xED, 0x78, 0x1, 0xD2, 0xE3, 0xFD, 0x78, 0x1, 0x12, 0xE4, 0xD, 0x79, 0x1, 0x52, 0xE4, 0x1D, 0x79, 0x1, 0x92, 0xE4, 0x2D, 0x79, 0x1, 0xD2, 0xE4, 0x3D, 0x79, 0x1, 0x12, 0xE5, 0x4D, 0x79, 0x1, 0x52, 0xE5, 0x5D, 0x79, 0x1, 0x92, 0xE5, 0x6D, 0x79, 0x1, 0xD2, 0xE5, 0x7D, 0x79, 0x1, 0x12, 0xE6, 0x8D, 0x79, 0x1, 0x52, 0xE6, 0x9D, 0x79, 0x1, 0x92, 0xE6, 0xAD, 0x79, 0x1, 0xD2, 0xE6, 0xBD, 0x79, 0x1, 0x12, 0xE7, 0xCD, 0x79, 0x1, 0x52, 0xE7, 0xDD, 0x79, 0x1, 0x92, 0xE7, 0xED, 0x79, 0x1, 0xD2, 0xE7, 0xFD, 0x79, 0x1, 0x12, 0xE8, 0xD, 0x7A, 0x1, 0x52, 0xE8, 0x1D, 0x7A, 0x1, 0x92, 0xE8, 0x2D, 0x7A, 0x1, 0xD2, 0xE8, 0x3D, 0x7A, 0x1, 0x12, 0xE9, 0x4D, 0x7A, 0x1, 0x52, 0xE9, 0x5D, 0x7A, 0x1, 0x92, 0xE9, 0x6D, 0x7A, 0x1, 0xD2, 0xE9, 0x7D, 0x7A, 0x1, 0x12, 0xEA, 0x8D, 0x7A, 0x1, 0x52, 0xEA, 0x9D, 0x7A, 0x1, 0x92, 0xEA, 0xAD, 0x7A, 0x1, 0xD2, 0xEA, 0xBD, 0x7A, 0x1, 0x12, 0xEB, 0xCD, 0x7A, 0x1, 0x52, 0xEB, 0xDD, 0x7A, 0x1, 0x92, 0xEB, 0xED, 0x7A, 0x1, 0x12, 0x0, 0xF0, 0x7A, 0x1, 0xF2, 0xEB, 0x5, 0x7B, 0x1, 0x32, 0xEC, 0x15, 0x7B, 0x1, 0x72, 0xEC, 0x25, 0x7B, 0x1, 0xB2, 0xEC, 0x35, 0x7B, 0x1, 0xF2, 0xEC, 0x45, 0x7B, 0x1, 0x32, 0xED, 0x55, 0x7B, 0x1, 0x72, 0xED, 0x65, 0x7B, 0x1, 0xB2, 0xED, 0x75, 0x7B, 0x1, 0xF2, 0xED, 0x85, 0x7B, 0x1, 0x32, 0xEE, 0x95, 0x7B, 0x1, 0x72, 0xEE, 0xA5, 0x7B, 0x1, 0xB2, 0xEE, 0xB5, 0x7B, 0x1, 0xF2, 0xEE, 0xC5, 0x7B, 0x1, 0x32, 0xEF, 0xD5, 0x7B, 0x1, 0x72, 0xEF, 0xE5, 0x7B, 0x1, 0xB2, 0xEF, 0x5, 0x0, 0x0, 0xD2, 0xEF, 0xFD, 0x7B, 0x1, 0x12, 0xF0, 0xD, 0x7C, 0x1, 0x52, 0xF0, 0x1D, 0x7C, 0x1, 0x92, 0xF0, 0x2D, 0x7C, 0x1, 0xD2, 0xF0, 0xFD, 0x7B, 0x1, 0xF2, 0xF0, 0x45, 0x7C, 0x1, 0x32, 0xF1, 0x5, 0x0, 0x0, 0x52, 0xF1, 0x5D, 0x7C, 0x1, 0x92, 0xF1, 0x6D, 0x7C, 0x1, 0xD2, 0xF1, 0x5, 0x0, 0x0, 0x12, 0x0, 0x78, 0x7C, 0x1, 0x12, 0xF2, 0x8D, 0x7C, 0x1, 0x52, 0xF2, 0x9D, 0x7C, 0x1, 0x92, 0xF2, 0x5, 0x0, 0x0, 0xB2, 0xF2, 0xB5, 0x7C, 0x1, 0xF2, 0xF2, 0xC5, 0x7C, 0x1, 0x32, 0xF3, 0xD5, 0x7C, 0x1, 0x72, 0xF3, 0xE5, 0x7C, 0x1, 0xB2, 0xF3, 0xF5, 0x7C, 0x1, 0xF2, 0xF3, 0x5, 0x7D, 0x1, 0x32, 0xF4, 0x15, 0x7D, 0x1, 0x72, 0xF4, 0x25, 0x7D, 0x1, 0x12, 0x0, 0x28, 0x7D, 0x1, 0xD2, 0xF4, 0x3D, 0x7D, 0x1, 0x12, 0xF5, 0x4D, 0x7D, 0x1, 0x52, 0xF5, 0x5D, 0x7D, 0x1, 0x92, 0xF5, 0x6D, 0x7D, 0x1, 0xD2, 0xF5, 0x7D, 0x7D, 0x1, 0x12, 0xF6, 0x8D, 0x7D, 0x1, 0x52, 0xF6, 0x9D, 0x7D, 0x1, 0x92, 0xF6, 0xAD, 0x7D, 0x1, 0xD2, 0xF6, 0xBD, 0x7D, 0x1, 0x12, 0xF7, 0xCD, 0x7D, 0x1, 0x52, 0xF7, 0xDD, 0x7D, 0x1, 0x92, 0xF7, 0xED, 0x7D, 0x1, 0xD2, 0xF7, 0xFD, 0x7D, 0x1, 0x12, 0xF8, 0x5, 0x0, 0x0, 0x32, 0xF8, 0x15, 0x7E, 0x1, 0x72, 0xF8, 0x25, 0x7E, 0x1, 0xB2, 0xF8, 0x35, 0x7E, 0x1, 0xF2, 0xF8, 0x45, 0x7E, 0x1, 0x32, 0xF9, 0x55, 0x7E, 0x1, 0x72, 0xF9, 0x65, 0x7E, 0x1, 0xB2, 0xF9, 0x75, 0x7E, 0x1, 0xF2, 0xF9, 0x85, 0x7E, 0x1, 0x32, 0xFA, 0x95, 0x7E, 0x1, 0x72, 0xFA, 0xA5, 0x7E, 0x1, 0xB2, 0xFA, 0xB5, 0x7E, 0x1, 0xF2, 0xFA, 0xC5, 0x7E, 0x1, 0x32, 0xFB, 0xD5, 0x7E, 0x1, 0x72, 0xFB, 0xE5, 0x7E, 0x1, 0xB2, 0xFB, 0xF5, 0x7E, 0x1, 0xF2, 0xFB, 0x5, 0x7F, 0x1, 0x32, 0xFC, 0x15, 0x7F, 0x1, 0x72, 0xFC, 0x25, 0x7F, 0x1, 0xB2, 0xFC, 0x35, 0x7F, 0x1, 0xF2, 0xFC, 0x45, 0x7F, 0x1, 0x32, 0xFD, 0x55, 0x7F, 0x1, 0x72, 0xFD, 0x65, 0x7F, 0x1, 0xB2, 0xFD, 0x75, 0x7F, 0x1, 0xF2, 0xFD, 0x85, 0x7F, 0x1, 0x32, 0xFE, 0x95, 0x7F, 0x1, 0x72, 0xFE, 0xA5, 0x7F, 0x1, 0xB2, 0xFE, 0xB5, 0x7F, 0x1, 0xF2, 0xFE, 0xC5, 0x7F, 0x1, 0x32, 0xFF, 0x95, 0x7F, 0x1, 0x12, 0x0, 0xD0, 0x7F, 0x1, 0x72, 0xFF, 0xE5, 0x7F, 0x1, 0xB2, 0xFF, 0xF5, 0x7F, 0x1, 0xF2, 0xFF, 0x5, 0x80, 0x1, 0x33, 0x0, 0x16, 0x80, 0x1, 0x73, 0x0, 0x26, 0x80, 0x1, 0xB3, 0x0, 0x36, 0x80, 0x1, 0xF3, 0x0, 0x46, 0x80, 0x1, 0x33, 0x1, 0x56, 0x80, 0x1, 0x73, 0x1, 0x66, 0x80, 0x1, 0xB3, 0x1, 0x76, 0x80, 0x1, 0x13, 0x0, 0x78, 0x80, 0x1, 0x13, 0x0, 0x80, 0x80, 0x1, 0x33, 0x2, 0x96, 0x80, 0x1, 0x73, 0x2, 0xA6, 0x80, 0x1, 0xB3, 0x2, 0xB6, 0x80, 0x1, 0xF3, 0x2, 0xC6, 0x80, 0x1, 0x33, 0x3, 0xD6, 0x80, 0x1, 0x73, 0x3, 0x6, 0x0, 0x0, 0x93, 0x3, 0xEE, 0x80, 0x1, 0xD3, 0x3, 0xFE, 0x80, 0x1, 0x13, 0x4, 0xE, 0x81, 0x1, 0x53, 0x4, 0x1E, 0x81, 0x1, 0x93, 0x4, 0x2E, 0x81, 0x1, 0xD3, 0x4, 0x3E, 0x81, 0x1, 0x13, 0x5, 0x4E, 0x81, 0x1, 0x53, 0x5, 0x5E, 0x81, 0x1, 0x93, 0x5, 0x6E, 0x81, 0x1, 0xD3, 0x5, 0x7E, 0x81, 0x1, 0x13, 0x6, 0x8E, 0x81, 0x1, 0x53, 0x6, 0x9E, 0x81, 0x1, 0x93, 0x6, 0xAE, 0x81, 0x1, 0x13, 0x0, 0xB0, 0x81, 0x1, 0xF3, 0x6, 0xC6, 0x81, 0x1, 0x33, 0x7, 0xD6, 0x81, 0x1, 0x73, 0x7, 0xE6, 0x81, 0x1, 0xB3, 0x7, 0xF6, 0x81, 0x1, 0xF3, 0x7, 0x6, 0x82, 0x1, 0x33, 0x8, 0x16, 0x82, 0x1, 0x73, 0x8, 0x26, 0x82, 0x1, 0xB3, 0x8, 0x36, 0x82, 0x1, 0xF3, 0x8, 0x46, 0x82, 0x1, 0x33, 0x9, 0x56, 0x82, 0x1, 0x73, 0x9, 0x66, 0x82, 0x1, 0xB3, 0x9, 0x76, 0x82, 0x1, 0xF3, 0x9, 0x86, 0x82, 0x1, 0x33, 0xA, 0x96, 0x82, 0x1, 0x73, 0xA, 0xA6, 0x82, 0x1, 0xB3, 0xA, 0xB6, 0x82, 0x1, 0x13, 0x0, 0xB8, 0x82, 0x1, 0x13, 0xB, 0xCE, 0x82, 0x1, 0x53, 0xB, 0x6, 0x0, 0x0, 0x13, 0x0, 0xD8, 0x82, 0x1, 0x93, 0xB, 0xEE, 0x82, 0x1, 0xD3, 0xB, 0xFE, 0x82, 0x1, 0x13, 0xC, 0xE, 0x83, 0x1, 0x53, 0xC, 0x1E, 0x83, 0x1, 0x93, 0xC, 0x2E, 0x83, 0x1, 0xD3, 0xC, 0x3E, 0x83, 0x1, 0x73, 0xD, 0x66, 0x83, 0x1, 0x93, 0xE, 0xAE, 0x83, 0x1, 0xD3, 0xE, 0xBE, 0x83, 0x1, 0x13, 0xF, 0xCE, 0x83, 0x1, 0x53, 0xF, 0xDE, 0x83, 0x1, 0x93, 0xF, 0xEE, 0x83, 0x1, 0xD3, 0xF, 0xFE, 0x83, 0x1, 0x13, 0x10, 0xE, 0x84, 0x1, 0x53, 0x10, 0x1E, 0x84, 0x1, 0x93, 0x10, 0x2E, 0x84, 0x1, 0xD3, 0x10, 0x3E, 0x84, 0x1, 0x13, 0x11, 0x4E, 0x84, 0x1, 0x53, 0x11, 0x5E, 0x84, 0x1, 0x93, 0x11, 0x6E, 0x84, 0x1, 0xD3, 0x11, 0x7E, 0x84, 0x1, 0x13, 0x12, 0x8E, 0x84, 0x1, 0x53, 0x12, 0x9E, 0x84, 0x1, 0x93, 0x12, 0x6, 0x0, 0x0, 0xB3, 0x12, 0x6, 0x0, 0x0, 0xD3, 0x12, 0xBE, 0x84, 0x1, 0x13, 0x13, 0xCE, 0x84, 0x1, 0x53, 0x13, 0xDE, 0x84, 0x1, 0x13, 0x0, 0xE8, 0x84, 0x1, 0xD3, 0x13, 0xFE, 0x84, 0x1, 0x13, 0x14, 0xE, 0x85, 0x1, 0x53, 0x14, 0x1E, 0x85, 0x1, 0x93, 0x14, 0x2E, 0x85, 0x1, 0xD3, 0x14, 0x3E, 0x85, 0x1, 0x13, 0x15, 0x4E, 0x85, 0x1, 0x53, 0x15, 0x5E, 0x85, 0x1, 0x93, 0x15, 0x6E, 0x85, 0x1, 0xD3, 0x15, 0x7E, 0x85, 0x1, 0x13, 0x16, 0x8E, 0x85, 0x1, 0x53, 0x16, 0x9E, 0x85, 0x1, 0x93, 0x16, 0xAE, 0x85, 0x1, 0xD3, 0x16, 0xBE, 0x85, 0x1, 0x13, 0x17, 0xCE, 0x85, 0x1, 0x53, 0x17, 0xDE, 0x85, 0x1, 0x93, 0x17, 0xEE, 0x85, 0x1, 0xD3, 0x17, 0xFE, 0x85, 0x1, 0x13, 0x18, 0xE, 0x86, 0x1, 0x53, 0x18, 0x1E, 0x86, 0x1, 0x93, 0x18, 0x2E, 0x86, 0x1, 0xD3, 0x18, 0x3E, 0x86, 0x1, 0x13, 0x19, 0x4E, 0x86, 0x1, 0x53, 0x19, 0x5E, 0x86, 0x1, 0x93, 0x19, 0x4E, 0x86, 0x1, 0xB3, 0x19, 0x76, 0x86, 0x1, 0xF3, 0x19, 0x86, 0x86, 0x1, 0x33, 0x1A, 0x96, 0x86, 0x1, 0x73, 0x1A, 0xA6, 0x86, 0x1, 0xB3, 0x1A, 0xB6, 0x86, 0x1, 0xF3, 0x1A, 0xC6, 0x86, 0x1, 0x33, 0x1B, 0xD6, 0x86, 0x1, 0x73, 0x1B, 0xE6, 0x86, 0x1, 0xB3, 0x1B, 0xF6, 0x86, 0x1, 0xF3, 0x1B, 0x6, 0x87, 0x1, 0x33, 0x1C, 0x16, 0x87, 0x1, 0x73, 0x1C, 0x26, 0x87, 0x1, 0xB3, 0x1C, 0x36, 0x87, 0x1, 0xF3, 0x1C, 0x46, 0x87, 0x1, 0x33, 0x1D, 0x56, 0x87, 0x1, 0x73, 0x1D, 0x66, 0x87, 0x1, 0xB3, 0x1D, 0x76, 0x87, 0x1, 0xF3, 0x1D, 0x86, 0x87, 0x1, 0x33, 0x1E, 0x96, 0x87, 0x1, 0x73, 0x1E, 0xA6, 0x87, 0x1, 0xB3, 0x1E, 0xB6, 0x87, 0x1, 0xF3, 0x1E, 0xC6, 0x87, 0x1, 0x33, 0x1F, 0xD6, 0x87, 0x1, 0x73, 0x1F, 0xE6, 0x87, 0x1, 0xB3, 0x1F, 0xF6, 0x87, 0x1, 0xF3, 0x1F, 0x6, 0x88, 0x1, 0x33, 0x20, 0x16, 0x88, 0x1, 0x73, 0x20, 0x26, 0x88, 0x1, 0xB3, 0x20, 0x36, 0x88, 0x1, 0xF3, 0x20, 0x46, 0x88, 0x1, 0x33, 0x21, 0x36, 0x88, 0x1, 0x53, 0x21, 0x5E, 0x88, 0x1, 0x93, 0x21, 0x6E, 0x88, 0x1, 0xD4, 0x21, 0x7E, 0x88, 0x1, 0x14, 0x22, 0x8E, 0x88, 0x1, 0x54, 0x22, 0x9E, 0x88, 0x1, 0x94, 0x22, 0x6, 0x0, 0x0, 0xB4, 0x22, 0x6, 0x0, 0x0, 0xD4, 0x22, 0x6, 0x0, 0x0, 0x14, 0x0, 0xB8, 0x88, 0x1, 0x14, 0x23, 0xCE, 0x88, 0x1, 0x54, 0x23, 0xDE, 0x88, 0x1, 0x94, 0x23, 0xEE, 0x88, 0x1, 0xD4, 0x23, 0xFE, 0x88, 0x1, 0x14, 0x24, 0xE, 0x89, 0x1, 0x54, 0x24, 0x1E, 0x89, 0x1, 0x14, 0x0, 0x20, 0x89, 0x1, 0xB4, 0x24, 0x36, 0x89, 0x1, 0x14, 0x0, 0x38, 0x89, 0x1, 0x14, 0x25, 0x4E, 0x89, 0x1, 0x54, 0x25, 0x5E, 0x89, 0x1, 0x94, 0x25, 0x6E, 0x89, 0x1, 0xD4, 0x25, 0x7E, 0x89, 0x1, 0x14, 0x26, 0x8E, 0x89, 0x1, 0x54, 0x26, 0x9E, 0x89, 0x1, 0x94, 0x26, 0xAE, 0x89, 0x1, 0xD4, 0x26, 0xA6, 0x89, 0x1, 0xB4, 0x26, 0xB6, 0x89, 0x1, 0x14, 0x0, 0xB8, 0x89, 0x1, 0x14, 0x27, 0xCE, 0x89, 0x1, 0x54, 0x27, 0x6, 0x0, 0x0, 0x14, 0x0, 0xD8, 0x89, 0x1, 0x14, 0x0, 0xE8, 0x89, 0x1, 0xD4, 0x27, 0xFE, 0x89, 0x1, 0x14, 0x28, 0xE, 0x8A, 0x1, 0x54, 0x28, 0x1E, 0x8A, 0x1, 0x94, 0x28, 0x46, 0x83, 0x1, 0x34, 0xD, 0x56, 0x83, 0x1, 0xB4, 0x28, 0x6E, 0x83, 0x1, 0xD4, 0xD, 0x7E, 0x83, 0x1, 0x14, 0xE, 0x8E, 0x83, 0x1, 0x54, 0xE, 0x9E, 0x83, 0x1, 0xD4, 0x28, 0x3E, 0x8A, 0x1, 0x14, 0x29, 0x4E, 0x8A, 0x1, 0x54, 0x29, 0x5E, 0x8A, 0x1, 0x94, 0x29, 0x6E, 0x8A, 0x1, 0xD4, 0x29, 0x7E, 0x8A, 0x1, 0x14, 0x2A, 0x8E, 0x8A, 0x1, 0x54, 0x2A, 0x9E, 0x8A, 0x1, 0x94, 0x2A, 0xAE, 0x8A, 0x1, 0x14, 0x0, 0xB0, 0x8A, 0x1, 0xF4, 0x2A, 0x6, 0x0, 0x0, 0x14, 0x2B, 0xCE, 0x8A, 0x1, 0x54, 0x2B, 0x6, 0x0, 0x0, 0x94, 0x13, 0x86, 0x88, 0x1, 0x34, 0x22, 0x96, 0x88, 0x1, 0x74, 0x22, 0xA6, 0x88, 0x1, 0x54, 0x2B, 0x3E, 0x89, 0x1, 0x14, 0x0, 0xD8, 0x8A, 0x1, 0x94, 0x2B, 0xEE, 0x8A, 0x1, 0x74, 0x2B, 0xE6, 0x8A, 0x1, 0xB4, 0x2B, 0xF6, 0x8A, 0x1, 0xF4, 0x2B, 0x6, 0x8B, 0x1, 0x34, 0x2C, 0x16, 0x8B, 0x1, 0x74, 0x2C, 0x26, 0x8B, 0x1, 0xB4, 0x2C, 0x36, 0x8B, 0x1, 0xF4, 0x2C, 0x46, 0x8B, 0x1, 0x34, 0x2D, 0x56, 0x8B, 0x1, 0x74, 0x2D, 0x66, 0x8B, 0x1, 0xB4, 0x2D, 0x66, 0x8B, 0x1, 0xB4, 0x2D, 0x5E, 0x8B, 0x1, 0xD4, 0x2D, 0x7E, 0x8B, 0x1, 0x14, 0x2E, 0x8E, 0x8B, 0x1, 0x54, 0x2E, 0x9E, 0x8B, 0x1, 0x54, 0x2E, 0xA6, 0x8B, 0x1, 0xB4, 0x2E, 0x6, 0x0, 0x0, 0xD4, 0x2E, 0xBE, 0x8B, 0x1, 0x14, 0x2F, 0xCE, 0x8B, 0x1, 0x54, 0x2F, 0xDE, 0x8B, 0x1, 0x94, 0x2F, 0xEE, 0x8B, 0x1, 0xD4, 0x2F, 0xFE, 0x8B, 0x1, 0x14, 0x30, 0xE, 0x8C, 0x1, 0x54, 0x30, 0x1E, 0x8C, 0x1, 0x94, 0x30, 0x2E, 0x8C, 0x1, 0xD4, 0x30, 0x3E, 0x8C, 0x1, 0x14, 0x31, 0x4E, 0x8C, 0x1, 0x54, 0x31, 0x5E, 0x8C, 0x1, 0x94, 0x31, 0x6E, 0x8C, 0x1, 0xD4, 0x31, 0x7E, 0x8C, 0x1, 0x14, 0x32, 0x8E, 0x8C, 0x1, 0x54, 0x32, 0x8E, 0x8C, 0x1, 0x74, 0x32, 0xA6, 0x8C, 0x1, 0x15, 0x0, 0xA8, 0x8C, 0x1, 0xB5, 0x32, 0x6, 0x0, 0x0, 0xD5, 0x32, 0xBE, 0x8C, 0x1, 0x15, 0x33, 0xCE, 0x8C, 0x1, 0x55, 0x33, 0xDE, 0x8C, 0x1, 0x95, 0x33, 0xEE, 0x8C, 0x1, 0xD5, 0x33, 0xFE, 0x8C, 0x1, 0x15, 0x34, 0x6, 0x0, 0x0, 0x15, 0x0, 0x8, 0x8D, 0x1, 0x55, 0x34, 0x1E, 0x8D, 0x1, 0x95, 0x34, 0x2E, 0x8D, 0x1, 0xD5, 0x34, 0x3E, 0x8D, 0x1, 0x15, 0x35, 0x4E, 0x8D, 0x1, 0x55, 0x35, 0x5E, 0x8D, 0x1, 0x95, 0x35, 0x6E, 0x8D, 0x1, 0xD5, 0x35, 0x7E, 0x8D, 0x1, 0x15, 0x36, 0x6, 0x0, 0x0, 0x15, 0x0, 0x88, 0x8D, 0x1, 0x95, 0x27, 0x96, 0x8D, 0x1, 0x75, 0x36, 0x6, 0x0, 0x0, 0x95, 0x36, 0xAE, 0x8D, 0x1, 0xD5, 0x36, 0xBE, 0x8D, 0x1, 0x15, 0x37, 0xCE, 0x8D, 0x1, 0x55, 0x37, 0xDE, 0x8D, 0x1, 0x95, 0x37, 0xEE, 0x8D, 0x1, 0xD5, 0x37, 0xFE, 0x8D, 0x1, 0x15, 0x38, 0xE, 0x8E, 0x1, 0x55, 0x38, 0x1E, 0x8E, 0x1, 0x15, 0x0, 0x20, 0x8E, 0x1, 0xB5, 0x38, 0x6, 0x0, 0x0, 0xD5, 0x38, 0x3E, 0x8E, 0x1, 0x15, 0x39, 0x4E, 0x8E, 0x1, 0x55, 0x39, 0x6, 0x0, 0x0, 0xD5, 0x38, 0x5E, 0x8E, 0x1, 0xB5, 0x34, 0x6, 0x0, 0x0, 0x15, 0x0, 0x60, 0x8E, 0x1, 0xB5, 0x39, 0x76, 0x8E, 0x1, 0xF5, 0x39, 0x86, 0x8E, 0x1, 0x35, 0x3A, 0x96, 0x8E, 0x1, 0x75, 0x3A, 0xA6, 0x8E, 0x1, 0xB5, 0x3A, 0xB6, 0x8E, 0x1, 0xF5, 0x3A, 0xC6, 0x8E, 0x1, 0x35, 0x3B, 0xD6, 0x8E, 0x1, 0x75, 0x3B, 0xE6, 0x8E, 0x1, 0xB5, 0x3B, 0x6, 0x0, 0x0, 0x15, 0x0, 0xF0, 0x8E, 0x1, 0xF5, 0x3B, 0x6, 0x8F, 0x1, 0x35, 0x3C, 0x16, 0x8F, 0x1, 0x75, 0x3C, 0x26, 0x8F, 0x1, 0xB5, 0x3C, 0x36, 0x8F, 0x1, 0xF5, 0x3C, 0x46, 0x8F, 0x1, 0x35, 0x3D, 0x56, 0x8F, 0x1, 0x75, 0x3D, 0x66, 0x8F, 0x1, 0xD6, 0x3D, 0x7E, 0x8F, 0x1, 0x16, 0x0, 0x80, 0x8F, 0x1, 0x36, 0x3E, 0x6, 0x0, 0x0, 0x56, 0x3E, 0x9E, 0x8F, 0x1, 0x96, 0x3E, 0xAE, 0x8F, 0x1, 0x16, 0x0, 0xB0, 0x8F, 0x1, 0xF6, 0x3E, 0x6, 0x0, 0x0, 0x16, 0x0, 0xC0, 0x8F, 0x1, 0x36, 0x3F, 0xD6, 0x8F, 0x1, 0x76, 0x3F, 0xE6, 0x8F, 0x1, 0xB6, 0x3F, 0xF6, 0x8F, 0x1, 0x16, 0x0, 0xF8, 0x8F, 0x1, 0x16, 0x40, 0xE, 0x90, 0x1, 0x56, 0x40, 0x1E, 0x90, 0x1, 0x96, 0x40, 0x2E, 0x90, 0x1, 0xD6, 0x40, 0x3E, 0x90, 0x1, 0x16, 0x41, 0x4E, 0x90, 0x1, 0x16, 0x0, 0x50, 0x90, 0x1, 0x76, 0x41, 0x6, 0x0, 0x0, 0x16, 0x0, 0x60, 0x90, 0x1, 0xB6, 0x41, 0x76, 0x90, 0x1, 0xF6, 0x41, 0x86, 0x90, 0x1, 0x16, 0x0, 0x88, 0x90, 0x1, 0x56, 0x42, 0x9E, 0x90, 0x1, 0x96, 0x42, 0xAE, 0x90, 0x1, 0xD6, 0x42, 0xBE, 0x90, 0x1, 0x16, 0x43, 0xCE, 0x90, 0x1, 0x56, 0x43, 0x6, 0x0, 0x0, 0x16, 0x0, 0xD8, 0x90, 0x1, 0x96, 0x43, 0xEE, 0x90, 0x1, 0xD6, 0x43, 0xFE, 0x90, 0x1, 0x16, 0x44, 0xE, 0x91, 0x1, 0x56, 0x44, 0x6, 0x0, 0x0, 0xB6, 0x3D, 0x6, 0x0, 0x0, 0x17, 0x0, 0x18, 0x91, 0x1, 0x97, 0x44, 0x2E, 0x91, 0x1, 0xD7, 0x44, 0x3E, 0x91, 0x1, 0x17, 0x45, 0x4E, 0x91, 0x1, 0x17, 0x0, 0x50, 0x91, 0x1, 0x77, 0x45, 0x66, 0x91, 0x1, 0xB7, 0x45, 0x6, 0x0, 0x0, 0xD7, 0x45, 0x7E, 0x91, 0x1, 0x17, 0x46, 0x8E, 0x91, 0x1, 0x57, 0x46, 0x9E, 0x91, 0x1, 0x97, 0x46, 0xAE, 0x91, 0x1, 0xD7, 0x46, 0x6, 0x0, 0x0, 0xF7, 0x46, 0x6, 0x0, 0x0, 0x17, 0x47, 0x6, 0x0, 0x0, 0x37, 0x47, 0xD6, 0x91, 0x1, 0x77, 0x47, 0xE6, 0x91, 0x1, 0xB7, 0x47, 0xF6, 0x91, 0x1, 0xF7, 0x47, 0x6, 0x92, 0x1, 0x37, 0x48, 0x16, 0x92, 0x1, 0x77, 0x48, 0x26, 0x92, 0x1, 0xB8, 0x48, 0x6, 0x0, 0x0, 0xD8, 0x48, 0x6, 0x0, 0x0, 0xF8, 0x48, 0x46, 0x92, 0x1, 0x38, 0x49, 0x56, 0x92, 0x1, 0x18, 0x0, 0x58, 0x92, 0x1, 0x98, 0x49, 0x6, 0x0, 0x0, 0xB8, 0x49, 0x76, 0x92, 0x1, 0xF8, 0x49, 0x86, 0x92, 0x1, 0x38, 0x4A, 0x6, 0x0, 0x0, 0x18, 0x0, 0x90, 0x92, 0x1, 0x78, 0x4A, 0xA6, 0x92, 0x1, 0xB8, 0x4A, 0xB6, 0x92, 0x1, 0xF8, 0x4A, 0xC6, 0x92, 0x1, 0x39, 0x4B, 0x6, 0x0, 0x0, 0x59, 0x4B, 0x6, 0x0, 0x0, 0x79, 0x4B, 0x6, 0x0, 0x0, 0x19, 0x0, 0xE0, 0x92, 0x1, 0x19, 0x0, 0xE8, 0x92, 0x1, 0x19, 0x0, 0xF0, 0x92, 0x1, 0xF9, 0x4B, 0x6, 0x93, 0x1, 0x39, 0x4C, 0x16, 0x93, 0x1, 0x19, 0x0, 0x18, 0x93, 0x1, 0x99, 0x4C, 0x2E, 0x93, 0x1, 0xDA, 0x4C, 0x6, 0x0, 0x0, 0x1A, 0x0, 0x38, 0x93, 0x1, 0x1A, 0x4D, 0x6, 0x0, 0x0, 0x3A, 0x4D, 0x6, 0x0, 0x0, 0x5A, 0x4D, 0x5E, 0x93, 0x1, 0x9A, 0x4D, 0x6, 0x0, 0x0, 0x1A, 0x0, 0x68, 0x93, 0x1, 0xDA, 0x4D, 0x7E, 0x93, 0x1, 0x1B, 0x4E, 0x6, 0x0, 0x0, 0x3B, 0x4E, 0x96, 0x93, 0x1, 0x7B, 0x4E, 0xA6, 0x93, 0x1, 0xBB, 0x4E, 0xB6, 0x93, 0x1, 0x1B, 0x0, 0xB8, 0x93, 0x1, 0x1C, 0x4F, 0x6, 0x0, 0x0, 0x1C, 0x0, 0xC8, 0x93, 0x1, 0x1C, 0x0, 0xD0, 0x93, 0x1, 0x7C, 0x4F, 0xE6, 0x93, 0x1, 0xBD, 0x4F, 0x6, 0x0, 0x0, 0xDD, 0x4F, 0x6, 0x0, 0x0, 0xFD, 0x4F, 0x6, 0x94, 0x1, 0x3E, 0x50, 0x16, 0x94, 0x1, 0x1E, 0x0, 0x18, 0x94, 0x1, 0x9F, 0x50, 0x2E, 0x94, 0x1, };
-    }
-}
diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelationGenerator.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelationGenerator.cs
deleted file mode 100644 (file)
index d6d5652..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Diagnostics.CodeAnalysis;
-using System.Globalization;
-using System.IO;
-
-namespace System.Text.RegularExpressions.Symbolic.Unicode
-{
-#if DEBUG
-    [ExcludeFromCodeCoverage]
-    internal static class IgnoreCaseRelationGenerator
-    {
-        private const string DefaultCultureName = "en-US";
-
-        public static void Generate(string namespacename, string classname, string path)
-        {
-            Debug.Assert(namespacename != null);
-            Debug.Assert(classname != null);
-            Debug.Assert(path != null);
-
-            using StreamWriter sw = new StreamWriter($"{Path.Combine(path, classname)}.cs");
-            sw.WriteLine(
-$@"// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-// This is a programmatically generated file from Regex.GenerateUnicodeTables.
-// It provides serialized BDD Unicode category definitions for System.Environment.Version = {Environment.Version}
-
-namespace {namespacename}
-{{
-    internal static class {classname}
-    {{");
-            WriteIgnoreCaseBDD(sw);
-            sw.WriteLine($@"    }}
-}}");
-        }
-
-        private static void WriteIgnoreCaseBDD(StreamWriter sw)
-        {
-            sw.WriteLine("        /// <summary>Serialized BDD for mapping characters to their case-ignoring equivalence classes in the default (en-US) culture.</summary>");
-
-            CharSetSolver solver = CharSetSolver.Instance;
-            List<EquivalenceClass> ignoreCaseEquivalenceClasses = ComputeIgnoreCaseEquivalenceClasses(solver, new CultureInfo(DefaultCultureName));
-            BDD ignorecase = solver.False;
-            foreach (EquivalenceClass ec in ignoreCaseEquivalenceClasses)
-            {
-                // Create the Cartesian product of ec._set with itself
-                BDD crossproduct = solver.And(solver.ShiftLeft(ec._set, 16), ec._set);
-                // Add the product into the overall lookup table
-                ignorecase = solver.Or(ignorecase, crossproduct);
-            }
-
-            sw.Write("        public static readonly byte[] IgnoreCaseEnUsSerializedBDD = ");
-            GeneratorHelper.WriteByteArrayInitSyntax(sw, ignorecase.SerializeToBytes());
-            sw.WriteLine(";");
-        }
-
-        private static List<EquivalenceClass> ComputeIgnoreCaseEquivalenceClasses(CharSetSolver solver, CultureInfo culture)
-        {
-            var ignoreCase = new Dictionary<char, EquivalenceClass>();
-            var sets = new List<EquivalenceClass>();
-
-            for (uint i = 65; i <= 0xFFFF; i++)
-            {
-                char C = (char)i;
-                char c = char.ToLower(C, culture);
-
-                if (c == C)
-                {
-                    continue;
-                }
-
-                EquivalenceClass? ec;
-                if (!ignoreCase.TryGetValue(c, out ec))
-                {
-                    ec = new EquivalenceClass(solver.CharConstraint(c));
-                    ignoreCase[c] = ec;
-                    sets.Add(ec);
-                }
-                ec._set = solver.Or(ec._set, solver.CharConstraint(C));
-            }
-            return sets;
-        }
-
-        private sealed class EquivalenceClass
-        {
-            public BDD _set;
-            public EquivalenceClass(BDD set)
-            {
-                _set = set;
-            }
-        }
-    };
-#endif
-}
diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseTransformer.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseTransformer.cs
deleted file mode 100644 (file)
index 945fdea..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Diagnostics.CodeAnalysis;
-using System.Globalization;
-using System.Threading;
-
-namespace System.Text.RegularExpressions.Symbolic.Unicode
-{
-    internal sealed class IgnoreCaseTransformer
-    {
-        private const char Turkish_I_WithDot = '\u0130';
-        private const char Turkish_i_WithoutDot = '\u0131';
-        private const char KelvinSign = '\u212A';
-
-        private readonly CharSetSolver _solver;
-        private readonly BDD _i_Invariant;
-        private readonly BDD _i_Default;
-        private readonly BDD _i_Turkish;
-        private readonly BDD _I_Turkish;
-
-        private volatile IgnoreCaseRelation? _relationDefault;
-        private volatile IgnoreCaseRelation? _relationInvariant;
-        private volatile IgnoreCaseRelation? _relationTurkish;
-
-        /// <summary>Maps each char c to the case-insensitive set of c that is culture-independent (for non-null entries).</summary>
-        private readonly BDD?[] _cultureIndependentChars = new BDD[char.MaxValue + 1];
-
-        private sealed class IgnoreCaseRelation
-        {
-            public IgnoreCaseRelation(BDD instance, BDD instanceDomain)
-            {
-                Instance = instance;
-                InstanceDomain = instanceDomain;
-            }
-
-            public BDD Instance { get; }
-            public BDD InstanceDomain { get; }
-        }
-
-        public IgnoreCaseTransformer(CharSetSolver solver)
-        {
-            _solver = solver;
-            _i_Invariant = solver.Or(_solver.CharConstraint('i'), solver.CharConstraint('I'));
-            _i_Default = solver.Or(_i_Invariant, solver.CharConstraint(Turkish_I_WithDot));
-            _i_Turkish = solver.Or(solver.CharConstraint('i'), solver.CharConstraint(Turkish_I_WithDot));
-            _I_Turkish = solver.Or(solver.CharConstraint('I'), solver.CharConstraint(Turkish_i_WithoutDot));
-        }
-
-        /// <summary>
-        /// Get the set of CI-equivalent characters to c.
-        /// This operation depends on culture for i, I, '\u0130', and '\u0131';
-        /// culture="" means InvariantCulture while culture=null means to use the current culture.
-        /// </summary>
-        public BDD Apply(char c, string? culture = null)
-        {
-            if (Volatile.Read(ref _cultureIndependentChars[c]) is BDD bdd)
-            {
-                return bdd;
-            }
-
-            culture ??= CultureInfo.CurrentCulture.Name;
-            switch (c)
-            {
-                // Do not cache in _cultureIndependentChars values that are culture-dependent
-
-                case 'i':
-                    return
-                        culture == string.Empty ? _i_Invariant :
-                        IsTurkishAlphabet(culture) ? _i_Turkish :
-                        _i_Default; // for all other cultures, case-sensitivity is the same as for en-US
-
-                case 'I':
-                    return
-                        culture == string.Empty ? _i_Invariant :
-                        IsTurkishAlphabet(culture) ? _I_Turkish : // different from 'i' above
-                        _i_Default;
-
-                case Turkish_I_WithDot:
-                    return
-                        culture == string.Empty ? _solver.CharConstraint(Turkish_I_WithDot) :
-                        IsTurkishAlphabet(culture) ? _i_Turkish :
-                        _i_Default;
-
-                case Turkish_i_WithoutDot:
-                    return
-                        IsTurkishAlphabet(culture) ? _I_Turkish :
-                        _solver.CharConstraint(Turkish_i_WithoutDot);
-
-                case 'k':
-                case 'K':
-                case KelvinSign:
-                    Volatile.Write(ref _cultureIndependentChars[c], _solver.Or(_solver.Or(_solver.CharConstraint('k'), _solver.CharConstraint('K')), _solver.CharConstraint(KelvinSign)));
-                    return _cultureIndependentChars[c]!;
-
-                // Cache in _cultureIndependentChars entries that are culture-independent.
-                // BDDs are idempotent, so while we use volatile to ensure proper adherence
-                // to ECMA's memory model, we don't need Interlocked.CompareExchange.
-
-                case <= '\x7F':
-                    // For ASCII range other than letters i, I, k, and K, the case-conversion is independent of culture and does
-                    // not include case-insensitive-equivalent non-ASCII.
-                    Volatile.Write(ref _cultureIndependentChars[c], _solver.Or(_solver.CharConstraint(char.ToLower(c)), _solver.CharConstraint(char.ToUpper(c))));
-                    return _cultureIndependentChars[c]!;
-
-                default:
-                    // Bring in the full transfomation relation, but here it does not actually depend on culture
-                    // so it is safe to store the result for c.
-                    Volatile.Write(ref _cultureIndependentChars[c], Apply(_solver.CharConstraint(c)));
-                    return _cultureIndependentChars[c]!;
-            }
-        }
-
-        /// <summary>
-        /// For all letters in the bdd add their lower and upper case equivalents.
-        /// This operation depends on culture for i, I, '\u0130', and '\u0131';
-        /// culture="" means InvariantCulture while culture=null means to use the current culture.
-        /// </summary>
-        public BDD Apply(BDD bdd, string? culture = null)
-        {
-            // First get the culture specific relation
-            IgnoreCaseRelation relation = GetIgnoreCaseRelation(culture);
-
-            if (_solver.And(relation.InstanceDomain, bdd).IsEmpty)
-            {
-                // No elements need to be added
-                return bdd;
-            }
-
-            // Compute the set of all characters that are equivalent to some element in bdd.
-            // restr is the relation restricted to the relevant characters in bdd.
-            // This conjunction works because bdd is unspecified for bits > 15.
-            BDD restr = _solver.And(bdd, relation.Instance);
-
-            // ShiftRight essentially produces the LHS of the relation (char X char) that restr represents.
-            BDD ignorecase = _solver.ShiftRight(restr, 16);
-
-            // The final set is the union of all the characters.
-            return _solver.Or(ignorecase, bdd);
-        }
-
-        /// <summary>Gets the transformation relation based on the current culture.</summary>
-        /// <remarks>culture == "" means InvariantCulture. culture == null means to use the current culture.</remarks>
-        private IgnoreCaseRelation GetIgnoreCaseRelation(string? culture = null)
-        {
-            culture ??= CultureInfo.CurrentCulture.Name;
-
-            if (culture == string.Empty)
-            {
-                return _relationInvariant ?? CreateIgnoreCaseRelationInvariant();
-            }
-
-            if (IsTurkishAlphabet(culture))
-            {
-                return _relationTurkish ?? CreateIgnoreCaseRelationTurkish();
-            }
-
-            // All other cultures are equivalent to the default culture wrt case-sensitivity.
-            return _relationDefault ?? EnsureDefault();
-        }
-
-        [MemberNotNull(nameof(_relationDefault))]
-        private IgnoreCaseRelation EnsureDefault()
-        {
-            // Deserialize the table for the default culture.
-            if (_relationDefault is null)
-            {
-                BDD instance = BDD.Deserialize(Unicode.IgnoreCaseRelation.IgnoreCaseEnUsSerializedBDD, _solver);
-                BDD instanceDomain = _solver.ShiftRight(instance, 16); // represents the set of all case-sensitive characters in the default culture.
-                _relationDefault = new IgnoreCaseRelation(instance, instanceDomain);
-            }
-
-            return _relationDefault;
-        }
-
-        private IgnoreCaseRelation CreateIgnoreCaseRelationInvariant()
-        {
-            EnsureDefault();
-
-            // Compute the invariant table based off of default.
-            // In the default (en-US) culture: Turkish_I_withDot = i = I
-            // In the invariant culture: i = I, while Turkish_I_withDot is case-insensitive
-            BDD tr_I_withdot_BDD = _solver.CharConstraint(Turkish_I_WithDot);
-
-            // Since Turkish_I_withDot is case-insensitive in invariant culture, remove it from the default (en-US culture) table.
-            BDD inv_table = _solver.And(_relationDefault.Instance, _solver.Not(tr_I_withdot_BDD));
-
-            // Next, remove Turkish_I_withDot from the RHS of the relation.
-            // This also effectively removes Turkish_I_withDot from the equivalence sets of 'i' and 'I'.
-            BDD instance = _solver.And(inv_table, _solver.Not(_solver.ShiftLeft(tr_I_withdot_BDD, 16)));
-
-            // Remove Turkish_I_withDot from the domain of casesensitive characters in the default case
-            BDD instanceDomain = _solver.And(instance, _solver.Not(tr_I_withdot_BDD));
-
-            _relationInvariant = new IgnoreCaseRelation(instance, instanceDomain);
-            return _relationInvariant;
-        }
-
-        private IgnoreCaseRelation CreateIgnoreCaseRelationTurkish()
-        {
-            EnsureDefault();
-
-            // Compute the tr table based off of default.
-            // In the default (en-US) culture: Turkish_I_withDot = i = I
-            // In the tr culture: i = Turkish_I_withDot, I = Turkish_i_withoutDot
-            BDD tr_I_withdot_BDD = _solver.CharConstraint(Turkish_I_WithDot);
-            BDD tr_i_withoutdot_BDD = _solver.CharConstraint(Turkish_i_WithoutDot);
-            BDD i_BDD = _solver.CharConstraint('i');
-            BDD I_BDD = _solver.CharConstraint('I');
-
-            // First remove all i's from the default table from the LHS and from the RHS.
-            // Note that Turkish_i_withoutDot is not in the default table because it is case-insensitive in the en-US culture.
-            BDD iDefault = _solver.Or(i_BDD, _solver.Or(I_BDD, tr_I_withdot_BDD));
-            BDD tr_table = _solver.And(_relationDefault.Instance, _solver.Not(iDefault));
-            tr_table = _solver.And(tr_table, _solver.Not(_solver.ShiftLeft(iDefault, 16)));
-
-            BDD i_tr = _solver.Or(i_BDD, tr_I_withdot_BDD);
-            BDD I_tr = _solver.Or(I_BDD, tr_i_withoutdot_BDD);
-
-            // The Cartesian product i_tr X i_tr.
-            BDD i_trXi_tr = _solver.And(_solver.ShiftLeft(i_tr, 16), i_tr);
-
-            // The Cartesian product I_tr X I_tr.
-            BDD I_trXI_tr = _solver.And(_solver.ShiftLeft(I_tr, 16), I_tr);
-
-            // Update the table with the new entries, and add Turkish_i_withoutDot also into the domain of case-sensitive characters.
-            BDD instance = _solver.Or(tr_table, _solver.Or(i_trXi_tr, I_trXI_tr));
-            BDD instanceDomain = _solver.Or(_relationDefault.InstanceDomain, tr_i_withoutdot_BDD);
-
-            _relationTurkish = new IgnoreCaseRelation(instance, instanceDomain);
-            return _relationTurkish;
-        }
-
-        private static bool IsTurkishAlphabet(string culture) =>
-            culture is "az" or "az-Cyrl" or "az-Cyrl-AZ" or "az-Latn" or "az-Latn-AZ" or "tr" or "tr-CY" or "tr-TR";
-    }
-}
index e518212..366562f 100644 (file)
@@ -76,7 +76,7 @@ namespace {namespacename}
             {
                 sw.WriteLine("            // {0}({1}):", (UnicodeCategory)i, i);
                 sw.Write("            ");
-                GeneratorHelper.WriteByteArrayInitSyntax(sw, catBDDs[i].SerializeToBytes());
+                WriteByteArrayInitSyntax(sw, catBDDs[i].SerializeToBytes());
                 sw.WriteLine(",");
             }
             sw.WriteLine("        };");
@@ -84,9 +84,29 @@ namespace {namespacename}
 
             sw.WriteLine("        /// <summary>Serialized BDD representation of the set of all whitespace characters.</summary>");
             sw.Write($"        public static readonly byte[] WhitespaceSerializedBDD = ");
-            GeneratorHelper.WriteByteArrayInitSyntax(sw, whitespaceBdd.SerializeToBytes());
+            WriteByteArrayInitSyntax(sw, whitespaceBdd.SerializeToBytes());
             sw.WriteLine(";");
         }
+
+        public static void WriteInt64ArrayInitSyntax(StreamWriter sw, long[] values)
+        {
+            sw.Write("new long[] {");
+            for (int i = 0; i < values.Length; i++)
+            {
+                sw.Write($" 0x{values[i]:X}, ");
+            }
+            sw.Write("}");
+        }
+
+        public static void WriteByteArrayInitSyntax(StreamWriter sw, byte[] values)
+        {
+            sw.Write("new byte[] {");
+            for (int i = 0; i < values.Length; i++)
+            {
+                sw.Write($" 0x{values[i]:X}, ");
+            }
+            sw.Write("}");
+        }
     }
 
     /// <summary>Used internally for creating a collection of ranges for serialization.</summary>
index effbebd..ded3d23 100644 (file)
@@ -117,12 +117,17 @@ namespace System.Text.RegularExpressions.Tests
 
             // same input and regex does match so far so good
             Assert.All(cultInvariantRegex, rex => Assert.True(rex.IsMatch(input)));
-
-            // [ActiveIssue("https://github.com/dotnet/runtime/issues/58958")]
-            // when the Regex was created with a turkish locale the lower cased turkish version will
-            // no longer match the input string which contains upper and lower case iiiis hence even the input string
-            // will no longer match
-            Assert.All(turkishRegex, rex => Assert.False(rex.IsMatch(input)));
+            if (PlatformDetection.IsNetFramework)
+            {
+                // If running in .NET Framework, when the Regex was created with a turkish locale the lower cased turkish version will
+                // no longer match the input string which contains upper and lower case iiiis hence even the input string
+                // will no longer match. For more info, check https://github.com/dotnet/runtime/issues/58958
+                Assert.All(turkishRegex, rex => Assert.False(rex.IsMatch(input)));
+            }
+            else
+            {
+                Assert.All(turkishRegex, rex => Assert.True(rex.IsMatch(input)));
+            }
 
             // Now comes the tricky part depending on the use locale in ToUpper the results differ
             // Hence the regular expression will not match if different locales were used
@@ -208,10 +213,6 @@ namespace System.Text.RegularExpressions.Tests
             {
                 yield return new object[] { engine, "I\u0131\u0130i", RegexOptions.None, "I\u0131\u0130i" };
                 yield return new object[] { engine, "I\u0131\u0130i", RegexOptions.IgnoreCase, "I\u0131\u0130i" };
-                if (!RegexHelpers.IsNonBacktracking(engine))
-                {
-                    yield return new object[] { engine, "I\u0131\u0130i", RegexOptions.IgnoreCase | RegexOptions.ECMAScript, "" };
-                }
             }
         }
 
@@ -347,7 +348,6 @@ namespace System.Text.RegularExpressions.Tests
 
         private const char Turkish_I_withDot = '\u0130';
         private const char Turkish_i_withoutDot = '\u0131';
-        private const char Kelvin_sign = '\u212A';
 
         /// <summary>
         /// This test is to make sure that the generated IgnoreCaseRelation table for NonBacktracking does not need to be updated.
diff --git a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexIgnoreCaseTests.cs b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexIgnoreCaseTests.cs
new file mode 100644 (file)
index 0000000..d1b676a
--- /dev/null
@@ -0,0 +1,224 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Generic;
+using System.Globalization;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Tests;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace System.Text.RegularExpressions.Tests
+{
+    public class RegexIgnoreCaseTests
+    {
+        public static bool IsIcuGlobalization = PlatformDetection.IsIcuGlobalization;
+
+        public static IEnumerable<(string, string)> CharactersWithSameLowercase()
+        {
+            return new (string, string)[]
+            {
+                new("\u0130", "\u0049"), // Both lowercase to \u0069
+                new("\u01C5", "\u01C4"), // Both lowercase to \u01C6
+                new("\u01C8", "\u01C7"), // Both lowercase to \u01C9
+                new("\u01CB", "\u01CA"), // Both lowercase to \u01CC
+                new("\u01F2", "\u01F1"), // Both lowercase to \u01F3
+                new("\u03F4", "\u0398"), // Both lowercase to \u03B8
+                new("\u2126", "\u03A9"), // Both lowercase to \u03C9
+                new("\u212A", "\u004B"), // Both lowercase to \u006B
+                new("\u212B", "\u00C5"), // Both lowercase to \u00E5
+            };
+        }
+
+        public static IEnumerable<object[]> Characters_With_Common_Lowercase_Match_Data()
+        {
+            foreach (string culture in new[] { "", "en-us", "tr-TR" })
+            {
+                if (PlatformDetection.IsBrowser && culture != "") // Browser runs in Invariant mode, so only test Invariant in that case.
+                    continue;
+
+                foreach ((string pattern, string input) in CharactersWithSameLowercase())
+                {
+                    if (culture != "en-us" && pattern == "\u0130" && input == "\u0049") // This mapping doesn't exist in invariant or turkish cultures.
+                        continue;
+
+                    foreach (RegexEngine engine in RegexHelpers.AvailableEngines)
+                    {
+                        yield return new object[] { engine, pattern, input, culture };
+                    }
+                }
+            }
+        }
+
+        public static IEnumerable<object[]> Characters_With_Common_Lowercase_Match_Backreference_Data()
+        {
+            foreach (string culture in new[] { "", "en-us", "tr-TR" })
+            {
+                // Browser runs in Invariant mode, so only test Invariant in that case.
+                if (PlatformDetection.IsBrowser && culture != "")
+                    continue;
+
+                // NLS globalization uses different mappings for invariant culture for some characters so we skip that for now.
+                // https://github.com/dotnet/runtime/issues/67624
+                if (PlatformDetection.IsNlsGlobalization && culture == "")
+                    continue;
+
+                foreach ((string firstChar, string secondChar) in CharactersWithSameLowercase())
+                {
+                    if (culture != "en-us" && firstChar == "\u0130" && secondChar == "\u0049") // This mapping doesn't exist in invariant or turkish cultures.
+                        continue;
+
+                    foreach (RegexEngine engine in RegexHelpers.AvailableEngines)
+                    {
+                        if (engine == RegexEngine.NonBacktracking) // Backreferences are not yet supported by the NonBacktracking engine
+                            continue;
+
+                        yield return new object[] { engine, @"(.)\1", firstChar, secondChar, culture };
+                    }
+                }
+            }
+        }
+
+        [Theory]
+        [MemberData(nameof(Characters_With_Common_Lowercase_Match_Data))]
+        public async Task Characters_With_Common_Lowercase_Match(RegexEngine engine, string pattern, string input, string culture)
+        {
+            using var _ = new ThreadCultureChange(culture);
+            Regex regex = await RegexHelpers.GetRegexAsync(engine, pattern, RegexOptions.IgnoreCase);
+            Assert.True(regex.IsMatch(input));
+        }
+
+        public static IEnumerable<object[]> EnginesThatSupportBackreferences()
+        {
+            foreach(RegexEngine engine in RegexHelpers.AvailableEngines)
+            {
+                if (engine == RegexEngine.NonBacktracking) // Nonbacktracking engine doesn't yet support backreferences.
+                    continue;
+                yield return new object[] { engine };
+            }
+        }
+
+        [Theory]
+        [MemberData(nameof(EnginesThatSupportBackreferences))]
+        public async Task IgnoreCase_Behavior_Is_Constant(RegexEngine engine)
+        {
+            Regex regex;
+            using (new ThreadCultureChange("en-US"))
+            {
+                regex = await RegexHelpers.GetRegexAsync(engine, @"(i)\1", RegexOptions.IgnoreCase);
+            }
+
+            using (new ThreadCultureChange("tr-TR"))
+            {
+                // tr-TR culture doesn't consider 'I' and 'i' to be equal in ignore case, but en-US culture does.
+                // This test will validate that the backreference will use en-US culture even when current culture is
+                // set to tr-TR
+                Assert.True(regex.IsMatch("Ii"));
+            }
+        }
+
+        [Theory]
+        [MemberData(nameof(Characters_With_Common_Lowercase_Match_Backreference_Data))]
+        public async Task Characters_With_Common_Lowercase_Match_Backreference(RegexEngine engine, string pattern, string firstChar, string secondChar, string culture)
+        {
+            using var _ = new ThreadCultureChange(culture);
+            Regex regex = await RegexHelpers.GetRegexAsync(engine, pattern, RegexOptions.IgnoreCase);
+            Assert.True(regex.IsMatch($"{firstChar}{secondChar}"));
+            Assert.True(regex.IsMatch($"{secondChar}{firstChar}"));
+        }
+
+        [Theory]
+        [MemberData(nameof(EnginesThatSupportBackreferences))]
+        public async Task Ensure_CultureInvariant_Option_Is_Used_For_Backreferences(RegexEngine engine)
+        {
+            using var _ = new ThreadCultureChange("tr-TR");
+            Regex regex = await RegexHelpers.GetRegexAsync(engine, @"(.)\1", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
+            // There is no mapping between 'i' and 'I' in tr-TR culture, so this test is validating that when passing CultureInvariant
+            // option, we will use InvariantCulture mappings for backreferences.
+            Assert.True(regex.IsMatch("iI"));
+        }
+
+        [Fact]
+        // This test creates a source generated engine for each of the ~870 cultures and ensures the result compiles. This test alone takes around 30
+        // seconds on a fast machine, so marking as OuterLoop.
+        [OuterLoop]
+        public async Task SourceGenerator_Supports_All_Cultures()
+        {
+            foreach (CultureInfo culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
+            {
+                using (new ThreadCultureChange(culture))
+                {
+                    // This test will try to emit code that looks like: textInfo = CultureInfo.GetCultureInfo(CurrentCulture.Name).TextInfo
+                    // so we will validate in this test that we are able to do that for all cultures and that GetCultureInfo returns a valid Culture.
+                    Regex r = await RegexHelpers.GetRegexAsync(RegexEngine.SourceGenerated, @"(.)\1", RegexOptions.IgnoreCase);
+                    Assert.True(r.IsMatch("Aa"));
+                }
+            }
+        }
+
+        // This test takes a long time to run since it needs to compute all possible lowercase mappings across
+        // 3 different cultures and then creates Regex matches for all of our engines for each mapping.
+        [OuterLoop]
+        // Disabling test in NLS-globalization systems due to https://github.com/dotnet/runtime/issues/67624
+        [ConditionalTheory(nameof(IsIcuGlobalization))]
+        [MemberData(nameof(Unicode_IgnoreCase_TestData))]
+        public async Task Unicode_IgnoreCase_Tests(RegexEngine engine, string culture, RegexOptions options)
+        {
+            IEnumerable<(string, string)> testCases = GetPatternAndInputsForCulture(culture);
+
+            foreach ((string c, string lowerC) in testCases)
+            {
+                using (ThreadCultureChange cultureChange = (options & RegexOptions.CultureInvariant) == 0 ?
+                    new ThreadCultureChange(culture) : null)
+                {
+                    // We validate that there is no case where c.ToLower() == lowerC and c.ToLower() != lowerC.ToLower()
+                    // given this would create inconsistencies with the way we handle case-insensitive backreference comparisons.
+                    Assert.Equal(CultureInfo.GetCultureInfo(culture).TextInfo.ToLower(lowerC), lowerC);
+                    await ValidateMatch(c, lowerC);
+                    await ValidateMatch(lowerC, c);
+                }
+            }
+
+            return;
+
+            async Task ValidateMatch(string pattern, string input)
+            {
+                Regex regex = await RegexHelpers.GetRegexAsync(engine, pattern, options | RegexOptions.IgnoreCase);
+                Assert.True(regex.IsMatch(input));
+            }
+
+            static IEnumerable<(string, string)> GetPatternAndInputsForCulture(string culture)
+            {
+                TextInfo textInfo = string.IsNullOrEmpty(culture) ? CultureInfo.InvariantCulture.TextInfo
+                    : CultureInfo.GetCultureInfo(culture).TextInfo;
+
+                for (int i = 0; i <= char.MaxValue; i++)
+                {
+                    char c = (char)i;
+                    char lowerC = textInfo.ToLower(c);
+                    if (c != lowerC)
+                    {
+                        yield return ($"{c}", $"{lowerC}");
+                    }
+                }
+            }
+        }
+
+        public static IEnumerable<object[]> Unicode_IgnoreCase_TestData()
+        {
+            foreach (string culture in new[] { "", "EN-US", "tr-TR", "AZ" })
+            {
+                foreach (RegexEngine engine in RegexHelpers.AvailableEngines)
+                {
+                    yield return new object[] { engine, culture, RegexOptions.None};
+                    if (string.IsNullOrEmpty(culture))
+                    {
+                        // For the Invariant culture equivalences also test to get the same behavior with RegexOptions.CultureInvariant.
+                        yield return new object[] { engine, culture, RegexOptions.CultureInvariant };
+                    }
+                }
+            }
+        }
+    }
+}
index 4162d7b..4be0e31 100644 (file)
@@ -47,6 +47,7 @@
     <Compile Include="Regex.Count.Tests.cs" />
     <Compile Include="RegexAssert.netcoreapp.cs" />
     <Compile Include="RegexParserTests.netcoreapp.cs" />
+    <Compile Include="RegexIgnoreCaseTests.cs" />
     <Compile Include="GroupCollectionReadOnlyDictionaryTests.cs" />
     <Compile Include="CaptureCollectionTests2.cs" />
     <Compile Include="GroupCollectionTests2.cs" />
index eb4a4ff..15e83bc 100644 (file)
@@ -58,8 +58,8 @@ namespace System.Text.RegularExpressions.Tests
         [InlineData(@"abc\z", RegexOptions.None, (int)FindNextStartingPositionMode.TrailingAnchor_FixedLength_LeftToRight_End, 3, (int)RegexNodeKind.End)]
         [InlineData(@"abc\Z", RegexOptions.None, (int)FindNextStartingPositionMode.TrailingAnchor_FixedLength_LeftToRight_EndZ, 3, (int)RegexNodeKind.EndZ)]
         [InlineData(@"abc$", RegexOptions.None, (int)FindNextStartingPositionMode.TrailingAnchor_FixedLength_LeftToRight_EndZ, 3, (int)RegexNodeKind.EndZ)]
-        [InlineData(@"a{4,10}$", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, 10, (int)RegexNodeKind.EndZ)]
-        [InlineData(@"(abc|defg){1,2}\z", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, 8, (int)RegexNodeKind.End)]
+        [InlineData(@"a{4,10}$", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, 10, (int)RegexNodeKind.EndZ)]
+        [InlineData(@"(abc|defg){1,2}\z", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, 8, (int)RegexNodeKind.End)]
         public void TrailingAnchor(string pattern, RegexOptions options, int expectedMode, int expectedLength, int trailingAnchor)
         {
             RegexFindOptimizations opts = ComputeOptimizations(pattern, options);
@@ -69,44 +69,44 @@ namespace System.Text.RegularExpressions.Tests
         }
 
         [Theory]
-        [InlineData(@"ab", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ab")]
-        [InlineData(@"ab", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")]
-        [InlineData(@"(a)(bc)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "abc")]
-        [InlineData(@"(a)(bc)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "bc")]
-        [InlineData(@"a{10}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "aaaaaaaaaa")]
-        [InlineData(@"a{10}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "aaaaaaaaaa")]
-        [InlineData(@"(?>a{10,20})", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "aaaaaaaaaa")]
-        [InlineData(@"(?>a{10,20})", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "aaaaaaaaaa")]
-        [InlineData(@"a{3,5}?", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "aaa")]
-        [InlineData(@"a{3,5}?", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "aaa")]
-        [InlineData(@"ab{5}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "abbbbb")]
-        [InlineData(@"ab{5}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "abbbbb")]
-        [InlineData(@"ab\w", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ab")]
-        [InlineData(@"\wab", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")]
-        [InlineData(@"(ab){3}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ababab")]
-        [InlineData(@"(ab){3}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")]
-        [InlineData(@"(ab){2,4}(de){4,}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "abab")]
-        [InlineData(@"(ab){2,4}(de){4,}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "de")]
-        [InlineData(@"ab|(abc)|(abcd)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ab")]
-        [InlineData(@"ab|(abc)|(abcd)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")]
-        [InlineData(@"ab(?=cd)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ab")]
-        [InlineData(@"ab(?=cd)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")]
+        [InlineData(@"ab", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ab")]
+        [InlineData(@"ab", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")]
+        [InlineData(@"(a)(bc)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "abc")]
+        [InlineData(@"(a)(bc)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "bc")]
+        [InlineData(@"a{10}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "aaaaaaaaaa")]
+        [InlineData(@"a{10}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "aaaaaaaaaa")]
+        [InlineData(@"(?>a{10,20})", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "aaaaaaaaaa")]
+        [InlineData(@"(?>a{10,20})", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "aaaaaaaaaa")]
+        [InlineData(@"a{3,5}?", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "aaa")]
+        [InlineData(@"a{3,5}?", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "aaa")]
+        [InlineData(@"ab{5}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "abbbbb")]
+        [InlineData(@"ab{5}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "abbbbb")]
+        [InlineData(@"ab\w", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ab")]
+        [InlineData(@"\wab", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")]
+        [InlineData(@"(ab){3}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ababab")]
+        [InlineData(@"(ab){3}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")]
+        [InlineData(@"(ab){2,4}(de){4,}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "abab")]
+        [InlineData(@"(ab){2,4}(de){4,}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "de")]
+        [InlineData(@"ab|(abc)|(abcd)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ab")]
+        [InlineData(@"ab|(abc)|(abcd)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")]
+        [InlineData(@"ab(?=cd)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ab")]
+        [InlineData(@"ab(?=cd)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")]
         public void LeadingPrefix(string pattern, RegexOptions options, int expectedMode, string expectedPrefix)
         {
             RegexFindOptimizations opts = ComputeOptimizations(pattern, options);
             Assert.Equal((FindNextStartingPositionMode)expectedMode, opts.FindMode);
-            Assert.Equal(expectedPrefix, opts.LeadingCaseSensitivePrefix);
+            Assert.Equal(expectedPrefix, opts.LeadingPrefix);
         }
 
         [Theory]
-        [InlineData(@"[ab]", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, "ab")]
-        [InlineData(@"[Aa]", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, "Aa")]
-        [InlineData(@"a", RegexOptions.IgnoreCase, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, "Aa")]
-        [InlineData(@"ab|cd|ef|gh", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, "aceg")]
-        [InlineData(@"[ab]", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive, "ab")]
-        [InlineData(@"[Aa]", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive, "Aa")]
-        [InlineData(@"a", RegexOptions.IgnoreCase | RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive, "Aa")]
-        [InlineData(@"ab|cd|ef|gh", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive, "bdfh")]
+        [InlineData(@"[ab]", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, "ab")]
+        [InlineData(@"[Aa]", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, "Aa")]
+        [InlineData(@"a", RegexOptions.IgnoreCase, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, "Aa")]
+        [InlineData(@"ab|cd|ef|gh", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, "aceg")]
+        [InlineData(@"[ab]", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft, "ab")]
+        [InlineData(@"[Aa]", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft, "Aa")]
+        [InlineData(@"a", RegexOptions.IgnoreCase | RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft, "Aa")]
+        [InlineData(@"ab|cd|ef|gh", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft, "bdfh")]
         public void LeadingSet(string pattern, RegexOptions options, int expectedMode, string expectedChars)
         {
             RegexFindOptimizations opts = ComputeOptimizations(pattern, options);
@@ -117,8 +117,8 @@ namespace System.Text.RegularExpressions.Tests
         }
 
         [Theory]
-        [InlineData(@"\d*a", RegexOptions.None, (int)FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive, null, 'a')]
-        [InlineData(@"\d*abc", RegexOptions.None, (int)FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive, "abc", 0)]
+        [InlineData(@"\d*a", RegexOptions.None, (int)FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight, null, 'a')]
+        [InlineData(@"\d*abc", RegexOptions.None, (int)FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight, "abc", 0)]
         public void LiteralAfterLoop(string pattern, RegexOptions options, int expectedMode, string? expectedString, char expectedChar)
         {
             RegexFindOptimizations opts = ComputeOptimizations(pattern, options);
@@ -131,7 +131,7 @@ namespace System.Text.RegularExpressions.Tests
         private static RegexFindOptimizations ComputeOptimizations(string pattern, RegexOptions options)
         {
             RegexTree tree = RegexParser.Parse(pattern, options, CultureInfo.InvariantCulture);
-            return new RegexFindOptimizations(tree.Root, options, CultureInfo.InvariantCulture);
+            return new RegexFindOptimizations(tree.Root, options);
         }
     }
 }
index a8b4ea2..62ba696 100644 (file)
     <Compile Include="$(CoreLibSharedDir)System\Collections\Generic\ValueListBuilder.cs" Link="Production\ValueListBuilder.cs" />
     <Compile Include="..\..\src\System\Collections\Generic\ValueListBuilder.Pop.cs" Link="Production\ValueListBuilder.Pop.cs" />
     <Compile Include="..\..\src\System\Threading\StackHelper.cs" Link="Production\StackHelper.cs" />
+    <Compile Include="..\..\src\System\Text\RegularExpressions\RegexCaseEquivalences.Data.cs" Link="Production\RegexCaseEquivalences.Data.cs" />
+    <Compile Include="..\..\src\System\Text\RegularExpressions\RegexCaseEquivalences.cs" Link="Production\RegexCaseEquivalences.cs" />
+    <Compile Include="..\..\src\System\Text\RegularExpressions\RegexCaseBehavior.cs" Link="Production\RegexCaseBehavior.cs" />
     <Compile Include="..\..\src\System\Text\RegularExpressions\RegexCharClass.cs" Link="Production\RegexCharClass.cs" />
-    <Compile Include="..\..\src\System\Text\RegularExpressions\RegexCharClass.MappingTable.cs" Link="Production\RegexCharClass.MappingTable.cs" />
     <Compile Include="..\..\src\System\Text\RegularExpressions\RegexInterpreterCode.cs" Link="Production\RegexInterpreterCode.cs" />
     <Compile Include="..\..\src\System\Text\RegularExpressions\RegexFindOptimizations.cs" Link="Production\RegexFindOptimizations.cs" />
     <Compile Include="..\..\src\System\Text\RegularExpressions\RegexNode.cs" Link="Production\RegexNode.cs" />
diff --git a/src/libraries/System.Text.RegularExpressions/tools/DataTable.cs b/src/libraries/System.Text.RegularExpressions/tools/DataTable.cs
new file mode 100644 (file)
index 0000000..7185e4a
--- /dev/null
@@ -0,0 +1,225 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+
+namespace GenerateRegexCasingTable
+{
+    /// <summary>
+    /// Class which holds both the equivalence map and values for all of the UnicodeData.txt Lowercase
+    /// mappings
+    /// </summary>
+    public class DataTable
+    {
+        private Dictionary<char, int> _map;
+        private Dictionary<int, SortedSet<char>> _values;
+        private Dictionary<int, int> _mapAndValueMapping;
+
+        public DataTable(Dictionary<char, int> equivalenceMap, Dictionary<int, SortedSet<char>> equivalenceValues)
+        {
+            _map = equivalenceMap;
+            _values = equivalenceValues;
+            _mapAndValueMapping = new();
+        }
+
+        /// <summary>
+        /// Generates the Regex case equivalence table with <paramref name="numberOfPartitions"/> partitions
+        /// and saves it at <paramref name="outputFilePath"/>.
+        /// </summary>
+        /// <param name="numberOfPartitions">Number of partitions for the First-level lookup table.</param>
+        /// <param name="outputFilePath">Filename for the output file that will be generated.</param>
+        public void GenerateDataTableWithPartitions(int numberOfPartitions, string outputFilePath)
+        {
+            byte[] unicodesThatParticipateInCasing = CalculateCharactersThatParticipateInCasing();
+            int charactersPerRange = 0x1_0000 / numberOfPartitions;
+            byte[] rangesWithData = CalculateRangesWithData();
+
+            using (StreamWriter writer = File.CreateText(outputFilePath))
+            {
+                EmitFileHeadersAndUsings(writer);
+
+                writer.Write("namespace System.Text.RegularExpressions\n");
+                writer.Write("{\n");
+
+                writer.Write("    internal static partial class RegexCaseEquivalences\n    {\n");
+
+                writer.Write("        // THE FOLLOWING DATA IS AUTO GENERATED BY GenerateRegexCasingTable program UNDER THE TOOLS FOLDER\n");
+                writer.Write("        // PLEASE DON'T MODIFY BY HAND\n");
+                writer.Write("        // IF YOU NEED TO UPDATE UNICODE VERSION FOLLOW THE GUIDE AT src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md\n\n");
+
+                EmitValuesArray(writer);
+
+                writer.Write("\n");
+
+                EmitFirstLevelLookupTable(writer);
+
+                writer.Write("\n");
+                
+                EmitMapArray(writer);
+
+                writer.Write("    }\n}\n");
+            }
+
+            return;
+
+            byte[] CalculateRangesWithData()
+            {
+                byte[] result = new byte[numberOfPartitions];
+                for (int i = 0; i < numberOfPartitions; i++)
+                {
+                    byte rangeHasData = 0;
+                    for (int x = 0; x < charactersPerRange; x++)
+                    {
+                        if (unicodesThatParticipateInCasing[(i * charactersPerRange) + x] == 1)
+                        {
+                            rangeHasData = 1;
+                            break;
+                        }
+                    }
+                    result[i] = rangeHasData;
+                }
+
+                return result;
+            }
+
+            byte[] CalculateCharactersThatParticipateInCasing()
+            {
+                byte[] result = new byte[0x1_0000];
+                for (int i = 0; i < 0x1_0000; i++)
+                {
+                    if (_map.ContainsKey((char)i))
+                    {
+                        result[i] = 1;
+                    }
+                    else
+                    {
+                        result[i] = 0;
+                    }
+                }
+
+                return result;
+            }
+
+            void EmitFileHeadersAndUsings(StreamWriter writer)
+            {
+                writer.Write("// Licensed to the .NET Foundation under one or more agreements.\n");
+                writer.Write("// The .NET Foundation licenses this file to you under the MIT license.\n\n");
+            }
+
+            void EmitFirstLevelLookupTable(StreamWriter writer)
+            {
+                var firstLevelLookupTable = FlattenFirstLevelLookupTable();
+                writer.Write("        private static ushort[] EquivalenceFirstLevelLookup { get; } = new ushort[" + firstLevelLookupTable.Count + "]\n        {\n");
+
+                writer.Write("            0x{0:x4}", firstLevelLookupTable[0]);
+                for (var i = 1; i < firstLevelLookupTable.Count; i++)
+                {
+                    writer.Write(i % 16 == 0 ? ",\n            " : ", ");
+                    writer.Write("0x{0:x4}", firstLevelLookupTable[i]);
+                }
+                writer.Write("\n        };\n");
+            }
+
+            List<ushort> FlattenFirstLevelLookupTable()
+            {
+                List<ushort> result = new();
+                int indexesWithRanges = 0;
+
+                for (int i = 0; i < numberOfPartitions; i++)
+                {
+                    if (rangesWithData[i] == 0)
+                    {
+                        result.Add(0xFFFF);
+                    }
+                    else
+                    {
+                        Debug.Assert((indexesWithRanges * charactersPerRange) < 0xFFFF);
+                        result.Add((ushort)(indexesWithRanges * charactersPerRange));
+                        indexesWithRanges++;
+                    }
+                }
+
+                return result;
+            }
+
+            void EmitMapArray(StreamWriter writer)
+            {
+                var flattenedMap = FlattenMapDictionary();
+                writer.Write("        private static ushort[] EquivalenceCasingMap { get; } = new ushort[" + flattenedMap.Count + "]\n        {\n");
+
+                writer.Write("            0x{0:x4}", flattenedMap[0]);
+                for (var i = 1; i < flattenedMap.Count; i++)
+                {
+                    writer.Write(i % 16 == 0 ? $",\n            " : ", ");
+                    writer.Write("0x{0:x4}", flattenedMap[i]);
+                }
+                writer.Write("\n        };\n");
+            }
+
+            List<ushort> FlattenMapDictionary()
+            {
+                List<ushort> result = new();
+
+                for (int i = 0; i <= 0xFFFF; i++)
+                {
+                    // If this character belongs to a range that has no data, then don't add it to the list.
+                    int index = (i / charactersPerRange) < numberOfPartitions ? i / charactersPerRange : numberOfPartitions - 1;
+                    if (rangesWithData[index] == 0)
+                        continue;
+
+                    if (_map.TryGetValue((char)i, out int valueMap))
+                    {
+                        int mapping = _mapAndValueMapping[valueMap];
+                        Debug.Assert(mapping < 0x1FFF); // Ensure the index will not need the 3 most significant bits.
+                        Debug.Assert(_values[valueMap].Count < 0x07); // Ensure the count will not need more than 3 bits.
+                        int mappingValue = mapping | (_values[valueMap].Count << 13); // store the count as the 3 highest significant bits.
+                        Debug.Assert(mappingValue < 0xFFFF);
+                        result.Add((ushort)mappingValue);
+                    }
+                    else
+                    {
+                        result.Add(0xFFFF);
+                    }
+                }
+
+                return result;
+            }
+
+            void EmitValuesArray(StreamWriter writer)
+            {
+                var flattenedValues = FlattenValuesDictionary();
+                writer.Write("        private static char[] EquivalenceCasingValues { get; } = new char[" + flattenedValues.Count + "]\n        {\n");
+
+                writer.Write("            \'\\u{0:X4}\'", flattenedValues[0]);
+                for (var i = 1; i < flattenedValues.Count; i++)
+                {
+                    writer.Write(i % 16 == 0 ? ",\n            " : ", ");
+                    writer.Write("\'\\u{0:X4}\'", flattenedValues[i]);
+                }
+                writer.Write("\n        };\n");
+            }
+
+            List<ushort> FlattenValuesDictionary()
+            {
+                List<ushort> values = new List<ushort>();
+                int valuesSize = 0;
+
+                for (int i = 0; i < _values.Count; i++)
+                {
+                    // Add a mapping that we will later use to match a character to the position of the values list
+                    _mapAndValueMapping.Add(i, valuesSize);
+                    foreach(char value in _values[i])
+                    {
+                        Debug.Assert(value < 0xFFFF);
+                        values.Add(value);
+                        valuesSize++;
+                    }
+                }
+
+                return values;
+            }
+        }
+    }
+}
diff --git a/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.props b/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.props
new file mode 100644 (file)
index 0000000..cfbf29e
--- /dev/null
@@ -0,0 +1,3 @@
+<Project>
+  <!-- Intentionally leaving this file empty in order to not import repo-level props -->
+</Project>
\ No newline at end of file
diff --git a/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.targets b/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.targets
new file mode 100644 (file)
index 0000000..cfbf29e
--- /dev/null
@@ -0,0 +1,3 @@
+<Project>
+  <!-- Intentionally leaving this file empty in order to not import repo-level props -->
+</Project>
\ No newline at end of file
diff --git a/src/libraries/System.Text.RegularExpressions/tools/GenerateRegexCasingTable.csproj b/src/libraries/System.Text.RegularExpressions/tools/GenerateRegexCasingTable.csproj
new file mode 100644 (file)
index 0000000..26b5733
--- /dev/null
@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+      <OutputType>Exe</OutputType>
+      <TargetFramework>net6.0</TargetFramework>
+      <LangVersion>latest</LangVersion>
+      <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/src/libraries/System.Text.RegularExpressions/tools/Program.cs b/src/libraries/System.Text.RegularExpressions/tools/Program.cs
new file mode 100644 (file)
index 0000000..5ca1f55
--- /dev/null
@@ -0,0 +1,153 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Globalization;
+using System.IO;
+
+namespace GenerateRegexCasingTable
+{
+    /// <summary>
+    /// Program that takes a parameter pointing to UnicodeData.txt and generates a file to be used
+    /// as the Regex case equivalence table to be used for matching when using RegexOptions.IgnoreCase
+    /// </summary>
+    public partial class Program
+    {
+        public static void Main(string[] args)
+        {
+            if (args.Length < 1 || !File.Exists(args[0]))
+                Console.WriteLine("Error: Please pass in the full path to UnicodeData.txt so that the files can be generated.");
+
+            string unicodeTxtFilePath = args[0];
+
+            // Flip this boolean to true if you want to test the generated table against invariantCulture.ToLower()/invariantCulture.ToUpper()
+            bool testCompat = false;
+            bool generateTable = true;
+
+            Dictionary<char, char> lowerCasingTable = UnicodeDataCasingParser.Parse(unicodeTxtFilePath, upperCase: false);
+            Dictionary<char, char> upperCasingTable = UnicodeDataCasingParser.Parse(unicodeTxtFilePath, upperCase: true);
+
+            (Dictionary<char, int>? equivalenceMap, Dictionary<int, SortedSet<char>>? equivalenceValues) = GenerateMapAndValuesFromCasingTable(lowerCasingTable, upperCasingTable);
+
+            if (testCompat)
+            {
+                var textInfo = CultureInfo.InvariantCulture.TextInfo;
+                // Ensure that all of the calculated equivalences are not introducing new changes to existing Regex behavior.
+                foreach (KeyValuePair<char, int> equivalenceMapEntry in equivalenceMap)
+                {
+                    foreach (char equivalence in equivalenceValues[equivalenceMapEntry.Value])
+                    {
+                        if (equivalenceMapEntry.Key != equivalence)
+                        {
+                            if (textInfo.ToLower(equivalenceMapEntry.Key) != equivalence &&
+                                textInfo.ToUpper(equivalenceMapEntry.Key) != equivalence &&
+                                textInfo.ToLower(equivalence) != equivalenceMapEntry.Key &&
+                                textInfo.ToUpper(equivalence) != equivalenceMapEntry.Key)
+                            {
+                                Console.WriteLine($"There shouldn't be a mapping between \\u{((ushort)equivalenceMapEntry.Key).ToString("X4")} and \\u{((ushort)equivalence).ToString("X4")}");
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (generateTable)
+            {
+                DataTable dataTable = new(equivalenceMap, equivalenceValues);
+                var fileName = "RegexCaseFolding.Data.cs";
+                Console.WriteLine("Generating Regex case folding table...");
+                dataTable.GenerateDataTableWithPartitions(64, fileName);
+                Console.WriteLine($"Regex case folding table file was generated at: {Path.Combine(Directory.GetCurrentDirectory(), fileName)}");
+                Console.WriteLine("Please use it to replace the existing one at src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/ directory.");
+            }
+        }
+
+        /// <summary>
+        /// Takes a <paramref name="lowerCasingTable"/>, and generates a character map and values to be used for finding equivalence classes
+        /// for each unicode character.
+        /// </summary>
+        /// <param name="lowerCasingTable">The lower casing table to use to generate the equivalence classes.</param>
+        /// <param name="upperCasingTable">The upper casing table to use to generate the equivalence classes.</param>
+        /// <returns>A pair containing the map and value dictionaries with the equivalence classes.</returns>
+        public static (Dictionary<char, int>, Dictionary<int, SortedSet<char>>) GenerateMapAndValuesFromCasingTable(Dictionary<char, char> lowerCasingTable, Dictionary<char, char> upperCasingTable)
+        {
+            Dictionary<char, int> map = new Dictionary<char, int>();
+            Dictionary<int, SortedSet<char>> values = new Dictionary<int, SortedSet<char>>();
+            int equivalenceValueCount = 0;
+
+            // Fill the equivalence Map and values Dictinaries using Invariant.ToLower
+            foreach (var lowerCaseMapping in lowerCasingTable)
+            {
+                AddMapping(lowerCaseMapping);
+            }
+
+            // Uncomment the following 3 lines if we also want to consider the ToUpper() mappings
+            //foreach (var upperCaseMapping in upperCasingTable)
+            //{
+            //    AddMapping(upperCaseMapping);
+            //}
+
+            return (map, values);
+
+            void AddMapping(KeyValuePair<char, char> caseMapping)
+            {
+                int mapIndex = -1;
+
+                char originalChar = caseMapping.Key;
+                char lowerCase = caseMapping.Value;
+
+                if (!map.ContainsKey(originalChar) && !map.ContainsKey(lowerCase))
+                {
+                    mapIndex = equivalenceValueCount++;
+                    map.Add(originalChar, mapIndex);
+                    map.Add(lowerCase, mapIndex);
+                }
+                else if (!map.ContainsKey(originalChar))
+                {
+                    mapIndex = map[lowerCase];
+                    map.Add(originalChar, mapIndex);
+                }
+                else if (!map.ContainsKey(lowerCase))
+                {
+                    mapIndex = map[originalChar];
+                    map.Add(lowerCase, mapIndex);
+                }
+                else
+                {
+                    Debug.Assert(map[originalChar] == map[lowerCase]);
+                    return;
+                }
+
+                if (!values.TryGetValue(mapIndex, out SortedSet<char>? value))
+                {
+                    values.Add(mapIndex, new SortedSet<char>(new CharComparer()));
+                }
+
+                if (!values[mapIndex].Contains(originalChar))
+                    values[mapIndex].Add(originalChar);
+                if (!values[mapIndex].Contains(lowerCase))
+                    values[mapIndex].Add(lowerCase);
+            }
+        }
+    }
+
+    /// <summary>
+    /// In order to be able to use the table in an optimum fashion in Regex, we need the
+    /// values for the equivalences to be sorted by char value number. This comparer will
+    /// keep the inner lists sorted.
+    /// </summary>
+    public class CharComparer : IComparer<char>
+    {
+        public int Compare(char x, char y)
+        {
+            if ((int)x == (int)y)
+                return 0;
+            else if ((int)x > (int)y)
+                return 1;
+            else
+                return -1;
+        }
+    }
+}
diff --git a/src/libraries/System.Text.RegularExpressions/tools/Readme.md b/src/libraries/System.Text.RegularExpressions/tools/Readme.md
new file mode 100644 (file)
index 0000000..1f181ff
--- /dev/null
@@ -0,0 +1,16 @@
+# GenerateRegexCasingTable Tool
+
+## Overview
+
+This tool is used for generating RegexCaseFolding.Data.cs which contains the three tables that will be used for performing matching operations when using RegexOptions.IgnoreCase. This tool will need to be used every time that we are ingesting a new version of Unicode in the repo. The current table contains the Unicode data from version 14.0.0.
+
+## Updating the version of Unicode used
+
+For instructions on how to update Unicode version on the whole repo, you find the instructions [here](../../System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md).
+
+These are the steps to follow in order to update the Regex case equivalence table:
+
+1. Download UnicodeData.txt from the version of Unicode that you are updating to from unicode.org. For example, for version 14.0.0, you can find that file [here](https://www.unicode.org/Public/14.0.0/ucd/UnicodeData.txt).
+2. Once you have that file locally, run the following command from the command line: `dotnet run -- <pathToUnicodeData.txt>`.
+3. A file named `RegexCaseFolding.Data.cs` will be created in this directory. Use it to replace the one at `src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/`.
+4. Update this Readme Unicode version mentioned in the overview section to point to the version that was used to produce the table.
diff --git a/src/libraries/System.Text.RegularExpressions/tools/UnicodeDataCasingParser.cs b/src/libraries/System.Text.RegularExpressions/tools/UnicodeDataCasingParser.cs
new file mode 100644 (file)
index 0000000..12b565e
--- /dev/null
@@ -0,0 +1,70 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Globalization;
+using System.IO;
+
+namespace GenerateRegexCasingTable
+{
+    /// <summary>
+    /// Class that parses UnicodeData.txt file and generates a casing table using lowercase values.
+    /// </summary>
+    public class UnicodeDataCasingParser
+    {
+        /// <summary>
+        /// Parses UnicodeData.txt file in path <paramref name="unicodeDataTxtFilePath"/> and returns a Dictionary map
+        /// with all of the lower-casing info
+        /// </summary>
+        /// <param name="unicodeDataTxtFilePath">The full path to UnicodeData.txt</param>
+        /// <returns>A Dictionary map of chars with lowercasing data parsed from UnicodeData.txt</returns>
+        public static Dictionary<char, char> Parse(string unicodeDataTxtFilePath, bool upperCase)
+        {
+            using FileStream fs = File.OpenRead(unicodeDataTxtFilePath);
+            using StreamReader reader = new StreamReader(fs);
+
+            Dictionary<char, char> result = new Dictionary<char, char>();
+
+            string? line;
+            // Parse each line. The format has one line per character, with semicolon separated properties. The only
+            // values we care about is the one in position 0 which is the hex representation of the character, and the
+            // property at position 13 which is the lowercase mapping with a hex value pointing to the lower case character.
+            while((line = reader.ReadLine()) != null)
+            {
+                string[] split = line.Split(';');
+                Debug.Assert(split.Length == 15);
+
+                uint codepoint = uint.Parse(split[0], NumberStyles.HexNumber, CultureInfo.InvariantCulture);
+
+                if (codepoint > 0xFFFF)
+                    break;
+
+                if (upperCase)
+                {
+                    // Skip special cases where string.Compare invariantCultureIgnoreCase returns false
+                    if (codepoint == 0x0131)
+                        continue;
+
+                    if (int.TryParse(split[12], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int upperCaseCodePoint))
+                    {
+                        result.Add((char)codepoint, (char)upperCaseCodePoint);
+                    }
+                }
+                else
+                {
+                    // Skip special cases where string.Compare invariantCultureIgnoreCase returns false
+                    if (codepoint == 0x0130)
+                        continue;
+
+                    if (int.TryParse(split[13], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int lowerCaseCodePoint))
+                    {
+                        result.Add((char)codepoint, (char)lowerCaseCodePoint);
+                    }
+                }
+            }
+
+            return result;
+        }
+    }
+}