From fd6a3b1a87cd13c28afbd43bc7b1c2d45e689bc5 Mon Sep 17 00:00:00 2001 From: Luthetus <45454132+huntercfreeman@users.noreply.github.com> Date: Sat, 14 Dec 2024 12:16:06 -0500 Subject: [PATCH 1/7] Update IdeInfoDisplay.razor --- .../Shareds/Displays/Internals/IdeInfoDisplay.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Lib/Ide/Ide.RazorLib/Shareds/Displays/Internals/IdeInfoDisplay.razor b/Source/Lib/Ide/Ide.RazorLib/Shareds/Displays/Internals/IdeInfoDisplay.razor index ed3a4658f..1df68ec11 100644 --- a/Source/Lib/Ide/Ide.RazorLib/Shareds/Displays/Internals/IdeInfoDisplay.razor +++ b/Source/Lib/Ide/Ide.RazorLib/Shareds/Displays/Internals/IdeInfoDisplay.razor @@ -174,7 +174,7 @@
v 0.9.7.7 (WIP_DATE)
From b19a19498eeae9c4f60b002b65ed728c4679f613 Mon Sep 17 00:00:00 2001 From: Luthetus <45454132+huntercfreeman@users.noreply.github.com> Date: Sat, 14 Dec 2024 16:33:56 -0500 Subject: [PATCH 2/7] Remove from 'CSharpParserModel' Binder and BinderSession properties --- .../BinderCase/CSharpBinder.Expressions.cs | 10 +- .../CSharp/BinderCase/CSharpBinder.Main.cs | 112 +++++++++--------- .../CSharp/ParserCase/CSharpParser.cs | 2 - .../CSharp/ParserCase/CSharpParserModel.cs | 6 - .../Internals/ParseDefaultKeywords.cs | 10 +- .../ParserCase/Internals/ParseFunctions.cs | 8 +- .../ParserCase/Internals/ParseOthers.cs | 10 +- .../ParserCase/Internals/ParseTokens.cs | 20 ++-- .../ParserCase/Internals/ParseVariables.cs | 2 +- 9 files changed, 86 insertions(+), 94 deletions(-) diff --git a/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Expressions.cs b/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Expressions.cs index 4726a3690..3463d55fd 100644 --- a/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Expressions.cs +++ b/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Expressions.cs @@ -340,8 +340,8 @@ public IExpressionNode ForceDecisionAmbiguousIdentifier( { if (TryGetVariableDeclarationHierarchically( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, ambiguousIdentifierExpressionNode.Token.TextSpan.GetText(), out var existingVariableDeclarationNode)) { @@ -360,8 +360,8 @@ public IExpressionNode ForceDecisionAmbiguousIdentifier( { if (TryGetTypeDefinitionHierarchically( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, ambiguousIdentifierExpressionNode.Token.TextSpan.GetText(), out var typeDefinitionNode)) { @@ -1028,7 +1028,7 @@ public IExpressionNode LambdaMergeToken( token.TextSpan.ResourceUri, token.TextSpan.SourceText); - ((CSharpBinder)compilationUnit.ParserModel.Binder).AddSymbolDefinition( + ((CSharpBinder)compilationUnit.Binder).AddSymbolDefinition( new LambdaSymbol(textSpan, lambdaExpressionNode), compilationUnit); if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.OpenBraceToken) diff --git a/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Main.cs b/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Main.cs index 320373ba8..c77fe43a4 100644 --- a/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Main.cs +++ b/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Main.cs @@ -259,12 +259,12 @@ public void BindFunctionDefinitionNode( if (!TryAddFunctionDefinitionNodeByScope( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, functionIdentifierText, functionDefinitionNode)) { - compilationUnit.ParserModel.BinderSession.DiagnosticBag.ReportAlreadyDefinedFunction( + compilationUnit.BinderSession.DiagnosticBag.ReportAlreadyDefinedFunction( functionDefinitionNode.FunctionIdentifierToken.TextSpan, functionIdentifierText); } @@ -286,8 +286,8 @@ public void BindFunctionOptionalArgument( // TODO: Wouldn't this have a '!' at the start? And '... && typeDefinitionNode is not null' (2024-10-25) if (TryGetTypeDefinitionHierarchically( model, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, argumentTypeClauseNode.TypeIdentifierToken.TextSpan.GetText(), out var typeDefinitionNode) || typeDefinitionNode is null) @@ -309,7 +309,7 @@ public void BindFunctionOptionalArgument( EndingIndexExclusive = functionArgumentEntryNode.VariableDeclarationNode.IdentifierToken.TextSpan.EndingIndexExclusive }; - compilationUnit.ParserModel.BinderSession.DiagnosticBag.ReportBadFunctionOptionalArgumentDueToMismatchInType( + compilationUnit.BinderSession.DiagnosticBag.ReportBadFunctionOptionalArgumentDueToMismatchInType( optionalArgumentTextSpan, functionArgumentEntryNode.VariableDeclarationNode.IdentifierToken.TextSpan.GetText(), functionArgumentEntryNode.VariableDeclarationNode.TypeClauseNode.ValueType?.Name ?? "null", @@ -344,7 +344,7 @@ public void SetCurrentNamespaceStatementNode( NamespaceStatementNode namespaceStatementNode, CSharpCompilationUnit compilationUnit) { - compilationUnit.ParserModel.BinderSession.CurrentNamespaceStatementNode = namespaceStatementNode; + compilationUnit.BinderSession.CurrentNamespaceStatementNode = namespaceStatementNode; } public void BindNamespaceStatementNode( @@ -406,8 +406,8 @@ public void BindVariableDeclarationNode( if (TryGetVariableDeclarationNodeByScope( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, text, out var existingVariableDeclarationNode)) { @@ -419,13 +419,13 @@ public void BindVariableDeclarationNode( // (if there is an error where something is defined twice for example) SetVariableDeclarationNodeByScope( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, text, variableDeclarationNode); } - compilationUnit.ParserModel.BinderSession.DiagnosticBag.ReportAlreadyDefinedVariable( + compilationUnit.BinderSession.DiagnosticBag.ReportAlreadyDefinedVariable( variableDeclarationNode.IdentifierToken.TextSpan, text); } @@ -433,8 +433,8 @@ public void BindVariableDeclarationNode( { _ = TryAddVariableDeclarationNodeByScope( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, text, variableDeclarationNode); } @@ -449,8 +449,8 @@ public VariableReferenceNode ConstructAndBindVariableReferenceNode( if (TryGetVariableDeclarationHierarchically( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, text, out var variableDeclarationNode) && variableDeclarationNode is not null) @@ -474,7 +474,7 @@ public VariableReferenceNode ConstructAndBindVariableReferenceNode( variableIdentifierToken, variableDeclarationNode); - compilationUnit.ParserModel.BinderSession.DiagnosticBag.ReportUndefinedVariable( + compilationUnit.BinderSession.DiagnosticBag.ReportUndefinedVariable( variableIdentifierToken.TextSpan, text); } @@ -492,8 +492,8 @@ public void BindVariableAssignmentExpressionNode( if (TryGetVariableDeclarationHierarchically( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, text, out var variableDeclarationNode) && variableDeclarationNode is not null) @@ -508,13 +508,13 @@ public void BindVariableAssignmentExpressionNode( { if (UtilityApi.IsContextualKeywordSyntaxKind(text)) { - compilationUnit.ParserModel.BinderSession.DiagnosticBag.TheNameDoesNotExistInTheCurrentContext( + compilationUnit.BinderSession.DiagnosticBag.TheNameDoesNotExistInTheCurrentContext( variableAssignmentExpressionNode.VariableIdentifierToken.TextSpan, text); } else { - compilationUnit.ParserModel.BinderSession.DiagnosticBag.ReportUndefinedVariable( + compilationUnit.BinderSession.DiagnosticBag.ReportUndefinedVariable( variableAssignmentExpressionNode.VariableIdentifierToken.TextSpan, text); } @@ -551,8 +551,8 @@ public void BindFunctionInvocationNode( if (TryGetFunctionHierarchically( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, functionInvocationIdentifierText, out var functionDefinitionNode) && functionDefinitionNode is not null) @@ -561,7 +561,7 @@ public void BindFunctionInvocationNode( } else { - compilationUnit.ParserModel.BinderSession.DiagnosticBag.ReportUndefinedFunction( + compilationUnit.BinderSession.DiagnosticBag.ReportUndefinedFunction( functionInvocationNode.FunctionInvocationIdentifierToken.TextSpan, functionInvocationIdentifierText); } @@ -623,7 +623,7 @@ public void BindUsingStatementNode( { AddSymbolReference(new NamespaceSymbol(usingStatementNode.NamespaceIdentifier.TextSpan), compilationUnit); - compilationUnit.ParserModel.BinderSession.CurrentUsingStatementNodeList.Add(usingStatementNode); + compilationUnit.BinderSession.CurrentUsingStatementNodeList.Add(usingStatementNode); AddNamespaceToCurrentScope(usingStatementNode.NamespaceIdentifier.TextSpan.GetText(), compilationUnit); } @@ -654,13 +654,13 @@ public void OpenScope( { var scope = new Scope( codeBlockOwner, - indexKey: compilationUnit.ParserModel.BinderSession.GetNextIndexKey(), - parentIndexKey: compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + indexKey: compilationUnit.BinderSession.GetNextIndexKey(), + parentIndexKey: compilationUnit.BinderSession.CurrentScopeIndexKey, textSpan.StartingIndexInclusive, endingIndexExclusive: null); - compilationUnit.ParserModel.BinderSession.ScopeList.Insert(scope.IndexKey, scope); - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey = scope.IndexKey; + compilationUnit.BinderSession.ScopeList.Insert(scope.IndexKey, scope); + compilationUnit.BinderSession.CurrentScopeIndexKey = scope.IndexKey; } public void AddNamespaceToCurrentScope(string namespaceString, IParserModel parserModel) => @@ -682,8 +682,8 @@ public void AddNamespaceToCurrentScope( { _ = TryAddTypeDefinitionNodeByScope( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, typeDefinitionNode.TypeIdentifierToken.TextSpan.GetText(), typeDefinitionNode); } @@ -696,7 +696,7 @@ public void CloseScope( { // Check if it is the global scope, if so return early. { - if (compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey == 0) + if (compilationUnit.BinderSession.CurrentScopeIndexKey == 0) return; } @@ -708,14 +708,14 @@ public void CloseScope( // Update Scope { - var scope = compilationUnit.ParserModel.BinderSession.ScopeList[compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey]; + var scope = compilationUnit.BinderSession.ScopeList[compilationUnit.BinderSession.CurrentScopeIndexKey]; scope.EndingIndexExclusive = textSpan.EndingIndexExclusive; - compilationUnit.ParserModel.BinderSession.ScopeList[compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey] = scope; + compilationUnit.BinderSession.ScopeList[compilationUnit.BinderSession.CurrentScopeIndexKey] = scope; // Restore Parent Scope if (scope.ParentIndexKey is not null) { - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey = scope.ParentIndexKey.Value; + compilationUnit.BinderSession.CurrentScopeIndexKey = scope.ParentIndexKey.Value; } } @@ -725,9 +725,9 @@ public void CloseScope( inOwner.SetCodeBlockNode(inBuilder.Build(), compilationUnit.ParserModel.DiagnosticBag, compilationUnit.ParserModel.TokenWalker); if (inOwner.SyntaxKind == SyntaxKind.NamespaceStatementNode) - compilationUnit.ParserModel.Binder.BindNamespaceStatementNode((NamespaceStatementNode)inOwner, compilationUnit); + compilationUnit.Binder.BindNamespaceStatementNode((NamespaceStatementNode)inOwner, compilationUnit); else if (inOwner.SyntaxKind == SyntaxKind.TypeDefinitionNode) - compilationUnit.ParserModel.Binder.BindTypeDefinitionNode((TypeDefinitionNode)inOwner, compilationUnit, true); + compilationUnit.Binder.BindTypeDefinitionNode((TypeDefinitionNode)inOwner, compilationUnit, true); // Restore Parent CodeBlockBuilder if (outBuilder is not null) @@ -751,15 +751,15 @@ public void BindTypeDefinitionNode( bool shouldOverwrite = false) { var typeIdentifierText = typeDefinitionNode.TypeIdentifierToken.TextSpan.GetText(); - var currentNamespaceStatementText = compilationUnit.ParserModel.BinderSession.CurrentNamespaceStatementNode.IdentifierToken.TextSpan.GetText(); + var currentNamespaceStatementText = compilationUnit.BinderSession.CurrentNamespaceStatementNode.IdentifierToken.TextSpan.GetText(); var namespaceAndTypeIdentifiers = new NamespaceAndTypeIdentifiers(currentNamespaceStatementText, typeIdentifierText); typeDefinitionNode.EncompassingNamespaceIdentifierString = currentNamespaceStatementText; if (TryGetTypeDefinitionNodeByScope( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, typeIdentifierText, out var existingTypeDefinitionNode)) { @@ -767,8 +767,8 @@ public void BindTypeDefinitionNode( { SetTypeDefinitionNodeByScope( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, typeIdentifierText, typeDefinitionNode); } @@ -777,8 +777,8 @@ public void BindTypeDefinitionNode( { _ = TryAddTypeDefinitionNodeByScope( compilationUnit, - compilationUnit.ParserModel.BinderSession.ResourceUri, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.ResourceUri, + compilationUnit.BinderSession.CurrentScopeIndexKey, typeIdentifierText, typeDefinitionNode); } @@ -800,10 +800,10 @@ private void AddSymbolDefinition( { var symbolDefinitionId = ISymbol.GetSymbolDefinitionId( symbol.TextSpan.GetText(), - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey); + compilationUnit.BinderSession.CurrentScopeIndexKey); var symbolDefinition = new SymbolDefinition( - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.CurrentScopeIndexKey, symbol); if (!_symbolDefinitions.TryAdd( @@ -829,14 +829,14 @@ private void AddSymbolReference(ISymbol symbol, CSharpCompilationUnit compilatio { var symbolDefinitionId = ISymbol.GetSymbolDefinitionId( symbol.TextSpan.GetText(), - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey); + compilationUnit.BinderSession.CurrentScopeIndexKey); if (!_symbolDefinitions.TryGetValue( symbolDefinitionId, out var symbolDefinition)) { symbolDefinition = new SymbolDefinition( - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey, + compilationUnit.BinderSession.CurrentScopeIndexKey, symbol) { IsFabricated = true @@ -853,7 +853,7 @@ private void AddSymbolReference(ISymbol symbol, CSharpCompilationUnit compilatio symbolDefinition.SymbolReferences.Add(new SymbolReference( symbol, - compilationUnit.ParserModel.BinderSession.CurrentScopeIndexKey)); + compilationUnit.BinderSession.CurrentScopeIndexKey)); } public void CreateVariableSymbol( @@ -1104,9 +1104,9 @@ bool IBinder.TryGetBinderSession(ResourceUri resourceUri, out IBinderSession bin public bool TryGetBinderSession(CSharpCompilationUnit? compilationUnit, ResourceUri resourceUri, out IBinderSession binderSession) { if (compilationUnit is not null && - resourceUri == compilationUnit.ParserModel.BinderSession.ResourceUri) + resourceUri == compilationUnit.BinderSession.ResourceUri) { - binderSession = compilationUnit.ParserModel.BinderSession; + binderSession = compilationUnit.BinderSession; return true; } @@ -1733,7 +1733,7 @@ public void OnBoundScopeCreatedAndSetAsCurrent(ICodeBlockOwner codeBlockOwner, C { foreach (var argument in typeDefinitionNode.PrimaryConstructorFunctionArgumentsListingNode.FunctionArgumentEntryNodeList) { - compilationUnit.ParserModel.Binder.BindVariableDeclarationNode(argument.VariableDeclarationNode, compilationUnit); + compilationUnit.Binder.BindVariableDeclarationNode(argument.VariableDeclarationNode, compilationUnit); } } } @@ -1741,27 +1741,27 @@ public void OnBoundScopeCreatedAndSetAsCurrent(ICodeBlockOwner codeBlockOwner, C { var namespaceStatementNode = (NamespaceStatementNode)codeBlockOwner; var namespaceString = namespaceStatementNode.IdentifierToken.TextSpan.GetText(); - compilationUnit.ParserModel.Binder.AddNamespaceToCurrentScope(namespaceString, compilationUnit); + compilationUnit.Binder.AddNamespaceToCurrentScope(namespaceString, compilationUnit); } else if (codeBlockOwner.SyntaxKind == SyntaxKind.FunctionDefinitionNode) { var functionDefinitionNode = (FunctionDefinitionNode)codeBlockOwner; foreach (var argument in functionDefinitionNode.FunctionArgumentsListingNode.FunctionArgumentEntryNodeList) { - compilationUnit.ParserModel.Binder.BindVariableDeclarationNode(argument.VariableDeclarationNode, compilationUnit); + compilationUnit.Binder.BindVariableDeclarationNode(argument.VariableDeclarationNode, compilationUnit); } } else if (codeBlockOwner.SyntaxKind == SyntaxKind.ForeachStatementNode) { var foreachStatementNode = (ForeachStatementNode)codeBlockOwner; - compilationUnit.ParserModel.Binder.BindVariableDeclarationNode(foreachStatementNode.VariableDeclarationNode, compilationUnit); + compilationUnit.Binder.BindVariableDeclarationNode(foreachStatementNode.VariableDeclarationNode, compilationUnit); } else if (codeBlockOwner.SyntaxKind == SyntaxKind.ConstructorDefinitionNode) { var constructorDefinitionNode = (ConstructorDefinitionNode)codeBlockOwner; foreach (var argument in constructorDefinitionNode.FunctionArgumentsListingNode.FunctionArgumentEntryNodeList) { - compilationUnit.ParserModel.Binder.BindVariableDeclarationNode(argument.VariableDeclarationNode, compilationUnit); + compilationUnit.Binder.BindVariableDeclarationNode(argument.VariableDeclarationNode, compilationUnit); } } } diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs index 2642a2826..25920e39d 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs @@ -33,8 +33,6 @@ public void Parse(CSharpCompilationUnit compilationUnit) var diagnosticBag = new DiagnosticBag(); compilationUnit.ParserModel = new CSharpParserModel( - compilationUnit.Binder, - compilationUnit.BinderSession, new TokenWalker(compilationUnit.Lexer.SyntaxTokenList, diagnosticBag), new Stack(), diagnosticBag, diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParserModel.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParserModel.cs index 102242f5b..e2860900b 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParserModel.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParserModel.cs @@ -14,8 +14,6 @@ namespace Luthetus.CompilerServices.CSharp.ParserCase; public class CSharpParserModel { public CSharpParserModel( - CSharpBinder binder, - CSharpBinderSession binderSession, TokenWalker tokenWalker, Stack syntaxStack, DiagnosticBag diagnosticBag, @@ -26,8 +24,6 @@ public CSharpParserModel( ++LuthetusDebugSomething.ParserModel_ConstructorInvocationCount; #endif - Binder = binder; - BinderSession = binderSession; TokenWalker = tokenWalker; SyntaxStack = syntaxStack; DiagnosticBag = diagnosticBag; @@ -40,8 +36,6 @@ public CSharpParserModel( ForceParseExpressionInitialPrimaryExpression = EmptyExpressionNode.Empty; } - public CSharpBinder Binder { get; } - public CSharpBinderSession BinderSession { get; } public TokenWalker TokenWalker { get; } public Stack SyntaxStack { get; set; } public CSharpStatementBuilder StatementBuilder { get; set; } = new(); diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseDefaultKeywords.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseDefaultKeywords.cs index 56a135230..a5bb98b06 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseDefaultKeywords.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseDefaultKeywords.cs @@ -721,7 +721,7 @@ public static void HandleIfTokenKeyword(CSharpCompilationUnit compilationUnit) compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); var expression = ParseOthers.ParseExpression(compilationUnit); - var boundIfStatementNode = compilationUnit.ParserModel.Binder.BindIfStatementNode(ifTokenKeyword, expression); + var boundIfStatementNode = compilationUnit.Binder.BindIfStatementNode(ifTokenKeyword, expression); compilationUnit.ParserModel.SyntaxStack.Push(boundIfStatementNode); compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = boundIfStatementNode; } @@ -744,7 +744,7 @@ public static void HandleUsingTokenKeyword(CSharpCompilationUnit compilationUnit usingKeywordToken, namespaceIdentifier); - compilationUnit.ParserModel.Binder.BindUsingStatementNode(usingStatementNode, compilationUnit); + compilationUnit.Binder.BindUsingStatementNode(usingStatementNode, compilationUnit); compilationUnit.ParserModel.StatementBuilder.ChildList.Add(usingStatementNode); } @@ -869,8 +869,8 @@ public static void HandleStorageModifierTokenKeyword(CSharpCompilationUnit compi openBraceToken: default, codeBlockNode: null); - compilationUnit.ParserModel.Binder.BindTypeDefinitionNode(typeDefinitionNode, compilationUnit); - compilationUnit.ParserModel.Binder.BindTypeIdentifier(identifierToken, compilationUnit); + compilationUnit.Binder.BindTypeDefinitionNode(typeDefinitionNode, compilationUnit); + compilationUnit.Binder.BindTypeIdentifier(identifierToken, compilationUnit); compilationUnit.ParserModel.SyntaxStack.Push(typeDefinitionNode); compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = typeDefinitionNode; } @@ -899,7 +899,7 @@ public static void HandleNamespaceTokenKeyword(CSharpCompilationUnit compilation namespaceIdentifier, null); - compilationUnit.ParserModel.Binder.SetCurrentNamespaceStatementNode(namespaceStatementNode, compilationUnit); + compilationUnit.Binder.SetCurrentNamespaceStatementNode(namespaceStatementNode, compilationUnit); compilationUnit.ParserModel.SyntaxStack.Push(namespaceStatementNode); compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = namespaceStatementNode; diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseFunctions.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseFunctions.cs index aceecc343..92de6efb8 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseFunctions.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseFunctions.cs @@ -41,7 +41,7 @@ public static void HandleFunctionDefinition( null, null); - compilationUnit.ParserModel.Binder.BindFunctionDefinitionNode(functionDefinitionNode, compilationUnit); + compilationUnit.Binder.BindFunctionDefinitionNode(functionDefinitionNode, compilationUnit); compilationUnit.ParserModel.SyntaxStack.Push(functionDefinitionNode); compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = functionDefinitionNode; @@ -54,9 +54,9 @@ public static void HandleFunctionDefinition( foreach (var argument in functionDefinitionNode.FunctionArgumentsListingNode.FunctionArgumentEntryNodeList) { if (argument.IsOptional) - compilationUnit.ParserModel.Binder.BindFunctionOptionalArgument(argument, compilationUnit); + compilationUnit.Binder.BindFunctionOptionalArgument(argument, compilationUnit); else - compilationUnit.ParserModel.Binder.BindVariableDeclarationNode(argument.VariableDeclarationNode, compilationUnit); + compilationUnit.Binder.BindVariableDeclarationNode(argument.VariableDeclarationNode, compilationUnit); } } } @@ -81,7 +81,7 @@ public static void HandleConstructorDefinition( null, null); - compilationUnit.ParserModel.Binder.BindConstructorDefinitionIdentifierToken(consumedIdentifierToken, compilationUnit); + compilationUnit.Binder.BindConstructorDefinitionIdentifierToken(consumedIdentifierToken, compilationUnit); compilationUnit.ParserModel.SyntaxStack.Push(constructorDefinitionNode); compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = constructorDefinitionNode; diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseOthers.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseOthers.cs index b2b606809..d7d94c74f 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseOthers.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseOthers.cs @@ -175,7 +175,7 @@ public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationU break; } - expressionPrimary = compilationUnit.ParserModel.Binder.AnyMergeToken(expressionPrimary, tokenCurrent, compilationUnit); + expressionPrimary = compilationUnit.Binder.AnyMergeToken(expressionPrimary, tokenCurrent, compilationUnit); #if DEBUG Console.WriteLine($"\t=> {expressionPrimary.SyntaxKind}"); @@ -190,7 +190,7 @@ public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationU if (compilationUnit.ParserModel.NoLongerRelevantExpressionNode is not null) // try finally is not needed to guarantee setting 'compilationUnit.ParserModel.NoLongerRelevantExpressionNode = null;' because this is an object reference comparison 'Object.ReferenceEquals'. Versus something more general that would break future parses if not properly cleared, like a SyntaxKind. { - compilationUnit.ParserModel.Binder.ClearFromExpressionList(compilationUnit.ParserModel.NoLongerRelevantExpressionNode, compilationUnit); + compilationUnit.Binder.ClearFromExpressionList(compilationUnit.ParserModel.NoLongerRelevantExpressionNode, compilationUnit); compilationUnit.ParserModel.NoLongerRelevantExpressionNode = null; } @@ -257,7 +257,7 @@ public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationU if (expressionPrimary.SyntaxKind == SyntaxKind.AmbiguousIdentifierExpressionNode) { - expressionPrimary = compilationUnit.ParserModel.Binder.ForceDecisionAmbiguousIdentifier( + expressionPrimary = compilationUnit.Binder.ForceDecisionAmbiguousIdentifier( EmptyExpressionNode.Empty, (AmbiguousIdentifierExpressionNode)expressionPrimary, compilationUnit); @@ -318,7 +318,7 @@ private static IExpressionNode BubbleUpParseExpression(int indexTriggered, IExpr previousDelimiterExpressionNode = delimiterExpressionTuple.ExpressionNode; - expressionPrimary = compilationUnit.ParserModel.Binder.AnyMergeExpression( + expressionPrimary = compilationUnit.Binder.AnyMergeExpression( delimiterExpressionTuple.ExpressionNode, expressionPrimary, // expressionSecondary compilationUnit); @@ -326,7 +326,7 @@ private static IExpressionNode BubbleUpParseExpression(int indexTriggered, IExpr if (compilationUnit.ParserModel.NoLongerRelevantExpressionNode is not null) // try finally is not needed to guarantee setting 'compilationUnit.ParserModel.NoLongerRelevantExpressionNode = null;' because this is an object reference comparison 'Object.ReferenceEquals'. Versus something more general that would break future parses if not properly cleared, like a SyntaxKind. { - compilationUnit.ParserModel.Binder.ClearFromExpressionList(compilationUnit.ParserModel.NoLongerRelevantExpressionNode, compilationUnit); + compilationUnit.Binder.ClearFromExpressionList(compilationUnit.ParserModel.NoLongerRelevantExpressionNode, compilationUnit); compilationUnit.ParserModel.NoLongerRelevantExpressionNode = null; } diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTokens.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTokens.cs index d44f3833e..123ccc697 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTokens.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTokens.cs @@ -107,7 +107,7 @@ public static void MoveToHandleVariableDeclarationNode(IVariableDeclarationNode ((VariableDeclarationNode)variableDeclarationNode).VariableKind = variableKind; - compilationUnit.ParserModel.Binder.BindVariableDeclarationNode(variableDeclarationNode, compilationUnit); + compilationUnit.Binder.BindVariableDeclarationNode(variableDeclarationNode, compilationUnit); compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(variableDeclarationNode); compilationUnit.ParserModel.StatementBuilder.ChildList.Add(variableDeclarationNode); @@ -215,7 +215,7 @@ public static void ParseColonToken(CSharpCompilationUnit compilationUnit) var typeDefinitionNode = (TypeDefinitionNode)compilationUnit.ParserModel.SyntaxStack.Pop(); var inheritedTypeClauseNode = compilationUnit.ParserModel.TokenWalker.MatchTypeClauseNode(compilationUnit); - compilationUnit.ParserModel.Binder.BindTypeClauseNode(inheritedTypeClauseNode, compilationUnit); + compilationUnit.Binder.BindTypeClauseNode(inheritedTypeClauseNode, compilationUnit); typeDefinitionNode.SetInheritedTypeClauseNode(inheritedTypeClauseNode); @@ -258,9 +258,9 @@ public static void ParseOpenBraceToken(OpenBraceToken openBraceToken, CSharpComp var nextCodeBlockOwner = compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner; var nextReturnTypeClauseNode = nextCodeBlockOwner.GetReturnTypeClauseNode(); - compilationUnit.ParserModel.Binder.OpenScope(nextCodeBlockOwner, nextReturnTypeClauseNode, openBraceToken.TextSpan, compilationUnit); + compilationUnit.Binder.OpenScope(nextCodeBlockOwner, nextReturnTypeClauseNode, openBraceToken.TextSpan, compilationUnit); compilationUnit.ParserModel.CurrentCodeBlockBuilder = new(parent: compilationUnit.ParserModel.CurrentCodeBlockBuilder, codeBlockOwner: nextCodeBlockOwner); - compilationUnit.ParserModel.Binder.OnBoundScopeCreatedAndSetAsCurrent(nextCodeBlockOwner, compilationUnit); + compilationUnit.Binder.OnBoundScopeCreatedAndSetAsCurrent(nextCodeBlockOwner, compilationUnit); } /// @@ -278,7 +278,7 @@ public static void ParseCloseBraceToken(CloseBraceToken closeBraceToken, CSharpC if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner is not null) compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner.SetCloseBraceToken(closeBraceToken, compilationUnit.ParserModel.DiagnosticBag, compilationUnit.ParserModel.TokenWalker); - compilationUnit.ParserModel.Binder.CloseScope(closeBraceToken.TextSpan, compilationUnit); + compilationUnit.Binder.CloseScope(closeBraceToken.TextSpan, compilationUnit); } public static void ParseOpenParenthesisToken(CSharpCompilationUnit compilationUnit) @@ -414,13 +414,13 @@ public static void ParseStatementDelimiterToken(StatementDelimiterToken statemen namespaceStatementNode.SetStatementDelimiterToken(statementDelimiterToken, compilationUnit.ParserModel.DiagnosticBag, compilationUnit.ParserModel.TokenWalker); - compilationUnit.ParserModel.Binder.OpenScope( + compilationUnit.Binder.OpenScope( nextCodeBlockOwner, scopeReturnTypeClauseNode, statementDelimiterToken.TextSpan, compilationUnit); - compilationUnit.ParserModel.Binder.AddNamespaceToCurrentScope( + compilationUnit.Binder.AddNamespaceToCurrentScope( namespaceStatementNode.IdentifierToken.TextSpan.GetText(), compilationUnit); @@ -431,11 +431,11 @@ public static void ParseStatementDelimiterToken(StatementDelimiterToken statemen { var pendingChild = compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner; - compilationUnit.ParserModel.Binder.OpenScope(pendingChild, CSharpFacts.Types.Void.ToTypeClause(), statementDelimiterToken.TextSpan, compilationUnit); + compilationUnit.Binder.OpenScope(pendingChild, CSharpFacts.Types.Void.ToTypeClause(), statementDelimiterToken.TextSpan, compilationUnit); compilationUnit.ParserModel.CurrentCodeBlockBuilder = new(compilationUnit.ParserModel.CurrentCodeBlockBuilder, pendingChild); - compilationUnit.ParserModel.Binder.OnBoundScopeCreatedAndSetAsCurrent(pendingChild, compilationUnit); + compilationUnit.Binder.OnBoundScopeCreatedAndSetAsCurrent(pendingChild, compilationUnit); - compilationUnit.ParserModel.Binder.CloseScope(statementDelimiterToken.TextSpan, compilationUnit); + compilationUnit.Binder.CloseScope(statementDelimiterToken.TextSpan, compilationUnit); if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.Parent is not null) compilationUnit.ParserModel.CurrentCodeBlockBuilder = compilationUnit.ParserModel.CurrentCodeBlockBuilder.Parent; diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseVariables.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseVariables.cs index fa7efc2bf..9caf6e509 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseVariables.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseVariables.cs @@ -32,7 +32,7 @@ public static void HandleVariableReference( variableKind, false); - compilationUnit.ParserModel.Binder.BindVariableDeclarationNode(variableDeclarationNode, compilationUnit); + compilationUnit.Binder.BindVariableDeclarationNode(variableDeclarationNode, compilationUnit); compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(variableDeclarationNode); return variableDeclarationNode; } From 80a679da1764c5dc764cc5af7899ef80cbe66357 Mon Sep 17 00:00:00 2001 From: Luthetus <45454132+huntercfreeman@users.noreply.github.com> Date: Sat, 14 Dec 2024 18:14:43 -0500 Subject: [PATCH 3/7] Only return 'CSharpLexerOutput' so computational state is cleared from memory immediately upon returning --- .../CSharpCompilationUnit.cs | 2 +- .../CSharpCompilerService.cs | 8 +- .../CSharp/LexerCase/CSharpLexer.cs | 235 ++++++++---------- .../CSharp/LexerCase/CSharpLexerOutput.cs | 23 ++ .../CSharp/ParserCase/CSharpParser.cs | 4 +- .../CompilerServices/Razor/RazorSyntaxTree.cs | 14 +- 6 files changed, 135 insertions(+), 151 deletions(-) create mode 100644 Source/Lib/CompilerServices/CSharp/LexerCase/CSharpLexerOutput.cs diff --git a/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilationUnit.cs b/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilationUnit.cs index 17947979c..4977b1557 100644 --- a/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilationUnit.cs +++ b/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilationUnit.cs @@ -21,7 +21,7 @@ public CSharpCompilationUnit( } public ResourceUri ResourceUri { get; set; } - public CSharpLexer Lexer { get; set; } + public CSharpLexerOutput LexerOutput { get; set; } public CSharpParser Parser { get; set; } public CSharpParserModel ParserModel { get; set; } public CSharpBinder Binder { get; set; } diff --git a/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilerService.cs b/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilerService.cs index 101130e64..a37147353 100644 --- a/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilerService.cs +++ b/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilerService.cs @@ -74,8 +74,8 @@ public override Task ParseAsync(ITextEditorEditContext editContext, TextEditorMo x => x.TextEditorPresentationKey == CompilerServiceDiagnosticPresentationFacts.PresentationKey); var cSharpCompilationUnit = new CSharpCompilationUnit(resourceUri, CSharpBinder); - cSharpCompilationUnit.Lexer = new CSharpLexer(resourceUri, presentationModel.PendingCalculation.ContentAtRequest); - cSharpCompilationUnit.Lexer.Lex(); + + cSharpCompilationUnit.LexerOutput = CSharpLexer.Lex(resourceUri, presentationModel.PendingCalculation.ContentAtRequest); // Even if the parser throws an exception, be sure to // make use of the Lexer to do whatever syntax highlighting is possible. @@ -93,8 +93,8 @@ public override Task ParseAsync(ITextEditorEditContext editContext, TextEditorMo { var resource = (CSharpResource)_resourceMap[resourceUri]; - resource.EscapeCharacterList = cSharpCompilationUnit.Lexer.EscapeCharacterList; - resource.SyntaxTokenList = cSharpCompilationUnit.Lexer.SyntaxTokenList; + resource.EscapeCharacterList = cSharpCompilationUnit.LexerOutput.EscapeCharacterList; + resource.SyntaxTokenList = cSharpCompilationUnit.LexerOutput.SyntaxTokenList; if (cSharpCompilationUnit is not null) resource.CompilationUnit = cSharpCompilationUnit; diff --git a/Source/Lib/CompilerServices/CSharp/LexerCase/CSharpLexer.cs b/Source/Lib/CompilerServices/CSharp/LexerCase/CSharpLexer.cs index d8203801f..ea3168f8c 100644 --- a/Source/Lib/CompilerServices/CSharp/LexerCase/CSharpLexer.cs +++ b/Source/Lib/CompilerServices/CSharp/LexerCase/CSharpLexer.cs @@ -10,36 +10,13 @@ namespace Luthetus.CompilerServices.CSharp.LexerCase; -public struct CSharpLexer +public static class CSharpLexer { - private readonly List _syntaxTokenList = new(); - private readonly DiagnosticBag _diagnosticBag = new(); - - public CSharpLexer(ResourceUri resourceUri, string sourceText) - { - #if DEBUG - ++LuthetusDebugSomething.Lexer_ConstructorInvocationCount; - #endif - - ResourceUri = resourceUri; - SourceText = sourceText; - LexerKeywords = CSharpKeywords.LexerKeywords; - } - - private byte _decorationByteLastEscapeCharacter = (byte)GenericDecorationKind.None; - - public List EscapeCharacterList { get; } = new(); - - public ResourceUri ResourceUri { get; } - public string SourceText { get; } - public LexerKeywords LexerKeywords { get; } - - public List SyntaxTokenList => _syntaxTokenList; - public List DiagnosticList => _diagnosticBag.ToList(); - - public void Lex() + public static CSharpLexerOutput Lex(ResourceUri resourceUri, string sourceText) { - var stringWalker = new StringWalkerStruct(ResourceUri, SourceText); + var stringWalker = new StringWalkerStruct(resourceUri, sourceText); + var decorationByteLastEscapeCharacter = (byte)GenericDecorationKind.None; + var lexerOutput = new CSharpLexerOutput(); while (!stringWalker.IsEof) { @@ -101,7 +78,7 @@ public void Lex() case 'Z': /* Underscore */ case '_': - LexIdentifierOrKeywordOrKeywordContextual(ref stringWalker); + LexIdentifierOrKeywordOrKeywordContextual(ref lexerOutput, ref stringWalker); break; case '0': case '1': @@ -113,81 +90,81 @@ public void Lex() case '7': case '8': case '9': - LexNumericLiteralToken(ref stringWalker); + LexNumericLiteralToken(ref lexerOutput, ref stringWalker); break; case '\'': - LexCharLiteralToken(ref stringWalker); + LexCharLiteralToken(ref lexerOutput, ref stringWalker); break; case '"': - LexString(ref stringWalker, countDollarSign: 0, useVerbatim: false); + LexString(ref lexerOutput, ref stringWalker, ref decorationByteLastEscapeCharacter, countDollarSign: 0, useVerbatim: false); break; case '/': if (stringWalker.PeekCharacter(1) == '/') { - LexCommentSingleLineToken(ref stringWalker); + LexCommentSingleLineToken(ref lexerOutput, ref stringWalker); } else if (stringWalker.PeekCharacter(1) == '*') { - LexCommentMultiLineToken(ref stringWalker); + LexCommentMultiLineToken(ref lexerOutput, ref stringWalker); } else { var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new DivisionToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new DivisionToken(textSpan)); } break; case '+': if (stringWalker.PeekCharacter(1) == '+') { - LexPlusPlusToken(ref stringWalker); + LexPlusPlusToken(ref lexerOutput, ref stringWalker); } else { var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new PlusToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new PlusToken(textSpan)); } break; case '-': if (stringWalker.PeekCharacter(1) == '-') { - LexMinusMinusToken(ref stringWalker); + LexMinusMinusToken(ref lexerOutput, ref stringWalker); } else { var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new MinusToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new MinusToken(textSpan)); } break; case '=': if (stringWalker.PeekCharacter(1) == '=') { - LexEqualsEqualsToken(ref stringWalker); + LexEqualsEqualsToken(ref lexerOutput, ref stringWalker); } else { var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new EqualsToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new EqualsToken(textSpan)); } break; case '?': if (stringWalker.PeekCharacter(1) == '?') { - LexQuestionMarkQuestionMarkToken(ref stringWalker); + LexQuestionMarkQuestionMarkToken(ref lexerOutput, ref stringWalker); } else { var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new QuestionMarkToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new QuestionMarkToken(textSpan)); } break; case '*': @@ -195,7 +172,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new StarToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new StarToken(textSpan)); break; } case '!': @@ -203,7 +180,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new BangToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new BangToken(textSpan)); break; } case ';': @@ -211,7 +188,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new StatementDelimiterToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new StatementDelimiterToken(textSpan)); break; } case '(': @@ -219,7 +196,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new OpenParenthesisToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new OpenParenthesisToken(textSpan)); break; } case ')': @@ -227,7 +204,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new CloseParenthesisToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new CloseParenthesisToken(textSpan)); break; } case '{': @@ -235,7 +212,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new OpenBraceToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new OpenBraceToken(textSpan)); break; } case '}': @@ -243,7 +220,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new CloseBraceToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new CloseBraceToken(textSpan)); break; } case '<': @@ -251,7 +228,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new OpenAngleBracketToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new OpenAngleBracketToken(textSpan)); break; } case '>': @@ -259,7 +236,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new CloseAngleBracketToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new CloseAngleBracketToken(textSpan)); break; } case '[': @@ -267,7 +244,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new OpenSquareBracketToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new OpenSquareBracketToken(textSpan)); break; } case ']': @@ -275,17 +252,17 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new CloseSquareBracketToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new CloseSquareBracketToken(textSpan)); break; } case '$': if (stringWalker.NextCharacter == '"') { - LexString(ref stringWalker, countDollarSign: 1, useVerbatim: false); + LexString(ref lexerOutput, ref stringWalker, ref decorationByteLastEscapeCharacter, countDollarSign: 1, useVerbatim: false); } else if (stringWalker.PeekCharacter(1) == '@' && stringWalker.PeekCharacter(2) == '"') { - LexString(ref stringWalker, countDollarSign: 1, useVerbatim: true); + LexString(ref lexerOutput, ref stringWalker, ref decorationByteLastEscapeCharacter, countDollarSign: 1, useVerbatim: true); } else if (stringWalker.NextCharacter == '$') { @@ -306,7 +283,7 @@ public void Lex() // Only the last '$' (dollar sign character) will be syntax highlighted // if this code is NOT included. var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.StringLiteral, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new StringLiteralToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new StringLiteralToken(textSpan)); // From the LexString(...) method: // "awkwardly even if there are many of these it is expected @@ -314,27 +291,27 @@ public void Lex() _ = stringWalker.BacktrackCharacter(); if (stringWalker.NextCharacter == '"') - LexString(ref stringWalker, countDollarSign: countDollarSign, useVerbatim: false); + LexString(ref lexerOutput, ref stringWalker, ref decorationByteLastEscapeCharacter, countDollarSign: countDollarSign, useVerbatim: false); } else { - LexDollarSignToken(ref stringWalker); + LexDollarSignToken(ref lexerOutput, ref stringWalker); } break; case '@': if (stringWalker.NextCharacter == '"') - LexString(ref stringWalker, countDollarSign: 0, useVerbatim: true); + LexString(ref lexerOutput, ref stringWalker, ref decorationByteLastEscapeCharacter, countDollarSign: 0, useVerbatim: true); else if (stringWalker.PeekCharacter(1) == '$' && stringWalker.PeekCharacter(2) == '"') - LexString(ref stringWalker, countDollarSign: 1, useVerbatim: true); + LexString(ref lexerOutput, ref stringWalker, ref decorationByteLastEscapeCharacter, countDollarSign: 1, useVerbatim: true); else - LexAtToken(ref stringWalker); + LexAtToken(ref lexerOutput, ref stringWalker); break; case ':': { var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new ColonToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new ColonToken(textSpan)); break; } case '.': @@ -342,7 +319,7 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new MemberAccessToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new MemberAccessToken(textSpan)); break; } case ',': @@ -350,11 +327,11 @@ public void Lex() var entryPositionIndex = stringWalker.PositionIndex; stringWalker.ReadCharacter(); var textSpan = new TextEditorTextSpan(entryPositionIndex, stringWalker.PositionIndex, (byte)GenericDecorationKind.None, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new CommaToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new CommaToken(textSpan)); break; } case '#': - LexPreprocessorDirectiveToken(ref stringWalker); + LexPreprocessorDirectiveToken(ref lexerOutput, ref stringWalker); break; default: _ = stringWalker.ReadCharacter(); @@ -369,7 +346,8 @@ public void Lex() stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new EndOfFileToken(endOfFileTextSpan)); + lexerOutput.SyntaxTokenList.Add(new EndOfFileToken(endOfFileTextSpan)); + return lexerOutput; } /// @@ -379,7 +357,7 @@ public void Lex() /// The reason being: you don't know if it is a string until you've read all of the '$' (dollar sign characters). /// So in order to invoke this method the invoker had to have counted them. /// - private void LexString(ref StringWalkerStruct stringWalker, int countDollarSign, bool useVerbatim) + private static void LexString(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker, ref byte decorationByteLastEscapeCharacter, int countDollarSign, bool useVerbatim) { var entryPositionIndex = stringWalker.PositionIndex; @@ -434,15 +412,12 @@ private void LexString(ref StringWalkerStruct stringWalker, int countDollarSign, } else if (useVerbatim && stringWalker.NextCharacter == '\"') { - if (EscapeCharacterList is not null) - { - EscapeCharacterListAdd(ref stringWalker, new TextEditorTextSpan( - stringWalker.PositionIndex, - stringWalker.PositionIndex + 2, - (byte)GenericDecorationKind.EscapeCharacterPrimary, - stringWalker.ResourceUri, - stringWalker.SourceText)); - } + EscapeCharacterListAdd(ref lexerOutput, ref stringWalker, ref decorationByteLastEscapeCharacter, new TextEditorTextSpan( + stringWalker.PositionIndex, + stringWalker.PositionIndex + 2, + (byte)GenericDecorationKind.EscapeCharacterPrimary, + stringWalker.ResourceUri, + stringWalker.SourceText)); _ = stringWalker.ReadCharacter(); } @@ -454,15 +429,12 @@ private void LexString(ref StringWalkerStruct stringWalker, int countDollarSign, } else if (!useVerbatim && stringWalker.CurrentCharacter == '\\') { - if (EscapeCharacterList is not null) - { - EscapeCharacterListAdd(ref stringWalker, new TextEditorTextSpan( - stringWalker.PositionIndex, - stringWalker.PositionIndex + 2, - (byte)GenericDecorationKind.EscapeCharacterPrimary, - stringWalker.ResourceUri, - stringWalker.SourceText)); - } + EscapeCharacterListAdd(ref lexerOutput, ref stringWalker, ref decorationByteLastEscapeCharacter, new TextEditorTextSpan( + stringWalker.PositionIndex, + stringWalker.PositionIndex + 2, + (byte)GenericDecorationKind.EscapeCharacterPrimary, + stringWalker.ResourceUri, + stringWalker.SourceText)); // Presuming the escaped text is 2 characters, then read an extra character. _ = stringWalker.ReadCharacter(); @@ -500,14 +472,14 @@ private void LexString(ref StringWalkerStruct stringWalker, int countDollarSign, (byte)GenericDecorationKind.StringLiteral, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new StringLiteralToken(innerTextSpan)); + lexerOutput.SyntaxTokenList.Add(new StringLiteralToken(innerTextSpan)); // 'LexInterpolatedExpression' is expected to consume one more after it is finished. // Thus, if this while loop were to consume, it would skip the // closing double quotes if the expression were the last thing in the string. // // So, a backtrack is done. - LexInterpolatedExpression(ref stringWalker, countDollarSign); + LexInterpolatedExpression(ref lexerOutput, ref stringWalker, countDollarSign); entryPositionIndex = stringWalker.PositionIndex; stringWalker.BacktrackCharacter(); } @@ -528,12 +500,12 @@ private void LexString(ref StringWalkerStruct stringWalker, int countDollarSign, (byte)GenericDecorationKind.StringLiteral, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new StringLiteralToken(innerTextSpan)); + lexerOutput.SyntaxTokenList.Add(new StringLiteralToken(innerTextSpan)); // 'LexInterpolatedExpression' is expected to consume one more after it is finished. // Thus, if this while loop were to consume, it would skip the // closing double quotes if the expression were the last thing in the string. - LexInterpolatedExpression(ref stringWalker, countDollarSign); + LexInterpolatedExpression(ref lexerOutput, ref stringWalker, countDollarSign); entryPositionIndex = stringWalker.PositionIndex; continue; } @@ -552,10 +524,10 @@ private void LexString(ref StringWalkerStruct stringWalker, int countDollarSign, stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new StringLiteralToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new StringLiteralToken(textSpan)); } - private void LexInterpolatedExpression(ref StringWalkerStruct stringWalker, int countDollarSign) + private static void LexInterpolatedExpression(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker, int countDollarSign) { var entryPositionIndex = stringWalker.PositionIndex; @@ -588,14 +560,14 @@ private void LexInterpolatedExpression(ref StringWalkerStruct stringWalker, int _ = stringWalker.ReadCharacter(); } - private void EscapeCharacterListAdd(ref StringWalkerStruct stringWalker, TextEditorTextSpan textSpan) + private static void EscapeCharacterListAdd(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker, ref byte decorationByteLastEscapeCharacter, TextEditorTextSpan textSpan) { - if (EscapeCharacterList.Count > 0) + if (lexerOutput.EscapeCharacterList.Count > 0) { - var lastEntry = EscapeCharacterList[^1]; + var lastEntry = lexerOutput.EscapeCharacterList[^1]; if (lastEntry.EndingIndexExclusive == textSpan.StartingIndexInclusive && - _decorationByteLastEscapeCharacter == (byte)GenericDecorationKind.EscapeCharacterPrimary) + decorationByteLastEscapeCharacter == (byte)GenericDecorationKind.EscapeCharacterPrimary) { textSpan = textSpan with { @@ -604,11 +576,11 @@ private void EscapeCharacterListAdd(ref StringWalkerStruct stringWalker, TextEdi } } - _decorationByteLastEscapeCharacter = textSpan.DecorationByte; - EscapeCharacterList.Add(textSpan); + decorationByteLastEscapeCharacter = textSpan.DecorationByte; + lexerOutput.EscapeCharacterList.Add(textSpan); } - public void LexIdentifierOrKeywordOrKeywordContextual(ref StringWalkerStruct stringWalker) + public static void LexIdentifierOrKeywordOrKeywordContextual(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -646,18 +618,18 @@ public void LexIdentifierOrKeywordOrKeywordContextual(ref StringWalkerStruct str if (CSharpKeywords.LexerKeywords.ContextualKeywords.Contains(textValue)) { - _syntaxTokenList.Add(new KeywordContextualToken(textSpan, LexerUtils.GetSyntaxKindForContextualKeyword(textSpan))); + lexerOutput.SyntaxTokenList.Add(new KeywordContextualToken(textSpan, LexerUtils.GetSyntaxKindForContextualKeyword(textSpan))); return; } - _syntaxTokenList.Add(new KeywordToken(textSpan, LexerUtils.GetSyntaxKindForKeyword(textSpan))); + lexerOutput.SyntaxTokenList.Add(new KeywordToken(textSpan, LexerUtils.GetSyntaxKindForKeyword(textSpan))); return; } - _syntaxTokenList.Add(new IdentifierToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new IdentifierToken(textSpan)); } - public void LexNumericLiteralToken(ref StringWalkerStruct stringWalker) + public static void LexNumericLiteralToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -697,10 +669,10 @@ public void LexNumericLiteralToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new NumericLiteralToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new NumericLiteralToken(textSpan)); } - public void LexCharLiteralToken(ref StringWalkerStruct stringWalker) + public static void LexCharLiteralToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var delimiter = '\''; var escapeCharacter = '\\'; @@ -719,15 +691,12 @@ public void LexCharLiteralToken(ref StringWalkerStruct stringWalker) } else if (stringWalker.CurrentCharacter == escapeCharacter) { - if (EscapeCharacterList is not null) - { - EscapeCharacterList.Add(new TextEditorTextSpan( - stringWalker.PositionIndex, - stringWalker.PositionIndex + 2, - (byte)GenericDecorationKind.EscapeCharacterPrimary, - stringWalker.ResourceUri, - stringWalker.SourceText)); - } + lexerOutput.EscapeCharacterList.Add(new TextEditorTextSpan( + stringWalker.PositionIndex, + stringWalker.PositionIndex + 2, + (byte)GenericDecorationKind.EscapeCharacterPrimary, + stringWalker.ResourceUri, + stringWalker.SourceText)); // Presuming the escaped text is 2 characters, // then read an extra character. @@ -744,10 +713,10 @@ public void LexCharLiteralToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new CharLiteralToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new CharLiteralToken(textSpan)); } - public void LexCommentSingleLineToken(ref StringWalkerStruct stringWalker) + public static void LexCommentSingleLineToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -779,10 +748,10 @@ public void LexCommentSingleLineToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new CommentSingleLineToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new CommentSingleLineToken(textSpan)); } - public void LexCommentMultiLineToken(ref StringWalkerStruct stringWalker) + public static void LexCommentMultiLineToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -821,10 +790,10 @@ public void LexCommentMultiLineToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new CommentMultiLineToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new CommentMultiLineToken(textSpan)); } - public void LexPlusPlusToken(ref StringWalkerStruct stringWalker) + public static void LexPlusPlusToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -840,10 +809,10 @@ public void LexPlusPlusToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new PlusPlusToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new PlusPlusToken(textSpan)); } - public void LexMinusMinusToken(ref StringWalkerStruct stringWalker) + public static void LexMinusMinusToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -859,10 +828,10 @@ public void LexMinusMinusToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new MinusMinusToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new MinusMinusToken(textSpan)); } - public void LexEqualsEqualsToken(ref StringWalkerStruct stringWalker) + public static void LexEqualsEqualsToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -878,10 +847,10 @@ public void LexEqualsEqualsToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new EqualsEqualsToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new EqualsEqualsToken(textSpan)); } - public void LexQuestionMarkQuestionMarkToken(ref StringWalkerStruct stringWalker) + public static void LexQuestionMarkQuestionMarkToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -897,10 +866,10 @@ public void LexQuestionMarkQuestionMarkToken(ref StringWalkerStruct stringWalker stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new QuestionMarkQuestionMarkToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new QuestionMarkQuestionMarkToken(textSpan)); } - public void LexDollarSignToken(ref StringWalkerStruct stringWalker) + public static void LexDollarSignToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -913,10 +882,10 @@ public void LexDollarSignToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new DollarSignToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new DollarSignToken(textSpan)); } - public void LexAtToken(ref StringWalkerStruct stringWalker) + public static void LexAtToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -929,10 +898,10 @@ public void LexAtToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new AtToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new AtToken(textSpan)); } - public void LexPreprocessorDirectiveToken(ref StringWalkerStruct stringWalker) + public static void LexPreprocessorDirectiveToken(ref CSharpLexerOutput lexerOutput, ref StringWalkerStruct stringWalker) { var entryPositionIndex = stringWalker.PositionIndex; @@ -964,6 +933,6 @@ public void LexPreprocessorDirectiveToken(ref StringWalkerStruct stringWalker) stringWalker.ResourceUri, stringWalker.SourceText); - _syntaxTokenList.Add(new PreprocessorDirectiveToken(textSpan)); + lexerOutput.SyntaxTokenList.Add(new PreprocessorDirectiveToken(textSpan)); } } \ No newline at end of file diff --git a/Source/Lib/CompilerServices/CSharp/LexerCase/CSharpLexerOutput.cs b/Source/Lib/CompilerServices/CSharp/LexerCase/CSharpLexerOutput.cs new file mode 100644 index 000000000..dc4dd1f98 --- /dev/null +++ b/Source/Lib/CompilerServices/CSharp/LexerCase/CSharpLexerOutput.cs @@ -0,0 +1,23 @@ +using Luthetus.TextEditor.RazorLib.CompilerServices; +using Luthetus.TextEditor.RazorLib.CompilerServices.Syntax; +using Luthetus.TextEditor.RazorLib.Lexers.Models; + +namespace Luthetus.CompilerServices.CSharp.LexerCase; + +public struct CSharpLexerOutput +{ + public CSharpLexerOutput() + { + #if DEBUG + ++LuthetusDebugSomething.Lexer_ConstructorInvocationCount; + #endif + + SyntaxTokenList = new(); + EscapeCharacterList = new(); + DiagnosticBag = new(); + } + + public List SyntaxTokenList { get; } + public List EscapeCharacterList { get; } + public DiagnosticBag DiagnosticBag { get; } +} diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs index 25920e39d..c1c28a5cc 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs @@ -33,7 +33,7 @@ public void Parse(CSharpCompilationUnit compilationUnit) var diagnosticBag = new DiagnosticBag(); compilationUnit.ParserModel = new CSharpParserModel( - new TokenWalker(compilationUnit.Lexer.SyntaxTokenList, diagnosticBag), + new TokenWalker(compilationUnit.LexerOutput.SyntaxTokenList, diagnosticBag), new Stack(), diagnosticBag, globalCodeBlockBuilder, @@ -240,7 +240,7 @@ public void Parse(CSharpCompilationUnit compilationUnit) var topLevelStatementsCodeBlock = compilationUnit.ParserModel.CurrentCodeBlockBuilder.Build( DiagnosticsList .Union(compilationUnit.Binder.DiagnosticsList) - .Union(compilationUnit.Lexer.DiagnosticList) + .Union(compilationUnit.LexerOutput.DiagnosticBag.ToList()) .ToArray()); compilationUnit.Binder.FinalizeBinderSession(compilationUnit.BinderSession); diff --git a/Source/Lib/CompilerServices/Razor/RazorSyntaxTree.cs b/Source/Lib/CompilerServices/Razor/RazorSyntaxTree.cs index 0612ec5b5..f839c1bcf 100644 --- a/Source/Lib/CompilerServices/Razor/RazorSyntaxTree.cs +++ b/Source/Lib/CompilerServices/Razor/RazorSyntaxTree.cs @@ -103,17 +103,11 @@ public void ParseCodebehind() var classContents = _codebehindClassBuilder.ToString(); - var lexer = new CSharpLexer( - _codebehindResourceUri, - classContents); - - lexer.Lex(); - var compilationUnit = new CSharpCompilationUnit( _codebehindResourceUri, new CSharpBinder()); - compilationUnit.Lexer = lexer; + compilationUnit.LexerOutput = CSharpLexer.Lex(_codebehindResourceUri, classContents); compilationUnit.BinderSession = (CSharpBinderSession)compilationUnit.Binder.StartBinderSession(_codebehindResourceUri); @@ -1377,11 +1371,9 @@ private List ParseCSharp( { var injectedLanguageFragmentSyntaxes = new List(); - var lexer = new CSharpLexer(ResourceUri.Empty, cSharpText); - - lexer.Lex(); + var lexerOutput = CSharpLexer.Lex(ResourceUri.Empty, cSharpText); - foreach (var lexedTokenTextSpan in lexer.SyntaxTokenList.Select(x => x.TextSpan)) + foreach (var lexedTokenTextSpan in lexerOutput.SyntaxTokenList.Select(x => x.TextSpan)) { var startingIndexInclusive = lexedTokenTextSpan.StartingIndexInclusive + offsetPositionIndex - From 2a352d37d1662af8af108b92c2b252f97ac098e4 Mon Sep 17 00:00:00 2001 From: Luthetus <45454132+huntercfreeman@users.noreply.github.com> Date: Sat, 14 Dec 2024 19:53:00 -0500 Subject: [PATCH 4/7] Parser computational state --- .../BinderCase/CSharpBinder.Expressions.cs | 361 +++++----- .../CSharp/BinderCase/CSharpBinder.Main.cs | 26 +- .../CSharpCompilationUnit.cs | 8 +- .../CSharpCompilerService.cs | 3 +- .../ParserCase/CSharpDeferredChildScope.cs | 12 +- .../CSharp/ParserCase/CSharpParser.cs | 459 ++----------- .../CSharp/ParserCase/CSharpParserModel.cs | 6 +- .../ParserCase/CSharpStatementBuilder.cs | 10 +- .../Internals/ParseContextualKeywords.cs | 190 +++--- .../Internals/ParseDefaultKeywords.cs | 550 +++++++-------- .../ParserCase/Internals/ParseFunctions.cs | 85 +-- .../ParserCase/Internals/ParseOthers.cs | 126 ++-- .../ParserCase/Internals/ParseTokens.cs | 628 ++++++++---------- .../CSharp/ParserCase/Internals/ParseTypes.cs | 60 +- .../ParserCase/Internals/ParseVariables.cs | 50 +- .../Internals/TokenWalkerExtensionMethods.cs | 15 +- .../CSharp/ParserCase/Internals/UtilityApi.cs | 16 +- .../CompilerServices/Razor/RazorSyntaxTree.cs | 3 +- 18 files changed, 1122 insertions(+), 1486 deletions(-) diff --git a/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Expressions.cs b/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Expressions.cs index 3463d55fd..925489398 100644 --- a/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Expressions.cs +++ b/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Expressions.cs @@ -27,7 +27,7 @@ public partial class CSharpBinder /// if the parameters were not mergeable. /// public IExpressionNode AnyMergeToken( - IExpressionNode expressionPrimary, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + IExpressionNode expressionPrimary, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { #if DEBUG Console.WriteLine($"{expressionPrimary.SyntaxKind} + {token.SyntaxKind}"); @@ -44,7 +44,8 @@ public IExpressionNode AnyMergeToken( ForceDecisionAmbiguousIdentifier( EmptyExpressionNode.Empty, ambiguousIdentifierExpressionNode, - compilationUnit); + compilationUnit, + ref parserModel); } } @@ -54,37 +55,37 @@ public IExpressionNode AnyMergeToken( switch (expressionPrimary.SyntaxKind) { case SyntaxKind.EmptyExpressionNode: - return EmptyMergeToken((EmptyExpressionNode)expressionPrimary, token, compilationUnit); + return EmptyMergeToken((EmptyExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.LiteralExpressionNode: - return LiteralMergeToken((LiteralExpressionNode)expressionPrimary, token, compilationUnit); + return LiteralMergeToken((LiteralExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.BinaryExpressionNode: - return BinaryMergeToken((BinaryExpressionNode)expressionPrimary, token, compilationUnit); + return BinaryMergeToken((BinaryExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.ParenthesizedExpressionNode: - return ParenthesizedMergeToken((ParenthesizedExpressionNode)expressionPrimary, token, compilationUnit); + return ParenthesizedMergeToken((ParenthesizedExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.CommaSeparatedExpressionNode: - return CommaSeparatedMergeToken((CommaSeparatedExpressionNode)expressionPrimary, token, compilationUnit); + return CommaSeparatedMergeToken((CommaSeparatedExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.FunctionInvocationNode: - return FunctionInvocationMergeToken((FunctionInvocationNode)expressionPrimary, token, compilationUnit); + return FunctionInvocationMergeToken((FunctionInvocationNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.LambdaExpressionNode: - return LambdaMergeToken((LambdaExpressionNode)expressionPrimary, token, compilationUnit); + return LambdaMergeToken((LambdaExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.ConstructorInvocationExpressionNode: - return ConstructorInvocationMergeToken((ConstructorInvocationExpressionNode)expressionPrimary, token, compilationUnit); + return ConstructorInvocationMergeToken((ConstructorInvocationExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.ExplicitCastNode: - return ExplicitCastMergeToken((ExplicitCastNode)expressionPrimary, token, compilationUnit); + return ExplicitCastMergeToken((ExplicitCastNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.AmbiguousIdentifierExpressionNode: - return AmbiguousIdentifierMergeToken((AmbiguousIdentifierExpressionNode)expressionPrimary, token, compilationUnit); + return AmbiguousIdentifierMergeToken((AmbiguousIdentifierExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.TypeClauseNode: - return TypeClauseMergeToken((TypeClauseNode)expressionPrimary, token, compilationUnit); + return TypeClauseMergeToken((TypeClauseNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.VariableAssignmentExpressionNode: - return VariableAssignmentMergeToken((VariableAssignmentExpressionNode)expressionPrimary, token, compilationUnit); + return VariableAssignmentMergeToken((VariableAssignmentExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.GenericParametersListingNode: - return GenericParametersListingMergeToken((GenericParametersListingNode)expressionPrimary, token, compilationUnit); + return GenericParametersListingMergeToken((GenericParametersListingNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.FunctionParametersListingNode: - return FunctionParametersListingMergeToken((FunctionParametersListingNode)expressionPrimary, token, compilationUnit); + return FunctionParametersListingMergeToken((FunctionParametersListingNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.FunctionArgumentsListingNode: - return FunctionArgumentsListingMergeToken((FunctionArgumentsListingNode)expressionPrimary, token, compilationUnit); + return FunctionArgumentsListingMergeToken((FunctionArgumentsListingNode)expressionPrimary, token, compilationUnit, ref parserModel); case SyntaxKind.BadExpressionNode: - return BadMergeToken((BadExpressionNode)expressionPrimary, token, compilationUnit); + return BadMergeToken((BadExpressionNode)expressionPrimary, token, compilationUnit, ref parserModel); default: return new BadExpressionNode(CSharpFacts.Types.Void.ToTypeClause(), expressionPrimary, token); }; @@ -95,7 +96,7 @@ public IExpressionNode AnyMergeToken( /// if the parameters were not mergeable. /// public IExpressionNode AnyMergeExpression( - IExpressionNode expressionPrimary, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + IExpressionNode expressionPrimary, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { #if DEBUG Console.WriteLine($"{expressionPrimary.SyntaxKind} + {expressionSecondary.SyntaxKind}"); @@ -104,36 +105,36 @@ public IExpressionNode AnyMergeExpression( switch (expressionPrimary.SyntaxKind) { case SyntaxKind.ParenthesizedExpressionNode: - return ParenthesizedMergeExpression((ParenthesizedExpressionNode)expressionPrimary, expressionSecondary, compilationUnit); + return ParenthesizedMergeExpression((ParenthesizedExpressionNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.CommaSeparatedExpressionNode: - return CommaSeparatedMergeExpression((CommaSeparatedExpressionNode)expressionPrimary, expressionSecondary, compilationUnit); + return CommaSeparatedMergeExpression((CommaSeparatedExpressionNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.FunctionInvocationNode: - return FunctionInvocationMergeExpression((FunctionInvocationNode)expressionPrimary, expressionSecondary, compilationUnit); + return FunctionInvocationMergeExpression((FunctionInvocationNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.LambdaExpressionNode: - return LambdaMergeExpression((LambdaExpressionNode)expressionPrimary, expressionSecondary, compilationUnit); + return LambdaMergeExpression((LambdaExpressionNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.ConstructorInvocationExpressionNode: - return ConstructorInvocationMergeExpression((ConstructorInvocationExpressionNode)expressionPrimary, expressionSecondary, compilationUnit); + return ConstructorInvocationMergeExpression((ConstructorInvocationExpressionNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.AmbiguousIdentifierExpressionNode: - return AmbiguousIdentifierMergeExpression((AmbiguousIdentifierExpressionNode)expressionPrimary, expressionSecondary, compilationUnit); + return AmbiguousIdentifierMergeExpression((AmbiguousIdentifierExpressionNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.TypeClauseNode: - return TypeClauseMergeExpression((TypeClauseNode)expressionPrimary, expressionSecondary, compilationUnit); + return TypeClauseMergeExpression((TypeClauseNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.VariableAssignmentExpressionNode: - return VariableAssignmentMergeExpression((VariableAssignmentExpressionNode)expressionPrimary, expressionSecondary, compilationUnit); + return VariableAssignmentMergeExpression((VariableAssignmentExpressionNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.GenericParametersListingNode: - return GenericParametersListingMergeExpression((GenericParametersListingNode)expressionPrimary, expressionSecondary, compilationUnit); + return GenericParametersListingMergeExpression((GenericParametersListingNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.FunctionParametersListingNode: - return FunctionParametersListingMergeExpression((FunctionParametersListingNode)expressionPrimary, expressionSecondary, compilationUnit); + return FunctionParametersListingMergeExpression((FunctionParametersListingNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.FunctionArgumentsListingNode: - return FunctionArgumentsListingMergeExpression((FunctionArgumentsListingNode)expressionPrimary, expressionSecondary, compilationUnit); + return FunctionArgumentsListingMergeExpression((FunctionArgumentsListingNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); case SyntaxKind.BadExpressionNode: - return BadMergeExpression((BadExpressionNode)expressionPrimary, expressionSecondary, compilationUnit); + return BadMergeExpression((BadExpressionNode)expressionPrimary, expressionSecondary, compilationUnit, ref parserModel); default: return new BadExpressionNode(CSharpFacts.Types.Void.ToTypeClause(), expressionPrimary, expressionSecondary); }; } public IExpressionNode AmbiguousIdentifierMergeToken( - AmbiguousIdentifierExpressionNode ambiguousIdentifierExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + AmbiguousIdentifierExpressionNode ambiguousIdentifierExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (token.SyntaxKind == SyntaxKind.OpenParenthesisToken && ambiguousIdentifierExpressionNode.Token.SyntaxKind == SyntaxKind.IdentifierToken) @@ -155,8 +156,8 @@ public IExpressionNode AmbiguousIdentifierMergeToken( functionInvocationNode, compilationUnit); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, functionInvocationNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, functionInvocationNode.FunctionParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, functionInvocationNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, functionInvocationNode.FunctionParametersListingNode)); return EmptyExpressionNode.Empty; } else if (token.SyntaxKind == SyntaxKind.OpenAngleBracketToken) @@ -170,8 +171,8 @@ public IExpressionNode AmbiguousIdentifierMergeToken( closeAngleBracketToken: default)); } - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, ambiguousIdentifierExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, ambiguousIdentifierExpressionNode.GenericParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, ambiguousIdentifierExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, ambiguousIdentifierExpressionNode.GenericParametersListingNode)); return EmptyExpressionNode.Empty; } else if (token.SyntaxKind == SyntaxKind.CloseAngleBracketToken) @@ -184,10 +185,10 @@ public IExpressionNode AmbiguousIdentifierMergeToken( } else if (token.SyntaxKind == SyntaxKind.EqualsToken) { - if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) + if (parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) { var lambdaExpressionNode = new LambdaExpressionNode(CSharpFacts.Types.Void.ToTypeClause()); - SetLambdaExpressionNodeVariableDeclarationNodeList(lambdaExpressionNode, ambiguousIdentifierExpressionNode, compilationUnit); + SetLambdaExpressionNodeVariableDeclarationNodeList(lambdaExpressionNode, ambiguousIdentifierExpressionNode, compilationUnit, ref parserModel); return lambdaExpressionNode; } @@ -195,18 +196,18 @@ public IExpressionNode AmbiguousIdentifierMergeToken( if (UtilityApi.IsConvertibleToIdentifierToken(ambiguousIdentifierExpressionNode.Token.SyntaxKind)) { var variableAssignmentNode = new VariableAssignmentExpressionNode( - UtilityApi.ConvertToIdentifierToken(ambiguousIdentifierExpressionNode.Token, compilationUnit), + UtilityApi.ConvertToIdentifierToken(ambiguousIdentifierExpressionNode.Token, compilationUnit, ref parserModel), (EqualsToken)token, EmptyExpressionNode.Empty); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, variableAssignmentNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.EndOfFileToken, variableAssignmentNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, variableAssignmentNode)); + parserModel.ExpressionList.Add((SyntaxKind.EndOfFileToken, variableAssignmentNode)); return EmptyExpressionNode.Empty; } else { - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, ambiguousIdentifierExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, ambiguousIdentifierExpressionNode)); return EmptyExpressionNode.Empty; } } @@ -215,24 +216,25 @@ public IExpressionNode AmbiguousIdentifierMergeToken( ForceDecisionAmbiguousIdentifier( EmptyExpressionNode.Empty, ambiguousIdentifierExpressionNode, - compilationUnit); + compilationUnit, + ref parserModel); - _ = compilationUnit.ParserModel.TokenWalker.Consume(); // Consume the IsTokenKeyword + _ = parserModel.TokenWalker.Consume(); // Consume the IsTokenKeyword - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.NotTokenContextualKeyword) - _ = compilationUnit.ParserModel.TokenWalker.Consume(); // Consume the NotTokenKeyword + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.NotTokenContextualKeyword) + _ = parserModel.TokenWalker.Consume(); // Consume the NotTokenKeyword - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.NullTokenKeyword) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.NullTokenKeyword) { - _ = compilationUnit.ParserModel.TokenWalker.Consume(); // Consume the NullTokenKeyword + _ = parserModel.TokenWalker.Consume(); // Consume the NullTokenKeyword } - else if (UtilityApi.IsConvertibleToIdentifierToken(compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind)) + else if (UtilityApi.IsConvertibleToIdentifierToken(parserModel.TokenWalker.Current.SyntaxKind)) { - ParseTokens.ParseIdentifierToken(compilationUnit); // Parse the type pattern matching / variable declaration + ParseTokens.ParseIdentifierToken(compilationUnit, ref parserModel); // Parse the type pattern matching / variable declaration } // Guaranteed to consume 1 further than the secondary loop so have to backtrack 1 time as well. - _ = compilationUnit.ParserModel.TokenWalker.Backtrack(); + _ = parserModel.TokenWalker.Backtrack(); return ambiguousIdentifierExpressionNode; } @@ -241,42 +243,43 @@ public IExpressionNode AmbiguousIdentifierMergeToken( ForceDecisionAmbiguousIdentifier( EmptyExpressionNode.Empty, ambiguousIdentifierExpressionNode, - compilationUnit); + compilationUnit, + ref parserModel); - if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.OpenBraceToken) + if (parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.OpenBraceToken) { - var withKeywordContextualToken = compilationUnit.ParserModel.TokenWalker.Consume(); + var withKeywordContextualToken = parserModel.TokenWalker.Consume(); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; #endif - var openBraceToken = (OpenBraceToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var openBraceToken = (OpenBraceToken)parserModel.TokenWalker.Consume(); var openBraceCounter = 1; while (true) { - if (compilationUnit.ParserModel.TokenWalker.IsEof) + if (parserModel.TokenWalker.IsEof) break; - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) { ++openBraceCounter; } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseBraceToken) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseBraceToken) { if (--openBraceCounter <= 0) break; } - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } - var closeBraceToken = (CloseBraceToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseBraceToken); + var closeBraceToken = (CloseBraceToken)parserModel.TokenWalker.Match(SyntaxKind.CloseBraceToken); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; #endif } @@ -291,23 +294,25 @@ public IExpressionNode AmbiguousIdentifierMergeToken( var decidedExpression = ForceDecisionAmbiguousIdentifier( EmptyExpressionNode.Empty, ambiguousIdentifierExpressionNode, - compilationUnit); + compilationUnit, + ref parserModel); if (decidedExpression.SyntaxKind != SyntaxKind.TypeClauseNode) { - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException( - compilationUnit.ParserModel.TokenWalker.Current.TextSpan, + parserModel.DiagnosticBag.ReportTodoException( + parserModel.TokenWalker.Current.TextSpan, "if (decidedExpression.SyntaxKind != SyntaxKind.TypeClauseNode)"); return decidedExpression; } - var identifierToken = (IdentifierToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + var identifierToken = (IdentifierToken)parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); var variableDeclarationNode = ParseVariables.HandleVariableDeclarationExpression( (TypeClauseNode)decidedExpression, identifierToken, VariableKind.Local, - compilationUnit); + compilationUnit, + ref parserModel); return variableDeclarationNode; } @@ -316,7 +321,7 @@ public IExpressionNode AmbiguousIdentifierMergeToken( } public IExpressionNode AmbiguousIdentifierMergeExpression( - AmbiguousIdentifierExpressionNode ambiguousIdentifierExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + AmbiguousIdentifierExpressionNode ambiguousIdentifierExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (ambiguousIdentifierExpressionNode.GenericParametersListingNode is not null && !ambiguousIdentifierExpressionNode.GenericParametersListingNode.CloseAngleBracketToken.ConstructorWasInvoked) @@ -331,6 +336,7 @@ public IExpressionNode ForceDecisionAmbiguousIdentifier( IExpressionNode expressionPrimary, AmbiguousIdentifierExpressionNode ambiguousIdentifierExpressionNode, CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel, bool forceVariableReferenceNode = false) { if (ambiguousIdentifierExpressionNode.FollowsMemberAccessToken) @@ -345,7 +351,7 @@ public IExpressionNode ForceDecisionAmbiguousIdentifier( ambiguousIdentifierExpressionNode.Token.TextSpan.GetText(), out var existingVariableDeclarationNode)) { - var identifierToken = UtilityApi.ConvertToIdentifierToken(ambiguousIdentifierExpressionNode.Token, compilationUnit); + var identifierToken = UtilityApi.ConvertToIdentifierToken(ambiguousIdentifierExpressionNode.Token, compilationUnit, ref parserModel); var variableReferenceNode = ConstructAndBindVariableReferenceNode( identifierToken, @@ -365,7 +371,7 @@ public IExpressionNode ForceDecisionAmbiguousIdentifier( ambiguousIdentifierExpressionNode.Token.TextSpan.GetText(), out var typeDefinitionNode)) { - var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(ambiguousIdentifierExpressionNode.Token, compilationUnit); + var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(ambiguousIdentifierExpressionNode.Token, compilationUnit, ref parserModel); BindTypeClauseNode(typeClauseNode, compilationUnit); return typeClauseNode; } @@ -375,7 +381,7 @@ public IExpressionNode ForceDecisionAmbiguousIdentifier( if (!forceVariableReferenceNode || UtilityApi.IsConvertibleToTypeClauseNode(ambiguousIdentifierExpressionNode.Token.SyntaxKind)) { - var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(ambiguousIdentifierExpressionNode.Token, compilationUnit); + var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(ambiguousIdentifierExpressionNode.Token, compilationUnit, ref parserModel); BindTypeClauseNode(typeClauseNode, compilationUnit); return typeClauseNode; } @@ -383,7 +389,7 @@ public IExpressionNode ForceDecisionAmbiguousIdentifier( // Bind an undefined-variable if (UtilityApi.IsConvertibleToIdentifierToken(ambiguousIdentifierExpressionNode.Token.SyntaxKind)) { - var identifierToken = UtilityApi.ConvertToIdentifierToken(ambiguousIdentifierExpressionNode.Token, compilationUnit); + var identifierToken = UtilityApi.ConvertToIdentifierToken(ambiguousIdentifierExpressionNode.Token, compilationUnit, ref parserModel); var variableReferenceNode = ConstructAndBindVariableReferenceNode( identifierToken, @@ -396,21 +402,21 @@ public IExpressionNode ForceDecisionAmbiguousIdentifier( } public IExpressionNode BadMergeToken( - BadExpressionNode badExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + BadExpressionNode badExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { badExpressionNode.SyntaxList.Add(token); return badExpressionNode; } public IExpressionNode BadMergeExpression( - BadExpressionNode badExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + BadExpressionNode badExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { badExpressionNode.SyntaxList.Add(expressionSecondary); return badExpressionNode; } public IExpressionNode BinaryMergeToken( - BinaryExpressionNode binaryExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + BinaryExpressionNode binaryExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { @@ -463,13 +469,13 @@ public IExpressionNode BinaryMergeToken( } public IExpressionNode CommaSeparatedMergeToken( - CommaSeparatedExpressionNode commaSeparatedExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + CommaSeparatedExpressionNode commaSeparatedExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (token.SyntaxKind == SyntaxKind.CommaToken) { if (!commaSeparatedExpressionNode.CloseParenthesisToken.ConstructorWasInvoked) { - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, commaSeparatedExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, commaSeparatedExpressionNode)); return EmptyExpressionNode.Empty; } } @@ -482,9 +488,9 @@ public IExpressionNode CommaSeparatedMergeToken( } public IExpressionNode CommaSeparatedMergeExpression( - CommaSeparatedExpressionNode commaSeparatedExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + CommaSeparatedExpressionNode commaSeparatedExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken || compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseParenthesisToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken || parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseParenthesisToken) { commaSeparatedExpressionNode.AddInnerExpressionNode(expressionSecondary); return commaSeparatedExpressionNode; @@ -494,7 +500,7 @@ public IExpressionNode CommaSeparatedMergeExpression( } public IExpressionNode ConstructorInvocationMergeToken( - ConstructorInvocationExpressionNode constructorInvocationExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + ConstructorInvocationExpressionNode constructorInvocationExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { @@ -503,7 +509,7 @@ public IExpressionNode ConstructorInvocationMergeToken( { if (UtilityApi.IsConvertibleToTypeClauseNode(token.SyntaxKind)) { - var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(token, compilationUnit); + var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(token, compilationUnit, ref parserModel); BindTypeClauseNode( typeClauseNode, @@ -523,8 +529,8 @@ public IExpressionNode ConstructorInvocationMergeToken( constructorInvocationExpressionNode.SetFunctionParametersListingNode(functionParametersListingNode); constructorInvocationExpressionNode.ConstructorInvocationStageKind = ConstructorInvocationStageKind.FunctionParameters; - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, constructorInvocationExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode.FunctionParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, constructorInvocationExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode.FunctionParametersListingNode)); return EmptyExpressionNode.Empty; case SyntaxKind.CloseParenthesisToken: if (constructorInvocationExpressionNode.FunctionParametersListingNode is not null) @@ -547,8 +553,8 @@ public IExpressionNode ConstructorInvocationMergeToken( } constructorInvocationExpressionNode.ConstructorInvocationStageKind = ConstructorInvocationStageKind.GenericParameters; - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, constructorInvocationExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode.ResultTypeClauseNode.GenericParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, constructorInvocationExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode.ResultTypeClauseNode.GenericParametersListingNode)); return EmptyExpressionNode.Empty; case SyntaxKind.CloseAngleBracketToken: constructorInvocationExpressionNode.ConstructorInvocationStageKind = ConstructorInvocationStageKind.Unset; @@ -563,9 +569,9 @@ public IExpressionNode ConstructorInvocationMergeToken( constructorInvocationExpressionNode.SetObjectInitializationParametersListingNode(objectInitializationParametersListingNode); constructorInvocationExpressionNode.ConstructorInvocationStageKind = ConstructorInvocationStageKind.ObjectInitializationParameters; - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseBraceToken, constructorInvocationExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.EqualsToken, constructorInvocationExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseBraceToken, constructorInvocationExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.EqualsToken, constructorInvocationExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode)); return EmptyExpressionNode.Empty; case SyntaxKind.CloseBraceToken: constructorInvocationExpressionNode.ConstructorInvocationStageKind = ConstructorInvocationStageKind.Unset; @@ -580,8 +586,8 @@ public IExpressionNode ConstructorInvocationMergeToken( goto default; } case SyntaxKind.EqualsToken: - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.EqualsToken, constructorInvocationExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.EqualsToken, constructorInvocationExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode)); if (constructorInvocationExpressionNode.ConstructorInvocationStageKind == ConstructorInvocationStageKind.ObjectInitializationParameters && constructorInvocationExpressionNode.ObjectInitializationParametersListingNode is not null) @@ -600,7 +606,7 @@ public IExpressionNode ConstructorInvocationMergeToken( goto default; case SyntaxKind.CommaToken: - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, constructorInvocationExpressionNode)); return EmptyExpressionNode.Empty; default: return new BadExpressionNode(CSharpFacts.Types.Void.ToTypeClause(), constructorInvocationExpressionNode, token); @@ -608,7 +614,7 @@ public IExpressionNode ConstructorInvocationMergeToken( } public IExpressionNode ConstructorInvocationMergeExpression( - ConstructorInvocationExpressionNode constructorInvocationExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + ConstructorInvocationExpressionNode constructorInvocationExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (constructorInvocationExpressionNode.ConstructorInvocationStageKind != ConstructorInvocationStageKind.ObjectInitializationParameters && expressionSecondary.SyntaxKind == SyntaxKind.AmbiguousIdentifierExpressionNode) @@ -616,7 +622,8 @@ public IExpressionNode ConstructorInvocationMergeExpression( expressionSecondary = ForceDecisionAmbiguousIdentifier( constructorInvocationExpressionNode, (AmbiguousIdentifierExpressionNode)expressionSecondary, - compilationUnit); + compilationUnit, + ref parserModel); } if (expressionSecondary.SyntaxKind == SyntaxKind.EmptyExpressionNode) @@ -666,8 +673,8 @@ public IExpressionNode ConstructorInvocationMergeExpression( // This feels like hacky nonsense. // It allows for ObjectInitialization and CollectionInitialization // to use the same node but why not just use separate nodes? - var currentTokenIsComma = compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken; - var currentTokenIsBrace = compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseBraceToken; + var currentTokenIsComma = parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken; + var currentTokenIsBrace = parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseBraceToken; if (!objectInitializationParameterEntryNode.PropertyIdentifierToken.ConstructorWasInvoked && (!currentTokenIsComma && !currentTokenIsBrace)) @@ -710,7 +717,8 @@ public IExpressionNode ConstructorInvocationMergeExpression( expressionSecondary = ForceDecisionAmbiguousIdentifier( constructorInvocationExpressionNode, (AmbiguousIdentifierExpressionNode)expressionSecondary, - compilationUnit); + compilationUnit, + ref parserModel); } objectInitializationParameterEntryNode.ExpressionNode = expressionSecondary; @@ -744,7 +752,7 @@ public IExpressionNode ConstructorInvocationMergeExpression( } public IExpressionNode EmptyMergeToken( - EmptyExpressionNode emptyExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + EmptyExpressionNode emptyExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (UtilityApi.IsConvertibleToTypeClauseNode(token.SyntaxKind)) { @@ -756,13 +764,14 @@ public IExpressionNode EmptyMergeToken( FollowsMemberAccessToken = emptyExpressionNode.FollowsMemberAccessToken }; - if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.StatementDelimiterToken && !ambiguousExpressionNode.FollowsMemberAccessToken || - compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Contains(SyntaxKind.TypeClauseNode) && compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind != SyntaxKind.WithTokenContextualKeyword) + if (parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.StatementDelimiterToken && !ambiguousExpressionNode.FollowsMemberAccessToken || + parserModel.TryParseExpressionSyntaxKindList.Contains(SyntaxKind.TypeClauseNode) && parserModel.TokenWalker.Next.SyntaxKind != SyntaxKind.WithTokenContextualKeyword) { return ForceDecisionAmbiguousIdentifier( emptyExpressionNode, ambiguousExpressionNode, - compilationUnit); + compilationUnit, + ref parserModel); } return ambiguousExpressionNode; @@ -791,8 +800,8 @@ public IExpressionNode EmptyMergeToken( return new LiteralExpressionNode(token, tokenTypeClauseNode); case SyntaxKind.OpenParenthesisToken: var parenthesizedExpressionNode = new ParenthesizedExpressionNode((OpenParenthesisToken)token, CSharpFacts.Types.Void.ToTypeClause()); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, parenthesizedExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, parenthesizedExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, parenthesizedExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, parenthesizedExpressionNode)); return EmptyExpressionNode.Empty; case SyntaxKind.NewTokenKeyword: return new ConstructorInvocationExpressionNode( @@ -810,10 +819,10 @@ public IExpressionNode EmptyMergeToken( return emptyExpressionNode; case SyntaxKind.OutTokenKeyword: - if (UtilityApi.IsConvertibleToIdentifierToken(compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind)) + if (UtilityApi.IsConvertibleToIdentifierToken(parserModel.TokenWalker.Current.SyntaxKind)) { // Parse the variable reference / variable declaration - ParseTokens.ParseIdentifierToken(compilationUnit); + ParseTokens.ParseIdentifierToken(compilationUnit, ref parserModel); } return emptyExpressionNode; @@ -826,8 +835,8 @@ public IExpressionNode EmptyMergeToken( new List(), closeAngleBracketToken: default); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, genericParametersListingNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, genericParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, genericParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, genericParametersListingNode)); return EmptyExpressionNode.Empty; default: return new BadExpressionNode(CSharpFacts.Types.Void.ToTypeClause(), emptyExpressionNode, token); @@ -835,7 +844,7 @@ public IExpressionNode EmptyMergeToken( } public IExpressionNode ExplicitCastMergeToken( - ExplicitCastNode explicitCastNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + ExplicitCastNode explicitCastNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { @@ -853,12 +862,12 @@ public IExpressionNode ExplicitCastMergeToken( } public IExpressionNode GenericParametersListingMergeToken( - GenericParametersListingNode genericParametersListingNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + GenericParametersListingNode genericParametersListingNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { case SyntaxKind.CommaToken: - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, genericParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, genericParametersListingNode)); return EmptyExpressionNode.Empty; case SyntaxKind.CloseAngleBracketToken: // This case only occurs when the text won't compile. @@ -866,7 +875,7 @@ public IExpressionNode GenericParametersListingMergeToken( // The case is for when the user types just the generic parameter listing text without an identifier before it. // // In the case of "SomeMethod()", the FunctionInvocationNode - // is expected to have ran 'compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, functionInvocationNode));' + // is expected to have ran 'parserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, functionInvocationNode));' // to receive the genericParametersListingNode. return genericParametersListingNode; default: @@ -875,7 +884,7 @@ public IExpressionNode GenericParametersListingMergeToken( } public IExpressionNode GenericParametersListingMergeExpression( - GenericParametersListingNode genericParametersListingNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + GenericParametersListingNode genericParametersListingNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (expressionSecondary.SyntaxKind == SyntaxKind.EmptyExpressionNode) return genericParametersListingNode; @@ -884,7 +893,7 @@ public IExpressionNode GenericParametersListingMergeExpression( { var expressionSecondaryTyped = (AmbiguousIdentifierExpressionNode)expressionSecondary; - var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(expressionSecondaryTyped.Token, compilationUnit); + var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(expressionSecondaryTyped.Token, compilationUnit, ref parserModel); BindTypeClauseNode( typeClauseNode, @@ -929,12 +938,12 @@ public IExpressionNode GenericParametersListingMergeExpression( } public IExpressionNode FunctionParametersListingMergeToken( - FunctionParametersListingNode functionParametersListingNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + FunctionParametersListingNode functionParametersListingNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { case SyntaxKind.CommaToken: - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, functionParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, functionParametersListingNode)); return EmptyExpressionNode.Empty; default: return new BadExpressionNode(CSharpFacts.Types.Void.ToTypeClause(), functionParametersListingNode, token); @@ -942,7 +951,7 @@ public IExpressionNode FunctionParametersListingMergeToken( } public IExpressionNode FunctionParametersListingMergeExpression( - FunctionParametersListingNode functionParametersListingNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + FunctionParametersListingNode functionParametersListingNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (expressionSecondary.SyntaxKind == SyntaxKind.EmptyExpressionNode) return functionParametersListingNode; @@ -952,7 +961,8 @@ public IExpressionNode FunctionParametersListingMergeExpression( expressionSecondary = ForceDecisionAmbiguousIdentifier( functionParametersListingNode, (AmbiguousIdentifierExpressionNode)expressionSecondary, - compilationUnit); + compilationUnit, + ref parserModel); } var functionParameterEntryNode = new FunctionParameterEntryNode( @@ -967,12 +977,12 @@ public IExpressionNode FunctionParametersListingMergeExpression( } public IExpressionNode FunctionArgumentsListingMergeToken( - FunctionArgumentsListingNode functionArgumentsListingNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + FunctionArgumentsListingNode functionArgumentsListingNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { case SyntaxKind.CommaToken: - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, functionArgumentsListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, functionArgumentsListingNode)); return EmptyExpressionNode.Empty; default: return new BadExpressionNode(CSharpFacts.Types.Void.ToTypeClause(), functionArgumentsListingNode, token); @@ -980,7 +990,7 @@ public IExpressionNode FunctionArgumentsListingMergeToken( } public IExpressionNode FunctionArgumentsListingMergeExpression( - FunctionArgumentsListingNode functionArgumentsListingNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + FunctionArgumentsListingNode functionArgumentsListingNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (expressionSecondary.SyntaxKind == SyntaxKind.EmptyExpressionNode) return functionArgumentsListingNode; @@ -990,7 +1000,8 @@ public IExpressionNode FunctionArgumentsListingMergeExpression( expressionSecondary = ForceDecisionAmbiguousIdentifier( functionArgumentsListingNode, (AmbiguousIdentifierExpressionNode)expressionSecondary, - compilationUnit); + compilationUnit, + ref parserModel); } var functionArgumentEntryNode = new FunctionArgumentEntryNode( @@ -1008,14 +1019,14 @@ public IExpressionNode FunctionArgumentsListingMergeExpression( } public IExpressionNode LambdaMergeToken( - LambdaExpressionNode lambdaExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + LambdaExpressionNode lambdaExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (token.SyntaxKind == SyntaxKind.CloseAngleBracketToken) { int startInclusiveIndex; - if (compilationUnit.ParserModel.TokenWalker.Previous.SyntaxKind == SyntaxKind.EqualsToken) - startInclusiveIndex = compilationUnit.ParserModel.TokenWalker.Previous.TextSpan.StartingIndexInclusive; + if (parserModel.TokenWalker.Previous.SyntaxKind == SyntaxKind.EqualsToken) + startInclusiveIndex = parserModel.TokenWalker.Previous.TextSpan.StartingIndexInclusive; else startInclusiveIndex = token.TextSpan.StartingIndexInclusive; @@ -1031,16 +1042,16 @@ public IExpressionNode LambdaMergeToken( ((CSharpBinder)compilationUnit.Binder).AddSymbolDefinition( new LambdaSymbol(textSpan, lambdaExpressionNode), compilationUnit); - if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.OpenBraceToken) + if (parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.OpenBraceToken) { lambdaExpressionNode.CodeBlockNodeIsExpression = false; - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseBraceToken, lambdaExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.StatementDelimiterToken, lambdaExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseBraceToken, lambdaExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.StatementDelimiterToken, lambdaExpressionNode)); return EmptyExpressionNode.Empty; } - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.StatementDelimiterToken, lambdaExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.StatementDelimiterToken, lambdaExpressionNode)); return EmptyExpressionNode.Empty; } else if (token.SyntaxKind == SyntaxKind.StatementDelimiterToken) @@ -1051,7 +1062,7 @@ public IExpressionNode LambdaMergeToken( } else { - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.StatementDelimiterToken, lambdaExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.StatementDelimiterToken, lambdaExpressionNode)); return EmptyExpressionNode.Empty; } } @@ -1075,8 +1086,8 @@ public IExpressionNode LambdaMergeToken( else { lambdaExpressionNode.HasReadParameters = true; - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, lambdaExpressionNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, lambdaExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, lambdaExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, lambdaExpressionNode)); return EmptyExpressionNode.Empty; } } @@ -1086,14 +1097,14 @@ public IExpressionNode LambdaMergeToken( } else if (token.SyntaxKind == SyntaxKind.EqualsToken) { - if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) + if (parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) return lambdaExpressionNode; return new BadExpressionNode(CSharpFacts.Types.Void.ToTypeClause(), lambdaExpressionNode, token); } else if (token.SyntaxKind == SyntaxKind.CommaToken) { - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, lambdaExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, lambdaExpressionNode)); return EmptyExpressionNode.Empty; } else if (token.SyntaxKind == SyntaxKind.IdentifierToken) @@ -1115,7 +1126,7 @@ public IExpressionNode LambdaMergeToken( } public IExpressionNode LambdaMergeExpression( - LambdaExpressionNode lambdaExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + LambdaExpressionNode lambdaExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (expressionSecondary.SyntaxKind) { @@ -1133,7 +1144,7 @@ public IExpressionNode LambdaMergeExpression( /// they are much higher priority. /// public IExpressionNode LiteralMergeToken( - LiteralExpressionNode literalExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + LiteralExpressionNode literalExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { @@ -1151,7 +1162,7 @@ public IExpressionNode LiteralMergeToken( } public IExpressionNode ParenthesizedMergeToken( - ParenthesizedExpressionNode parenthesizedExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + ParenthesizedExpressionNode parenthesizedExpressionNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { @@ -1160,15 +1171,15 @@ public IExpressionNode ParenthesizedMergeToken( { var typeClauseNode = (TypeClauseNode)parenthesizedExpressionNode.InnerExpression; var explicitCastNode = new ExplicitCastNode(parenthesizedExpressionNode.OpenParenthesisToken, typeClauseNode); - return ExplicitCastMergeToken(explicitCastNode, token, compilationUnit); + return ExplicitCastMergeToken(explicitCastNode, token, compilationUnit, ref parserModel); } return parenthesizedExpressionNode.SetCloseParenthesisToken((CloseParenthesisToken)token); case SyntaxKind.EqualsToken: - if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) + if (parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) { var lambdaExpressionNode = new LambdaExpressionNode(CSharpFacts.Types.Void.ToTypeClause()); - SetLambdaExpressionNodeVariableDeclarationNodeList(lambdaExpressionNode, parenthesizedExpressionNode.InnerExpression, compilationUnit); + SetLambdaExpressionNodeVariableDeclarationNodeList(lambdaExpressionNode, parenthesizedExpressionNode.InnerExpression, compilationUnit, ref parserModel); return lambdaExpressionNode; } @@ -1179,26 +1190,26 @@ public IExpressionNode ParenthesizedMergeToken( } public IExpressionNode ParenthesizedMergeExpression( - ParenthesizedExpressionNode parenthesizedExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + ParenthesizedExpressionNode parenthesizedExpressionNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.TokenWalker.Peek(1).SyntaxKind == SyntaxKind.EqualsToken && - compilationUnit.ParserModel.TokenWalker.Peek(2).SyntaxKind == SyntaxKind.CloseAngleBracketToken) + if (parserModel.TokenWalker.Peek(1).SyntaxKind == SyntaxKind.EqualsToken && + parserModel.TokenWalker.Peek(2).SyntaxKind == SyntaxKind.CloseAngleBracketToken) { var lambdaExpressionNode = new LambdaExpressionNode(CSharpFacts.Types.Void.ToTypeClause()); - return SetLambdaExpressionNodeVariableDeclarationNodeList(lambdaExpressionNode, expressionSecondary, compilationUnit); + return SetLambdaExpressionNodeVariableDeclarationNodeList(lambdaExpressionNode, expressionSecondary, compilationUnit, ref parserModel); } if (expressionSecondary.SyntaxKind == SyntaxKind.AmbiguousIdentifierExpressionNode) - expressionSecondary = ForceDecisionAmbiguousIdentifier(parenthesizedExpressionNode, (AmbiguousIdentifierExpressionNode)expressionSecondary, compilationUnit); + expressionSecondary = ForceDecisionAmbiguousIdentifier(parenthesizedExpressionNode, (AmbiguousIdentifierExpressionNode)expressionSecondary, compilationUnit, ref parserModel); - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken) { - compilationUnit.ParserModel.NoLongerRelevantExpressionNode = parenthesizedExpressionNode; + parserModel.NoLongerRelevantExpressionNode = parenthesizedExpressionNode; var commaSeparatedExpressionNode = new CommaSeparatedExpressionNode(); commaSeparatedExpressionNode.AddInnerExpressionNode(expressionSecondary); // commaSeparatedExpressionNode never saw the 'OpenParenthesisToken' so the 'ParenthesizedExpressionNode // has to create the ExpressionList entry on behalf of the 'CommaSeparatedExpressionNode'. - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, commaSeparatedExpressionNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, commaSeparatedExpressionNode)); return commaSeparatedExpressionNode; } @@ -1226,7 +1237,7 @@ public IExpressionNode ParenthesizedMergeExpression( } public IExpressionNode TypeClauseMergeToken( - TypeClauseNode typeClauseNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + TypeClauseNode typeClauseNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { @@ -1240,8 +1251,8 @@ public IExpressionNode TypeClauseMergeToken( closeAngleBracketToken: default)); } - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, typeClauseNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, typeClauseNode.GenericParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseAngleBracketToken, typeClauseNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, typeClauseNode.GenericParametersListingNode)); return EmptyExpressionNode.Empty; case SyntaxKind.CloseAngleBracketToken: if (typeClauseNode.GenericParametersListingNode is not null) @@ -1269,7 +1280,7 @@ public IExpressionNode TypeClauseMergeToken( closeParenthesisToken: default); var functionInvocationNode = new FunctionInvocationNode( - UtilityApi.ConvertToIdentifierToken(typeClauseNode.TypeIdentifierToken, compilationUnit), + UtilityApi.ConvertToIdentifierToken(typeClauseNode.TypeIdentifierToken, compilationUnit, ref parserModel), functionDefinitionNode: null, typeClauseNode.GenericParametersListingNode, functionParametersListingNode, @@ -1279,8 +1290,8 @@ public IExpressionNode TypeClauseMergeToken( functionInvocationNode, compilationUnit); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, functionInvocationNode)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, functionInvocationNode.FunctionParametersListingNode)); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, functionInvocationNode)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, functionInvocationNode.FunctionParametersListingNode)); return EmptyExpressionNode.Empty; } @@ -1291,10 +1302,10 @@ public IExpressionNode TypeClauseMergeToken( default: if (UtilityApi.IsConvertibleToIdentifierToken(token.SyntaxKind)) { - var identifierToken = UtilityApi.ConvertToIdentifierToken(token, compilationUnit); + var identifierToken = UtilityApi.ConvertToIdentifierToken(token, compilationUnit, ref parserModel); var isRootExpression = true; - foreach (var tuple in compilationUnit.ParserModel.ExpressionList) + foreach (var tuple in parserModel.ExpressionList) { if (tuple.ExpressionNode is null) continue; @@ -1328,7 +1339,8 @@ public IExpressionNode TypeClauseMergeToken( typeClauseNode, identifierToken, VariableKind.Local, - compilationUnit); + compilationUnit, + ref parserModel); } return variableDeclarationNode; @@ -1339,7 +1351,7 @@ public IExpressionNode TypeClauseMergeToken( } public IExpressionNode TypeClauseMergeExpression( - TypeClauseNode typeClauseNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + TypeClauseNode typeClauseNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (expressionSecondary.SyntaxKind) { @@ -1357,13 +1369,13 @@ public IExpressionNode TypeClauseMergeExpression( } public IExpressionNode VariableAssignmentMergeToken( - VariableAssignmentExpressionNode variableAssignmentNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + VariableAssignmentExpressionNode variableAssignmentNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { return variableAssignmentNode; } public IExpressionNode VariableAssignmentMergeExpression( - VariableAssignmentExpressionNode variableAssignmentNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + VariableAssignmentExpressionNode variableAssignmentNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (variableAssignmentNode.ExpressionNode == EmptyExpressionNode.Empty) { @@ -1377,7 +1389,7 @@ public IExpressionNode VariableAssignmentMergeExpression( } public IExpressionNode FunctionInvocationMergeToken( - FunctionInvocationNode functionInvocationNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit) + FunctionInvocationNode functionInvocationNode, ISyntaxToken token, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { switch (token.SyntaxKind) { @@ -1390,11 +1402,11 @@ public IExpressionNode FunctionInvocationMergeToken( } public IExpressionNode FunctionInvocationMergeExpression( - FunctionInvocationNode functionInvocationNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit) + FunctionInvocationNode functionInvocationNode, IExpressionNode expressionSecondary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (expressionSecondary.SyntaxKind == SyntaxKind.AmbiguousIdentifierExpressionNode) { - expressionSecondary = ForceDecisionAmbiguousIdentifier(functionInvocationNode, (AmbiguousIdentifierExpressionNode)expressionSecondary, compilationUnit); + expressionSecondary = ForceDecisionAmbiguousIdentifier(functionInvocationNode, (AmbiguousIdentifierExpressionNode)expressionSecondary, compilationUnit, ref parserModel); } switch (expressionSecondary.SyntaxKind) @@ -1409,7 +1421,7 @@ public IExpressionNode FunctionInvocationMergeExpression( } public IExpressionNode SetLambdaExpressionNodeVariableDeclarationNodeList( - LambdaExpressionNode lambdaExpressionNode, IExpressionNode expressionNode, CSharpCompilationUnit compilationUnit) + LambdaExpressionNode lambdaExpressionNode, IExpressionNode expressionNode, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (expressionNode.SyntaxKind == SyntaxKind.BadExpressionNode) { @@ -1421,7 +1433,7 @@ public IExpressionNode SetLambdaExpressionNodeVariableDeclarationNodeList( { var ambiguousIdentifierExpressionNode = (AmbiguousIdentifierExpressionNode)badExpressionNode.SyntaxList[0]; - var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(ambiguousIdentifierExpressionNode.Token, compilationUnit); + var typeClauseNode = UtilityApi.ConvertToTypeClauseNode(ambiguousIdentifierExpressionNode.Token, compilationUnit, ref parserModel); BindTypeClauseNode( typeClauseNode, @@ -1433,7 +1445,8 @@ public IExpressionNode SetLambdaExpressionNodeVariableDeclarationNodeList( typeClauseNode, identifierToken, VariableKind.Local, - compilationUnit); + compilationUnit, + ref parserModel); lambdaExpressionNode.AddVariableDeclarationNode(variableDeclarationNode); } @@ -1463,7 +1476,7 @@ public IExpressionNode SetLambdaExpressionNodeVariableDeclarationNodeList( if (firstSyntax.SyntaxKind == SyntaxKind.AmbiguousIdentifierExpressionNode) { var ambiguousIdentifierExpressionNode = (AmbiguousIdentifierExpressionNode)firstSyntax; - typeClauseNode = UtilityApi.ConvertToTypeClauseNode(ambiguousIdentifierExpressionNode.Token, compilationUnit); + typeClauseNode = UtilityApi.ConvertToTypeClauseNode(ambiguousIdentifierExpressionNode.Token, compilationUnit, ref parserModel); BindTypeClauseNode( typeClauseNode, @@ -1518,7 +1531,8 @@ public IExpressionNode SetLambdaExpressionNodeVariableDeclarationNodeList( typeClauseNode, (IdentifierToken)variableIdentifier, VariableKind.Local, - compilationUnit); + compilationUnit, + ref parserModel); lambdaExpressionNode.AddVariableDeclarationNode(variableDeclarationNode); } @@ -1535,7 +1549,8 @@ public IExpressionNode SetLambdaExpressionNodeVariableDeclarationNodeList( TypeFacts.Empty.ToTypeClause(), (IdentifierToken)token, VariableKind.Local, - compilationUnit); + compilationUnit, + ref parserModel); lambdaExpressionNode.AddVariableDeclarationNode(variableDeclarationNode); } @@ -1547,24 +1562,24 @@ public IExpressionNode SetLambdaExpressionNodeVariableDeclarationNodeList( /// A ParenthesizedExpressionNode expression will "become" a CommaSeparatedExpressionNode /// upon encounter a CommaToken within its parentheses. /// - /// An issue arises however, because the compilationUnit.ParserModel.ExpressionList still says to + /// An issue arises however, because the parserModel.ExpressionList still says to /// "short circuit" when the CloseParenthesisToken is encountered, /// and to at this point make the ParenthesizedExpressionNode the primary expression. /// /// Well, the ParenthesizedExpressionNode should no longer exist, it was deemed /// to be more accurately described by a CommaSeparatedExpressionNode. /// - /// So, this method will remove any entries in the compilationUnit.ParserModel.ExpressionList + /// So, this method will remove any entries in the parserModel.ExpressionList /// that have the 'ParenthesizedExpressionNode' as the to-be primary expression. /// - public void ClearFromExpressionList(IExpressionNode expressionNode, CSharpCompilationUnit compilationUnit) + public void ClearFromExpressionList(IExpressionNode expressionNode, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - for (int i = compilationUnit.ParserModel.ExpressionList.Count - 1; i > -1; i--) + for (int i = parserModel.ExpressionList.Count - 1; i > -1; i--) { - var delimiterExpressionTuple = compilationUnit.ParserModel.ExpressionList[i]; + var delimiterExpressionTuple = parserModel.ExpressionList[i]; if (Object.ReferenceEquals(expressionNode, delimiterExpressionTuple.ExpressionNode)) - compilationUnit.ParserModel.ExpressionList.RemoveAt(i); + parserModel.ExpressionList.RemoveAt(i); } } } diff --git a/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Main.cs b/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Main.cs index c77fe43a4..06042e1f5 100644 --- a/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Main.cs +++ b/Source/Lib/CompilerServices/CSharp/BinderCase/CSharpBinder.Main.cs @@ -127,7 +127,8 @@ public void FinalizeBinderSession(CSharpBinderSession binderSession) public LiteralExpressionNode BindLiteralExpressionNode( LiteralExpressionNode literalExpressionNode, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { TypeClauseNode typeClauseNode; @@ -144,7 +145,7 @@ public LiteralExpressionNode BindLiteralExpressionNode( break; default: typeClauseNode = CSharpFacts.Types.Void.ToTypeClause(); - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException(literalExpressionNode.LiteralSyntaxToken.TextSpan, $"{nameof(BindLiteralExpressionNode)}(...) failed to map SyntaxKind: '{literalExpressionNode.LiteralSyntaxToken.SyntaxKind}'"); + parserModel.DiagnosticBag.ReportTodoException(literalExpressionNode.LiteralSyntaxToken.TextSpan, $"{nameof(BindLiteralExpressionNode)}(...) failed to map SyntaxKind: '{literalExpressionNode.LiteralSyntaxToken.SyntaxKind}'"); break; } @@ -157,7 +158,8 @@ public BinaryOperatorNode BindBinaryOperatorNode( IExpressionNode leftExpressionNode, ISyntaxToken operatorToken, IExpressionNode rightExpressionNode, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { var problematicTextSpan = (TextEditorTextSpan?)null; @@ -213,7 +215,7 @@ public BinaryOperatorNode BindBinaryOperatorNode( $" for types: {leftExpressionNode.ConstructTextSpanRecursively().GetText()}" + $" and {rightExpressionNode.ConstructTextSpanRecursively().GetText()}"; - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException(problematicTextSpan.Value, errorMessage); + parserModel.DiagnosticBag.ReportTodoException(problematicTextSpan.Value, errorMessage); } return new BinaryOperatorNode( @@ -380,14 +382,15 @@ public void BindConstructorInvocationNode() public InheritanceStatementNode BindInheritanceStatementNode( TypeClauseNode typeClauseNode, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { AddSymbolReference(new TypeSymbol(typeClauseNode.TypeIdentifierToken.TextSpan with { DecorationByte = (byte)GenericDecorationKind.Type }), compilationUnit); - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException( + parserModel.DiagnosticBag.ReportTodoException( typeClauseNode.TypeIdentifierToken.TextSpan, $"Implement {nameof(BindInheritanceStatementNode)}"); @@ -692,7 +695,8 @@ public void AddNamespaceToCurrentScope( public void CloseScope( TextEditorTextSpan textSpan, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { // Check if it is the global scope, if so return early. { @@ -700,10 +704,10 @@ public void CloseScope( return; } - var inBuilder = compilationUnit.ParserModel.CurrentCodeBlockBuilder; + var inBuilder = parserModel.CurrentCodeBlockBuilder; var inOwner = inBuilder.CodeBlockOwner; - var outBuilder = compilationUnit.ParserModel.CurrentCodeBlockBuilder.Parent; + var outBuilder = parserModel.CurrentCodeBlockBuilder.Parent; var outOwner = outBuilder?.CodeBlockOwner; // Update Scope @@ -722,7 +726,7 @@ public void CloseScope( // Update CodeBlockOwner if (inOwner is not null) { - inOwner.SetCodeBlockNode(inBuilder.Build(), compilationUnit.ParserModel.DiagnosticBag, compilationUnit.ParserModel.TokenWalker); + inOwner.SetCodeBlockNode(inBuilder.Build(), parserModel.DiagnosticBag, parserModel.TokenWalker); if (inOwner.SyntaxKind == SyntaxKind.NamespaceStatementNode) compilationUnit.Binder.BindNamespaceStatementNode((NamespaceStatementNode)inOwner, compilationUnit); @@ -732,7 +736,7 @@ public void CloseScope( // Restore Parent CodeBlockBuilder if (outBuilder is not null) { - compilationUnit.ParserModel.CurrentCodeBlockBuilder = outBuilder; + parserModel.CurrentCodeBlockBuilder = outBuilder; outBuilder.InnerPendingCodeBlockOwner = null; if (inOwner.SyntaxKind != SyntaxKind.TryStatementTryNode && diff --git a/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilationUnit.cs b/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilationUnit.cs index 4977b1557..edb1d0240 100644 --- a/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilationUnit.cs +++ b/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilationUnit.cs @@ -22,10 +22,12 @@ public CSharpCompilationUnit( public ResourceUri ResourceUri { get; set; } public CSharpLexerOutput LexerOutput { get; set; } - public CSharpParser Parser { get; set; } - public CSharpParserModel ParserModel { get; set; } public CSharpBinder Binder { get; set; } public CSharpBinderSession BinderSession { get; set; } public CodeBlockNode RootCodeBlockNode { get; set; } + + /// + /// This seems to no longer get set (noticed this on 2024-12-14). + /// public ImmutableArray DiagnosticsList { get; init; } -} \ No newline at end of file +} diff --git a/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilerService.cs b/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilerService.cs index a37147353..4972674e1 100644 --- a/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilerService.cs +++ b/Source/Lib/CompilerServices/CSharp/CompilerServiceCase/CSharpCompilerService.cs @@ -82,8 +82,7 @@ public override Task ParseAsync(ITextEditorEditContext editContext, TextEditorMo try { cSharpCompilationUnit.BinderSession = (CSharpBinderSession)CSharpBinder.StartBinderSession(resourceUri); - var parser = new CSharpParser(); - parser.Parse(cSharpCompilationUnit); + CSharpParser.Parse(cSharpCompilationUnit); } finally { diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpDeferredChildScope.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpDeferredChildScope.cs index 9fd99b18e..f56ec6140 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpDeferredChildScope.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpDeferredChildScope.cs @@ -23,19 +23,19 @@ public CSharpDeferredChildScope( public int TokenIndexToRestore { get; private set; } - public void PrepareMainParserLoop(int tokenIndexToRestore, CSharpCompilationUnit compilationUnit) + public void PrepareMainParserLoop(int tokenIndexToRestore, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { TokenIndexToRestore = tokenIndexToRestore; - compilationUnit.ParserModel.CurrentCodeBlockBuilder.PermitInnerPendingCodeBlockOwnerToBeParsed = true; + parserModel.CurrentCodeBlockBuilder.PermitInnerPendingCodeBlockOwnerToBeParsed = true; - compilationUnit.ParserModel.CurrentCodeBlockBuilder.DequeuedIndexForChildList = null; + parserModel.CurrentCodeBlockBuilder.DequeuedIndexForChildList = null; - compilationUnit.ParserModel.TokenWalker.DeferredParsing( + parserModel.TokenWalker.DeferredParsing( OpenTokenIndex, CloseTokenIndex, TokenIndexToRestore); - compilationUnit.ParserModel.SyntaxStack.Push(PendingCodeBlockOwner); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = PendingCodeBlockOwner; + parserModel.SyntaxStack.Push(PendingCodeBlockOwner); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = PendingCodeBlockOwner; } } diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs index c1c28a5cc..8f50be52e 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParser.cs @@ -15,24 +15,15 @@ namespace Luthetus.CompilerServices.CSharp.ParserCase; -public struct CSharpParser +public static class CSharpParser { - public CSharpParser() - { - #if DEBUG - ++LuthetusDebugSomething.Parser_ConstructorInvocationCount; - #endif - } - - public TextEditorDiagnostic[] DiagnosticsList { get; private set; } = Array.Empty(); - - public void Parse(CSharpCompilationUnit compilationUnit) + public static void Parse(CSharpCompilationUnit compilationUnit) { var globalCodeBlockBuilder = new CSharpCodeBlockBuilder(null, null); var currentCodeBlockBuilder = globalCodeBlockBuilder; var diagnosticBag = new DiagnosticBag(); - compilationUnit.ParserModel = new CSharpParserModel( + var parserModel = new CSharpParserModel( new TokenWalker(compilationUnit.LexerOutput.SyntaxTokenList, diagnosticBag), new Stack(), diagnosticBag, @@ -40,17 +31,17 @@ public void Parse(CSharpCompilationUnit compilationUnit) currentCodeBlockBuilder); #if DEBUG - compilationUnit.ParserModel.TokenWalker.ProtectedTokenSyntaxKindList = new() { SyntaxKind.StatementDelimiterToken, SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken, }; + parserModel.TokenWalker.ProtectedTokenSyntaxKindList = new() { SyntaxKind.StatementDelimiterToken, SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken, }; #endif while (true) { - // The last statement in this while loop is conditionally: '_ = compilationUnit.ParserModel.TokenWalker.Consume();'. + // The last statement in this while loop is conditionally: '_ = parserModel.TokenWalker.Consume();'. // Knowing this to be the case is extremely important. - var token = compilationUnit.ParserModel.TokenWalker.Current; + var token = parserModel.TokenWalker.Current; #if DEBUG - Console.WriteLine(token.SyntaxKind + "___" + token.TextSpan.GetText() + "___" + compilationUnit.ParserModel.TokenWalker.Index); + Console.WriteLine(token.SyntaxKind + "___" + token.TextSpan.GetText() + "___" + parserModel.TokenWalker.Index); #endif switch (token.SyntaxKind) @@ -64,150 +55,150 @@ public void Parse(CSharpCompilationUnit compilationUnit) case SyntaxKind.StarToken: case SyntaxKind.DollarSignToken: case SyntaxKind.AtToken: - if (compilationUnit.ParserModel.StatementBuilder.ChildList.Count == 0) + if (parserModel.StatementBuilder.ChildList.Count == 0) { - ParseOthers.StartStatement_Expression(compilationUnit); + ParseOthers.StartStatement_Expression(compilationUnit, ref parserModel); } else { - var expressionNode = ParseOthers.ParseExpression(compilationUnit); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(expressionNode); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + parserModel.StatementBuilder.ChildList.Add(expressionNode); } break; case SyntaxKind.PreprocessorDirectiveToken: - ParseTokens.ParsePreprocessorDirectiveToken((PreprocessorDirectiveToken)token, compilationUnit); + ParseTokens.ParsePreprocessorDirectiveToken((PreprocessorDirectiveToken)token, compilationUnit, ref parserModel); break; case SyntaxKind.IdentifierToken: - ParseTokens.ParseIdentifierToken(compilationUnit); + ParseTokens.ParseIdentifierToken(compilationUnit, ref parserModel); break; case SyntaxKind.OpenBraceToken: - compilationUnit.ParserModel.StatementBuilder.FinishStatement(compilationUnit); + parserModel.StatementBuilder.FinishStatement(compilationUnit, ref parserModel); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; #endif - var openBraceToken = (OpenBraceToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var openBraceToken = (OpenBraceToken)parserModel.TokenWalker.Consume(); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; #endif - ParseTokens.ParseOpenBraceToken(openBraceToken, compilationUnit); + ParseTokens.ParseOpenBraceToken(openBraceToken, compilationUnit, ref parserModel); break; case SyntaxKind.CloseBraceToken: - compilationUnit.ParserModel.StatementBuilder.FinishStatement(compilationUnit); + parserModel.StatementBuilder.FinishStatement(compilationUnit, ref parserModel); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; #endif - var closeBraceToken = (CloseBraceToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var closeBraceToken = (CloseBraceToken)parserModel.TokenWalker.Consume(); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; #endif - ParseTokens.ParseCloseBraceToken(closeBraceToken, compilationUnit); + ParseTokens.ParseCloseBraceToken(closeBraceToken, compilationUnit, ref parserModel); break; case SyntaxKind.OpenParenthesisToken: - if (compilationUnit.ParserModel.StatementBuilder.ChildList.Count == 0) - ParseOthers.StartStatement_Expression(compilationUnit); + if (parserModel.StatementBuilder.ChildList.Count == 0) + ParseOthers.StartStatement_Expression(compilationUnit, ref parserModel); else - ParseTokens.ParseOpenParenthesisToken(compilationUnit); + ParseTokens.ParseOpenParenthesisToken(compilationUnit, ref parserModel); break; case SyntaxKind.CloseParenthesisToken: - ParseTokens.ParseCloseParenthesisToken((CloseParenthesisToken)token, compilationUnit); + ParseTokens.ParseCloseParenthesisToken((CloseParenthesisToken)token, compilationUnit, ref parserModel); break; case SyntaxKind.OpenAngleBracketToken: - if (compilationUnit.ParserModel.StatementBuilder.ChildList.Count == 0) - ParseOthers.StartStatement_Expression(compilationUnit); + if (parserModel.StatementBuilder.ChildList.Count == 0) + ParseOthers.StartStatement_Expression(compilationUnit, ref parserModel); else - ParseTokens.ParseOpenAngleBracketToken((OpenAngleBracketToken)token, compilationUnit); + ParseTokens.ParseOpenAngleBracketToken((OpenAngleBracketToken)token, compilationUnit, ref parserModel); break; case SyntaxKind.CloseAngleBracketToken: - ParseTokens.ParseCloseAngleBracketToken((CloseAngleBracketToken)token, compilationUnit); + ParseTokens.ParseCloseAngleBracketToken((CloseAngleBracketToken)token, compilationUnit, ref parserModel); break; case SyntaxKind.OpenSquareBracketToken: - ParseTokens.ParseOpenSquareBracketToken(compilationUnit); + ParseTokens.ParseOpenSquareBracketToken(compilationUnit, ref parserModel); break; case SyntaxKind.CloseSquareBracketToken: - ParseTokens.ParseCloseSquareBracketToken((CloseSquareBracketToken)token, compilationUnit); + ParseTokens.ParseCloseSquareBracketToken((CloseSquareBracketToken)token, compilationUnit, ref parserModel); break; case SyntaxKind.ColonToken: - ParseTokens.ParseColonToken(compilationUnit); + ParseTokens.ParseColonToken(compilationUnit, ref parserModel); break; case SyntaxKind.MemberAccessToken: - ParseTokens.ParseMemberAccessToken((MemberAccessToken)token, compilationUnit); + ParseTokens.ParseMemberAccessToken((MemberAccessToken)token, compilationUnit, ref parserModel); break; case SyntaxKind.EqualsToken: - ParseTokens.ParseEqualsToken(compilationUnit); + ParseTokens.ParseEqualsToken(compilationUnit, ref parserModel); break; case SyntaxKind.StatementDelimiterToken: - compilationUnit.ParserModel.StatementBuilder.FinishStatement(compilationUnit); + parserModel.StatementBuilder.FinishStatement(compilationUnit, ref parserModel); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; #endif - var statementDelimiterToken = (StatementDelimiterToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var statementDelimiterToken = (StatementDelimiterToken)parserModel.TokenWalker.Consume(); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; #endif - ParseTokens.ParseStatementDelimiterToken(statementDelimiterToken, compilationUnit); + ParseTokens.ParseStatementDelimiterToken(statementDelimiterToken, compilationUnit, ref parserModel); break; case SyntaxKind.EndOfFileToken: - if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out var syntax) && + if (parserModel.SyntaxStack.TryPeek(out var syntax) && syntax is EndOfFileToken) { - _ = compilationUnit.ParserModel.SyntaxStack.Pop(); + _ = parserModel.SyntaxStack.Pop(); } - if (compilationUnit.ParserModel.SyntaxStack.TryPop(out var notUsedSyntax)) + if (parserModel.SyntaxStack.TryPop(out var notUsedSyntax)) { if (notUsedSyntax is null) { } else if (notUsedSyntax is IExpressionNode) { - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(notUsedSyntax); + parserModel.CurrentCodeBlockBuilder.ChildList.Add(notUsedSyntax); } else if (notUsedSyntax.SyntaxKind == SyntaxKind.AmbiguousIdentifierNode) { var ambiguousIdentifierNode = (AmbiguousIdentifierNode)notUsedSyntax; - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(notUsedSyntax); - compilationUnit.ParserModel.DiagnosticBag.ReportUndefinedTypeOrNamespace( + parserModel.CurrentCodeBlockBuilder.ChildList.Add(notUsedSyntax); + parserModel.DiagnosticBag.ReportUndefinedTypeOrNamespace( ambiguousIdentifierNode.IdentifierToken.TextSpan, ambiguousIdentifierNode.IdentifierToken.TextSpan.GetText()); } } - else if (compilationUnit.ParserModel.StatementBuilder.ChildList.Any()) + else if (parserModel.StatementBuilder.ChildList.Any()) { - foreach (var item in compilationUnit.ParserModel.StatementBuilder.ChildList) + foreach (var item in parserModel.StatementBuilder.ChildList) { - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(item); + parserModel.CurrentCodeBlockBuilder.ChildList.Add(item); } } break; default: if (UtilityApi.IsContextualKeywordSyntaxKind(token.SyntaxKind)) - ParseTokens.ParseKeywordContextualToken(compilationUnit); + ParseTokens.ParseKeywordContextualToken(compilationUnit, ref parserModel); else if (UtilityApi.IsKeywordSyntaxKind(token.SyntaxKind)) - ParseTokens.ParseKeywordToken(compilationUnit); + ParseTokens.ParseKeywordToken(compilationUnit, ref parserModel); break; } if (token.SyntaxKind == SyntaxKind.EndOfFileToken) { - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.ParseChildScopeQueue.TryDequeue(out var deferredChildScope)) - deferredChildScope.PrepareMainParserLoop(compilationUnit.ParserModel.TokenWalker.Index, compilationUnit); + if (parserModel.CurrentCodeBlockBuilder.ParseChildScopeQueue.TryDequeue(out var deferredChildScope)) + deferredChildScope.PrepareMainParserLoop(parserModel.TokenWalker.Index, compilationUnit, ref parserModel); else break; } - if (compilationUnit.ParserModel.TokenWalker.ConsumeCounter == 0) + if (parserModel.TokenWalker.ConsumeCounter == 0) { // This means either: // - None of the methods for syntax could make sense of the token, so they didn't consume it. @@ -217,347 +208,31 @@ public void Parse(CSharpCompilationUnit compilationUnit) // To avoid an infinite loop, this will ensure at least 1 token is consumed each iteration of the while loop. // // (and that the token index increased by at least 1 from the previous loop; this is implicitly what is implied). - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } - else if (compilationUnit.ParserModel.TokenWalker.ConsumeCounter < 0) + else if (parserModel.TokenWalker.ConsumeCounter < 0) { - // This means that a syntax invoked 'compilationUnit.ParserModel.TokenWalker.Backtrack()'. - // Without invoking an equal amount of 'compilationUnit.ParserModel.TokenWalker.Consume()' to avoid an infinite loop. - throw new LuthetusTextEditorException($"compilationUnit.ParserModel.TokenWalker.ConsumeCounter:{compilationUnit.ParserModel.TokenWalker.ConsumeCounter} < 0"); + // This means that a syntax invoked 'parserModel.TokenWalker.Backtrack()'. + // Without invoking an equal amount of 'parserModel.TokenWalker.Consume()' to avoid an infinite loop. + throw new LuthetusTextEditorException($"parserModel.TokenWalker.ConsumeCounter:{parserModel.TokenWalker.ConsumeCounter} < 0"); } - compilationUnit.ParserModel.TokenWalker.ConsumeCounterReset(); + parserModel.TokenWalker.ConsumeCounterReset(); } - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.Parent is not null) + if (parserModel.CurrentCodeBlockBuilder.Parent is not null) { // The current token here would be the EOF token. - compilationUnit.Binder.CloseScope(compilationUnit.ParserModel.TokenWalker.Current.TextSpan, compilationUnit); + compilationUnit.Binder.CloseScope(parserModel.TokenWalker.Current.TextSpan, compilationUnit, ref parserModel); } - DiagnosticsList = compilationUnit.ParserModel.DiagnosticBag.ToArray(); - - var topLevelStatementsCodeBlock = compilationUnit.ParserModel.CurrentCodeBlockBuilder.Build( - DiagnosticsList + var topLevelStatementsCodeBlock = parserModel.CurrentCodeBlockBuilder.Build( + parserModel.DiagnosticBag.ToArray() .Union(compilationUnit.Binder.DiagnosticsList) .Union(compilationUnit.LexerOutput.DiagnosticBag.ToList()) .ToArray()); - - compilationUnit.Binder.FinalizeBinderSession(compilationUnit.BinderSession); - + compilationUnit.RootCodeBlockNode = topLevelStatementsCodeBlock; + compilationUnit.Binder.FinalizeBinderSession(compilationUnit.BinderSession); } } - -// TODO: Are the comments below still of value? If they are not of value anymore then delete them. - -//{ - // In regards to whether to '_ = compilationUnit.ParserModel.TokenWalker.Consume();' - // at the start of the while loop, or at the end: - // - // The end is better because: - // - // - Anytime one wants to check the previous token, - // with the 'Consume()' at the end of the loop then one can use 'compilationUnit.ParserModel.TokenWalker.Previous'. - // But, if 'Consume()' is at the start of the loop then one has to use 'compilationUnit.ParserModel.TokenWalker.Peek(-2)' and that feels very janky. - // - // - As well, helps ensure a "handle-syntax" does not 'Consume()' someone elses syntax. - // If an individual "syntax" cannot make sense of the current token, - // then it can just return to the main loop and the main loop will deal with it. - // - // On a different note: - // - // 'should return to the main loop' - // - The end of every statement - // - The start of a code block - // - The end of a code block - // - // The goal with every iteration of the main loop, - // is to narrow down the possible syntax that is occuring. - // Then to invoke some other method that will handle that syntax - // entirely, and then return to the main loop for the next syntax to start being parsed. - // - // For example, multiple consecutive keywords might be an ambiguous syntax. - // Therefore, the main loop should push these keywords onto the 'StatementStack'. - // Then, eventually a disambiguating token will be encountered. - // At this point, the corresponding method to handle the syntax can be invoked, - // and the method can pop off the 'StatementStack' to see the "related" tokens. - // - // There are two loops: - // - Statement Loop - // - Expression Loop - // - // Statement loop exists in CSharpParser.cs (this file). - // Expression loop exists in ParseOthers.cs (a relative path from this file: './Internals/ParseOthers.cs'). - // - // The parser should gracefully handle syntax that does not compile. - // i.e.: if a syntactical error can be recovered from, then - // the parser is expected to recover. - // - // For example, "(;" - // For the sake of the example, this is presumed to start a ParenthesizedExpressionNode. - // It goes on to see a StatementDelimiterToken before it sees a CloseParenthesisToken. - // Instead of cascading syntactical errors to the text that comes after this (imagine this is part of a source code file) - // the ParenthesizedExpressionNode should report a diagnostic error, - // but then return back to the main loop. - // The main loop will see a StatementDelimiterToken, and then a new statement will begin - // as if nothing went wrong. This allows the rest of the text file to parse with the "same result". - // - // The parsing is at times done 'breadth first'. - // Because, a class definition might be: - // - // ````public class MyClass - // ````{ - // ```` public MyClass(string firstName) - // ```` { - // ```` FirstName = firstName; - // ```` } - // ```` - // ```` public string FirstName { get; set; } - // ````} - // - // In this scenario the 'FirstName' property is being referenced from within the class's constructor. - // Yet, the constructor is defined above the property it references. - // - // Instead of parsing 'depth first', in this scenario the index of the token that - // starts the code block body of the constructor definition is remembered, - // then the parser skips until it finds the matching close brace - // (by counting the open brace and close braces until it evens out). - // - // Once the class definition is finished being parsed, then the deferred parsing will start. - // This will modify the 'TokenWalker' such that it now is pointing at the previously "remembered" - // token that starts the code block of the constructor definition. - // - // As well, the 'TokenWalker' is told what index to return to once finished parsing the child scope. - // In this case the 'TokenWalker' would return to the index that represents the 'CloseBraceToken' - // of the class definition. - // - // If there were many child scopes that needed to be 'defer parsed' then the same - // code will be hit as was initially, and each time a child scope is 'defer parsed' - // it is removed from the list of child scopes that need to be 'defer parsed'. - // - // Regarding StatementDelimiterToken, OpenBraceToken, and CloseBraceToken: - // - These syntax hold a greater meaning than the "individual syntax". - // For example: "1;". - // In the example '1' is a NumericLiteralToken. - // Furthermore, a NumericLiteralToken can be parsed as a 'LiteralExpressionNode'. - // But, the ending StatementDelimiterToken does not belong to the 'LiteralExpressionNode'. - // It is to be "provided" to the main statement loop, to be processed there. - // - // In short, syntax shouldn't consume tokens that don't belong to them. - // And it is being stated that 'StatementDelimiterToken, OpenBraceToken, and CloseBraceToken' - // in general do not belong to a syntax. - // - // Some exceptions to this would be a property definition "public string FirstName { get; set; }". - // Here, the OpenBraceToken and CloseBraceToken are not being used in the same sense - // as they are when defining scope. - // - // So, the property definition should consume those OpenBraceToken and CloseBraceToken. - // - // However, consider this example: - // - // ````public string FirstName - // ````{ - // ```` get - // ```` { - // ```` return _firstName; - // ```` } - // ```` set => _firstName = value; - // ````} - // - // Here, the property's "getter" is defining a code block. - // So, the brace tokens that deliminate the "getter", ought to - // "visit" the main loop for a moment. Then it can continue on with the property syntax. -//} - -//{ - // Goal: re-write the parser a bit (2024-11-07) - // ============================================ - // It took 8 seconds for the Luthetus.Ide.sln to parse after turning off much of the syntax. - // (i.e.: the lexer ran entirely, but the parser was just iterating the while loop without doing much of anything). - // (upon further inspection the parser's while loop still is doing a bit more than I thought, - // but still the baseline time of 8 seconds can be compared with the time after I make a change.) - // - // With the syntax on it was taking 1 minute 13 seconds. - // - // Task Manager after the solution was parsed on Windows using a published version of the code. - // -------------------------------------------------------------------------------------------- - // Apps: - // '.NET Host' 278 MB - // Background processes - // '.NET Host' 492 MB - // '.NET Host' 265 MB - // - // After about 5 minutes the Task Manager looks like this (5 minutes is not at all an accurate timespan, but it "felt" like 5 minutes had passed) - // ----------------------------------------------------------------------------------------------------------------------------------------------- - // Apps: - // '.NET Host' 370 MB - // Background processes - // (these are gone now) - // - // So, now I can move back from git history each syntax one by one and see the impact of adding that specific syntax back. - // - // Most pressing is: - // - Determining whether syntax is an 'expression' or 'statement'. - // - As well the handling of 'ambiguous syntax'. - // - // Suspicions: - // - Anytime a 'statement' and a 'expression' are ambiguous, - // then there will be a keyword to disambiguate. - // - If I add back the 'expression' code first, - // then the statements will be far clearer - // because I hadn't implemented the 'expression' code - // with any "complexity" of whether it actually is a statement. - // I'll have a very "simple" version of the parser to look at, - // and it is thought that the statement disambiguation will be obvious. - // - I don't think I can rely on the surrounding code block's "kind" - // and whether that code block allows a certain syntax. - // - The programmer can type any syntax they want, and do so anywhere, - // it just might not compile. - // But, the parser still has to "survive" the ordeal. - // - // I added that if an IdentifierToken is found by the main loop, - // and the 'StatementBuilderStack.Count == 0', - // that ParseExpression(...) would be invoked. - // - // It went from 8 seconds for entire .sln to 26 seconds. - // As well a lot of syntax highlighting began to appear, - // albeit seemingly incorrect because definitions aren't being parsed - // so it cannot tell whether an identifier is a reference to a type or a local, or etc... - // - // A confusion I remember having was with (I think it was) function definitions. - // And their return type. Something to do with it being an ambiguous identifier - // while you are stepping through the nodes, and you have to wait to decide what it was. - // - // I sort of rambled when I said that but I am fairly certain that two ideas can be relied on: - // - If you are in an expression, you can look at syntax through the lens of an expression - // until you are given syntax that brings you back to the possibiity of statements. - // A lambda statement is confusing. Because it is an expression that wants to - // return to the statement loop, yet its part of a larger expression - // and being handled by the expression loop. - // - There have got to be some keywords that when you come across them, - // it is immediately apparent that you aren't looking at an expression. - // Or at the least it could be a path to go down that leads to disambiguation. - // - // Function definition - // =================== - // ````int Aaa() => 3; - // ```` - // ````int Bbb() - // ````{ - // ```` return 3; - // ````} - // - // Variable declaration - // ==================== - // ````var x = 2; - // ````int y = 3; - // - // Lambda expression - // ================= - // ````// Is this syntax even legal? - // ````int x => 3; - // ```` - // ````(int x) => 3; - // - // Comma Separated Expression - // ========================== - // ````// lambda expression - // ````(x, y) => 2; - // ````(int x, Person y) => 2; - // ````// tuple expression - // ````(int X, Person Y) tuple = (3, new Person()); - // - // Explicit Cast Expression - // ========================== - // ````(Person)someVariable; - // - // Parenthesized Expression - // ========================== - // ````(Person)someVariable; - // - // Constructor Definition - // ====================== - // ````public class Person - // ````{ - // ```` public Person() - // ```` { - // ```` } - // ````} - // - // Constructor Invocation - // ====================== - // ````new Person(); - // ````// object initialization - // ````new Person(); - // ````new Person { }; - // ````new Person { FirstName = "John", ... }; - // ````new Person(id: Guid.NewGuid) { FirstName = "John", ... }; - // ````// collection initialization - // ````new List { 1, 2, 3, }; - // ````new List(capacity: 5) { 1, 2, 3, }; - // - // Class definition - // ================ - // ````class Aaa { } - // ````class Bbb(/*primary constructor*/) { } - // - // I want to write out in order the definitions/expressions, ordered by how similar the syntax is to one another. - // - // Types are a "simple" case due to the storage modifier keyword 'class, interface, ...'. - // - // It went from 26 seconds to 28 seconds - // after adding TypeDefinitionNode parsing. - // - // -//} - -//{ - // I think the key to parsing this properly is having the input "Person" parse properly. - // - // An expression can contain a 'TypeClauseNode', so it ought to be an IExpressionNode. - // An expression can contain a 'TypeClauseNode IdentifierOrContextualToken', so it ought to be an IExpressionNode. - // - // If I open Visual Studio and I type "Person" into a C# file that is completely empty other than that text. - // will it be treated as a type or a variable or something else? - // - // Because it seems that there is a pattern of either 'TypeClause' or 'TypeClauseNode IdentifierOrContextualToken'. - // - // And, the 'TypeClauseNode' could be made up of one or more ISyntaxToken. - // - // It almost feels like you'd want to parse for 'TypeClause' - // and 'TypeClauseNode IdentifierOrContextualToken'. - // But in the sense of they both get the same starting point in the TokenWalker. - // All the state is separate. - // - // Probably a 'bool TryParse_TypeClause_IdentifierOrContextualToken(out var aaa)' - // and 'bool TryParse_TypeClause(out var aaa)'. - // - // You'd maybe invoke 'TryParse_TypeClause_IdentifierOrContextualToken' first, - // then reset the TokenWalker state back to what it was and invoke - // TryParse_TypeClause' to see that returns true/successful. - // - // Visual Studio treats the text "Person" when it is the only text in a C# file to be: - // "The type or namespace name 'Person' could not be found (are you missing a using directive or an assembly reference?) - // - // If I open the demo website and put the same text into an empty C# file what is it treated as? - // With the 'v 0.9.7.1 :: Release :: Luthetus.Ide.RazorLib' demo it is a Type for the syntax highlighting - // and has a similar error diagnostic with "type or namespace could not be found" wording. - // - // Visual Studio was different in that it for syntax highlighting "did not give the text a color - it was just colored as default text". - // Whereas the demo website colored the text as a Type. - // - // I put the Visual Studio part about default text color in quotes because I believe that is also the color they use for namespaces (default text and namespaces are the same color). - // - // I changed the color in Visual Studio that is assigned to namespaces to be different from the default text. - // The color of the text did not change, therefore it was being colored as default text it seems. - - // I am writing the C# Parser statement first but it might be better to do things expression first. - - // Idea: "Everything is an expression unless it is a statement"? - // - // This might just be equivalent to saying "do things expression first". - // But for some reason this wording is sticking out in my mind. - - // But, some expressions can be a statement, so being a statement does not stop something from being an expression. -//} diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParserModel.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParserModel.cs index e2860900b..86e4381a1 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParserModel.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpParserModel.cs @@ -11,7 +11,11 @@ namespace Luthetus.CompilerServices.CSharp.ParserCase; -public class CSharpParserModel +/// +/// The computational state for the CSharpParser is contained within this type. +/// The output of the CSharpParser is the . +/// +public struct CSharpParserModel { public CSharpParserModel( TokenWalker tokenWalker, diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpStatementBuilder.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpStatementBuilder.cs index 553a38463..19556021a 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpStatementBuilder.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/CSharpStatementBuilder.cs @@ -40,13 +40,13 @@ public ISyntax Pop() /// are parsed by the main loop, /// /// Then check that the last item in the StatementBuilder.ChildList - /// has been added to the compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList. + /// has been added to the parserModel.CurrentCodeBlockBuilder.ChildList. /// /// If it was not yet added, then add it. /// /// Lastly, clear the StatementBuilder.ChildList. /// - public void FinishStatement(CSharpCompilationUnit compilationUnit) + public void FinishStatement(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (ChildList.Count == 0) return; @@ -55,13 +55,13 @@ public void FinishStatement(CSharpCompilationUnit compilationUnit) ISyntax codeBlockBuilderSyntax; - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Count == 0) + if (parserModel.CurrentCodeBlockBuilder.ChildList.Count == 0) codeBlockBuilderSyntax = EmptyExpressionNode.Empty; else - codeBlockBuilderSyntax = compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList[^1]; + codeBlockBuilderSyntax = parserModel.CurrentCodeBlockBuilder.ChildList[^1]; if (!Object.ReferenceEquals(statementSyntax, codeBlockBuilderSyntax)) - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(statementSyntax); + parserModel.CurrentCodeBlockBuilder.ChildList.Add(statementSyntax); ChildList.Clear(); } diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseContextualKeywords.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseContextualKeywords.cs index fe1cd5017..a67dbef1c 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseContextualKeywords.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseContextualKeywords.cs @@ -9,240 +9,240 @@ namespace Luthetus.CompilerServices.CSharp.ParserCase.Internals; public class ParseContextualKeywords { - public static void HandleVarTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleVarTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.StatementBuilder.ChildList.Count == 0) - ParseTokens.ParseIdentifierToken(compilationUnit); + if (parserModel.StatementBuilder.ChildList.Count == 0) + ParseTokens.ParseIdentifierToken(compilationUnit, ref parserModel); else - ParseOthers.StartStatement_Expression(compilationUnit); + ParseOthers.StartStatement_Expression(compilationUnit, ref parserModel); } - public static void HandlePartialTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandlePartialTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleAddTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleAddTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleAndTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleAndTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleAliasTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleAliasTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleAscendingTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleAscendingTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleArgsTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleArgsTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleAsyncTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleAsyncTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleAwaitTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleAwaitTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleByTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleByTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleDescendingTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleDescendingTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleDynamicTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleDynamicTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleEqualsTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleEqualsTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleFileTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleFileTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleFromTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleFromTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleGetTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleGetTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleGlobalTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleGlobalTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleGroupTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleGroupTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleInitTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleInitTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleIntoTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleIntoTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleJoinTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleJoinTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleLetTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleLetTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleManagedTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleManagedTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleNameofTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleNameofTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleNintTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleNintTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleNotTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleNotTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleNotnullTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleNotnullTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleNuintTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleNuintTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleOnTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleOnTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleOrTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleOrTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleOrderbyTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleOrderbyTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleRecordTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleRecordTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - ParseDefaultKeywords.HandleStorageModifierTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleStorageModifierTokenKeyword(compilationUnit, ref parserModel); } - public static void HandleRemoveTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleRemoveTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleRequiredTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleRequiredTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleScopedTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleScopedTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleSelectTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleSelectTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleSetTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleSetTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleUnmanagedTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUnmanagedTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleValueTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleValueTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleWhenTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleWhenTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleWhereTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleWhereTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var whereTokenContextualKeyword = (KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var whereTokenContextualKeyword = (KeywordContextualToken)parserModel.TokenWalker.Consume(); - if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out var syntax) && syntax.SyntaxKind != SyntaxKind.TypeDefinitionNode) + if (parserModel.SyntaxStack.TryPeek(out var syntax) && syntax.SyntaxKind != SyntaxKind.TypeDefinitionNode) return; - while (!compilationUnit.ParserModel.TokenWalker.IsEof) + while (!parserModel.TokenWalker.IsEof) { - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken || - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.StatementDelimiterToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken || + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.StatementDelimiterToken) { break; } - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } } - public static void HandleWithTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleWithTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleYieldTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleYieldTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } - public static void HandleUnrecognizedTokenContextualKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUnrecognizedTokenContextualKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordContextualToken)parserModel.TokenWalker.Consume()); } } diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseDefaultKeywords.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseDefaultKeywords.cs index a5bb98b06..d14685375 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseDefaultKeywords.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseDefaultKeywords.cs @@ -11,59 +11,59 @@ namespace Luthetus.CompilerServices.CSharp.ParserCase.Internals; public class ParseDefaultKeywords { - public static void HandleAsTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleAsTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleBaseTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleBaseTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleBoolTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleBoolTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleBreakTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleBreakTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleByteTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleByteTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleCaseTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleCaseTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.ColonToken, null)); - var expressionNode = ParseOthers.ParseExpression(compilationUnit); - var colonToken = (ColonToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.ColonToken); + parserModel.ExpressionList.Add((SyntaxKind.ColonToken, null)); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + var colonToken = (ColonToken)parserModel.TokenWalker.Match(SyntaxKind.ColonToken); } - public static void HandleCatchTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleCatchTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var catchKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var catchKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); - var openParenthesisToken = (OpenParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); + var openParenthesisToken = (OpenParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); - var typeClause = compilationUnit.ParserModel.TokenWalker.MatchTypeClauseNode(compilationUnit); + var typeClause = parserModel.TokenWalker.MatchTypeClauseNode(compilationUnit, ref parserModel); - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind != SyntaxKind.CloseParenthesisToken) - _ = (IdentifierToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + if (parserModel.TokenWalker.Current.SyntaxKind != SyntaxKind.CloseParenthesisToken) + _ = (IdentifierToken)parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); - var closeParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); + var closeParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); TryStatementNode? tryStatementNode = null; - if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out var syntax) && + if (parserModel.SyntaxStack.TryPeek(out var syntax) && syntax is TryStatementNode temporaryTryStatementNodeOne) { tryStatementNode = temporaryTryStatementNodeOne; } - else if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out syntax) && + else if (parserModel.SyntaxStack.TryPeek(out syntax) && syntax is TryStatementTryNode tryNode) { if (tryNode.Parent is TryStatementNode temporaryTryStatementNodeTwo) @@ -82,53 +82,53 @@ public static void HandleCatchTokenKeyword(CSharpCompilationUnit compilationUnit codeBlockNode: null); tryStatementNode.SetTryStatementCatchNode(catchNode); - compilationUnit.ParserModel.SyntaxStack.Push(catchNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = catchNode; + parserModel.SyntaxStack.Push(catchNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = catchNode; } } - public static void HandleCharTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleCharTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleCheckedTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleCheckedTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleConstTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleConstTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleContinueTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleContinueTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleDecimalTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleDecimalTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleDefaultTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleDefaultTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { // Switch statement default case. - if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.ColonToken) - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + if (parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.ColonToken) + _ = parserModel.TokenWalker.Consume(); else - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleDelegateTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleDelegateTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleDoTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleDoTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var doKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var doKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); var doWhileStatementNode = new DoWhileStatementNode( doKeywordToken, @@ -140,63 +140,63 @@ public static void HandleDoTokenKeyword(CSharpCompilationUnit compilationUnit) closeParenthesisToken: default); // Have to push twice so it is on the stack when the 'while' keyword is parsed. - compilationUnit.ParserModel.SyntaxStack.Push(doWhileStatementNode); - compilationUnit.ParserModel.SyntaxStack.Push(doWhileStatementNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = doWhileStatementNode; + parserModel.SyntaxStack.Push(doWhileStatementNode); + parserModel.SyntaxStack.Push(doWhileStatementNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = doWhileStatementNode; } - public static void HandleDoubleTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleDoubleTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleElseTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleElseTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleEnumTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleEnumTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleStorageModifierTokenKeyword(compilationUnit); + HandleStorageModifierTokenKeyword(compilationUnit, ref parserModel); // Why was this method invocation here? (2024-01-23) // - // HandleTypeIdentifierKeyword(compilationUnit); + // HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleEventTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleEventTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleExplicitTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleExplicitTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleExternTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleExternTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleFalseTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleFalseTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var expressionNode = ParseOthers.ParseExpression(compilationUnit); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(expressionNode); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + parserModel.StatementBuilder.ChildList.Add(expressionNode); } - public static void HandleFinallyTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleFinallyTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var finallyKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var finallyKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); TryStatementNode? tryStatementNode = null; - if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out var syntax) && + if (parserModel.SyntaxStack.TryPeek(out var syntax) && syntax is TryStatementNode temporaryTryStatementNodeOne) { tryStatementNode = temporaryTryStatementNodeOne; } - else if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out syntax) && + else if (parserModel.SyntaxStack.TryPeek(out syntax) && syntax is TryStatementTryNode tryNode) { if (tryNode.Parent is TryStatementNode temporaryTryStatementNodeTwo) @@ -204,7 +204,7 @@ public static void HandleFinallyTokenKeyword(CSharpCompilationUnit compilationUn tryStatementNode = temporaryTryStatementNodeTwo; } } - else if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out syntax) && + else if (parserModel.SyntaxStack.TryPeek(out syntax) && syntax is TryStatementCatchNode catchNode) { if (catchNode.Parent is TryStatementNode temporaryTryStatementNodeThree) @@ -221,49 +221,49 @@ public static void HandleFinallyTokenKeyword(CSharpCompilationUnit compilationUn codeBlockNode: null); tryStatementNode.SetTryStatementFinallyNode(finallyNode); - compilationUnit.ParserModel.SyntaxStack.Push(finallyNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = finallyNode; + parserModel.SyntaxStack.Push(finallyNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = finallyNode; } } - public static void HandleFixedTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleFixedTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleFloatTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleFloatTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleForTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleForTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var forKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var forKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); - var openParenthesisToken = (OpenParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); + var openParenthesisToken = (OpenParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); // Initialization Case One // ; var initializationExpressionNode = (IExpressionNode)new EmptyExpressionNode(CSharpFacts.Types.Void.ToTypeClause()); - var initializationStatementDelimiterToken = (StatementDelimiterToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); + var initializationStatementDelimiterToken = (StatementDelimiterToken)parserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); var badStateInitialization = false; if (initializationStatementDelimiterToken.IsFabricated) { // Initialization Case Two // i = 0; - var identifierToken = (IdentifierToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + var identifierToken = (IdentifierToken)parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); if (identifierToken.IsFabricated) { // Initialization Case Three // int i = 0; - var typeClauseNode = compilationUnit.ParserModel.TokenWalker.MatchTypeClauseNode(compilationUnit); + var typeClauseNode = parserModel.TokenWalker.MatchTypeClauseNode(compilationUnit, ref parserModel); var isCaseThree = !typeClauseNode.IsFabricated; if (isCaseThree) { - identifierToken = (IdentifierToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + identifierToken = (IdentifierToken)parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); } else { @@ -277,51 +277,51 @@ public static void HandleForTokenKeyword(CSharpCompilationUnit compilationUnit) { // Read the remainder // = 0; - var equalsToken = (EqualsToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.EqualsToken); + var equalsToken = (EqualsToken)parserModel.TokenWalker.Match(SyntaxKind.EqualsToken); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); - initializationExpressionNode = ParseOthers.ParseExpression(compilationUnit); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); + initializationExpressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); - initializationStatementDelimiterToken = (StatementDelimiterToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); + initializationStatementDelimiterToken = (StatementDelimiterToken)parserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); } } // Condition Case One // ; var conditionExpressionNode = (IExpressionNode)new EmptyExpressionNode(CSharpFacts.Types.Void.ToTypeClause()); - var conditionStatementDelimiterToken = (StatementDelimiterToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); + var conditionStatementDelimiterToken = (StatementDelimiterToken)parserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); if (conditionStatementDelimiterToken.IsFabricated) { // Condition Case Two // i < 10; - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); - conditionExpressionNode = ParseOthers.ParseExpression(compilationUnit); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); + conditionExpressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); - conditionStatementDelimiterToken = (StatementDelimiterToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); + conditionStatementDelimiterToken = (StatementDelimiterToken)parserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); } // Updation Case One // ) var updationExpressionNode = (IExpressionNode)new EmptyExpressionNode(CSharpFacts.Types.Void.ToTypeClause()); - var closeParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); + var closeParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); if (closeParenthesisToken.IsFabricated) { - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); - updationExpressionNode = ParseOthers.ParseExpression(compilationUnit); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); + updationExpressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); - closeParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); + closeParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); if (closeParenthesisToken.IsFabricated) { - while (!compilationUnit.ParserModel.TokenWalker.IsEof) + while (!parserModel.TokenWalker.IsEof) { - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseParenthesisToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseParenthesisToken) break; - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } } } @@ -337,18 +337,18 @@ public static void HandleForTokenKeyword(CSharpCompilationUnit compilationUnit) closeParenthesisToken, codeBlockNode: null); - compilationUnit.ParserModel.SyntaxStack.Push(forStatementNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = forStatementNode; + parserModel.SyntaxStack.Push(forStatementNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = forStatementNode; } - public static void HandleForeachTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleForeachTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var foreachKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var foreachKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); - var openParenthesisToken = (OpenParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); + var openParenthesisToken = (OpenParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); - var typeClauseNode = compilationUnit.ParserModel.TokenWalker.MatchTypeClauseNode(compilationUnit); - var variableIdentifierToken = (IdentifierToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + var typeClauseNode = parserModel.TokenWalker.MatchTypeClauseNode(compilationUnit, ref parserModel); + var variableIdentifierToken = (IdentifierToken)parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); var variableDeclarationStatementNode = new VariableDeclarationNode( typeClauseNode, @@ -356,11 +356,11 @@ public static void HandleForeachTokenKeyword(CSharpCompilationUnit compilationUn VariableKind.Local, false); - var inKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.InTokenKeyword); + var inKeywordToken = (KeywordToken)parserModel.TokenWalker.Match(SyntaxKind.InTokenKeyword); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); - var expressionNode = ParseOthers.ParseExpression(compilationUnit); - var closeParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + var closeParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); var foreachStatementNode = new ForeachStatementNode( foreachKeywordToken, @@ -371,45 +371,45 @@ public static void HandleForeachTokenKeyword(CSharpCompilationUnit compilationUn closeParenthesisToken, codeBlockNode: null); - compilationUnit.ParserModel.SyntaxStack.Push(foreachStatementNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = foreachStatementNode; + parserModel.SyntaxStack.Push(foreachStatementNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = foreachStatementNode; } - public static void HandleGotoTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleGotoTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleImplicitTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleImplicitTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleInTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleInTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleIntTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleIntTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleIsTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleIsTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleLockTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleLockTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var lockKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var lockKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); - var openParenthesisToken = (OpenParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); + var openParenthesisToken = (OpenParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); - var expressionNode = ParseOthers.ParseExpression(compilationUnit); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); - var closeParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); + var closeParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); var lockStatementNode = new LockStatementNode( lockKeywordToken, @@ -418,96 +418,96 @@ public static void HandleLockTokenKeyword(CSharpCompilationUnit compilationUnit) closeParenthesisToken, codeBlockNode: null); - compilationUnit.ParserModel.SyntaxStack.Push(lockStatementNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = lockStatementNode; + parserModel.SyntaxStack.Push(lockStatementNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = lockStatementNode; } - public static void HandleLongTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleLongTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleNullTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleNullTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleObjectTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleObjectTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleOperatorTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleOperatorTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleOutTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleOutTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleParamsTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleParamsTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleProtectedTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleProtectedTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var protectedTokenKeyword = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(protectedTokenKeyword); + var protectedTokenKeyword = (KeywordToken)parserModel.TokenWalker.Consume(); + parserModel.StatementBuilder.ChildList.Add(protectedTokenKeyword); } - public static void HandleReadonlyTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleReadonlyTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleRefTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleRefTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleSbyteTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleSbyteTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleShortTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleShortTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleSizeofTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleSizeofTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleStackallocTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleStackallocTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleStringTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleStringTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleStructTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleStructTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleStorageModifierTokenKeyword(compilationUnit); + HandleStorageModifierTokenKeyword(compilationUnit, ref parserModel); } - public static void HandleSwitchTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleSwitchTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var switchKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var switchKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); - var openParenthesisToken = (OpenParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); + var openParenthesisToken = (OpenParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); - var expressionNode = ParseOthers.ParseExpression(compilationUnit); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); - var closeParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); + var closeParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); var switchStatementNode = new SwitchStatementNode( switchKeywordToken, @@ -516,29 +516,29 @@ public static void HandleSwitchTokenKeyword(CSharpCompilationUnit compilationUni closeParenthesisToken, codeBlockNode: null); - compilationUnit.ParserModel.SyntaxStack.Push(switchStatementNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = switchStatementNode; + parserModel.SyntaxStack.Push(switchStatementNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = switchStatementNode; } - public static void HandleThisTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleThisTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleThrowTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleThrowTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleTrueTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleTrueTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var expressionNode = ParseOthers.ParseExpression(compilationUnit); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(expressionNode); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + parserModel.StatementBuilder.ChildList.Add(expressionNode); } - public static void HandleTryTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleTryTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var tryKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var tryKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); var tryStatementNode = new TryStatementNode( tryNode: null, @@ -552,66 +552,66 @@ public static void HandleTryTokenKeyword(CSharpCompilationUnit compilationUnit) tryStatementNode.SetTryStatementTryNode(tryStatementTryNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(tryStatementNode); + parserModel.CurrentCodeBlockBuilder.ChildList.Add(tryStatementNode); - compilationUnit.ParserModel.SyntaxStack.Push(tryStatementNode); + parserModel.SyntaxStack.Push(tryStatementNode); - compilationUnit.ParserModel.SyntaxStack.Push(tryStatementTryNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = tryStatementTryNode; + parserModel.SyntaxStack.Push(tryStatementTryNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = tryStatementTryNode; } - public static void HandleTypeofTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleTypeofTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleUintTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUintTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleUlongTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUlongTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleUncheckedTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUncheckedTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleUnsafeTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUnsafeTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleUshortTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUshortTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleVoidTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleVoidTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleTypeIdentifierKeyword(compilationUnit); + HandleTypeIdentifierKeyword(compilationUnit, ref parserModel); } - public static void HandleVolatileTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleVolatileTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleWhileTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleWhileTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var whileKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var whileKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); - var openParenthesisToken = (OpenParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); + var openParenthesisToken = (OpenParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); - var expressionNode = ParseOthers.ParseExpression(compilationUnit); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); - var closeParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); + var closeParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Match(SyntaxKind.CloseParenthesisToken); - if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out var syntax) && + if (parserModel.SyntaxStack.TryPeek(out var syntax) && syntax is DoWhileStatementNode doWhileStatementNode) { doWhileStatementNode.SetWhileProperties( @@ -629,112 +629,112 @@ public static void HandleWhileTokenKeyword(CSharpCompilationUnit compilationUnit closeParenthesisToken, codeBlockNode: null); - compilationUnit.ParserModel.SyntaxStack.Push(whileStatementNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = whileStatementNode; + parserModel.SyntaxStack.Push(whileStatementNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = whileStatementNode; } } - public static void HandleUnrecognizedTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUnrecognizedTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } /// The 'Default' of this method name is confusing. /// It seems to refer to the 'default' of switch statement rather than the 'default' keyword itself? /// - public static void HandleDefault(CSharpCompilationUnit compilationUnit) + public static void HandleDefault(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleTypeIdentifierKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleTypeIdentifierKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - ParseTokens.ParseIdentifierToken(compilationUnit); + ParseTokens.ParseIdentifierToken(compilationUnit, ref parserModel); } - public static void HandleNewTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleNewTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.OpenParenthesisToken || - UtilityApi.IsConvertibleToIdentifierToken(compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind)) + if (parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.OpenParenthesisToken || + UtilityApi.IsConvertibleToIdentifierToken(parserModel.TokenWalker.Next.SyntaxKind)) { - var expressionNode = ParseOthers.ParseExpression(compilationUnit); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(expressionNode); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + parserModel.StatementBuilder.ChildList.Add(expressionNode); } else { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } } - public static void HandlePublicTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandlePublicTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var publicKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(publicKeywordToken); + var publicKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); + parserModel.StatementBuilder.ChildList.Add(publicKeywordToken); } - public static void HandleInternalTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleInternalTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var internalTokenKeyword = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(internalTokenKeyword); + var internalTokenKeyword = (KeywordToken)parserModel.TokenWalker.Consume(); + parserModel.StatementBuilder.ChildList.Add(internalTokenKeyword); } - public static void HandlePrivateTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandlePrivateTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var privateTokenKeyword = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(privateTokenKeyword); + var privateTokenKeyword = (KeywordToken)parserModel.TokenWalker.Consume(); + parserModel.StatementBuilder.ChildList.Add(privateTokenKeyword); } - public static void HandleStaticTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleStaticTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleOverrideTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleOverrideTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleVirtualTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleVirtualTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleAbstractTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleAbstractTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleSealedTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleSealedTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } - public static void HandleIfTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleIfTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var ifTokenKeyword = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var ifTokenKeyword = (KeywordToken)parserModel.TokenWalker.Consume(); - var openParenthesisToken = compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); + var openParenthesisToken = parserModel.TokenWalker.Match(SyntaxKind.OpenParenthesisToken); if (openParenthesisToken.IsFabricated) return; - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); - var expression = ParseOthers.ParseExpression(compilationUnit); + parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null)); + var expression = ParseOthers.ParseExpression(compilationUnit, ref parserModel); var boundIfStatementNode = compilationUnit.Binder.BindIfStatementNode(ifTokenKeyword, expression); - compilationUnit.ParserModel.SyntaxStack.Push(boundIfStatementNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = boundIfStatementNode; + parserModel.SyntaxStack.Push(boundIfStatementNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = boundIfStatementNode; } - public static void HandleUsingTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleUsingTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var usingKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var usingKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); - var handleNamespaceIdentifierResult = ParseOthers.HandleNamespaceIdentifier(compilationUnit); + var handleNamespaceIdentifierResult = ParseOthers.HandleNamespaceIdentifier(compilationUnit, ref parserModel); if (handleNamespaceIdentifierResult.SyntaxKind == SyntaxKind.EmptyNode) { - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException(usingKeywordToken.TextSpan, "Expected a namespace identifier."); + parserModel.DiagnosticBag.ReportTodoException(usingKeywordToken.TextSpan, "Expected a namespace identifier."); return; } @@ -745,12 +745,12 @@ public static void HandleUsingTokenKeyword(CSharpCompilationUnit compilationUnit namespaceIdentifier); compilationUnit.Binder.BindUsingStatementNode(usingStatementNode, compilationUnit); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(usingStatementNode); + parserModel.StatementBuilder.ChildList.Add(usingStatementNode); } - public static void HandleInterfaceTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleInterfaceTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleStorageModifierTokenKeyword(compilationUnit); + HandleStorageModifierTokenKeyword(compilationUnit, ref parserModel); } /// @@ -764,18 +764,18 @@ public static void HandleInterfaceTokenKeyword(CSharpCompilationUnit compilation /// Invocation of this method implies the current token was /// class, interface, struct, etc... /// - public static void HandleStorageModifierTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleStorageModifierTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var storageModifierToken = compilationUnit.ParserModel.TokenWalker.Consume(); + var storageModifierToken = parserModel.TokenWalker.Consume(); // Given: public partial class MyClass { } // Then: partial var hasPartialModifier = false; - if (compilationUnit.ParserModel.StatementBuilder.TryPeek(out var syntax) && syntax is ISyntaxToken syntaxToken) + if (parserModel.StatementBuilder.TryPeek(out var syntax) && syntax is ISyntaxToken syntaxToken) { if (syntaxToken.SyntaxKind == SyntaxKind.PartialTokenContextualKeyword) { - _ = compilationUnit.ParserModel.StatementBuilder.Pop(); + _ = parserModel.StatementBuilder.Pop(); hasPartialModifier = true; } } @@ -785,24 +785,24 @@ public static void HandleStorageModifierTokenKeyword(CSharpCompilationUnit compi // Given: public class MyClass { } // Then: public var accessModifierKind = AccessModifierKind.Public; - if (compilationUnit.ParserModel.StatementBuilder.TryPeek(out syntax) && syntax is ISyntaxToken firstSyntaxToken) + if (parserModel.StatementBuilder.TryPeek(out syntax) && syntax is ISyntaxToken firstSyntaxToken) { var firstOutput = UtilityApi.GetAccessModifierKindFromToken(firstSyntaxToken); if (firstOutput is not null) { - _ = compilationUnit.ParserModel.StatementBuilder.Pop(); + _ = parserModel.StatementBuilder.Pop(); accessModifierKind = firstOutput.Value; // Given: protected internal class MyClass { } // Then: protected internal - if (compilationUnit.ParserModel.StatementBuilder.TryPeek(out syntax) && syntax is ISyntaxToken secondSyntaxToken) + if (parserModel.StatementBuilder.TryPeek(out syntax) && syntax is ISyntaxToken secondSyntaxToken) { var secondOutput = UtilityApi.GetAccessModifierKindFromToken(secondSyntaxToken); if (secondOutput is not null) { - _ = compilationUnit.ParserModel.StatementBuilder.Pop(); + _ = parserModel.StatementBuilder.Pop(); if ((firstOutput.Value.ToString().ToLower() == "protected" && secondOutput.Value.ToString().ToLower() == "internal") || @@ -829,9 +829,9 @@ public static void HandleStorageModifierTokenKeyword(CSharpCompilationUnit compi if (storageModifierKind is null) return; if (storageModifierKind == StorageModifierKind.Record && - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.StructTokenKeyword) + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.StructTokenKeyword) { - var structKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var structKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); storageModifierKind = StorageModifierKind.RecordStruct; } @@ -840,22 +840,22 @@ public static void HandleStorageModifierTokenKeyword(CSharpCompilationUnit compi IdentifierToken identifierToken; // Retrospective: What is the purpose of this 'if (contextualKeyword) logic'? // Response: maybe it is because 'var' contextual keyword is allowed to be a class name? - if (UtilityApi.IsContextualKeywordSyntaxKind(compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind)) + if (UtilityApi.IsContextualKeywordSyntaxKind(parserModel.TokenWalker.Current.SyntaxKind)) { - var contextualKeywordToken = (KeywordContextualToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var contextualKeywordToken = (KeywordContextualToken)parserModel.TokenWalker.Consume(); // Take the contextual keyword as an identifier identifierToken = new IdentifierToken(contextualKeywordToken.TextSpan); } else { - identifierToken = (IdentifierToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + identifierToken = (IdentifierToken)parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); } // Given: public class MyClass { } // Then: GenericArgumentsListingNode? genericArgumentsListingNode = null; - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenAngleBracketToken) - genericArgumentsListingNode = ParseTypes.HandleGenericArguments(compilationUnit); + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenAngleBracketToken) + genericArgumentsListingNode = ParseTypes.HandleGenericArguments(compilationUnit, ref parserModel); var typeDefinitionNode = new TypeDefinitionNode( accessModifierKind, @@ -871,24 +871,24 @@ public static void HandleStorageModifierTokenKeyword(CSharpCompilationUnit compi compilationUnit.Binder.BindTypeDefinitionNode(typeDefinitionNode, compilationUnit); compilationUnit.Binder.BindTypeIdentifier(identifierToken, compilationUnit); - compilationUnit.ParserModel.SyntaxStack.Push(typeDefinitionNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = typeDefinitionNode; + parserModel.SyntaxStack.Push(typeDefinitionNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = typeDefinitionNode; } - public static void HandleClassTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleClassTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - HandleStorageModifierTokenKeyword(compilationUnit); + HandleStorageModifierTokenKeyword(compilationUnit, ref parserModel); } - public static void HandleNamespaceTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleNamespaceTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var namespaceKeywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var namespaceKeywordToken = (KeywordToken)parserModel.TokenWalker.Consume(); - var handleNamespaceIdentifierResult = ParseOthers.HandleNamespaceIdentifier(compilationUnit); + var handleNamespaceIdentifierResult = ParseOthers.HandleNamespaceIdentifier(compilationUnit, ref parserModel); if (handleNamespaceIdentifierResult.SyntaxKind == SyntaxKind.EmptyNode) { - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException(namespaceKeywordToken.TextSpan, "Expected a namespace identifier."); + parserModel.DiagnosticBag.ReportTodoException(namespaceKeywordToken.TextSpan, "Expected a namespace identifier."); return; } @@ -901,12 +901,12 @@ public static void HandleNamespaceTokenKeyword(CSharpCompilationUnit compilation compilationUnit.Binder.SetCurrentNamespaceStatementNode(namespaceStatementNode, compilationUnit); - compilationUnit.ParserModel.SyntaxStack.Push(namespaceStatementNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = namespaceStatementNode; + parserModel.SyntaxStack.Push(namespaceStatementNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = namespaceStatementNode; } - public static void HandleReturnTokenKeyword(CSharpCompilationUnit compilationUnit) + public static void HandleReturnTokenKeyword(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add((KeywordToken)compilationUnit.ParserModel.TokenWalker.Consume()); + parserModel.StatementBuilder.ChildList.Add((KeywordToken)parserModel.TokenWalker.Consume()); } } diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseFunctions.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseFunctions.cs index 92de6efb8..b93a5baac 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseFunctions.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseFunctions.cs @@ -14,23 +14,25 @@ public static void HandleFunctionDefinition( IdentifierToken consumedIdentifierToken, TypeClauseNode consumedTypeClauseNode, GenericParametersListingNode? consumedGenericArgumentsListingNode, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenAngleBracketToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenAngleBracketToken) { var successGenericParametersListingNode = ParseOthers.TryParseExpression( SyntaxKind.GenericParametersListingNode, compilationUnit, + ref parserModel, out var genericParametersListingNode); if (successGenericParametersListingNode) consumedGenericArgumentsListingNode = (GenericParametersListingNode)genericParametersListingNode; } - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind != SyntaxKind.OpenParenthesisToken) + if (parserModel.TokenWalker.Current.SyntaxKind != SyntaxKind.OpenParenthesisToken) return; - var functionArgumentsListingNode = HandleFunctionArguments(compilationUnit); + var functionArgumentsListingNode = HandleFunctionArguments(compilationUnit, ref parserModel); var functionDefinitionNode = new FunctionDefinitionNode( AccessModifierKind.Public, @@ -42,14 +44,14 @@ public static void HandleFunctionDefinition( null); compilationUnit.Binder.BindFunctionDefinitionNode(functionDefinitionNode, compilationUnit); - compilationUnit.ParserModel.SyntaxStack.Push(functionDefinitionNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = functionDefinitionNode; + parserModel.SyntaxStack.Push(functionDefinitionNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = functionDefinitionNode; - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner is TypeDefinitionNode typeDefinitionNode && + if (parserModel.CurrentCodeBlockBuilder.CodeBlockOwner is TypeDefinitionNode typeDefinitionNode && typeDefinitionNode.IsInterface) { // TODO: Would method constraints break this code? "public T Aaa() where T : OtherClass" - var statementDelimiterToken = compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); + var statementDelimiterToken = parserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); foreach (var argument in functionDefinitionNode.FunctionArgumentsListingNode.FunctionArgumentEntryNodeList) { @@ -64,9 +66,10 @@ public static void HandleFunctionDefinition( public static void HandleConstructorDefinition( TypeDefinitionNode typeDefinitionNodeCodeBlockOwner, IdentifierToken consumedIdentifierToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { - var functionArgumentsListingNode = HandleFunctionArguments(compilationUnit); + var functionArgumentsListingNode = HandleFunctionArguments(compilationUnit, ref parserModel); var typeClauseNode = new TypeClauseNode( typeDefinitionNodeCodeBlockOwner.TypeIdentifierToken, @@ -82,55 +85,55 @@ public static void HandleConstructorDefinition( null); compilationUnit.Binder.BindConstructorDefinitionIdentifierToken(consumedIdentifierToken, compilationUnit); - compilationUnit.ParserModel.SyntaxStack.Push(constructorDefinitionNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = constructorDefinitionNode; + parserModel.SyntaxStack.Push(constructorDefinitionNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = constructorDefinitionNode; - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.ColonToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.ColonToken) { - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); // Constructor invokes some other constructor as well // 'this(...)' or 'base(...)' KeywordToken keywordToken; - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.ThisTokenKeyword) - keywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.ThisTokenKeyword); - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.BaseTokenKeyword) - keywordToken = (KeywordToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.BaseTokenKeyword); + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.ThisTokenKeyword) + keywordToken = (KeywordToken)parserModel.TokenWalker.Match(SyntaxKind.ThisTokenKeyword); + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.BaseTokenKeyword) + keywordToken = (KeywordToken)parserModel.TokenWalker.Match(SyntaxKind.BaseTokenKeyword); else keywordToken = default; - while (!compilationUnit.ParserModel.TokenWalker.IsEof) + while (!parserModel.TokenWalker.IsEof) { // TODO: This won't work because an OpenBraceToken can appear inside the "other constructor invocation"... // ...If one were to skip over this syntax for the time being, it should be done by counting the // matched OpenParenthesisToken and CloseParenthesisToken until it evens out. - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken || - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken || + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken) { break; } - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } } } /// Use this method for function definition, whereas should be used for function invocation. - public static FunctionArgumentsListingNode HandleFunctionArguments(CSharpCompilationUnit compilationUnit) + public static FunctionArgumentsListingNode HandleFunctionArguments(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var openParenthesisToken = (OpenParenthesisToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var openParenthesisToken = (OpenParenthesisToken)parserModel.TokenWalker.Consume(); var functionArgumentEntryNodeList = new List(); var openParenthesisCount = 1; var corruptState = false; - while (!compilationUnit.ParserModel.TokenWalker.IsEof) + while (!parserModel.TokenWalker.IsEof) { - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenParenthesisToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenParenthesisToken) { openParenthesisCount++; } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseParenthesisToken) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseParenthesisToken) { openParenthesisCount--; @@ -139,19 +142,19 @@ public static FunctionArgumentsListingNode HandleFunctionArguments(CSharpCompila break; } } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) { break; } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken && - compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken && + parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) { break; } else if (!corruptState) { - var tokenIndexOriginal = compilationUnit.ParserModel.TokenWalker.Index; - var successTypeClauseNode = ParseOthers.TryParseExpression(SyntaxKind.TypeClauseNode, compilationUnit, out var typeClauseNode); + var tokenIndexOriginal = parserModel.TokenWalker.Index; + var successTypeClauseNode = ParseOthers.TryParseExpression(SyntaxKind.TypeClauseNode, compilationUnit, ref parserModel, out var typeClauseNode); var successName = false; if (successTypeClauseNode) @@ -159,12 +162,12 @@ public static FunctionArgumentsListingNode HandleFunctionArguments(CSharpCompila // 'TypeClauseNode' or 'VariableDeclarationNode' var successNameableToken = false; - if (UtilityApi.IsConvertibleToIdentifierToken(compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind)) + if (UtilityApi.IsConvertibleToIdentifierToken(parserModel.TokenWalker.Current.SyntaxKind)) { - var identifierToken = UtilityApi.ConvertToIdentifierToken(compilationUnit.ParserModel.TokenWalker.Consume(), compilationUnit); + var identifierToken = UtilityApi.ConvertToIdentifierToken(parserModel.TokenWalker.Consume(), compilationUnit, ref parserModel); successNameableToken = true; - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken) { // Optional } @@ -186,10 +189,10 @@ public static FunctionArgumentsListingNode HandleFunctionArguments(CSharpCompila functionArgumentEntryNodeList.Add(functionArgumentEntryNode); - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken) - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken) + _ = parserModel.TokenWalker.Consume(); - if (tokenIndexOriginal < compilationUnit.ParserModel.TokenWalker.Index) + if (tokenIndexOriginal < parserModel.TokenWalker.Index) continue; // Already consumed so avoid the one at the end of the while loop } @@ -202,13 +205,13 @@ public static FunctionArgumentsListingNode HandleFunctionArguments(CSharpCompila } } - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } var closeParenthesisToken = default(CloseParenthesisToken); - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseParenthesisToken) - closeParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Consume(); + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseParenthesisToken) + closeParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Consume(); return new FunctionArgumentsListingNode( openParenthesisToken, diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseOthers.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseOthers.cs index d7d94c74f..7df7707c1 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseOthers.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseOthers.cs @@ -16,15 +16,15 @@ public static class ParseOthers /// /// TODO: Delete this method, to parse a namespace identifier one should be able to just invoke 'ParseExpression(...)' /// - public static ISyntax HandleNamespaceIdentifier(CSharpCompilationUnit compilationUnit) + public static ISyntax HandleNamespaceIdentifier(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { var combineNamespaceIdentifierIntoOne = new List(); - while (!compilationUnit.ParserModel.TokenWalker.IsEof) + while (!parserModel.TokenWalker.IsEof) { if (combineNamespaceIdentifierIntoOne.Count % 2 == 0) { - var matchedToken = compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + var matchedToken = parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); combineNamespaceIdentifierIntoOne.Add(matchedToken); if (matchedToken.IsFabricated) @@ -32,8 +32,8 @@ public static ISyntax HandleNamespaceIdentifier(CSharpCompilationUnit compilatio } else { - if (SyntaxKind.MemberAccessToken == compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind) - combineNamespaceIdentifierIntoOne.Add(compilationUnit.ParserModel.TokenWalker.Consume()); + if (SyntaxKind.MemberAccessToken == parserModel.TokenWalker.Current.SyntaxKind) + combineNamespaceIdentifierIntoOne.Add(parserModel.TokenWalker.Consume()); else break; } @@ -54,20 +54,20 @@ public static ISyntax HandleNamespaceIdentifier(CSharpCompilationUnit compilatio return new IdentifierToken(identifierTextSpan); } - public static void StartStatement_Expression(CSharpCompilationUnit compilationUnit) + public static void StartStatement_Expression(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var expressionNode = ParseOthers.ParseExpression(compilationUnit); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(expressionNode); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + parserModel.CurrentCodeBlockBuilder.ChildList.Add(expressionNode); } /// /// ParseExpression while expressionPrimary.SyntaxKind == syntaxKind /// /// if (expressionPrimary.SyntaxKind != syntaxKind) - /// compilationUnit.ParserModel.TokenWalker.Backtrack() to either the previous loops tokenIndex where + /// parserModel.TokenWalker.Backtrack() to either the previous loops tokenIndex where /// the syntax kinds did match. /// - /// Or, if they never matched then compilationUnit.ParserModel.TokenWalker.Backtrack() + /// Or, if they never matched then parserModel.TokenWalker.Backtrack() /// to the tokenIndex that was had when this function was invoked. /// /// Return true if a match was found, return false if NO match was found. @@ -76,30 +76,30 @@ public static void StartStatement_Expression(CSharpCompilationUnit compilationUn /// As a result, some statements need to read a TypeClauseNode by invoking 'ParseExpression(...)'. /// /// In order to "short circut" or "force exit" from the expression code back to the statement code, - /// if the root primary expression is not equal to the compilationUnit.ParserModel.ForceParseExpressionSyntaxKind + /// if the root primary expression is not equal to the parserModel.ForceParseExpressionSyntaxKind /// then stop. /// - public static bool TryParseExpression(SyntaxKind? syntaxKind, CSharpCompilationUnit compilationUnit, out IExpressionNode expressionNode) + public static bool TryParseExpression(SyntaxKind? syntaxKind, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel, out IExpressionNode expressionNode) { - var originalTokenIndex = compilationUnit.ParserModel.TokenWalker.Index; + var originalTokenIndex = parserModel.TokenWalker.Index; if (syntaxKind is not null) - compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Add(syntaxKind.Value); + parserModel.TryParseExpressionSyntaxKindList.Add(syntaxKind.Value); try { - expressionNode = ParseExpression(compilationUnit); + expressionNode = ParseExpression(compilationUnit, ref parserModel); #if DEBUG Console.WriteLine($"try => {expressionNode.SyntaxKind}\n"); #endif - return compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Contains(expressionNode.SyntaxKind); + return parserModel.TryParseExpressionSyntaxKindList.Contains(expressionNode.SyntaxKind); } finally { - compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Clear(); - compilationUnit.ParserModel.ForceParseExpressionInitialPrimaryExpression = EmptyExpressionNode.Empty; + parserModel.TryParseExpressionSyntaxKindList.Clear(); + parserModel.ForceParseExpressionInitialPrimaryExpression = EmptyExpressionNode.Empty; } } @@ -123,37 +123,37 @@ public static bool SyntaxIsEndDelimiter(SyntaxKind syntaxKind) } /// - /// Invoke this method when 'compilationUnit.ParserModel.TokenWalker.Current' is the first token of the expression to be parsed. + /// Invoke this method when 'parserModel.TokenWalker.Current' is the first token of the expression to be parsed. /// - /// In the case where the first token of the expression had already been 'Consume()'-ed then 'compilationUnit.ParserModel.TokenWalker.Backtrack();' - /// might be of use in order to move the compilationUnit.ParserModel.TokenWalker backwards prior to invoking this method. + /// In the case where the first token of the expression had already been 'Consume()'-ed then 'parserModel.TokenWalker.Backtrack();' + /// might be of use in order to move the parserModel.TokenWalker backwards prior to invoking this method. /// - public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationUnit) + public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { #if DEBUG Console.WriteLine("\nParseExpression(...)"); #endif - var expressionPrimary = compilationUnit.ParserModel.ForceParseExpressionInitialPrimaryExpression; - var indexToken = compilationUnit.ParserModel.TokenWalker.Index; + var expressionPrimary = parserModel.ForceParseExpressionInitialPrimaryExpression; + var indexToken = parserModel.TokenWalker.Index; var forceExit = false; - var indexTokenRoot = compilationUnit.ParserModel.TokenWalker.Index; + var indexTokenRoot = parserModel.TokenWalker.Index; var expressionPrimaryPreviousRoot = expressionPrimary; - while (!compilationUnit.ParserModel.TokenWalker.IsEof) + while (!parserModel.TokenWalker.IsEof) { #if DEBUG - WriteExpressionList(compilationUnit.ParserModel.ExpressionList); + WriteExpressionList(parserModel.ExpressionList); #endif - var tokenCurrent = compilationUnit.ParserModel.TokenWalker.Current; + var tokenCurrent = parserModel.TokenWalker.Current; if (SyntaxIsEndDelimiter(tokenCurrent.SyntaxKind)) // Check if the tokenCurrent is a token that is used as a end-delimiter before iterating the list? { - for (int i = compilationUnit.ParserModel.ExpressionList.Count - 1; i > -1; i--) + for (int i = parserModel.ExpressionList.Count - 1; i > -1; i--) { - var delimiterExpressionTuple = compilationUnit.ParserModel.ExpressionList[i]; + var delimiterExpressionTuple = parserModel.ExpressionList[i]; if (delimiterExpressionTuple.DelimiterSyntaxKind == tokenCurrent.SyntaxKind) { @@ -163,7 +163,7 @@ public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationU break; } - expressionPrimary = BubbleUpParseExpression(i, expressionPrimary, compilationUnit); + expressionPrimary = BubbleUpParseExpression(i, expressionPrimary, compilationUnit, ref parserModel); break; } } @@ -171,35 +171,35 @@ public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationU if (forceExit) // delimiterExpressionTuple.ExpressionNode is null { - expressionPrimary = BubbleUpParseExpression(0, expressionPrimary, compilationUnit); + expressionPrimary = BubbleUpParseExpression(0, expressionPrimary, compilationUnit, ref parserModel); break; } - expressionPrimary = compilationUnit.Binder.AnyMergeToken(expressionPrimary, tokenCurrent, compilationUnit); + expressionPrimary = compilationUnit.Binder.AnyMergeToken(expressionPrimary, tokenCurrent, compilationUnit, ref parserModel); #if DEBUG Console.WriteLine($"\t=> {expressionPrimary.SyntaxKind}"); #endif - if (compilationUnit.ParserModel.TokenWalker.Index == indexToken) - _ = compilationUnit.ParserModel.TokenWalker.Consume(); - if (compilationUnit.ParserModel.TokenWalker.Index < indexToken) + if (parserModel.TokenWalker.Index == indexToken) + _ = parserModel.TokenWalker.Consume(); + if (parserModel.TokenWalker.Index < indexToken) throw new LuthetusTextEditorException($"Infinite loop in {nameof(ParseExpression)}"); - indexToken = compilationUnit.ParserModel.TokenWalker.Index; + indexToken = parserModel.TokenWalker.Index; - if (compilationUnit.ParserModel.NoLongerRelevantExpressionNode is not null) // try finally is not needed to guarantee setting 'compilationUnit.ParserModel.NoLongerRelevantExpressionNode = null;' because this is an object reference comparison 'Object.ReferenceEquals'. Versus something more general that would break future parses if not properly cleared, like a SyntaxKind. + if (parserModel.NoLongerRelevantExpressionNode is not null) // try finally is not needed to guarantee setting 'parserModel.NoLongerRelevantExpressionNode = null;' because this is an object reference comparison 'Object.ReferenceEquals'. Versus something more general that would break future parses if not properly cleared, like a SyntaxKind. { - compilationUnit.Binder.ClearFromExpressionList(compilationUnit.ParserModel.NoLongerRelevantExpressionNode, compilationUnit); - compilationUnit.ParserModel.NoLongerRelevantExpressionNode = null; + compilationUnit.Binder.ClearFromExpressionList(parserModel.NoLongerRelevantExpressionNode, compilationUnit, ref parserModel); + parserModel.NoLongerRelevantExpressionNode = null; } - if (compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Count != 0) + if (parserModel.TryParseExpressionSyntaxKindList.Count != 0) { var isExpressionRoot = true; var rootSyntaxKind = SyntaxKind.EmptyExpressionNode; - foreach (var tuple in compilationUnit.ParserModel.ExpressionList) + foreach (var tuple in parserModel.ExpressionList) { if (tuple.ExpressionNode is null) continue; @@ -213,26 +213,26 @@ public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationU if (isExpressionRoot) { - success = compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Contains(expressionPrimary.SyntaxKind); + success = parserModel.TryParseExpressionSyntaxKindList.Contains(expressionPrimary.SyntaxKind); if (success) { expressionPrimaryPreviousRoot = expressionPrimary; - indexTokenRoot = compilationUnit.ParserModel.TokenWalker.Index; + indexTokenRoot = parserModel.TokenWalker.Index; } } else { - success = compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Contains(rootSyntaxKind); + success = parserModel.TryParseExpressionSyntaxKindList.Contains(rootSyntaxKind); } if (!success) { - var distance = compilationUnit.ParserModel.TokenWalker.Index - indexTokenRoot; + var distance = parserModel.TokenWalker.Index - indexTokenRoot; for (int i = 0; i < distance; i++) { - _ = compilationUnit.ParserModel.TokenWalker.Backtrack(); + _ = parserModel.TokenWalker.Backtrack(); } expressionPrimary = expressionPrimaryPreviousRoot; @@ -240,27 +240,28 @@ public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationU forceExit = true; #if DEBUG - WriteExpressionList(compilationUnit.ParserModel.ExpressionList); + WriteExpressionList(parserModel.ExpressionList); Console.WriteLine("----TryParseExpressionSyntaxKindList"); #endif } } - if (forceExit) // compilationUnit.ParserModel.ForceParseExpressionSyntaxKind + if (forceExit) // parserModel.ForceParseExpressionSyntaxKind break; } // It is vital that this 'clear' and 'add' are done in a way that permits an invoker of the 'ParseExpression' method to 'add' a similar 'forceExit' delimiter - // Example: 'compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null));' - compilationUnit.ParserModel.ExpressionList.Clear(); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.StatementDelimiterToken, null)); + // Example: 'parserModel.ExpressionList.Add((SyntaxKind.CloseParenthesisToken, null));' + parserModel.ExpressionList.Clear(); + parserModel.ExpressionList.Add((SyntaxKind.StatementDelimiterToken, null)); if (expressionPrimary.SyntaxKind == SyntaxKind.AmbiguousIdentifierExpressionNode) { expressionPrimary = compilationUnit.Binder.ForceDecisionAmbiguousIdentifier( EmptyExpressionNode.Empty, (AmbiguousIdentifierExpressionNode)expressionPrimary, - compilationUnit); + compilationUnit, + ref parserModel); } #if DEBUG @@ -289,12 +290,12 @@ public static IExpressionNode ParseExpression(CSharpCompilationUnit compilationU /// /// LambdaExpressionNode for example, needs to override 'SyntaxKind.StatementDelimiterToken'. /// - private static IExpressionNode BubbleUpParseExpression(int indexTriggered, IExpressionNode expressionPrimary, CSharpCompilationUnit compilationUnit) + private static IExpressionNode BubbleUpParseExpression(int indexTriggered, IExpressionNode expressionPrimary, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var triggeredDelimiterTuple = compilationUnit.ParserModel.ExpressionList[indexTriggered]; + var triggeredDelimiterTuple = parserModel.ExpressionList[indexTriggered]; IExpressionNode? previousDelimiterExpressionNode = null; - var initialExpressionListCount = compilationUnit.ParserModel.ExpressionList.Count; + var initialExpressionListCount = parserModel.ExpressionList.Count; #if DEBUG var nullNodeSyntaxKindText = "null"; @@ -303,8 +304,8 @@ private static IExpressionNode BubbleUpParseExpression(int indexTriggered, IExpr for (int i = initialExpressionListCount - 1; i > indexTriggered - 1; i--) { - var delimiterExpressionTuple = compilationUnit.ParserModel.ExpressionList[i]; - compilationUnit.ParserModel.ExpressionList.RemoveAt(i); + var delimiterExpressionTuple = parserModel.ExpressionList[i]; + parserModel.ExpressionList.RemoveAt(i); if (delimiterExpressionTuple.ExpressionNode is null) break; // This implies to forcibly return back to the statement while loop. @@ -321,13 +322,14 @@ private static IExpressionNode BubbleUpParseExpression(int indexTriggered, IExpr expressionPrimary = compilationUnit.Binder.AnyMergeExpression( delimiterExpressionTuple.ExpressionNode, expressionPrimary, // expressionSecondary - compilationUnit); + compilationUnit, + ref parserModel); } - if (compilationUnit.ParserModel.NoLongerRelevantExpressionNode is not null) // try finally is not needed to guarantee setting 'compilationUnit.ParserModel.NoLongerRelevantExpressionNode = null;' because this is an object reference comparison 'Object.ReferenceEquals'. Versus something more general that would break future parses if not properly cleared, like a SyntaxKind. + if (parserModel.NoLongerRelevantExpressionNode is not null) // try finally is not needed to guarantee setting 'parserModel.NoLongerRelevantExpressionNode = null;' because this is an object reference comparison 'Object.ReferenceEquals'. Versus something more general that would break future parses if not properly cleared, like a SyntaxKind. { - compilationUnit.Binder.ClearFromExpressionList(compilationUnit.ParserModel.NoLongerRelevantExpressionNode, compilationUnit); - compilationUnit.ParserModel.NoLongerRelevantExpressionNode = null; + compilationUnit.Binder.ClearFromExpressionList(parserModel.NoLongerRelevantExpressionNode, compilationUnit, ref parserModel); + parserModel.NoLongerRelevantExpressionNode = null; } return expressionPrimary; diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTokens.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTokens.cs index 123ccc697..7247c52b7 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTokens.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTokens.cs @@ -15,22 +15,23 @@ public static class ParseTokens { public static void ParsePreprocessorDirectiveToken( PreprocessorDirectiveToken consumedPreprocessorDirectiveToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { - var consumedToken = compilationUnit.ParserModel.TokenWalker.Consume(); + var consumedToken = parserModel.TokenWalker.Consume(); } - public static void ParseIdentifierToken(CSharpCompilationUnit compilationUnit) + public static void ParseIdentifierToken(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var originalTokenIndex = compilationUnit.ParserModel.TokenWalker.Index; + var originalTokenIndex = parserModel.TokenWalker.Index; - compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.TypeClauseNode); - compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.VariableDeclarationNode); - compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.VariableReferenceNode); - compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.ConstructorInvocationExpressionNode); + parserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.TypeClauseNode); + parserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.VariableDeclarationNode); + parserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.VariableReferenceNode); + parserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.ConstructorInvocationExpressionNode); - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner is not null && - compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner.SyntaxKind != SyntaxKind.TypeDefinitionNode) + if (parserModel.CurrentCodeBlockBuilder.CodeBlockOwner is not null && + parserModel.CurrentCodeBlockBuilder.CodeBlockOwner.SyntaxKind != SyntaxKind.TypeDefinitionNode) { // There is a syntax conflict between a ConstructorDefinitionNode and a FunctionInvocationNode. // @@ -42,65 +43,66 @@ public static void ParseIdentifierToken(CSharpCompilationUnit compilationUnit) // Then, it perhaps should be treated as a function invocation (or function definition). // The main case for this being someone typing out pseudo code within a CodeBlockOwner // that is a TypeDefinitionNode. - compilationUnit.ParserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.FunctionInvocationNode); + parserModel.TryParseExpressionSyntaxKindList.Add(SyntaxKind.FunctionInvocationNode); } - var successParse = ParseOthers.TryParseExpression(null, compilationUnit, out var expressionNode); + var successParse = ParseOthers.TryParseExpression(null, compilationUnit, ref parserModel, out var expressionNode); if (!successParse) { - expressionNode = ParseOthers.ParseExpression(compilationUnit); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(expressionNode); + expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + parserModel.StatementBuilder.ChildList.Add(expressionNode); return; } switch (expressionNode.SyntaxKind) { case SyntaxKind.TypeClauseNode: - MoveToHandleTypeClauseNode(originalTokenIndex, (TypeClauseNode)expressionNode, compilationUnit); + MoveToHandleTypeClauseNode(originalTokenIndex, (TypeClauseNode)expressionNode, compilationUnit, ref parserModel); return; case SyntaxKind.VariableDeclarationNode: - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenParenthesisToken || - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenAngleBracketToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenParenthesisToken || + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenAngleBracketToken) { - MoveToHandleFunctionDefinition((VariableDeclarationNode)expressionNode, compilationUnit); + MoveToHandleFunctionDefinition((VariableDeclarationNode)expressionNode, compilationUnit, ref parserModel); return; } - MoveToHandleVariableDeclarationNode((VariableDeclarationNode)expressionNode, compilationUnit); + MoveToHandleVariableDeclarationNode((VariableDeclarationNode)expressionNode, compilationUnit, ref parserModel); return; case SyntaxKind.VariableReferenceNode: case SyntaxKind.FunctionInvocationNode: case SyntaxKind.ConstructorInvocationExpressionNode: - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(expressionNode); + parserModel.StatementBuilder.ChildList.Add(expressionNode); return; default: - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException(compilationUnit.ParserModel.TokenWalker.Current.TextSpan, $"nameof(ParseIdentifierToken) default case"); + parserModel.DiagnosticBag.ReportTodoException(parserModel.TokenWalker.Current.TextSpan, $"nameof(ParseIdentifierToken) default case"); return; } } - public static void MoveToHandleFunctionDefinition(VariableDeclarationNode variableDeclarationNode, CSharpCompilationUnit compilationUnit) + public static void MoveToHandleFunctionDefinition(VariableDeclarationNode variableDeclarationNode, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { ParseFunctions.HandleFunctionDefinition( variableDeclarationNode.IdentifierToken, variableDeclarationNode.TypeClauseNode, consumedGenericArgumentsListingNode: null, - compilationUnit); + compilationUnit, + ref parserModel); } - public static void MoveToHandleVariableDeclarationNode(IVariableDeclarationNode variableDeclarationNode, CSharpCompilationUnit compilationUnit) + public static void MoveToHandleVariableDeclarationNode(IVariableDeclarationNode variableDeclarationNode, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { var variableKind = VariableKind.Local; - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken || - (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken && - compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken)) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken || + (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken && + parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken)) { variableKind = VariableKind.Property; } - else if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner is not null && - compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner.SyntaxKind == SyntaxKind.TypeDefinitionNode) + else if (parserModel.CurrentCodeBlockBuilder.CodeBlockOwner is not null && + parserModel.CurrentCodeBlockBuilder.CodeBlockOwner.SyntaxKind == SyntaxKind.TypeDefinitionNode) { variableKind = VariableKind.Field; } @@ -108,123 +110,124 @@ public static void MoveToHandleVariableDeclarationNode(IVariableDeclarationNode ((VariableDeclarationNode)variableDeclarationNode).VariableKind = variableKind; compilationUnit.Binder.BindVariableDeclarationNode(variableDeclarationNode, compilationUnit); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(variableDeclarationNode); - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(variableDeclarationNode); + parserModel.CurrentCodeBlockBuilder.ChildList.Add(variableDeclarationNode); + parserModel.StatementBuilder.ChildList.Add(variableDeclarationNode); - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) { - ParsePropertyDefinition(compilationUnit, variableDeclarationNode); + ParsePropertyDefinition(compilationUnit, variableDeclarationNode, ref parserModel); } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken && - compilationUnit.ParserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken && + parserModel.TokenWalker.Next.SyntaxKind == SyntaxKind.CloseAngleBracketToken) { - ParsePropertyDefinition_ExpressionBound(compilationUnit); + ParsePropertyDefinition_ExpressionBound(compilationUnit, ref parserModel); } } - public static void MoveToHandleTypeClauseNode(int originalTokenIndex, TypeClauseNode typeClauseNode, CSharpCompilationUnit compilationUnit) + public static void MoveToHandleTypeClauseNode(int originalTokenIndex, TypeClauseNode typeClauseNode, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.StatementDelimiterToken || - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EndOfFileToken || - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken || - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseBraceToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.StatementDelimiterToken || + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EndOfFileToken || + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken || + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseBraceToken) { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(typeClauseNode); + parserModel.StatementBuilder.ChildList.Add(typeClauseNode); } - else if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner is TypeDefinitionNode typeDefinitionNode && + else if (parserModel.CurrentCodeBlockBuilder.CodeBlockOwner is TypeDefinitionNode typeDefinitionNode && UtilityApi.IsConvertibleToIdentifierToken(typeClauseNode.TypeIdentifierToken.SyntaxKind) && - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenParenthesisToken && + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenParenthesisToken && typeDefinitionNode.TypeIdentifierToken.TextSpan.GetText() == typeClauseNode.TypeIdentifierToken.TextSpan.GetText()) { // ConstructorDefinitionNode - var identifierToken = UtilityApi.ConvertToIdentifierToken(typeClauseNode.TypeIdentifierToken, compilationUnit); + var identifierToken = UtilityApi.ConvertToIdentifierToken(typeClauseNode.TypeIdentifierToken, compilationUnit, ref parserModel); ParseFunctions.HandleConstructorDefinition( typeDefinitionNode, identifierToken, - compilationUnit); + compilationUnit, + ref parserModel); } else { - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(typeClauseNode); + parserModel.StatementBuilder.ChildList.Add(typeClauseNode); } return; } - public static void ParsePropertyDefinition(CSharpCompilationUnit compilationUnit, IVariableDeclarationNode variableDeclarationNode) + public static void ParsePropertyDefinition(CSharpCompilationUnit compilationUnit, IVariableDeclarationNode variableDeclarationNode, ref CSharpParserModel parserModel) { #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; #endif - var openBraceToken = (OpenBraceToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var openBraceToken = (OpenBraceToken)parserModel.TokenWalker.Consume(); var openBraceCounter = 1; while (true) { - if (compilationUnit.ParserModel.TokenWalker.IsEof) + if (parserModel.TokenWalker.IsEof) break; - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) { ++openBraceCounter; } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseBraceToken) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseBraceToken) { if (--openBraceCounter <= 0) break; } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.GetTokenContextualKeyword) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.GetTokenContextualKeyword) { variableDeclarationNode.HasGetter = true; } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.SetTokenContextualKeyword) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.SetTokenContextualKeyword) { variableDeclarationNode.HasSetter = true; } - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } - var closeTokenIndex = compilationUnit.ParserModel.TokenWalker.Index; - var closeBraceToken = (CloseBraceToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseBraceToken); + var closeTokenIndex = parserModel.TokenWalker.Index; + var closeBraceToken = (CloseBraceToken)parserModel.TokenWalker.Match(SyntaxKind.CloseBraceToken); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; #endif } - public static void ParsePropertyDefinition_ExpressionBound(CSharpCompilationUnit compilationUnit) + public static void ParsePropertyDefinition_ExpressionBound(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var equalsToken = (EqualsToken)compilationUnit.ParserModel.TokenWalker.Consume(); - var closeAngleBracketToken = (CloseAngleBracketToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var equalsToken = (EqualsToken)parserModel.TokenWalker.Consume(); + var closeAngleBracketToken = (CloseAngleBracketToken)parserModel.TokenWalker.Consume(); - var expressionNode = ParseOthers.ParseExpression(compilationUnit); - var statementDelimiterToken = (StatementDelimiterToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); + var expressionNode = ParseOthers.ParseExpression(compilationUnit, ref parserModel); + var statementDelimiterToken = (StatementDelimiterToken)parserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); } - public static void ParseColonToken(CSharpCompilationUnit compilationUnit) + public static void ParseColonToken(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var colonToken = (ColonToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var colonToken = (ColonToken)parserModel.TokenWalker.Consume(); - if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out var syntax) && syntax.SyntaxKind == SyntaxKind.TypeDefinitionNode) + if (parserModel.SyntaxStack.TryPeek(out var syntax) && syntax.SyntaxKind == SyntaxKind.TypeDefinitionNode) { - var typeDefinitionNode = (TypeDefinitionNode)compilationUnit.ParserModel.SyntaxStack.Pop(); - var inheritedTypeClauseNode = compilationUnit.ParserModel.TokenWalker.MatchTypeClauseNode(compilationUnit); + var typeDefinitionNode = (TypeDefinitionNode)parserModel.SyntaxStack.Pop(); + var inheritedTypeClauseNode = parserModel.TokenWalker.MatchTypeClauseNode(compilationUnit, ref parserModel); compilationUnit.Binder.BindTypeClauseNode(inheritedTypeClauseNode, compilationUnit); typeDefinitionNode.SetInheritedTypeClauseNode(inheritedTypeClauseNode); - compilationUnit.ParserModel.SyntaxStack.Push(typeDefinitionNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = typeDefinitionNode; + parserModel.SyntaxStack.Push(typeDefinitionNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = typeDefinitionNode; } else { - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException(colonToken.TextSpan, "Colon is in unexpected place."); + parserModel.DiagnosticBag.ReportTodoException(colonToken.TextSpan, "Colon is in unexpected place."); } } @@ -232,34 +235,34 @@ public static void ParseColonToken(CSharpCompilationUnit compilationUnit) /// OpenBraceToken is passed in to the method because it is a protected token, /// and is preferably consumed from the main loop so it can be more easily tracked. /// - public static void ParseOpenBraceToken(OpenBraceToken openBraceToken, CSharpCompilationUnit compilationUnit) + public static void ParseOpenBraceToken(OpenBraceToken openBraceToken, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner is null) + if (parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner is null) { - var arbitraryCodeBlockNode = new ArbitraryCodeBlockNode(compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner); - compilationUnit.ParserModel.SyntaxStack.Push(arbitraryCodeBlockNode); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = arbitraryCodeBlockNode; + var arbitraryCodeBlockNode = new ArbitraryCodeBlockNode(parserModel.CurrentCodeBlockBuilder.CodeBlockOwner); + parserModel.SyntaxStack.Push(arbitraryCodeBlockNode); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = arbitraryCodeBlockNode; } - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner.SetOpenBraceToken(openBraceToken, compilationUnit.ParserModel.DiagnosticBag, compilationUnit.ParserModel.TokenWalker); + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner.SetOpenBraceToken(openBraceToken, parserModel.DiagnosticBag, parserModel.TokenWalker); - var parentScopeDirection = compilationUnit.ParserModel.CurrentCodeBlockBuilder?.CodeBlockOwner?.ScopeDirectionKind ?? ScopeDirectionKind.Both; + var parentScopeDirection = parserModel.CurrentCodeBlockBuilder?.CodeBlockOwner?.ScopeDirectionKind ?? ScopeDirectionKind.Both; if (parentScopeDirection == ScopeDirectionKind.Both) { - if (!compilationUnit.ParserModel.CurrentCodeBlockBuilder.PermitInnerPendingCodeBlockOwnerToBeParsed) + if (!parserModel.CurrentCodeBlockBuilder.PermitInnerPendingCodeBlockOwnerToBeParsed) { - compilationUnit.ParserModel.TokenWalker.DeferParsingOfChildScope(openBraceToken, compilationUnit); + parserModel.TokenWalker.DeferParsingOfChildScope(openBraceToken, compilationUnit, ref parserModel); return; } - compilationUnit.ParserModel.CurrentCodeBlockBuilder.PermitInnerPendingCodeBlockOwnerToBeParsed = false; + parserModel.CurrentCodeBlockBuilder.PermitInnerPendingCodeBlockOwnerToBeParsed = false; } - var nextCodeBlockOwner = compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner; + var nextCodeBlockOwner = parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner; var nextReturnTypeClauseNode = nextCodeBlockOwner.GetReturnTypeClauseNode(); compilationUnit.Binder.OpenScope(nextCodeBlockOwner, nextReturnTypeClauseNode, openBraceToken.TextSpan, compilationUnit); - compilationUnit.ParserModel.CurrentCodeBlockBuilder = new(parent: compilationUnit.ParserModel.CurrentCodeBlockBuilder, codeBlockOwner: nextCodeBlockOwner); + parserModel.CurrentCodeBlockBuilder = new(parent: parserModel.CurrentCodeBlockBuilder, codeBlockOwner: nextCodeBlockOwner); compilationUnit.Binder.OnBoundScopeCreatedAndSetAsCurrent(nextCodeBlockOwner, compilationUnit); } @@ -267,50 +270,53 @@ public static void ParseOpenBraceToken(OpenBraceToken openBraceToken, CSharpComp /// CloseBraceToken is passed in to the method because it is a protected token, /// and is preferably consumed from the main loop so it can be more easily tracked. /// - public static void ParseCloseBraceToken(CloseBraceToken closeBraceToken, CSharpCompilationUnit compilationUnit) + public static void ParseCloseBraceToken(CloseBraceToken closeBraceToken, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.ParseChildScopeQueue.TryDequeue(out var deferredChildScope)) + if (parserModel.CurrentCodeBlockBuilder.ParseChildScopeQueue.TryDequeue(out var deferredChildScope)) { - deferredChildScope.PrepareMainParserLoop(compilationUnit.ParserModel.TokenWalker.Index - 1, compilationUnit); + deferredChildScope.PrepareMainParserLoop(parserModel.TokenWalker.Index - 1, compilationUnit, ref parserModel); return; } - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner is not null) - compilationUnit.ParserModel.CurrentCodeBlockBuilder.CodeBlockOwner.SetCloseBraceToken(closeBraceToken, compilationUnit.ParserModel.DiagnosticBag, compilationUnit.ParserModel.TokenWalker); + if (parserModel.CurrentCodeBlockBuilder.CodeBlockOwner is not null) + parserModel.CurrentCodeBlockBuilder.CodeBlockOwner.SetCloseBraceToken(closeBraceToken, parserModel.DiagnosticBag, parserModel.TokenWalker); - compilationUnit.Binder.CloseScope(closeBraceToken.TextSpan, compilationUnit); + compilationUnit.Binder.CloseScope(closeBraceToken.TextSpan, compilationUnit, ref parserModel); } - public static void ParseOpenParenthesisToken(CSharpCompilationUnit compilationUnit) + public static void ParseOpenParenthesisToken(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { } public static void ParseCloseParenthesisToken( CloseParenthesisToken consumedCloseParenthesisToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { - var closesParenthesisToken = (CloseParenthesisToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var closesParenthesisToken = (CloseParenthesisToken)parserModel.TokenWalker.Consume(); } public static void ParseOpenAngleBracketToken( OpenAngleBracketToken consumedOpenAngleBracketToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } public static void ParseCloseAngleBracketToken( CloseAngleBracketToken consumedCloseAngleBracketToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } - public static void ParseOpenSquareBracketToken(CSharpCompilationUnit compilationUnit) + public static void ParseOpenSquareBracketToken(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var openSquareBracketToken = (OpenSquareBracketToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var openSquareBracketToken = (OpenSquareBracketToken)parserModel.TokenWalker.Consume(); - if (compilationUnit.ParserModel.StatementBuilder.ChildList.Count != 0) + if (parserModel.StatementBuilder.ChildList.Count != 0) { - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException( + parserModel.DiagnosticBag.ReportTodoException( openSquareBracketToken.TextSpan, $"Unexpected '{nameof(OpenSquareBracketToken)}'"); return; @@ -319,67 +325,68 @@ public static void ParseOpenSquareBracketToken(CSharpCompilationUnit compilation var corruptState = false; #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; #endif - while (!compilationUnit.ParserModel.TokenWalker.IsEof) + while (!parserModel.TokenWalker.IsEof) { - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenSquareBracketToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenSquareBracketToken) { ++openSquareBracketCounter; } - else if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseSquareBracketToken) + else if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CloseSquareBracketToken) { if (--openSquareBracketCounter <= 0) break; } else if (!corruptState) { - var tokenIndexOriginal = compilationUnit.ParserModel.TokenWalker.Index; + var tokenIndexOriginal = parserModel.TokenWalker.Index; - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CloseSquareBracketToken, null)); - compilationUnit.ParserModel.ExpressionList.Add((SyntaxKind.CommaToken, null)); - var expression = ParseOthers.ParseExpression(compilationUnit); + parserModel.ExpressionList.Add((SyntaxKind.CloseSquareBracketToken, null)); + parserModel.ExpressionList.Add((SyntaxKind.CommaToken, null)); + var expression = ParseOthers.ParseExpression(compilationUnit, ref parserModel); - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken) - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.CommaToken) + _ = parserModel.TokenWalker.Consume(); - if (tokenIndexOriginal < compilationUnit.ParserModel.TokenWalker.Index) + if (tokenIndexOriginal < parserModel.TokenWalker.Index) continue; // Already consumed so avoid the one at the end of the while loop } - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } - var closeTokenIndex = compilationUnit.ParserModel.TokenWalker.Index; - var closeSquareBracketToken = (CloseSquareBracketToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseSquareBracketToken); + var closeTokenIndex = parserModel.TokenWalker.Index; + var closeSquareBracketToken = (CloseSquareBracketToken)parserModel.TokenWalker.Match(SyntaxKind.CloseSquareBracketToken); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; #endif } public static void ParseCloseSquareBracketToken( CloseSquareBracketToken consumedCloseSquareBracketToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } - public static void ParseEqualsToken(CSharpCompilationUnit compilationUnit) + public static void ParseEqualsToken(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.StatementBuilder.ChildList.Count == 0) + if (parserModel.StatementBuilder.ChildList.Count == 0) { - ParseOthers.StartStatement_Expression(compilationUnit); + ParseOthers.StartStatement_Expression(compilationUnit, ref parserModel); return; } - if (compilationUnit.ParserModel.StatementBuilder.TryPeek(out var syntax) && + if (parserModel.StatementBuilder.TryPeek(out var syntax) && syntax.SyntaxKind == SyntaxKind.VariableDeclarationNode) { var variableDeclarationNode = (VariableDeclarationNode)syntax; - compilationUnit.ParserModel.TokenWalker.Backtrack(); - var expression = ParseOthers.ParseExpression(compilationUnit); + parserModel.TokenWalker.Backtrack(); + var expression = ParseOthers.ParseExpression(compilationUnit, ref parserModel); if (expression.SyntaxKind != SyntaxKind.VariableAssignmentExpressionNode) { @@ -387,13 +394,14 @@ public static void ParseEqualsToken(CSharpCompilationUnit compilationUnit) return; } - compilationUnit.ParserModel.StatementBuilder.ChildList.Add(expression); + parserModel.StatementBuilder.ChildList.Add(expression); } } public static void ParseMemberAccessToken( MemberAccessToken consumedMemberAccessToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } @@ -401,18 +409,18 @@ public static void ParseMemberAccessToken( /// StatementDelimiterToken is passed in to the method because it is a protected token, /// and is preferably consumed from the main loop so it can be more easily tracked. /// - public static void ParseStatementDelimiterToken(StatementDelimiterToken statementDelimiterToken, CSharpCompilationUnit compilationUnit) + public static void ParseStatementDelimiterToken(StatementDelimiterToken statementDelimiterToken, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (compilationUnit.ParserModel.SyntaxStack.TryPeek(out var syntax) && syntax.SyntaxKind == SyntaxKind.NamespaceStatementNode) + if (parserModel.SyntaxStack.TryPeek(out var syntax) && syntax.SyntaxKind == SyntaxKind.NamespaceStatementNode) { - var closureCurrentCompilationUnitBuilder = compilationUnit.ParserModel.CurrentCodeBlockBuilder; + var closureCurrentCompilationUnitBuilder = parserModel.CurrentCodeBlockBuilder; ICodeBlockOwner? nextCodeBlockOwner = null; TypeClauseNode? scopeReturnTypeClauseNode = null; - var namespaceStatementNode = (NamespaceStatementNode)compilationUnit.ParserModel.SyntaxStack.Pop(); + var namespaceStatementNode = (NamespaceStatementNode)parserModel.SyntaxStack.Pop(); nextCodeBlockOwner = namespaceStatementNode; - namespaceStatementNode.SetStatementDelimiterToken(statementDelimiterToken, compilationUnit.ParserModel.DiagnosticBag, compilationUnit.ParserModel.TokenWalker); + namespaceStatementNode.SetStatementDelimiterToken(statementDelimiterToken, parserModel.DiagnosticBag, parserModel.TokenWalker); compilationUnit.Binder.OpenScope( nextCodeBlockOwner, @@ -424,500 +432,410 @@ public static void ParseStatementDelimiterToken(StatementDelimiterToken statemen namespaceStatementNode.IdentifierToken.TextSpan.GetText(), compilationUnit); - compilationUnit.ParserModel.CurrentCodeBlockBuilder = new(compilationUnit.ParserModel.CurrentCodeBlockBuilder, nextCodeBlockOwner); + parserModel.CurrentCodeBlockBuilder = new(parserModel.CurrentCodeBlockBuilder, nextCodeBlockOwner); } - else if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner is not null && - !compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner.OpenBraceToken.ConstructorWasInvoked) + else if (parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner is not null && + !parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner.OpenBraceToken.ConstructorWasInvoked) { - var pendingChild = compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner; + var pendingChild = parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner; compilationUnit.Binder.OpenScope(pendingChild, CSharpFacts.Types.Void.ToTypeClause(), statementDelimiterToken.TextSpan, compilationUnit); - compilationUnit.ParserModel.CurrentCodeBlockBuilder = new(compilationUnit.ParserModel.CurrentCodeBlockBuilder, pendingChild); + parserModel.CurrentCodeBlockBuilder = new(parserModel.CurrentCodeBlockBuilder, pendingChild); compilationUnit.Binder.OnBoundScopeCreatedAndSetAsCurrent(pendingChild, compilationUnit); - compilationUnit.Binder.CloseScope(statementDelimiterToken.TextSpan, compilationUnit); + compilationUnit.Binder.CloseScope(statementDelimiterToken.TextSpan, compilationUnit, ref parserModel); - if (compilationUnit.ParserModel.CurrentCodeBlockBuilder.Parent is not null) - compilationUnit.ParserModel.CurrentCodeBlockBuilder = compilationUnit.ParserModel.CurrentCodeBlockBuilder.Parent; + if (parserModel.CurrentCodeBlockBuilder.Parent is not null) + parserModel.CurrentCodeBlockBuilder = parserModel.CurrentCodeBlockBuilder.Parent; - compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = null; + parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner = null; } } - public static void ParseKeywordToken(CSharpCompilationUnit compilationUnit) + public static void ParseKeywordToken(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { // 'return', 'if', 'get', etc... - switch (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind) + switch (parserModel.TokenWalker.Current.SyntaxKind) { case SyntaxKind.AsTokenKeyword: - ParseDefaultKeywords.HandleAsTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleAsTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.BaseTokenKeyword: - ParseDefaultKeywords.HandleBaseTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleBaseTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.BoolTokenKeyword: - ParseDefaultKeywords.HandleBoolTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleBoolTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.BreakTokenKeyword: - ParseDefaultKeywords.HandleBreakTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleBreakTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ByteTokenKeyword: - ParseDefaultKeywords.HandleByteTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleByteTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.CaseTokenKeyword: - ParseDefaultKeywords.HandleCaseTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleCaseTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.CatchTokenKeyword: - ParseDefaultKeywords.HandleCatchTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleCatchTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.CharTokenKeyword: - ParseDefaultKeywords.HandleCharTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleCharTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.CheckedTokenKeyword: - ParseDefaultKeywords.HandleCheckedTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleCheckedTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ConstTokenKeyword: - ParseDefaultKeywords.HandleConstTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleConstTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ContinueTokenKeyword: - ParseDefaultKeywords.HandleContinueTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleContinueTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.DecimalTokenKeyword: - ParseDefaultKeywords.HandleDecimalTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleDecimalTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.DefaultTokenKeyword: - ParseDefaultKeywords.HandleDefaultTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleDefaultTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.DelegateTokenKeyword: - ParseDefaultKeywords.HandleDelegateTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleDelegateTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.DoTokenKeyword: - ParseDefaultKeywords.HandleDoTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleDoTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.DoubleTokenKeyword: - ParseDefaultKeywords.HandleDoubleTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleDoubleTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ElseTokenKeyword: - ParseDefaultKeywords.HandleElseTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleElseTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.EnumTokenKeyword: - ParseDefaultKeywords.HandleEnumTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleEnumTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.EventTokenKeyword: - ParseDefaultKeywords.HandleEventTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleEventTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ExplicitTokenKeyword: - ParseDefaultKeywords.HandleExplicitTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleExplicitTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ExternTokenKeyword: - ParseDefaultKeywords.HandleExternTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleExternTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.FalseTokenKeyword: - ParseDefaultKeywords.HandleFalseTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleFalseTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.FinallyTokenKeyword: - ParseDefaultKeywords.HandleFinallyTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleFinallyTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.FixedTokenKeyword: - ParseDefaultKeywords.HandleFixedTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleFixedTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.FloatTokenKeyword: - ParseDefaultKeywords.HandleFloatTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleFloatTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ForTokenKeyword: - ParseDefaultKeywords.HandleForTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleForTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ForeachTokenKeyword: - ParseDefaultKeywords.HandleForeachTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleForeachTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.GotoTokenKeyword: - ParseDefaultKeywords.HandleGotoTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleGotoTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ImplicitTokenKeyword: - ParseDefaultKeywords.HandleImplicitTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleImplicitTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.InTokenKeyword: - ParseDefaultKeywords.HandleInTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleInTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.IntTokenKeyword: - ParseDefaultKeywords.HandleIntTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleIntTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.IsTokenKeyword: - ParseDefaultKeywords.HandleIsTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleIsTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.LockTokenKeyword: - ParseDefaultKeywords.HandleLockTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleLockTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.LongTokenKeyword: - ParseDefaultKeywords.HandleLongTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleLongTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.NullTokenKeyword: - ParseDefaultKeywords.HandleNullTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleNullTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ObjectTokenKeyword: - ParseDefaultKeywords.HandleObjectTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleObjectTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.OperatorTokenKeyword: - ParseDefaultKeywords.HandleOperatorTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleOperatorTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.OutTokenKeyword: - ParseDefaultKeywords.HandleOutTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleOutTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ParamsTokenKeyword: - ParseDefaultKeywords.HandleParamsTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleParamsTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ProtectedTokenKeyword: - ParseDefaultKeywords.HandleProtectedTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleProtectedTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ReadonlyTokenKeyword: - ParseDefaultKeywords.HandleReadonlyTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleReadonlyTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.RefTokenKeyword: - ParseDefaultKeywords.HandleRefTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleRefTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.SbyteTokenKeyword: - ParseDefaultKeywords.HandleSbyteTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleSbyteTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ShortTokenKeyword: - ParseDefaultKeywords.HandleShortTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleShortTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.SizeofTokenKeyword: - ParseDefaultKeywords.HandleSizeofTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleSizeofTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.StackallocTokenKeyword: - ParseDefaultKeywords.HandleStackallocTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleStackallocTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.StringTokenKeyword: - ParseDefaultKeywords.HandleStringTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleStringTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.StructTokenKeyword: - ParseDefaultKeywords.HandleStructTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleStructTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.SwitchTokenKeyword: - ParseDefaultKeywords.HandleSwitchTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleSwitchTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ThisTokenKeyword: - ParseDefaultKeywords.HandleThisTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleThisTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ThrowTokenKeyword: - ParseDefaultKeywords.HandleThrowTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleThrowTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.TrueTokenKeyword: - ParseDefaultKeywords.HandleTrueTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleTrueTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.TryTokenKeyword: - ParseDefaultKeywords.HandleTryTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleTryTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.TypeofTokenKeyword: - ParseDefaultKeywords.HandleTypeofTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleTypeofTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UintTokenKeyword: - ParseDefaultKeywords.HandleUintTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleUintTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UlongTokenKeyword: - ParseDefaultKeywords.HandleUlongTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleUlongTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UncheckedTokenKeyword: - ParseDefaultKeywords.HandleUncheckedTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleUncheckedTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UnsafeTokenKeyword: - ParseDefaultKeywords.HandleUnsafeTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleUnsafeTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UshortTokenKeyword: - ParseDefaultKeywords.HandleUshortTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleUshortTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.VoidTokenKeyword: - ParseDefaultKeywords.HandleVoidTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleVoidTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.VolatileTokenKeyword: - ParseDefaultKeywords.HandleVolatileTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleVolatileTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.WhileTokenKeyword: - ParseDefaultKeywords.HandleWhileTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleWhileTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UnrecognizedTokenKeyword: - ParseDefaultKeywords.HandleUnrecognizedTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleUnrecognizedTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ReturnTokenKeyword: - ParseDefaultKeywords.HandleReturnTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleReturnTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.NamespaceTokenKeyword: - ParseDefaultKeywords.HandleNamespaceTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleNamespaceTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ClassTokenKeyword: - ParseDefaultKeywords.HandleClassTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleClassTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.InterfaceTokenKeyword: - ParseDefaultKeywords.HandleInterfaceTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleInterfaceTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UsingTokenKeyword: - ParseDefaultKeywords.HandleUsingTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleUsingTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.PublicTokenKeyword: - ParseDefaultKeywords.HandlePublicTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandlePublicTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.InternalTokenKeyword: - ParseDefaultKeywords.HandleInternalTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleInternalTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.PrivateTokenKeyword: - ParseDefaultKeywords.HandlePrivateTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandlePrivateTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.StaticTokenKeyword: - ParseDefaultKeywords.HandleStaticTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleStaticTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.OverrideTokenKeyword: - ParseDefaultKeywords.HandleOverrideTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleOverrideTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.VirtualTokenKeyword: - ParseDefaultKeywords.HandleVirtualTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleVirtualTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.AbstractTokenKeyword: - ParseDefaultKeywords.HandleAbstractTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleAbstractTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.SealedTokenKeyword: - ParseDefaultKeywords.HandleSealedTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleSealedTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.IfTokenKeyword: - ParseDefaultKeywords.HandleIfTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleIfTokenKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.NewTokenKeyword: - ParseDefaultKeywords.HandleNewTokenKeyword(compilationUnit); + ParseDefaultKeywords.HandleNewTokenKeyword(compilationUnit, ref parserModel); break; default: - ParseDefaultKeywords.HandleDefault(compilationUnit); + ParseDefaultKeywords.HandleDefault(compilationUnit, ref parserModel); break; } } - public static void ParseKeywordContextualToken(CSharpCompilationUnit compilationUnit) + public static void ParseKeywordContextualToken(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - switch (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind) + switch (parserModel.TokenWalker.Current.SyntaxKind) { case SyntaxKind.VarTokenContextualKeyword: - ParseContextualKeywords.HandleVarTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleVarTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.PartialTokenContextualKeyword: - ParseContextualKeywords.HandlePartialTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandlePartialTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.AddTokenContextualKeyword: - ParseContextualKeywords.HandleAddTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleAddTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.AndTokenContextualKeyword: - ParseContextualKeywords.HandleAndTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleAndTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.AliasTokenContextualKeyword: - ParseContextualKeywords.HandleAliasTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleAliasTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.AscendingTokenContextualKeyword: - ParseContextualKeywords.HandleAscendingTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleAscendingTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ArgsTokenContextualKeyword: - ParseContextualKeywords.HandleArgsTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleArgsTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.AsyncTokenContextualKeyword: - ParseContextualKeywords.HandleAsyncTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleAsyncTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.AwaitTokenContextualKeyword: - ParseContextualKeywords.HandleAwaitTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleAwaitTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ByTokenContextualKeyword: - ParseContextualKeywords.HandleByTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleByTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.DescendingTokenContextualKeyword: - ParseContextualKeywords.HandleDescendingTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleDescendingTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.DynamicTokenContextualKeyword: - ParseContextualKeywords.HandleDynamicTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleDynamicTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.EqualsTokenContextualKeyword: - ParseContextualKeywords.HandleEqualsTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleEqualsTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.FileTokenContextualKeyword: - ParseContextualKeywords.HandleFileTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleFileTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.FromTokenContextualKeyword: - ParseContextualKeywords.HandleFromTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleFromTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.GetTokenContextualKeyword: - ParseContextualKeywords.HandleGetTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleGetTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.GlobalTokenContextualKeyword: - ParseContextualKeywords.HandleGlobalTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleGlobalTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.GroupTokenContextualKeyword: - ParseContextualKeywords.HandleGroupTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleGroupTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.InitTokenContextualKeyword: - ParseContextualKeywords.HandleInitTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleInitTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.IntoTokenContextualKeyword: - ParseContextualKeywords.HandleIntoTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleIntoTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.JoinTokenContextualKeyword: - ParseContextualKeywords.HandleJoinTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleJoinTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.LetTokenContextualKeyword: - ParseContextualKeywords.HandleLetTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleLetTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ManagedTokenContextualKeyword: - ParseContextualKeywords.HandleManagedTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleManagedTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.NameofTokenContextualKeyword: - ParseContextualKeywords.HandleNameofTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleNameofTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.NintTokenContextualKeyword: - ParseContextualKeywords.HandleNintTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleNintTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.NotTokenContextualKeyword: - ParseContextualKeywords.HandleNotTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleNotTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.NotnullTokenContextualKeyword: - ParseContextualKeywords.HandleNotnullTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleNotnullTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.NuintTokenContextualKeyword: - ParseContextualKeywords.HandleNuintTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleNuintTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.OnTokenContextualKeyword: - ParseContextualKeywords.HandleOnTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleOnTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.OrTokenContextualKeyword: - ParseContextualKeywords.HandleOrTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleOrTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.OrderbyTokenContextualKeyword: - ParseContextualKeywords.HandleOrderbyTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleOrderbyTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.RecordTokenContextualKeyword: - ParseContextualKeywords.HandleRecordTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleRecordTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.RemoveTokenContextualKeyword: - ParseContextualKeywords.HandleRemoveTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleRemoveTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.RequiredTokenContextualKeyword: - ParseContextualKeywords.HandleRequiredTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleRequiredTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ScopedTokenContextualKeyword: - ParseContextualKeywords.HandleScopedTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleScopedTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.SelectTokenContextualKeyword: - ParseContextualKeywords.HandleSelectTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleSelectTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.SetTokenContextualKeyword: - ParseContextualKeywords.HandleSetTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleSetTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UnmanagedTokenContextualKeyword: - ParseContextualKeywords.HandleUnmanagedTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleUnmanagedTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.ValueTokenContextualKeyword: - ParseContextualKeywords.HandleValueTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleValueTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.WhenTokenContextualKeyword: - ParseContextualKeywords.HandleWhenTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleWhenTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.WhereTokenContextualKeyword: - ParseContextualKeywords.HandleWhereTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleWhereTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.WithTokenContextualKeyword: - ParseContextualKeywords.HandleWithTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleWithTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.YieldTokenContextualKeyword: - ParseContextualKeywords.HandleYieldTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleYieldTokenContextualKeyword(compilationUnit, ref parserModel); break; case SyntaxKind.UnrecognizedTokenContextualKeyword: - ParseContextualKeywords.HandleUnrecognizedTokenContextualKeyword(compilationUnit); + ParseContextualKeywords.HandleUnrecognizedTokenContextualKeyword(compilationUnit, ref parserModel); break; default: - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException(compilationUnit.ParserModel.TokenWalker.Current.TextSpan, $"Implement the {compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind.ToString()} contextual keyword."); + parserModel.DiagnosticBag.ReportTodoException(parserModel.TokenWalker.Current.TextSpan, $"Implement the {parserModel.TokenWalker.Current.SyntaxKind.ToString()} contextual keyword."); break; } } } - -/* - (2024-11-08) The issue is: - ========================== - 'int[] x = new { 1, 2, 3, };' - 'int[] MyMethod() { }' - - In my mind this was an issue, but it wouldn't be an issue because in order - to get to this code I have to see an OpenParenthesisToken. - - The variable assignment doesn't conflict at all. - - But: - 'int[] x = new { 1, 2, 3, };' - 'int[2] = 7;' - - At the start of a statement, there can be a conflict here, - but given the situation, one can see the second line has a '2' in the array's square brackets - so therefore you know the second line is a variable assignment expression. - (the first line is a variable declaration statement / variable assignment expression). - - https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/arrays - ======================================================================================= - // Declare a single-dimensional array of 5 integers. - int[] array1 = new int[5]; - - // Declare and set array element values. - int[] array2 = [1, 2, 3, 4, 5, 6]; - - // Declare a two dimensional array. - int[,] multiDimensionalArray1 = new int[2, 3]; - - // Declare and set array element values. - int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } }; - - // Declare a jagged array. - int[][] jaggedArray = new int[6][]; - - // Set the values of the first array in the jagged array structure. - jaggedArray[0] = [1, 2, 3, 4]; - --------------------------------------------------------------------------------------- - - None of the array declaration examples contain a number inside the - array square brackets at the start of the statement. - - When dealing with a function definition, - the TypeClauseNode for its return type might be an array. - - So I have to properly make sense of the 'int[]' - if I have 'int[] MyMethod() { }'. - - But, I just saw that it seems I can check inside the array brackets - whether there is a number or not. - - And there being a number means that it is an expression of some sort, - whereas the lack or one means it is a statement of some sort. - - In the case of: - 'Person MyMethod() { }' - - When I read 'Person', is there any ambiguity as to whether it is - - TypeClauseNode - - IdentifierToken - - I think the question is: - "At what points do I convert a token that can be a 'TypeClauseNode' to a 'TypeClauseNode'?" - - If the 'TypeClauseNode' is an array, then the array square brackets will not - contain a number, and this is the sign that it is a 'TypeClauseNode'. - - If the 'TypeClauseNode' is just an IdentifierToken, where could things go from there? - - ConstructorDefinitionNode can occur from the following: - - IdentifierToken, OpenParenthesisToken - - FunctionDefinitionNode can occur from the following: - - TypeClauseNode, IdentifierToken, OpenParenthesisToken - - This occurs when the first token initially was a 'IdentifierToken' but was not ambiguous and therefore - immediately interpreted as a 'TypeClauseNode' rather than as an 'IdentifierToken'. - - IdentifierToken, IdentifierToken, OpenParenthesisToken - - VariableDeclarationNode can occur from the following: - - TypeClauseNode, IdentifierToken, EqualsToken - - TypeDefinitionNode can occur from the following: - - SyntaxKind.ClassTokenKeyword, IdentifierToken - - TypeDefinitionNode can occur from the following: - - SyntaxKind.ClassTokenKeyword, IdentifierToken -*/ diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTypes.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTypes.cs index d7f24a8ba..1ac0e7988 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTypes.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseTypes.cs @@ -11,29 +11,31 @@ public static class ParseTypes { public static void HandleStaticClassIdentifier( IdentifierToken consumedIdentifierToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } public static void HandleUndefinedTypeOrNamespaceReference( IdentifierToken consumedIdentifierToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } /// /// This method is used for generic type definition such as, 'class List<T> { ... }' /// - public static GenericArgumentsListingNode HandleGenericArguments(CSharpCompilationUnit compilationUnit) + public static GenericArgumentsListingNode HandleGenericArguments(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - var openAngleBracketToken = (OpenAngleBracketToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var openAngleBracketToken = (OpenAngleBracketToken)parserModel.TokenWalker.Consume(); - if (SyntaxKind.CloseAngleBracketToken == compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind) + if (SyntaxKind.CloseAngleBracketToken == parserModel.TokenWalker.Current.SyntaxKind) { return new GenericArgumentsListingNode( openAngleBracketToken, ImmutableArray.Empty, - (CloseAngleBracketToken)compilationUnit.ParserModel.TokenWalker.Consume()); + (CloseAngleBracketToken)parserModel.TokenWalker.Consume()); } var mutableGenericArgumentsListing = new List(); @@ -41,7 +43,7 @@ public static GenericArgumentsListingNode HandleGenericArguments(CSharpCompilati while (true) { // TypeClause - var typeClauseNode = MatchTypeClause(compilationUnit); + var typeClauseNode = MatchTypeClause(compilationUnit, ref parserModel); if (typeClauseNode.IsFabricated) break; @@ -49,9 +51,9 @@ public static GenericArgumentsListingNode HandleGenericArguments(CSharpCompilati var genericArgumentEntryNode = new GenericArgumentEntryNode(typeClauseNode); mutableGenericArgumentsListing.Add(genericArgumentEntryNode); - if (SyntaxKind.CommaToken == compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind) + if (SyntaxKind.CommaToken == parserModel.TokenWalker.Current.SyntaxKind) { - var commaToken = (CommaToken)compilationUnit.ParserModel.TokenWalker.Consume(); + var commaToken = (CommaToken)parserModel.TokenWalker.Consume(); // TODO: Track comma tokens? // @@ -63,7 +65,7 @@ public static GenericArgumentsListingNode HandleGenericArguments(CSharpCompilati } } - var closeAngleBracketToken = (CloseAngleBracketToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseAngleBracketToken); + var closeAngleBracketToken = (CloseAngleBracketToken)parserModel.TokenWalker.Match(SyntaxKind.CloseAngleBracketToken); return new GenericArgumentsListingNode( openAngleBracketToken, @@ -73,7 +75,8 @@ public static GenericArgumentsListingNode HandleGenericArguments(CSharpCompilati public static void HandleAttribute( OpenSquareBracketToken consumedOpenSquareBracketToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } @@ -89,20 +92,20 @@ public static void HandleAttribute( /// Furthermore, because there is a need to disambiguate, more checks are performed in this method /// than in . /// - public static bool IsPossibleTypeClause(ISyntaxToken syntaxToken, CSharpCompilationUnit compilationUnit) + public static bool IsPossibleTypeClause(ISyntaxToken syntaxToken, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { return false; } - public static TypeClauseNode MatchTypeClause(CSharpCompilationUnit compilationUnit) + public static TypeClauseNode MatchTypeClause(CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - if (ParseOthers.TryParseExpression(SyntaxKind.TypeClauseNode, compilationUnit, out var expressionNode)) + if (ParseOthers.TryParseExpression(SyntaxKind.TypeClauseNode, compilationUnit, ref parserModel, out var expressionNode)) { return (TypeClauseNode)expressionNode; } else { - var syntaxToken = (IdentifierToken)compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + var syntaxToken = (IdentifierToken)parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); return new TypeClauseNode( syntaxToken, @@ -112,15 +115,15 @@ public static TypeClauseNode MatchTypeClause(CSharpCompilationUnit compilationUn /*ISyntaxToken syntaxToken; - if (UtilityApi.IsKeywordSyntaxKind(compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind) && - (UtilityApi.IsTypeIdentifierKeywordSyntaxKind(compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind) || - UtilityApi.IsVarContextualKeyword(compilationUnit, compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind))) + if (UtilityApi.IsKeywordSyntaxKind(parserModel.TokenWalker.Current.SyntaxKind) && + (UtilityApi.IsTypeIdentifierKeywordSyntaxKind(parserModel.TokenWalker.Current.SyntaxKind) || + UtilityApi.IsVarContextualKeyword(compilationUnit, parserModel.TokenWalker.Current.SyntaxKind))) { - syntaxToken = compilationUnit.ParserModel.TokenWalker.Consume(); + syntaxToken = parserModel.TokenWalker.Consume(); } else { - syntaxToken = compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); + syntaxToken = parserModel.TokenWalker.Match(SyntaxKind.IdentifierToken); } var typeClauseNode = new TypeClauseNode( @@ -128,9 +131,9 @@ public static TypeClauseNode MatchTypeClause(CSharpCompilationUnit compilationUn null, null); - compilationUnit.ParserModel.Binder.BindTypeClauseNode(typeClauseNode, compilationUnit); + parserModel.Binder.BindTypeClauseNode(typeClauseNode, compilationUnit); - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenAngleBracketToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenAngleBracketToken) { var genericParametersListingNode = (GenericParametersListingNode)ParseOthers.Force_ParseExpression( SyntaxKind.GenericParametersListingNode, @@ -139,16 +142,16 @@ public static TypeClauseNode MatchTypeClause(CSharpCompilationUnit compilationUn typeClauseNode.SetGenericParametersListingNode(genericParametersListingNode); } - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.QuestionMarkToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.QuestionMarkToken) { typeClauseNode.HasQuestionMark = true; - _ = compilationUnit.ParserModel.TokenWalker.Consume(); + _ = parserModel.TokenWalker.Consume(); } - while (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenSquareBracketToken) + while (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenSquareBracketToken) { - var openSquareBracketToken = compilationUnit.ParserModel.TokenWalker.Consume(); - var closeSquareBracketToken = compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.CloseSquareBracketToken); + var openSquareBracketToken = parserModel.TokenWalker.Consume(); + var closeSquareBracketToken = parserModel.TokenWalker.Match(SyntaxKind.CloseSquareBracketToken); var arraySyntaxTokenTextSpan = syntaxToken.TextSpan with { @@ -184,7 +187,8 @@ public static TypeClauseNode MatchTypeClause(CSharpCompilationUnit compilationUn public static void HandlePrimaryConstructorDefinition( TypeDefinitionNode typeDefinitionNode, OpenParenthesisToken consumedOpenParenthesisToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } } diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseVariables.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseVariables.cs index 9caf6e509..ddea2d038 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseVariables.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/ParseVariables.cs @@ -13,7 +13,8 @@ public static class ParseVariables { public static void HandleVariableReference( IdentifierToken consumedIdentifierToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } @@ -22,7 +23,8 @@ public static void HandleVariableReference( TypeClauseNode consumedTypeClauseNode, IdentifierToken consumedIdentifierToken, VariableKind variableKind, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { IVariableDeclarationNode variableDeclarationNode; @@ -33,7 +35,7 @@ public static void HandleVariableReference( false); compilationUnit.Binder.BindVariableDeclarationNode(variableDeclarationNode, compilationUnit); - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ChildList.Add(variableDeclarationNode); + parserModel.CurrentCodeBlockBuilder.ChildList.Add(variableDeclarationNode); return variableDeclarationNode; } @@ -44,36 +46,40 @@ public static void HandleVariableDeclarationStatement( TypeClauseNode consumedTypeClauseNode, IdentifierToken consumedIdentifierToken, VariableKind variableKind, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { var variableDeclarationNode = HandleVariableDeclarationExpression( consumedTypeClauseNode, consumedIdentifierToken, variableKind, - compilationUnit); + compilationUnit, + ref parserModel); if (variableDeclarationNode is null) return; // if (variableKind == VariableKind.Local || variableKind == VariableKind.Closure) - if (compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken) + if (parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.EqualsToken) { - if (compilationUnit.ParserModel.TokenWalker.Peek(1).SyntaxKind == SyntaxKind.CloseAngleBracketToken) + if (parserModel.TokenWalker.Peek(1).SyntaxKind == SyntaxKind.CloseAngleBracketToken) { HandlePropertyExpression( variableDeclarationNode, - (EqualsToken)compilationUnit.ParserModel.TokenWalker.Consume(), - (CloseAngleBracketToken)compilationUnit.ParserModel.TokenWalker.Consume(), - compilationUnit); + (EqualsToken)parserModel.TokenWalker.Consume(), + (CloseAngleBracketToken)parserModel.TokenWalker.Consume(), + compilationUnit, + ref parserModel); } else { // Variable initialization occurs here. HandleVariableAssignment( consumedIdentifierToken, - (EqualsToken)compilationUnit.ParserModel.TokenWalker.Consume(), - compilationUnit); + (EqualsToken)parserModel.TokenWalker.Consume(), + compilationUnit, + ref parserModel); } } else @@ -81,29 +87,31 @@ public static void HandleVariableDeclarationStatement( if (variableDeclarationNode.TypeClauseNode.TypeIdentifierToken.SyntaxKind == SyntaxKind.VarTokenContextualKeyword) { - compilationUnit.ParserModel.DiagnosticBag.ReportImplicitlyTypedVariablesMustBeInitialized( + parserModel.DiagnosticBag.ReportImplicitlyTypedVariablesMustBeInitialized( consumedIdentifierToken.TextSpan); } } if (variableKind == VariableKind.Property && - compilationUnit.ParserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) + parserModel.TokenWalker.Current.SyntaxKind == SyntaxKind.OpenBraceToken) { HandlePropertyDeclaration( variableDeclarationNode, - (OpenBraceToken)compilationUnit.ParserModel.TokenWalker.Consume(), - compilationUnit); + (OpenBraceToken)parserModel.TokenWalker.Consume(), + compilationUnit, + ref parserModel); } else { - _ = compilationUnit.ParserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); + _ = parserModel.TokenWalker.Match(SyntaxKind.StatementDelimiterToken); } } public static void HandlePropertyDeclaration( IVariableDeclarationNode consumedVariableDeclarationNode, OpenBraceToken consumedOpenBraceToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } @@ -111,14 +119,16 @@ public static void HandlePropertyExpression( IVariableDeclarationNode consumedVariableDeclarationNode, EqualsToken consumedEqualsToken, CloseAngleBracketToken consumedCloseAngleBracketToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } public static void HandleVariableAssignment( IdentifierToken consumedIdentifierToken, EqualsToken consumedEqualsToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { } } diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/TokenWalkerExtensionMethods.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/TokenWalkerExtensionMethods.cs index 9bd8196d5..4d7a5d072 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/TokenWalkerExtensionMethods.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/TokenWalkerExtensionMethods.cs @@ -8,25 +8,26 @@ namespace Luthetus.CompilerServices.CSharp.ParserCase.Internals; internal static class TokenWalkerExtensionMethods { - public static TypeClauseNode MatchTypeClauseNode(this TokenWalker tokenWalker, CSharpCompilationUnit compilationUnit) + public static TypeClauseNode MatchTypeClauseNode(this TokenWalker tokenWalker, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { - return ParseTypes.MatchTypeClause(compilationUnit); + return ParseTypes.MatchTypeClause(compilationUnit, ref parserModel); } public static void DeferParsingOfChildScope( this TokenWalker tokenWalker, OpenBraceToken consumedOpenBraceToken, - CSharpCompilationUnit compilationUnit) + CSharpCompilationUnit compilationUnit, + ref CSharpParserModel parserModel) { // Pop off the 'TypeDefinitionNode', then push it back on when later dequeued. - var pendingCodeBlockOwner = compilationUnit.ParserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner; + var pendingCodeBlockOwner = parserModel.CurrentCodeBlockBuilder.InnerPendingCodeBlockOwner; var openTokenIndex = tokenWalker.Index - 1; var openBraceCounter = 1; #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = true; #endif while (true) @@ -51,10 +52,10 @@ public static void DeferParsingOfChildScope( var closeBraceToken = (CloseBraceToken)tokenWalker.Match(SyntaxKind.CloseBraceToken); #if DEBUG - compilationUnit.ParserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; + parserModel.TokenWalker.SuppressProtectedSyntaxKindConsumption = false; #endif - compilationUnit.ParserModel.CurrentCodeBlockBuilder.ParseChildScopeQueue.Enqueue(new CSharpDeferredChildScope( + parserModel.CurrentCodeBlockBuilder.ParseChildScopeQueue.Enqueue(new CSharpDeferredChildScope( openTokenIndex, closeTokenIndex, pendingCodeBlockOwner)); diff --git a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/UtilityApi.cs b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/UtilityApi.cs index 632249675..a06d47b62 100644 --- a/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/UtilityApi.cs +++ b/Source/Lib/CompilerServices/CSharp/ParserCase/Internals/UtilityApi.cs @@ -188,7 +188,7 @@ public static bool IsConvertibleToTypeClauseNode(SyntaxKind syntaxKind) IsContextualKeywordSyntaxKind(syntaxKind); } - public static TypeClauseNode ConvertToTypeClauseNode(ISyntax syntax, CSharpCompilationUnit compilationUnit) + public static TypeClauseNode ConvertToTypeClauseNode(ISyntax syntax, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (syntax.SyntaxKind == SyntaxKind.TypeClauseNode) { @@ -217,11 +217,11 @@ public static TypeClauseNode ConvertToTypeClauseNode(ISyntax syntax, CSharpCompi } else { - // 'compilationUnit.ParserModel.TokenWalker.Current.TextSpan' isn't necessarily the syntax passed to this method. + // 'parserModel.TokenWalker.Current.TextSpan' isn't necessarily the syntax passed to this method. // TODO: But getting a TextSpan from a general type such as 'ISyntax' is a pain. // - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException( - compilationUnit.ParserModel.TokenWalker.Current.TextSpan, + parserModel.DiagnosticBag.ReportTodoException( + parserModel.TokenWalker.Current.TextSpan, $"The {nameof(SyntaxKind)}: {syntax.SyntaxKind}, is not convertible to a {nameof(TypeClauseNode)}. Invoke {nameof(IsConvertibleToTypeClauseNode)} and check the result, before invoking {nameof(ConvertToTypeClauseNode)}."); // TODO: Returning null when it can't be converted is a bad idea (the method return isn't documented as nullable). @@ -235,7 +235,7 @@ public static bool IsConvertibleToIdentifierToken(SyntaxKind syntaxKind) IsContextualKeywordSyntaxKind(syntaxKind); } - public static IdentifierToken ConvertToIdentifierToken(ISyntax syntax, CSharpCompilationUnit compilationUnit) + public static IdentifierToken ConvertToIdentifierToken(ISyntax syntax, CSharpCompilationUnit compilationUnit, ref CSharpParserModel parserModel) { if (syntax.SyntaxKind == SyntaxKind.IdentifierToken) { @@ -248,11 +248,11 @@ public static IdentifierToken ConvertToIdentifierToken(ISyntax syntax, CSharpCom } else { - // 'compilationUnit.ParserModel.TokenWalker.Current.TextSpan' isn't necessarily the syntax passed to this method. + // 'parserModel.TokenWalker.Current.TextSpan' isn't necessarily the syntax passed to this method. // TODO: But getting a TextSpan from a general type such as 'ISyntax' is a pain. // - compilationUnit.ParserModel.DiagnosticBag.ReportTodoException( - compilationUnit.ParserModel.TokenWalker.Current.TextSpan, + parserModel.DiagnosticBag.ReportTodoException( + parserModel.TokenWalker.Current.TextSpan, $"The {nameof(SyntaxKind)}: {syntax.SyntaxKind}, is not convertible to a {nameof(IdentifierToken)}. Invoke {nameof(IsConvertibleToIdentifierToken)} and check the result, before invoking {nameof(ConvertToIdentifierToken)}."); // TODO: Returning default when it can't be converted might be a fine idea? It isn't as bad as returning null. diff --git a/Source/Lib/CompilerServices/Razor/RazorSyntaxTree.cs b/Source/Lib/CompilerServices/Razor/RazorSyntaxTree.cs index f839c1bcf..f85586e44 100644 --- a/Source/Lib/CompilerServices/Razor/RazorSyntaxTree.cs +++ b/Source/Lib/CompilerServices/Razor/RazorSyntaxTree.cs @@ -111,8 +111,7 @@ public void ParseCodebehind() compilationUnit.BinderSession = (CSharpBinderSession)compilationUnit.Binder.StartBinderSession(_codebehindResourceUri); - var parser = new CSharpParser(); - parser.Parse(compilationUnit); + CSharpParser.Parse(compilationUnit); SemanticResultRazor = new SemanticResultRazor( compilationUnit, From 08c3b2fed6fb9d3748d71049b417e39151961878 Mon Sep 17 00:00:00 2001 From: Luthetus <45454132+huntercfreeman@users.noreply.github.com> Date: Sat, 14 Dec 2024 21:27:12 -0500 Subject: [PATCH 5/7] Update: README.md --- Images/Ide/Gifs/parseSolutionWideUpdated.gif | Bin 0 -> 500743 bytes README.md | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 Images/Ide/Gifs/parseSolutionWideUpdated.gif diff --git a/Images/Ide/Gifs/parseSolutionWideUpdated.gif b/Images/Ide/Gifs/parseSolutionWideUpdated.gif new file mode 100644 index 0000000000000000000000000000000000000000..43a818a3ed32d8abff10ded33a5818ef0fbddee2 GIT binary patch literal 500743 zcmeF&Wl)r4%UcZpGc*o#5_n2?@b11PJa@tT^G# z|GuARXLp`=_uYB->mGCD%z0gNO+I8MnanSVto&zTk?%~HMCk5lXzw2JR6c2He0;C^ ziIsT*{3EYv+a>W22uWu;XAzrw=C#>&qAzgad8j{nVmQB#|mnwtB+nVW+x zz!#TSmRHwT);3qxxBhSc{S2&bY^`o=|DSYiV|#6LXJc!3YiECV{}3CAwuVC~SDV)t zi2aJyaJV*qAe4wsAxo~VU?`G|&vI$Ft`HPU^D%-_zP<>Y$gELr2(B+4N#*_l$&zm< z8O@}7wYvmvC>_t04#a({&$g5$W~}7pRLesuv~^TRm|5I4@A6G zY_42ru$V6YI?`NaP#3xmkq9cNUhZ%|-(QZrs#@vse}+e;)LOeX5cZ1A2-;e=0g9tj z%%OCyHtbI0GcSR*HSCP%eT<}1Zg1S1253|m`M?|vM{9q~|5Wa1K3Z&bIzWtewES7= z_30>K>kwX99ZqEXHrCm8zB5s%m>c8LdV1hdX0L=#!)|4U4>tXaM7VF_~kL!Fh=H}h?NNynWM%3@JR$4RuZNNs1_~mY4j3A!W3a`BC?b1zFoGHb1}O>pX-mwx|uB> zZONh&SM9!6lI6O;SDNm7y$2{tu`JKYS8(4iuWa7mPePWFT<=#l&RJGO)*;*usyi?D ztpeH#t`2GkNvsat`_|nK>!E@NmG4aNRwjVYh9Ct{SiM{K*n6u()K7+Xa>At_bv+Aa~WjpCbPsQc7#$c*E>5ry@(hd;G zvY%!V+6kTxk(on(4hdTxo`PszflnRYrCOhXoj%%3P;6265zz`bln?bJ)q{06lP0!5nBI6_|>4pYZXZS-c zpf;F0DqqWpd4L=q$HL#4Pw2*+M0s`+ij=;1M-=M*@!iYQFm8U@m#OX_7QV5 z4Rlmjtzr^qr?K_tbTn9PqVHdx#TD?;(~_o(eBwQePjI5AXG#~AS3gVeZ=h!sN*7Xg zJWI4cr)QQ03%zU(PXeIlFl&GnDy!;~YlGlyKjcRWM(a~r4;MI`z#|z)^{Ktq3tWNn z&^UsIv|%WWClL${<7h~qP=fIl$}9URH)OyX=LH(T%5F9dnXCNsLId(DcF_%4yNz=q z)8H|)s)pCzkr^+Gf)1P^x&ES9(~(8V{FXj_ z>Z0UxJ&TGPoG$z9qLlxPMK$!6Hvi>c03$D}dMY_>G4J0pGDlX;Qu2nF&k^OiM@gCu z5Usy@S{h#o*kpQGS?e-f)C?pl^iyTDwW|JB`75v)?nG2JLn5l(lM@ZkA@dj}+=12y z6~-ft^L^xk0e%>j_k<&`G`N;dbToS<6&pKPzquqyYwo8|<}}ncvLWw5?fXYX{pqOY zMnG|fIVc%Ew{F>V;E1fU{^AT@fH(6rbyeBENL*aLb>;4QsIq@}xwJ;EV_lm)?~r;h zJII>SHi4n)P^kE|MyaJ8HVScR82MUm-O{n@192NrG%Aj2>D=XjcubENnD(u-Nb8Sn~!8H3NgjnKE&fsXzAntE%0 zcNcevOT`+&V)Fo13P;$-CHRX(vL;4Jo?jZ3CKL6oLzzB2Q58o%E@;F|IDY9G&tViQL9&*+dfI?!(a58bx)qOaViCqxrA?YT-k{{HwVct@sY#QJ)wQ(P+XvVvTR=~ zv0=6vld1B@=&0T_d1iCBfPhn#mBm^6JoH|mHlF41`>O^R5Rpt%S`JCUyAdy#;&p1znUUsfpi3|6S15Sct>(&S#X$R@Lhr%`PBS?C#iTSEenH)Pe z6z_$Hk+IBY@z3iv86V$4G`a_p8#=?lv-2a=hiB;{wcCPUOrXzF&Yx^_?y%j9Ok}n? z1rc=he30_QPOQFQCVBX-9LqIbXxmq&(G~Hf1vYz{`8UQ!qD%X+{pkRwD|$lL;WKeD zcn8cSp-Q6HCU;>Ghte&3w5!9i$BXQs`hAzI&>!Di>eXl8K6leapZE!R8^3t|eaImC zl)&}gP$d)WAA4=sKPr`=oztp}Gho9K* z7E)U;n`L>9oqE=n&k;l2k3La>T;Albdai{eCC^+c@3*d6Z^p2AFAAkL_cT_9=X!h- z8jv+Uj7~jwUyzd5#q7vaowoaJ5by1D&(`0Dm62mVzqAc5Ki=scqF)25;*UFQjt}$qyYwewwslLZzE2J%~23c3fDr38u&TZ+R1Yc2z&nXNtu z2Q_I2eGapdOAG2~4pQ2+Qn?Q5BMDZQv)0rN2Dt|70<860gGc9rjj(Nu$wHd zFo0b|YuLkFSPZs(99j4?q3|RN`xN(ZoYe4)Vf!pt`17mqJZ6Ui;fU8d5hY;`fV2pT zmWaw-hwAHycchW^a*mCF$~>4vM*&iQQS^Z!@InY)+pxb zs4)xP39@J`fv7h!(Odk{uw5Q_YcvEs3SseKnJnfNU(DvN(yDumig`3vQOvAq%rSub zge(?=FZM#1`_esjE-B{rTKWbSdv_L#R;GL}9A~Bzhnen*ogQZmiXj+`Gu(}Pg&yBU zA4d%4B=LyfNr)%cb!FhvB7=M|_yQjjY zm$?2hQP_iBv@P+>IZ?7qLgG!*P?7`ydk(!*4 z>M6qFy^tDnmg>JC<|L9XBoBfx@97n5pPZ&8TID&sfa#@_RsD9=$Yv$hS(cUlQ(w*g^!8OlB z@-*o3Fw5UzXXL4A<>5p4@ow{8zs!HBuXXLA^;-WuaYjCVeLiJ54b^S_jrX-3+CA*`OP_d@x+}yvdFptvCVAeLo;a2u18}8(>jQF~0AUfFLG1wW zBp`;IGLF2gho>yb^Zh5wqCB@U$d9tDa*CYWGUY-*0fZx8zr4wz8~`CNZ!a&OEU&g? zC?c=m6RBvlO!UFkYk|u)w^xWSRCM1aw(0BjS&G%_SLQiX4rg%mwpU)xRF1W?LCC8T zd8%f}-^_Vd#l}~`BMc_sRXR6StL4c9<$4<#a_gSe#_84jqABT?MMn|UTeo_raFHeb znjnXoYgV$`_8R}m8l-~ZA$hI4NG*CtDyCPhZ+a~*MH>EMZIDP!B}QG#O)YUn8i`k3 zbb1{*UiwQ4gSU&Bloa(TH+7It_38Ze%p>Wn9mx9Jg?di53`RC5o(>^2gN8Yb24Mqr z(T;}dg$7BAOlgY7Mv(?_*~XP$jh{msc=-ell5sojxlC^oH&H0o9`2z4~6 zPc|7XzSE~@R)5-Tx=3v1)$G96Y*|77Yq44GwAtQ@*io!SMyksX#59p)n)rUxD0@j8vzIt>&% zb*(xzBRf?qI+aE`VC%tE?7_0?L67WtQqhBi^xWp-!>K!N2zZp1)V`9LaUAZdRf9(OQ?budz4FwAl=IASoMe9#Xv=(RuS zjyvSSI^>`*WNSHO6)|K{KJ*hZWU@bGgbOra1?nmQH7$W^5kQr4pdth)w-5Y?3zB99 zNhp9sEkQyNApUX?4+O-y4??ox4l}b3GbjwxS`Jf33{#d5zkv+D-XDI63x3WD##aF2 zSb{Mlz|YFTXb|wj9{3gqa>)WYmxrAEf*gfI_RAnUV94ekWDREo!7{QaKLYzTG8;ZJ zRW>pX9)a$SfN`KhEYN;=XwNTbXE?O24B8BaHta!baYn0HM$6?#OMi_Pg^%W!jpl$y zGxtW*aK@5Z#uDVmVtcp2pmpeuguH#xnCD zH*;$-a}_po0hl=*o;lu~*~gyUVV>QTn_aV*MTE^R0%l>uvopK1lh|`(%yT1hbHf&M zLt%4$fVuABxsKhrR_ysE=J|TL`5KG)%CPw|zdm)&4AwX`y&tkzlY{3Jt;5xkEw7X!B4Yy&2Tgt)BE#RhM@b3V)(JT?xHmIk_7XTsN9l}#S(wm5)WXBb9jkucZnH$ znE}bXOe?ocZLv%lw)_ULOftOuYIm6k8$rN~z?DN_Ss>8E5KjOIBnWZ0gSf_8`OCC& zCcE;-eC057Wv_H)8?>^qv$Be{y3Di+mtCDVU!4hEoh)4)1FeqitPW$X4Kc0t%dYj9 zuXTp5wUw?lgVq{$)@rfVtC-fyW!Fp1*NZ~e^GnyWLF*Yi>#0~9NlY7YvKvw68)2av zL8TkNK^wk18=hF3ZcLj_vYU41n^vKl7Nwg%L7OH!o8Pdu44AfbWVbZUx70$nluNf1 zKwGjqTOYBurJ1%RWVc1kw*^DD`AWCBK-=s)+bmc+j7&RpvO6^9J8wgG$V+!vNkKcr zJ3BA1b_tnw@nm*7J2WV|G^u&EsQa`l`*(c~=#>Z_;En*X#zN>)#%R(fsIw-hQ8RgrI&PFY5<(R) zMCIB=Wn4q0Urwc6`XALQrTV8;R9bcaEdM%BtzAl^T}r22%A#G$ty3zXQ!1ics;FD4 zpUETkvp044)`t`p|Lp{B(I{Idc)(#?JP6BbxyvfeIVa~k4&b$FG z|I51a2DtGCc=HAP7WE5#?-e2E5~E?2{M9taLa*HWePbk7Q!IU5ENx{pZGHq@Mks4c zfS8xNnX9X_i;MH`-@k(bB7*)i!9hX6LBXMc!4bg`DG^CU(ODI-1!W1v`7!0`3H8az zZSme-jh{J&T+PT9-Gh~}!r7W)lIwqnb_t+*KAO0(GYKUi^ReNAsq6v~Q~+UmDP()g?p zS=vnhy%oO`MPi9G9n9DM7|Hp^ic>2LR{q0^1M#r3yjo8;{%yq`;Po+-6{~c$|2@dd z|MB0fSZJ2ByYuFJce>(RY@GPNt@z7h)7|a$zpVIi@eYZ>yy}lmVzH{3^Y-6Xyc&q{ z1bZ#$Usep04_gbNblqJG1^mMP4=eTv4_l95|Hq1z%CI-0_~$G(qUpe4|FYsAv7$)k z%{Up7w(oJD8Ot^kl(s`n|82$d67pNgx@Kj?Hrlo*D>e@KrI%{*FDst6?Za2F!5O|rD5tHD^^j9JVIIVVq!BQgzdPM`M2V6+ir-O@XrtThzvf@@urISAFLQDI8e4)y{enMIHx&opv)~7?>+EJ%K%8oJz z5KSolHi$OWx;}|MxAF`kQvy93;a=QzL|JjvI#h6{k}p*F&*Awv;UzxGit(78C*_!w zS0)vNj`%&5q&WW0EPYZ&S+SV8%bcMb$I_fpD2JPV85M5Tb|m^D3f8%{vH@9>I$#9WKGYbLP1MmvA>Ofh$C4F8}p<>T~{^?b2Mn+x?d3e0Rqn zKi>PZ`RBY3mpgtuNR$4RDfDL^q$Pnke^x30hXDo|5#iw~QM6fk%tNdt;St)#%QEI@6q2>ARBAd=Hs;D0l6@S-^nDfe5%f4X=Mo7uUui8H z_a(&6MdDi+ps`K_Bn0PSDg*Yf%O*m)6Y>e8ciG>uPDUUS3P?tGIeE$_V~`1jR0Mn6 z?^&l3s1l19mG^kn%BNB!6O%Zj%iM@qr!&ffN(4vuoOH{lb1)-IB?^HbW=Y`L?;nYS(BMqjUIF*O@@E?}L^6Gd5V<%jVj*66_{?<**^`#=4kjW>dPw z39!0geoB}1d%lVVf5+yAhkJI5a~AmITtj0?G?S&q;@E7xV0N_+(njP5+oJtcbMta1 zhiyaI;<9!_OLsJ*ec&Q=?WIsUP{Nicv0}-Xx23Jio735eWqEI|zI`s5!L?x#a^xtK zjCinR8DK-GCbV>Bi*tGMl_CCW*LNL9(|d0$4&O`(#b0*Wy*sa1kw#gu&pns_IrHk1 z`MO@r7`lL0OF#@h;b=l%`!{s#YuqR+{@TeM(g0W^(5V}silIeW@!*R@;c!MthZh=^ z>oh1Umhk3@a$??iGhYi7jCmL1wABChTsT+~>3|c+zDb0#; z;ZiS)hRAR2ZpSAmD@H?E@xvW&+BwrU&wLHkEQT6o#Y^1+4I)0azD_sm>^mouZDY$F zd^ruJI}$oIkkcz!N(FXRDPpl4Q#Xkx;jzB0YPUsSBW~(@|`O&kcsogtunWqH4^UPNe?VDr2isYEV9O>WH5Wv~7LnW_-o@!B;`M{`{A#Lm`>ac3 z?4aU2d!uDXa)oOm@OUNvl|=7nDbe33D}Kh;wTJ5~Izz$!x9nryhm@o~4cB^|omVplgp<^m+9a#d+5sQKZ!k{Syv(U*B&SWPAS^upaC68F{< zKY;0E^pb=fljK|og&ka;;8q|SugdKW2*ZNjb~db!Bnbm8;$>)G%Vh|ll!zO)@P#zwX<8hZIzc4;RxLdxoH{K%U2z~SOP($BCjIn9M!^kLkzU4uLk1w7 zs=O`Z)$7!152>6tnYetJjlWo{JTgf!GTYmvnin$j5;A-B1bRfWQU^1EH&R3CSt+zx zP`$TfH(BltSyMPHlX}_uA5m6(BR|}h{nRNNQAWA?CWmP@d$Wvd!y{)PK4-s8eS0D2 zqCe+kkK#-um+NQ3A8jl+4p5kcQ?5WFY=y}Q=seTU9RO~i!x!g=e;Y)Bi!d9 zBG0#;$|Jtj_~VhkY?4n-PEHBW|0s}8)BcH8w17^dfN`IJI-?-1u7F*Xk@>bjcfEjD z^bNm$p;KbMa67wDdtt<6p=1P^G5ox1z`7HD{tV7y31qo;BAQH7F>)hu0u)YtSfapNiF@8`NS( zR-bs*;&#-cpqTKkmWZP6rC1%YK^+Q;$udz;T#3_BM|D?6Ls3sFR!?tG&*)XpoLSG> zQ9lAl*0JB!b5k_%iZ$>XGzfY%2xm5kvQ=|-G)UexprH7JSfh+V<7cl%xskflghr*s zMwPopRf;Bcu_jG}CJ?+qJF`i@qsefw$>^@hn4)<*qG`dhVx$1gBD2}DquF|~+4ipa zmsK<5X^XQ#i)&=FVM~gQ_i-!Tb4@IkMX4VVU))%Tz!ZKS?P#m?`8gthgN70rb z)|O<@mg3cxmf4ok(U!H?mebJ|Lh;1?U2D-@^MFSyS=hN=*TuRw4Z63zx_2|X_dB`|7rT!$yXPvNzU_VTCa)8E(0PrQ z^*Zj!+li+ii7-O#u|v3f(G7bsy?e281XHUhGd3PbvMMjIfc?9d??C4QUzD8Fp4& z)IPuK#Wghqnt1~)vVfMIKa6@ zPF=&{5bxoztl=jILs5rA#_T|EN^pWWILQ#4;tfvA0=u*0s-a%#M8ozx!^IWDMTU?P zZwR2XD!LP*e?R=A5?o6;QoudZXgJdBJ<^&r(%w1Je2Ce7KhjGH?H7j*8bX2I&|z6!P5)*5cW0*b@*i}$89}vhGn-6XL zOnltOVEoo_@&-DN?3^I~3PN9=q*5Nic{@exGePkcMDQ?iDvl(5DKY8wYm(Duoa_O@ zATe!sKPf0NL60AeDTWbK;rQk>-aI?1yY7>aoK|_5>CT$5yPswu z82aGTBJ*{Iw5sBPeOmotR_X0rJN~R`_Vl-9pyu02ov$r=RkK&#Gv)+yCKB^ahI6jj z6AoR#UvFoulv`|$=2X$pn;#_v7B+vLEFwMTSuk1P`4AAOzJy~kK0A~flIenCVyABWY)j)kawzBRE} z8NJwdL^7bf)S$cwS_b+XFONQ~5=j!aaxYsMF3)E#citlqJ|n9fi0(MVb~NI66xHR^ z(UF}j%txOU_U`99Cs@6QD`=dnL-&gq2ofwr^U&8Byl$XA5#gu=;Y=Q$DJAwi+U6f= z!dEJ57S?O9QC#@wGKJB|TS-JC<@#P1qK9bZkI(v67W5Yyp@}si%oxKq5A*8@fk_r2 z#+YX#N=qfu}M+Oh|6@Rw6O~asV&v3GX`(=ga1y@Y z+?7)KtCf3z_k8Qk@yXlnt+uEwy6Q{PZ-;NbK?QrBultV`AV(}t2st=`8)*AIS(ujH zS7^sqw#MhXG}|Uo&*!*Tt9&*rejk-{rdCqHyb-_>)q|~xKR(EvnK-;kH0&TG;SAdG zF=A;)nxNGmSN3>mqW7<^6rq6~?tJf(g39ISSHekuTnNoFi7(+a_gbkv!5-%_uHTy3 z_(4?8rIGE3bq#_9xv~W`f(}<-yHX$dacy7Z5t!v*igFQVaBf`ZJ(!PSoUR`Bh+kdP z5c=j}!g{fy?BFqeByq7VIGpfLUtTlSY|&-PPZ<{$Ek4&s=HPP8m=>R{7~uDaas4Ubr3_n_ADAnWs4oeRDMFp0 z-9FpbGST~L$A;}LM~Egb=tLC3Yvcn4rS6Gwe=q^{=Pcbi6O8D$QX!OjXQq%C(r>^l zy>qj%YzaRk=3D&>i>YGe+|Swie=X;#zV?K?HMq2fH`%N(5`4O{MRa-8JnL4WHs~zv z@1oFoQS(U}Q~?%1)_(6#A`ze!ve;h~bA-GpfFrVJT~0|_g4xDT#vQ^o)XLf6FH4{q zfS?S=XbgYsos~;@OOVHkNvp%bGq>HYbQdc0bpAfagciZ(~WfAEvQ{ZTZ zC~%i;eWtIIX}?$>;abwBtmGyA7F5SWVqR4DnZj<6NA|7TW}PgxA3CqxyHF*l5SH@-^9IGmA}Lf&V(GXK&!ay^m zbi8N=_JP8#|9fPgQxENYwEWdpYQBP&rb~k|RtS%A;PcPI--AibTEB-Rnx#ZgItWu#hcpfxzQ}csb-ae zZRCK4v{aWP|2L;DeW5+qSoI&7IElx#AH2awEtc|+!7%QCmJ)WWnjTCs>pBo)hjoKT z(zRT~k0HgpIB3?C&5u9(vvd}ZXbUFB>4`U#4&`mzN~voGPLkjB_lw9fz58N|bDV%A zyLO*WHB{?K{%&X65KDOOqtE8Ces$|#2*H!4z&KE=&|!LERo@o!w!Xoc_hjaMI)cg;u)njyF>8B(U{#Y`rXh^Tn zqSanYkrEhCT17B*x3N^DUn~cFh{?_#|BO@#p7}l~nKCx6$aA(WN6FcdPuwTgAc10K zB14@S<7aTlwxg=nSuHamg93{MS>%KGPU*vI2hM5=3bbcw(u{(W;a`GGh>PV4F)p{= zM%rjZnR!#CtW6bkKgjZnPh~m95qU6wB#|#yD~Zexq?`&&@dPxyk9*G+yx5@#}t z`#5Gn2B2+3smxDStu_U1$-0Q1U&ccxw3TjYh2$N8VV3H(Pn+z6G?(`OR#bk zQ^0=h*RJa4-|+doy48=AU(^Bx$Myi9;jeO!l~RdLufVG04oTnH7!LK@R6_)3@}CD= zlo_>Uvc>EYzc5S}Daq&I7-m=46<&BVdBOXWFfu5RZEbk)cY=lfmrPjXm&~x2V^T4E zA+ZY2Li5bJZ_*E#w}aq!z6#F)>47YY2d3S)xRAgAj(o#N3(aCtt#a+z^5S$rg$cO% z(C1_TJI3sgZE8 z()na#snwxB*UVd?3IJIAWP^ie=bBqEbh@283=o$j>J2~N{^~N*4``Ze1%0x0OcraN z2a>doFH_qVi+wG;o@<{UI#$cG5?C{fZhdB8>pmoAbe5tcH@dvP!#xF;%1{mu93@|FK;kUqsxI%cegv3{oujbu3X@L%E3Y{B= zaCZ?FS6IXk;vcl63&XOu>rp@Veo*hgz|YnllDtMXJJ8y`f8ZobXzKjQ>GsB2;g~zw z>VA_+aRJ)?+UaX0l$*V0c*HKmDQgSbQ7I}kO2ycaINoU;d|P}YZ9Fz)q(I`SMKDe~Zy3+#mT(1^a9#b5$13w;mkS?uaJ!hZ`nfQ&rDF(kwdC|)t=@3!sIB-D2N+-h#Lh8~cldK0stJ^W9Woe5m)C2lc(kY`SYoowe=7oOm6MSLAej**|pHtD}nrE+1JQlAw+{WAx=h%gJqP%&(pI9S%FG^*7_O*IE=UNbdYeIbve@c15 z=Mk4JAfIEG9xud>FB8$A4yVQuxB6nU>~J75BW@=W_uqMdOyt!7Zq_o z^KBokOh3If2d(A@M$vx8pnm2kX2zucr=G}u*1>*uaR%0z56f-+oah7G{Gz`V6I_S} z&~N+sGzSF4DL73(HpmYMB@Ku;lL-}l3}WpTn;DRRl8bE)+(8DUhzH+mzLugNl*SwU zs5$uQkocpiOkntcY|@~75rJ&cphozh;>@73IDz7(j2d|G3-OTJ4E`7TAr+h<4b34f zVtftLAsYE1ounZ(=OMkrc-_V!!=gd`nIX!)AtQ9)$IT(*%J^^ez#lUM-(`TWd4NBi zfdZO9^U7$mB%tL?zeOVumIt)n1Tqc+ZLOni&_NF9{dV-A86uFACWwq5vwGcu|qU6HNs`7PzE{ zvvN~GDjwog0jV|YP2L1oJIhyjb2Vrx7GEp;dNtD0*;8RS5+|d$mod^|t!NZD(&a7H z)~Og-skn4I(gao1+87y7lI)>`hT}sQ^_3dfl@vch!588~-cUO$D0+udWt7tULg;vu z*vOKS`Un(Gt_(PYA_bp~&eDrcijT^&DGzum=PN0*{}^2?5}wZ*<%=B6gpa0ID!&^T zUAq@rzKF|KPyI~`7KUMB>qYoTvtnjaKEU2&Ptb||&bL+1Pj=4|pRDq}#WX3za&KiX z7G`z3QNG3`4^p{M`f{j0j^i|r+a!41Nm@SLbbt$ukwHJ>2G1b`ID(b{M9~t56VR99!#)oVYw5#+3Ges&oFkYGO4OzDcA~7V&E$ z5*JER4ppi5$W$k^Nz8Xew99H#$*R;%V4A<`?-)j0+=*!gM(CpJ>3@bZY<>CVpne=Q zb=_N5CmqWAP*x|LyF;(W@wW9;W`l-hk~yRB3Acm{YrBYjjGUDJHHN@LZ~^wj z5qhc6EYF*l<>a*E3J;otNKe|>6v z_g2#}yvRo`)V+MVT$Nr(I?zNp!{K_)aZS@DT|;q5vn(${`75d98#OmD3*dKYk@W0@ zTB?l%EVS;!{-cU?}R4j>z&mZu-+tqd{ zQ@Lw3(xU^}Vf57c^t+8AvY+N6x6})lU@d>^W0Jq%P8Pk1$TjRT_!2Q$@PyV*8MnZr zC~H*n+1i3f#C#!5hNXpS+$X$`@FEBIO5YE0^s|L_j{2FF)B3MrFBIdlTvQwv)M^b!hRQ73SN6=Rfs_%HAqQ32?L~f8|UxxVc|S3|6smj{`yS7k`%G{3a?mEyB#l za$_d$`>E6ZwdfA|Nkn3q+s8429?;MsQNq|cs4tVD{}H zI3haYQevsdV&$PRHa#r-RhMDG@DiYF7X8J_vZWE>yHHFj+83PU&&uF^LCdA(E3aef zVn#L37U;KRNN=o3`LrUQg;e%OSKbe<6$!6?QD((Sc_m?zg=Z9w-#oj&zl3#aTzP~v zxG5U1+j?61uKcCoQk&9RkjWZ{Ef4872XJ=2CwmdA={vQN4!Y~gTOge3a|AU|9~(%D z!)c-h%NgQX*Eup8waH>;AQGt6t6*3u2J11aWOEHy<~@z%J%+GzGH|+@;+>l;L$sY) zb=GDR*+Osy8JEzT=LIA;C?tQ-#H`xotK0xq^U`NY9*iUzVOPPb#kFzvu$6%$10tLk zz+^RdY%FVg<4+;lHy9(bBxcA6Q^!4~a_rSRkF`w>R9$bObTI#J}9C(1t(zpQYH5@U`e~OUHD3U;%r@5W$ zTE>-XhE@6)2KlZIeqD-lF${|_KUg-yv&FI6%Q+fa6`wO^VBBd2O!21?-7lz}&OX~M z4s}*uimfh{0h%`d+@to{YcZ<28~yftD1;wKT~xP4dB)^ARazFV)+nr>AG{RO%p~Qm z={@`X@$bS!8+*~)NN(TNupHFiVDd|~emWqGB^HX_j0V=d*7us4L<-Hp(~hj=en$35 z;yJfsN}L>qCYvWSLOtgcTT5)_%D>*25_S5LnyS3bQ&;^k3wL3`(vWyIs-Eg7t;J)8 zCkvkPP|k2ZDYAA=0$+Zy>)x#x+ts2nCwr|A$j2Hw+T6X@1H98IygarM{_$;FX+aPQ zceR^ox7iFb6Twi6lf-h%*Mq>ZM#|L(BW8U3v8>4sWMGX5te0}}=qZEw@^#uU?B1PBPfX(^j!-c#Kjg+4=v)#o~ z`-N=e#eKoWm+`lsRxW%-ogr^rBoCaGpZwKod86ol8BO zN9yUrlK;2hfGFaY@#P@wW=l#^6 z0a)tkN4+qUt3#QY2i9S4r?c+*^YTcJNpl%7u30H=f=u0H$x z(tMb$IhykW&WHN6rudi_J;43;7QX?P=6$@keM~PNR;agErGRTpNLfK&6B*>@&idAK z;I^ADNr-%*Rc^taXP|u916g?{fm+7}S9wGOe%EoI=K=6CZOLlmp<$S%(!6nC1tK&EQs=F6f z;5N^zvm=9e_SIgghnJkz*WBxa5u|*!owK%IJDJ~VR9mN)tU`ZqIUOI~@a;|%$R=uI zFO+XimFpPH9kw$a!0OGXt8MNCkAIg|l#CtSUCqt+J3ZyHy%#>)grvGH`Ml;j-<{GT ztf@8@y*z}sIQ>D)w+$l@px744Eb-fm{rLtvyBFf}yT>~eLR?vr$ot!?^A-Z?BKHRz zxeT8g0(Y7K9M;x6{l{en>cAJg+Idzl_1)ivys-?64^%~OeHUh@2G9#*$Z)5PxOch! z9>HNLU}DAz5vGe4KsM6`AqDrth@%3IuIb|5<9d+A=n{AoDM?_4&?hR3-q33i)?+gy zzhc4BP1dt)V@M@_?V+Cfozs~?&m_ZxF+;^ST`R*Pp-nH-0V1*!Zngc%Jk>5Dm?_ui zRwOSw@j<>g=R1KXb3wQ(DWE`wWM88&UP1Ji?f=8bT?Vz;KWrMNKp{BA-Q5etA;qD1 zDN@{}xI47CQ%Zs2?(P!Y-5r9v1t~7+rqA>KclX`h5Br-NCd}{w1|~DfeH~}C8q028 zwLXZsD8t#Jq=?UAfS+ivbX*C ztbm&S4yE+BgXEK8HG>UyWZc8_4#>5`I;UW{S8azY3!et zESsboSL|9VKCU?A^*4guR@YR)9v;$7>wZreO&gys$py9?5De}=1<`giFNN`RBy4|I zFlgBMNr~UGmqM!FvM*`8E_lf2LLp?K_|yM!HZKoz_MohFz2>;8ZVq(XAWYVJMn0V> zeEw=@-AASs;k`(EC+?qLM}w@CHJ78ZbkMfn)4Ho|*BB*F=(o!@ouYSZK7T~-x1!zy zANJC|0w0gcI)P7Tt$%>em!t3Bzuc^TeGh#&>3sj^<>}9RI0UAyS2!2M@F{9H@?jO! zT-5=XzEp^`Ox-AI)qwHg#1I*{K5UIpV+S$yQRCEv%ZSk6{4DOH=dOuR_NBqgTk5vFs17TC z%E7BE?q_$di86SmA?jrscpG06t(|XDQ7(Y%mQoXA?@LRz!!#&3QxognW{NXi%*G2J z665(yONGEZB#u)X7b-$W!&5wHeF^;-FfLC=N6S3?L9I4Esf~_-zIiB{cP0#NjE+f? zdE{e!Z9<{Q9tyu#k+S#Ik78eXHdE$N?U~vnGxdV(&tCm1E49Bmp6R)Qn8%C_uz!JU z3#!9Q#>~0vQYL&0sbajw^g%eO3vCR1btU6=>#C`+>02@5_ouiWp?p7jXD7E3&7kCF-E$y=`Y! zb}9YDKao&4S$Cuy#4?wIgAa`my*ZMU(wQsZZYWXK-}?B&S~MHjP^#I^qDe`lQ4$+b zs{H~Rnx@WHIP+4=%qzH?bNO zTA8hFY^WqRv2FpaEW&oCjpoL-1wyN(*^iPVY|n^^jElc8K4(+9KN2ZBJ9j zZF`CD$%l<6*v=G6J6TKEmEeDn4B@2*)zt{_;H;JfDA8jG9bV4iYg zKcV|%>~*ei$?`GGldE1D;M+)>4`;=-_M2 zVn4BUXQ{=0>f;9>DU^~+>*v>R%wr&53PjJEo>h$A81WbSK)%1}AHx0M_5VkX&f$dBS zU^~-OB%!%H4*SdGi$Uk1FY{QA5rY~Tgbr6zN(^4T~2erD?n zCG~9**)Ia#=hSuF54;Cn{j7T4J9xU8_yvNX0iPV{T5p@MpiOy(XB&pV>-i0dg98do zRsiKJx+U;&whDSv*ZBgOy#Bqj;c|xH`#9PNTx$}u8#hdQS`BYpkDz?;T0LyRVdX_K{ghY3L7a08(=OGS}t-M)D+qbW$>AsA{Vufe5saUZL&TEs&S(jPOaDm-a zL5@y4sX#k(?@B3+Y&U;zD@YU+KsJ=WSJ2BIpZ`Gys!KMs2j1%C-waY(Abdv;l#;C7D*$H%aqk9@IEsHN?3H2AFH|q(oyhqDDdZ zL;I!>Nx_S5p@FSVI}1w=It@rB*p0qvnd0+$#^+i@8%(AEg5rPyaQ)u4;80O*$}7?4 zAllq+wj@bPHeHegGeNlmQuLzwl2;pR`Kr)~ZNtDK7tkx9Oc6K*A&4O@xW_VtWi_Oy zC{&(Ni6M<>Y+HaXjZDPC?AVF}wC4-b@$=5BTVwQ}De{LPe6>jXx?My?!IU6VlAz4Y zCQr)8P*A62V#k-3ghU@Evl;_`RC~tc0&fwKX;uHBNPsIXX@wyz(^$2XxvqlVRdXkm zTbD$!IMl?%-8I$^ug=fki|QeWA5=kh^usx{0Zbi4nIhS^BXhO-b`Iqb3sh zdj{Pc_thNu;xC2Uc?4xO6s)yLE71CqZXY3Y0lfn`=PZ+vjG~3SM2UmqB<6@zmd0G` zn4W@qqhvJr2RZPYu2poQVb|FBN7V$(;69K+5Fl@6X{T%uB-#X+DX9Lz)o*2 zR3LEpN{?c{UT3FBh%_bAx}1-(iQ87GuvDLdts#}U54ETv(ZT*1m9};F;l1-Y0Cf$ zu{GN-=Tk9n+tzrCACTjrTAPNDEKB*-bHS3_j`9V2_CI+?^;URvs2Yu)D$Jy}6IlWRN!j-1pVl@29Q4l7rHF^phO51a7YKi%2487j9i zbL$HN_{+`eGK!Nr&g%BqrZTCWW{$#<*w>H_Rb15L(`;`!gJ&Jr9nJ-gPyj_U%F)+E;ymX7Mro8x?f z^JRhavBkpPAc&$*oZz{b)`C&!u*!BnU$D(8Di)!;u*6AbPmSYXKl8{$4YD`G4u@7v zh ztiHhk+T31+-ujlE6DFp41_U>VM9c|#3j#;%IKm(txOFU}8MTSETv$9rD!ORDSG5>^ zj|lMy71astr2TGSqHPuThV%*}WN_e;y`P}?8tc4)1b$@DWv#0{X}lDy;t?mT7tc!j z{eu~3h42tyC*sMtI?wYy>usGAW!;gBn7iKl)`0tvAla|))fjop`YFA1 z-ioLm?0k6FrId%yn5K+CIb?Tz`kGg3QXd`7Rg$IQ^LJitn^a&XZ*C}0eascXXYpqL zCWJEvu#7@lJ4pP#zahKS_VX`Z!@CCgJYFM}0zP5gjSyB9S)(eM)$_}uQ&fYGXvK!I zjb>FYMp})y3-zR6*NrWMiE+1j4TClFZi1moG}ALN6+Y`CJ~CZC8&Wb0OFqp>Llaru zd#`o%oih32M*H(djHX5hG_XzYEwGDs&WjJukP=_kK^k(Ag!?bcVw|IOnQ{B!W}@$vBSaq;l5v9WP* zabXW&UlI@!5)u)?F5>@wNQsHXh>7LM{(dHhxdYPw95OO8de{dU896!ZgP2r?h{O(; z$^(#@5QQvOs4hErHM?ci3GbyJ|Ph+qY^9O5-Si9eIO#1 zBP5Z+rQ*e*{^x={pyI`)euqcJLrBR+N7Qq@V64c zz`)4F#Kg?X$jrvf!okW4>jS_F0e=tsKZo;g9N;bN;^5+e{b#dr{JmJ&xmnrYva<8A za0)SV2{Unv((@}a@T)QMt8noFdHMKY#Q*^T0YTXLryC&r?-BWXL`6m4zke?-E-nTX zlVBB)rsq{)e5=pEYD>xJKt|y~M;;+YmLNy=U4hwCN!akCvYOT>Wo=ajRb>T5MR|Dz zDWIAdw}FV1BTyq$Og~asE1XFolt3~F=Y2eZ+%F=<3{v$%Ld{Y#%_8#u1OYg0t4W-(Ufy5*{DT65!b8I2qhjK|!%p0fguf>dc9Ig3f25S8 zr)6gSN-2s9tB7?j4^pV}muU3nZ+2k_VeRgekT+@^{=)|G@*>B|K z=PER94O#?#Zk&en4lfOkO-)Qr&CSg(E-k@)Js7;OvA(&zcW`igK7V%C`UGu(LP1dI z0u;Iih2FfpK>s;UPmeE82hbNV6gv3~?flo{3j+SOTe~p+w{|Oco7n$vyH!9|{%^Zg zB1kOA`Cj(_tKG_`k%Q!?JU0A)di*tAtuvK+t8vu-quna?it=>0>95BZ*ID|%+pXgu zn8z>W`RnoRREEW=|I=;_LZigg)5ZbffzbE?L3^ zYqx5C*-O+YnBSIBbT8TcVHC=|pKSJTyR~E==J5sde>u(!PX9zS`SNeOH4@RT(6kfx&QPY5n!~~}2#8*JKdz`Kg4H2zW5MPe=JCt^wp&lmJK>PYPTCOfl66`z zLk1x*kALduKqi*(@yqKx<_lQ6wH)U0J^r>^!^$1{ts+AmB~jnQJU&~~X<{Ey3_<14 zyTx<|c!7iRzwK6-#}`9phk1NLyK9)ohqYT3`OmH=`DEE|8nouQVr# z8^(7yXQuUZy=+xf0rU8O+pUg+>~~ za<>@w}ha)3O!VR@Ze)=%XIM^=a-keV%& zQ1k*O*$*RXsaFZbiUllM!y}rYtHkQ`9o(fUQ6`Zq$sdYCEgZw629Gn$DAaoR6-({x zeOJjtiiO<2hQ};~ey2=D7ruLFmJs6FN=hFt;9z_hwfCNl2fW$mqON`gA$CbUR4fu& z9G-9o{m!_EKA_M7Ak)prxe!3ThB!KhC;j8O(wV??F|}gId_%vp0ZPRZgdh;cCMxP7Tv|4$4fPv zM&>Jl3E8@zzo|J5tAB9kD78{5D|{!Y3`mbmQoShEJAiE}R&FYDPU%RMr9a9|Bt$5w zml+|aF*f?w%M@=L5MGWf4G7)V#I>K`9C9J6-|(ibh_D*-k80z;PT=8}(72;fSeZ$^ ztuMB-x>Ivo9yimh%ZP!sTXC#A?a&qSAjw~e`emEMG7n@DAMufCtVjiM$O(dG>X75aR8>)MCw58(C+&%)4C0H70aAb@L zyRG86TlM+HX1f#7vtLfx`LmAgDxq-GfNE@Q!kM?}GbDMC6zY@|#AdR9yvg$xf`=AN+<3vVsS`ARyvemy&gA@ z{{1#U&r;ZfxE1@t=0}s)E>QPzMmh)J@~ZtCB4A}I8?&J}FT#qO#e4cuY%u9&sU0!; zew1*t(vwTcM$yK*t>nrzT6X-zpiHo%E0mK}L3H2~<)`_>L(?+D4E?b{;x6TihWZEJ z69i#m4bW{vW7D{u8jf!CKxjdj#+j*X>&oc3`&s^*+=DNzy8ZL+HM%Y@NA{~v>-UvA zO}#|+THN0AdO-esdb?>ZkGnO1p;KF$h=c8-@CNqx=Dy)(2d>++#292xZD>(%?83aDSR05n!5PDAfta~_Zp(E&xQZ>>p3dg!w20i!j;}_X)z-cxdECxd8YQdjuGF&j##B-rj$GV|dixN>Li4l{mF$6=lB! zy={iQOtX8d2DHvQ%gKITZU6DGO}bI}foXU1lcA^E`?Q;B|MqL+uK`NG+Gi~-cW}Q! z17aXPf1WmxVcpmjS^H{HicGk{-A?1!M%?#tm4^d-jX7unWPhOdgU45wZIEpS|3|nb zl^R)xxIyLpCii_f)T~WR2V~6SLH9K{xrf)bM@C;CJOYT4)t-=T47I3U-3Ji!e#6xI zcCw3Mdxw#|`OV>1pdDd=e*)$Mw()fcVgp>z-6kq=a*$B5PSK$4_??pwp))dapwyuf z&AsQPS)dIv<`y<)c6Fc%Ab>L&Yn4l;@&c2;IS7XF&+7w97r&lq2AjxzkPY{vD^_0X za^IxF+=fGi7-6C}yJusE*c=4<;8|+O$v8S<6%2;JF#gnT$opn*83I33&v2;OXTRo9 z=ekAZFHB*!hrupG?pYTo*p2Q21G3g0GF_@}-|i!_ljSQ0oSvKPjbWWvCQ;dNp5;NA znmDv-qNrMds5$|(sD9b+#qQZ%p+D|X&XBQAxxzN7P=DQ{`R<}-h9h2NW9BSHPZZ1N zdAcBacqUkcmw3jM7KbnFdzO2Kt_)(FW5;d_#O}()f{j%D<}gl+qPDqU7%d{R3-coG zn=$}1i|YG8v+P>~FA zpBZzj%Ri?p^t|}z*2NDmsdy`?1V*m}IYC+GVPDo37bE1Kswe{7M=^)jXl-&ocH|H9Er@bDpMGHpVJxy{r#oTI;+z3>)~*PT zj%*JQ7n)yv*tt=F$y|h2cddf4$+@Mpnm^kYXX$PMN)R}h>~Hpxo#YwtMZ`|hRQsb!p? z@}*MJj+HO9EPp*dscc0=YAGdZ?qX`i;Rw+xOX229C4@w_Kh=JLB;`n_DypV(?XeQ( z@y+n6#`&wtt*hW|i0&WDpS`O$kE@VIiV#+-!#-B$L{{UlmZPSXOvzSZrq!6fDy$uh zbm6L@da4Bf-FRt9n-#8tkzoVHhGLRzDvtLAZhYdz|%r2(6MO>w8{63 zD%k}U^RG5V+TeXXsR?>&mey&O98Cp*nw?ggt^srAeA9S^7T%mFNu?&Ul{p?dayx@DG-wk5n%`l{|(c1obwS5|` z12P)2tx)T&(*X-oJC=0_?X;h_c77%5r!6MXdH{KPHSt;*9we1k9!29K{lk8h?A&4|Qg`;K!c zj!ukp@T8AzfhQo(6BlHYP23X(groc5>O3~=Q?|)x@Fetk5>AQk+BXhXPq<63d_e#7 zs(lK5Z3=UI5@Bs<(Pj!cqXOk+iYQ~6q##W3_m?+hjv(P_8#a*wseVErY#vBgj&rmr!BUSvy3F%w|n_a8Hs z67-jKqnDD#8KN*|xXzaRg_cstS904~lSNl7YnRnn+cGN_l*jv2E2av`S8GLC3Pe{; z0#`;?m&#s>vh7woURG_@R=f1+n)S!2+gA-%R#33v;xSfxU%*rP3_VctH8Jk@uedtw zR%ZuezzU_{v6q!O^7U?b6VUx9`j3&;C6>tVPuDxSJba`JCwyC7u)8F6=T)!$? zUs+o|d&yg01K*2o{`T7t4+NBNqSjPzmWu(js8$|dIy1}WbYC`TNH#Z>Hc9O1Lb<+D zK)0xXU%R;Gks!38*_)M9o55m$@~%xR`{g&8Jq@cHr*>Onky}^oTS8FSH(;gT?JQHx z(|6D+Ol_BoAq&(Z25+KPegkj;kr&%HqRX3rb~|X1I}`0YI+?W8B}f7|@q+Of4^+E? z7z_$is7e#GmK12p%FAz|4eA|hn*Mv|6+D+2d%Bqi@8I{LhQNJ4<$dG$O@j$q>+H>% zZ@UpM`^!pO@FEA75qoAcS(oNHq1gv{;|KhKM|`pKzRA#^Z23F+2Iw+ktxklS0PrV(NWI$kq_h`Mfp?=-WC#v<{)xt zvVD|ourFPU$ZT+|2-$&GH9+glVTF}Xnd|$?JBOJN)Y20Znj^k#RA467 zn(BFC#`%B&?PCWm#GE!G8LP8n;6d!d)Z}6Y<4o%6LfGW^y7Gb(N{i;tuVGr2SXt2k2p2|VVz~w;uByi2AvMf+VOU+3q>Ogxa_S^RK zR$3)w(w}a&l2-96t+m*(7|x9a_lXwmn&#Y=b z#{V`x<<_Y7mKW#2n=)Sg5cTE5^*eaQz}4CeI(t9WC0>ZA^cw+|I%dOe|r2x_W$Pb zAAjqi;cajjrBT7@bXZh@Xg^Qe06kC$_ec4X+$DGsI&p&er*lY_I&Xfs7Cf;Eg@qb^}ixh8a#Vm?Tu&2W*NMA|86SjluSljcW~9H8YmQ)5<+~& zB=lxHBoC@hsbY(TC#x2VjGsl$u$zjoqS3l~%av1;tT0q&%duiX9n^@T5c9Bpq}qLg zdhAFgX=}=qb416@Nqd!B%as3vFZWGZf@WkvVmcsT7(d^$H3DA(;PkpMlS2aW!*_r< zVj#V}_1+Lo819i=Qf@FD%g@v7$o8^$TDjI|_;P?S(X6Bbd!urc4M!_v28veI3E35U zCwjMAr}F*};yYDwWcqqlNfi3=`lcmRqXt18$*ShaT53S=>VO(@U$CzaGLg9pdO%&Tb0s}%=-<+ zpQ|^J+%=}FYeko}nx+;XQWGx2D>E`qSvH3@E0mCm$O!xh?JXSmB%(%vq)3O_-W+Bx zp@@P=?3^H)b{HAjYSFHZb_S4XnoMmF{$T?6mlB8A7shE%Yxxy zxNcF{YTtT3Anb5i*nW5d$GjG)Yx`x#jqRT4>bBGVx0BYYud`sBQzTQ!bB^zrt5tR| z6<%zY{l%K=I)cxh74-?YWj^;0stlI#C0!-JBG#Q{nJwF%pLr*e8g4efBq;&ajG`j2 z^md!`O3l6fyi$-iot!47GQ(&6Nmq-OC>} zhAi~_fVy8Uk%7uyNfQ~hii~CTqb~r>ac(%QDi`6qts;|#L+@0}ZBeOxHiFT-@y8(N zkBK4Kk_Lz($ua{7iPY_ibZ=b%Z}jVEv+9Fsgtc+hg>I#`c&BN!xPtrax1|85!HnUb zwMT3N-=YA^yd0brCU$FiGH=Gb7ZD7}_5@^w7N%o8$P(^xBsv=2jrbl)QioVLlb&y~ zgwQEcA+j~UK|s2)hD?VEz5ARVm~Hw#%Vn1umNVscpZS@ENMFyil(_M3m!Bs(y%edI zx{uu1h$0^VxY?5@kVfXiRLgn<(U+o#V^TDvU?RMM@=KmR&xC5V#=f?6<5Vmeblduf z5R=gKgZY(;EXx;@GaUH-;A*L~)$(m=DVZN7n`S0@r`swb+;qiy%n4&cJL59|(V6NW z-VTW96gMp@{rZj5KI6H-bM`SE^zOMx?Mu5FZoJ$0Z{{_FXB7YdnU`Az}%SQK*$k#6dGSt(R2!yH247b9=Ci zf!d7RBJO147!UPyT@mReiYjPfzS5)L#(2J=N6#^f$u9$Eyd$r7Q|Cmgo+~%P(KLeYPiP>uNu$O=(`PRVO(+*fBxMv zkw_z*t^0!+Wl%vu&c<@Mcj2JDA#?WU3F!^U;I?tG{T#z;cA%*kNP-s^s?TH`wWE8~ zg#q8+&FrX0OVcgU^{pXA$yPxw?yPDTD2jHebbHR}r}0k{4hF%PA6QIWyspQq45$^Q zP!HU+_}0Jy5m5?ECLUQh_!k4YPH#F;z1C1)HRm=d-;d$?_KR3>|5_eP+hX-Ydz204 zBeDspPY2`FZY4YUV#)AE{8UeQ4uUnFYYq`W%5-BUmJWTju`FN2^yDm}CkQz8i;*S{&h-WkKpvk038uKJZ@Tp4QcF1H4`^P$wK-*Q;GN-`_xZ^|EWpuGffI z4?DHLQ-z;CaYFODQ0u$Ut~+^8M3Hv8Ft59?5W9m_yRhlRkxy#@>Fuz-9==&OL47Ow zH7gulH*tP9NqsjmX*a2v7;bRaqe3@|Yc~~M54A1l!wN0$tQhfJH@#U8gR4aAa5rOc zrz39DLljh$atv*SwugPUhXc$=OU6VOE#4L1!~L$8N2>QcyyqR6C`+{P@~8yhl@!nKldqS$ zN9$9NdM8mYA!$pCQr;>9^Z0bqlUp7KR9^b5AdbCdyk5k!K?D46O61`uouU~Jj ze?Xw$H|#Xd{CK_|UFE5(?%-~m_lK{vBOW<|8LFJ>$~BU{NdE}4++;&F?vJ4c84?H)g>!Rr{Rs{(8;^^ zeGn)gjJX~zFq3bGAMs=zDNYzE(d*BX5_eP|DV!UrI4vpyiu$RaY7 zemW+MGQO0c^qzRUN@{$yZyaov=~1r`ls?!$*RzZ_v9%k$aw@wfHLuGHK={NM#IK0!i($jbv)A;7o1a8xWA=5;O)5HbSBn{J~ z{nKQkA76*4OdzT*1y51MOv$Em8oDa{o}Q-Dn4veHVQ`ya44Gj{gw8M*%&;`fu=dXo z?M?Hy$(NI*u2bDxwH6x!9lA!-1uHEMh{a--)h-pntcPi{)h>)FZEu+O-lk7<}| zD7j^87s#75d@$7@n2#QeyjKZ%R?`nzNZOsJO&FkUP%^TUHR~s}W0$w*{otU_dN-$N zar4oVciu{RF*bdHt9-$*f58@i0SR6!Cw=ipxz@F+W{}8`F0_B%^+qdHPfI<0%tL?B zCx##><3n(PTnIU*lfEYJwifcsVg&x+x10VzlFxxkvY~bau?>r!1zK_XNxo~fe)Jk# zXgrY`%aQCDMVIr@^Gi0@OXexsQRT~D+q4&{v=`oK*F~#;&|l7;myWX2N{(5!9@D;+ z(}~bq3B+GEbNlRPr>SeJnA4ymL$~saempO6xoAzZ>P)lxMY9G&tBFl6Ged{dZ=uY5 zRcK77_^nQk2!iGk!mRDeb@QqbyJoG%_Y8V1q{PVw+tu!d-lmGG=89pS`%oCY2DOj1 ziDC`i$PPEij5Gi`LzaG?Y4z-Z+283!udU>$gKd&Spbl2x!M)X#8oi>m)s$|%rKrzI zr{HD3p`&sc$LH|Tbet_X7(rrOF&qb(l_P67`b;}&XZM)5gdc*b8@z*hB7xRYD z`OWX|HvYJ2RgSN7dm9;(87rk5HI;8t+(;!#En~PFgMSG0=pt+5uKTD7E!2pE!B|$4Ks2;k36L+< z0r*&rd~AgjiM{7*6=o-}CtMj$Ocmy9v?Fr6`x`9`2sI6hGsi1Ml5r2$u;0@{+7CY5 z)3G;OEHGjYU27}fRtU9t%epO>zIDB4W`t;-+H4MwXRc-ttUVE?-Ut9rgxO#R2g8{< zg?_`zMt;w?ua^`Wd1!GlWYG|4DFy91@U?H%+eelNh2z0~9he;|VQ}ESzDNAc(rY5j zvt!*37-fFDWr4Ik9K&~_lW0CK_@YI6;D3fS2h-9IjEwAPWa{cLeiF<{FeVp9%{ z9aIK1P<&bDv)UX#rN}(V$=rR$*PD{D_me-K-anaX?CS*DA&S@}bexq?)Y zinX68v%kEz2Q)*1haiIMkbxv(x%Ja?c8FTV?rx}qppJbsz1;y+^6*xY3uqoXVDEFW z!voy&-3&8kIuXjW4wgCT=Qvq0=&6IEa=T-c5PU&+e^{w`aS1rSxg7u{E#2Q^Nn5h5RqxR|C3bLg4;H8WsYa?ZaG_&I1eWt_>vciejx*oyx>6Q<9uWs*aZl zzCbV`OtDrInb1SbKNk#xnb?a~IEK>CKqo@RaBBg}pA@@-K+^z@6B(v3@pZfUP&g&I z9skfT41EWJGQnaD;aQacJj=6SIG48$c20aQ!kv-mD$ck2j>~RWVzMMmSa7eB5d?^w zm^;rQ9N*^%IC+X)xK+Y6I-JrQBhg^@ubYv?_s@Six;D^Q*0=+d1oi|E0E&yQ%E;C- zO#p#pgjd**^LmYZUkmZ38*xIrXkJ$-EF)<`DV9Hy3R%}b8^h}$*Cv0?(8A#4vXPe> zBULC%4ESz{hps~m9Al}R0jlm69_}iZH<6BRpJlJMDCRjTZggeuhQ{2Qz&BENZa_r$ z_tB?DP=X5@6`Rox_pqs>VTxPRPJk69GZ1=&1#t0a+5yPg_%FII-rlC5+8}{wW{m6vxAyh@OXZ=Wx@gauGD@(@9hwCP? zdOeKNLpy6Q;?6ee?g7|+FX?d?BikE$-upu({Gu>CxFdYn!g4{`D;Cc42hM$_y}KG8 zT2T>lanZvsmGHE$ZsCSg_|T7+FAsG^<8BTK(TtDeQ1?xOKCe!XuUU|oO;c#nLsFGj zWU_a4=H95q<9V}BU18X-*vA++A1A_NXMTl9*{4CQnCyd_#;=ejerKM9;GoVU??q=Q zxYAqN{!0j@LrIhGB(6JY(_Pu-ml2MuY1!wQFt~KXXKntw%&_OxN%Ub#?~z{;c@8~7 zl}IMZJH($6#R*RICXg*QudE4gOxJw}EN)5vcr2;B`^a@5!Qmfx=-N$y=ywaX@qiKy z-UWw4=Q?SYe)(Z+T+~h)fj$0AO!>te`0-r(G0Zus+j~1gF+LJHgce!*!-d=IU+vi- zZNWS~pi1xK|K{eM?7i z=QwPk$_dF9=fq|QZ851~!aTnI4L3XW4#qPghhDR<%lP*KWo*@BjYi*N(=Y#C zJlKjhyahBOm`%UkTdKv^89;wbwF;q@jSTjRtN$`rs@+-%5N=dT7xH>Ugr&be=E;5M ztEj}|_}Ak@UWD&2wg-Ry;UJ{eZ}q&n+T(f>eZIdsn5}Z4?74hGqdhr4H+1*^gCekL z_)0#B%)otmFI{!|4KKOd0!nwznMCWywYu5{OGKH-N5e+%;PhcHgEePtsl@t zy{!b~Me}wHQ948U>4)@G&@uO@f=T5Ba>ArZyy)UTu(Z(q+z9{#gnR7uWk&Gnc+n?m zW6II`=~+MQ*%|~2?i-s>gl;;cu!T>#Oua(cic{njWXy0|@nX#M3cNE*plg(6$PPdi zVv@G#v1H1Lm?L%F3ySc&VTLlVD>A)EAcQh zuLAT~`YmpNfwjD9MyD*h2}*yIF9J0?`ab=ddABf+#D}eRn5C6Xt032-)caFqBx}RG zPFZs0cXJ=R>{VxFT}itvnIXp+$n%qF$*Od7`PElrC4A*`RedZYg{R=8A;V-y1KL5!N764q7d;-iNhqGoG96o7(z=4<*|^`+}J0tXog?9J2JKFU`F@`zz4G@QBh2G-sho~3?_U*(RgPDwKIv|nkTi>J+^Bf{@ktLx{p<0$3<`U6 zZ(NbO-#`=tao$p+UIX*H zk(kyUKNElZ9&ONZN4Rp)reSAyvkFK?+36*4;o0G1C<~&eNo+#V8w3vdKYL@_)WYJZ z5lrto3ueM3>XS(3E$;2N$KS?Ix{Z@se&}Uc0A;Ah=BGz6rx;IeQz2$@`JI?q)yqe) z&=qsc8~zUfZ$Oa03hhZ%hom(jcKwJ`o9WJp`cq2?{l;DW`VDS;uvs#tG)9pQ zwjyMvfoLpIu>@H_c9pUb5@}|WtK5fe_N*A`t2L=A+M+Jhmcnf4GS8sTbPN>&mZ@cT z6QW&XhL^N-q!Ckt8`@&lvb8?7E#IIjk=Gt1wX#i!dw5JW=KN&|aJW39AVY46}$k#1fxiIW}VS1r5T5tEo%&0VKo`f68+ ziq@3Z2*xY|dRJu*!yCh>#VMuH2=3BCpN^dbIg8X;xEHj1 zXj<)g%|&1szqD1zaKCB6a2^+|B|bEwL3QGkW*GuARcec6VN+`sN13~AYc1JoVehWg zrd>WV3Ar@kdosDch&8hCMu=PWDulj`2y$*d4S_H7E6f!BU@dHMW9DqK*3-+x?xhc+ zXH5rt%Lq|&aS+Ol>t6Y$0tWMJINZ@depr(<6mg=nt?fE3S}^q8^mH%GOk*EprawmI zQWNWJ(1IGt72zd#v)OErsruQjJtcdu!B$z*8qgZH(yBx2PF(Lg-SI3qxg9O%a-&<| zbmcTlT};=RK9u57jkZ=h?9pn2)O_3iILM3C?ZD7C;NdPrFMd(bhU1#dRJFL0*;`C? zw;O_nIzx_;Id8*MIZ*}2azc9{2%_@)&;GWx!kG!xg2!Cu3~f1fUykmb2Rz^y6>zv~ zjq!A9oZ2$9HX-E{^0AX$Ln8+aeP@ks(c=7<_^kfLuQ^TC`@$Tt1HJn|d%^0Ovygjw zbvDgEN5U~jB<&Y=udt22#edr<;D2?zf9;C*yX#% z#!Xvsfmmf#NBM0a2Y$#0-Hs@k6^eBh;{NFw`w5tmjT`(;p9%t4lU*16O;Fj;0v-63 zh2dYSkr0qw11^czQGs6iHPbc0AhN}T{>jMZSyRKU8?OZ!3_?I7T$chSg!`d`WBp&~ z%@i%518?b9w7~(_r3qIlj~Shw_;nx}reRmy4G5-_2r?StS(N;711;EDFvQ&y_SO{$Z@GAp8vNLQBa-AEsiizU zB*5_DH>Tw)4kdAsAwYWmoLJ`NwvnY9nk8EPrAqdPTbj;b$`4y6&Q=oT%3P#z1teJN zC1fHRUxFlHR%T%8M`3zSW||EJC1zdD;$5O%WRB*DO{P;?CTi;A&>W^KZRXf?CS3{| zV`5;TJtk@1CT5wYU#6yIMiOg2l52VmY{p_&%FtJ8AZ{jSa_OdX@n&WECTa#}*9>Pr z7AGxU8*(bAc8V2qj-Ye)=5PK^c*InRowPCnCk?N2(J;6sUn7D1s)af-We7HmHL>D1=6+gia`hR;YzuD28UJ zhHfZ_cBqGbD2V=ssECdziI%8|o+yf@sEV#=hN5Q}eP$Vj<{1JgjjoY^!V!V8sE+O^ zkM^jK{wR<>6AVT2o30IUMZGJWt>8#p@gZO+Ub~j-^Ll|QKG4u{%HqM zsVG?~oT4Rk;wPPU>76dBm~N$>dfjz~9j5>)rEZX*rW2tSDwoPBV3udm)G4EeYM#RA zdP?ebR4S?x(53ceb82c&9_pMvC8&n#qK>Md#VAJBrk|!NuSUXV9QuRd$+{OX$qYoc=MUwW$0%qp^msj`+{q=wk8LaVq=j{()K&s40%?nJ>ts*K8{ z$G&XLfUL-F>ep;(wYF=@dg;n)EPK)`%>Hc5;;ZWc>&!AE$3T)1*EG(uc%Mu!t z0pPOKLeYriV((!y;;$}QA7>)jr%sN}8QLM-2ArNkmFMYt`~Vrtwz zZLUTw;%08ADDL7KZR4uuze4UrNbcJ)0uCAwWZs*3J+On{xn z|X8cj&ALm?%-OkabYg+E^m_f?(f!I@cymnN(AZJu3{oDZ7MJG zZm)+p@AHCM^rr3S3gXtft@V-%>h|o|axeQHiT8f5d4(^!j&Jv%Y|5T5kEE}uHcb2W zuaUej{En9V?(OtOMD-f)?P71(BCP8AuLENU00;0}4RA=BEYH}l#p3VM=r7&=Ht+*~ zaCtAa4irl z0$(o+Gw}MtFcN#m2M#R_rxZQpLvUP)O5_7FL|-}hMnpiu73)SmPy?#fuv}uT-->Vf zdTB45F&d|FF9@*;Cvfu2<^rE--6k;|zr_;Iu(<}tZcs6noCHK@!fIggQw6d^_%Rrl zq!_E~2|q-bs<9)pacsV%SE{cI*RdsI#~r(A9s@==bi|ba$7v{pXOM(MjPgtH)e~3o zAs5IEt57TV-6A_gBRg^$L$cGpajCX2|6VdLyG17J>n5kz6K?|)hjRXnbTSr;!fLPt zA*<3d^FuRpu@|qhUzBh{T5t&gu3gY_Eq|#7TW8_UXfKa*S^RR9HgRBRgg>A{G{*=i zC&U!zgEZv9N(eFp#PdAYGit1aDpRv~TI=JkE$x0OH>0sFS1vA3^8S)DL!*T`4=OtU z#S}}!6i>5^AhSZKgh$-7KBojZZ1fb{GXxm2KZkLwymI_tbID+EL7(wKA8$hQ=|VR& zO^?MxV`@bE1!?ecNbo}!9)vodh9=lXXcTfW&l*uHUTV0*M!3UfOvDG!gHKCDNK-^r zKg2ti^nIRm4h!!Tht!D??!pEXt7G^>VeV03bDME6Rj{8 z1VXsAF(ZUJn*%=-17|eCYD_g~L$PR+_Cc67ORyDOS3_>hKqF|wXUlb56E zNF%lYf=||Zbz_5dL5ubE#&lWh?qxUkKV)`J&qPnN)o%22YQJ`?J#k=b1a?Q5c5}vb z(*#EA_HQFZZ%gwR12-N4bjhML@38b^>uhApW-c3XB|A5MLj`mPGe&fBV8b;^n8Ya? zHENIafD1Tkhc`w{v32kBZj*OJkVasux8q`_dy_9?{_n73A2(#TadMM&IJ<0qU-o`G z>`d%57HdR-1NBim#7_5fP-FFKsPaxz!^815Ijp#Ym-j)OcS2+}g;)5EbhY%ht#NZR za!Yo7%drQKIEk}q8?H5CsCXBmxPbe$cRzTHqq3H7L_3hDv zjJG(UH@J6w!!l2JqmMZ}m$_i``j1n(rGqa1n-e)18#$_UdYvCp#+GRuGx>dwx@F67 zsz7wAQ-oU!0wQF)wj%-~JaK@txS=0}f*W|aL%_IaG&r=nZqquMOM0)n`>*4Auv@d| zW_m)*GKb4|8!!8yHLHk2dqYe6sY`ib0C+@r_I0znf435MD|{ED+C)#pc$>MeKl)!k ze6X*%g%kVymhrL2_r+o?se*c_?=rwgd#UFuFq^nVRQJUnwt-_jNE~>~Nk9&R9hr%@o0%w>(x;y?ldP6vl!+VeObI>Q>(6_g}BLu!9d9uIg(vy4( zKmC(ijHyd~VOY7&cegsT^GH;~Z72RRa|GijMAr8PMMO2*n|H;xyGUEUuB$n{2ck-g z41DK%$SeEE%e1KiKFSNe%Aa$!M+B8mgy9FZWq3K)UwI$YK5N{5GW~*Wu*61J#KiBo zRcF3N$oss%a_E2Rn~%=u>wVIje&3^h$*Vr8vwr4KJIgc1s~>*3BL-lnH(@aN+|xZ* z4|kDQMBdY~So1rxnkjQze;r4?>u>*JbU*CNI%AN(WQ2eD<1j!#5IB%vL4yYoCRBLk zib97EAx4xqkzz%Q7cnAanEsJtM~@#thJ3g&Vgi#VP4-f`l4UQHC*i;mFf%~S04EpZ zTtLu5PYV}-0^Kl_=ui$vktY4Olxb6^PoYMYI+bcwt5>mR)w-2ySFc~eh7~)OY+18s z(WX_q*6cu?3r^Y$FjGLxqarJY%IB|7M7@0R9+YGcaA1Km$mK(3m~msrk0D1UNK&#y z%9Sx^*6i`}X3w8NL+GsV<;j+(ODBj)S1wMSJbeZgT9jx~+Z@>D*1el|Z{NRx2Nyn^ zcyZuvb;h+x*DeRpfBQm&9ywe-X^r(>551jx_wJ*)gZDn3d`R)-(WiHK-eBqkr(338 zP1C09oUnV!zCgS7{%xej0Sr*U0SPS7zylFX@GRtVQm!WE;JE9v>7?5$y2lVx%&@@< zQ_sT>L0qVz^4JT}L=Q_mQAN;F9LPQRSdvdB`f9Ror-6L>NjCnB^6w}Gfecc}A&D%~ z$Rmqm5H6GCf>1)wD10c&6{)P!N)ksTuf;35tZd6J!89++hhBtHB^g<(&!o5T(=jL> zH}LUCBXOf%7> z@uoFj!!foUd6W~kJxMLq)KgJSRY)cObkaFWVU1PR5G9qY)>&~K=+;~z{qj;6GZmmU zPVe(HKT!Gp6IIn^nQhkDXQ9Q4RVE*t=>S1_%~soO8{73UZ@KN2(QtG1H8nHOEG?!3 z(%duwHjO=Ywq%u!*4}&Z%~xL_r%hlvYq2F);DHHF2;6SREtuDX6+Y42($IBDT{zgK z(Z)92+%MF6_wCr@k3kMOtbYF$;MxdZZCK@%7fyIPhFM+_=9tra_@#(ttXS9@iM>&v z95aSf)KNt)+UTQ^)|cdJO%9mmr=bROX1u13TD_{Re%a-NeuXdRb}x=M=#Aw}+U&E@ zPW#TK0c{%Ptl^FuM65xgTki0-zS~5bQNnp*oz;A|)1PxhmbRhQPF(TD8Bem$|XTpLo?spF}_Vh_iKxL#@O(p5N}-d)md--E4JyHJY~;muU$;^I=3CN z+;zXbq;p088|>1>KE1!PT~A*5<&%dU;J15^UV6*&{*3qOsjeP->$P_gcua*SUGQQF z|8(BNIc8q{_1Qn#dABLwUViMazo`ECJGvi#>Mi{q*zkAeE_jtsUK*np^4ga`1uigJ z?~~pBAlN(oQDlM@VplhfBVBiJ_0iYSLM+ju#2~n6rJUP&58FZoCD#*VV zHfn=2%wGQ>7QC0NYk1@HnFtH_CbIcRg+(;t5&8AF21PD*EwteiV-~}RFr)-kwEp51 zv6w|IZjp;!^x_x67)CLUk&IL`5!=k-=dh^q?3?mPrvJR6OG)F_}qCZjzIo#9|ux7)nu& zl9Z)1as^KglbFRc<}tkp zN>nbBnayvsj zI&PGX9`)%CDb_=g7H^;?P3cjQn!uH|l&P^Yr-*18RjE$3qB^zeRWr)dIsTNZstIaH z0~$n<9xsteHS1ZIx74Pt^-)hX7)+-cSGlgUs#vw_U7x8{Id=7@ApNI(MtVN7ZWFDA zHEiS5%2vgO$*mfJ>s%ol*-q9Kua&jzDD@ggzWUU!fg36|^)p1m9+tGFO}z3rNy=W9wzb{qAE&w5kAC&9#0u;z2YVaS4wtwfL#=B5k?XLA+Ul{fb?$Sw zI9uCJm%3}rEF5*aTfhR1^mOS?ImjmQu&lH)=MLu#b zlU$G`H<`^deR7oH9M37QvC1gXFP1T!G5-=2%zgH=BSHS`pe8~RBwOf6nGqf2GfOhf zlUZ<^A>Gb5$C=X2obwIp3=`g7n0(&VvxaT+XHk!OH)5`c9bAD3jwCwK6Zrr=^3jZg zgrhL8&d05BO^pfY1=qd4^D|z3v*8do{Nc4CaS=W$iB9yPZL^@v`U=L*T5a_%^Mo;u;F7#}! z^av0m5F_S{{(N(mIMK@jW>`TWiK z+DQ4z4vuK;`Rd5ts-YZE(2e{p2Di@yxi8(oFSo>xVgQeL2x#zVDgD^52-na3MlAm1 zFY+{wBJ9u1@Q)s(VK7Xu|Nc(^P46HAumH2rA``fY=@A~kl1VteqRxkzgp%`+o-wM$XkuR0_j-&j}2gwh^ zgs`N#%m^tF;*gN>oM;K@&k2S8EFa7P$nwDyaLpTVjT96u3a>*iWR3r7O$q^U0AH~S zZ;l}1&Dz?57z&~h%;DDfLDs6H*E}x_4I|kEV$H~Ku6pnHxF{L7hy%~?4Le~F#VGjX zFz%4=4%rABQ!wxPa2}{Z5xlVuZ{P$~;Sl`|`JxZ|>S+;ssuAJu5fiSzKuswsu^tWY z5@SaRKf(f7A@bIM6NBv5OfeKgF(8M`e{Jk1>q#7~_fpMZwyx0S>cBCTY?pL4n(z zZV;yq_ofl+s!^1*@dW-|@CKqU5!Z;;RADA>?Ha_v!E7wR9jxQ?T zh~V7u2MZ})A~Co^%^uN`)bNqwGSMUEFV!pnAVJX^;6W5c(Hp!06b}*=1;QgU&kAA9 z*Y=O|Br+jv&DVO(*r<>IGh{Koa3DhOF;|l38W1KW3j)nyAB3(PuB`&G2s1S^8#q$~ zs|Xaft=m9>G{cA*hf*rTv5oXi8nW`=l=22>%^dh4?KpD=--r&QPY>CMDg!|)$MN5Q z(JQ}_9k(hh;qiyeZ_fZMEv0kE*3xA3u_N9R5#mxV?Ghe#@hL6aM8+?)XBFDrIgU1|uQKK>;B^GAGj|TaqO$GqR>GA9k-a^8qNYXg~|J z1oRC-z3uu+KodAKA8N9TShF>=@ip1V-#$_sT+Rlgl0%U%Hmxz;gmaC4vpBb}?!*r7 zieccCbFY|Fe9BKA3GXbYGe>!>I^nM^Ga@^;lRHC^6mCsC^>RG>eQPi@m$neR1? z@(v625K)v5cd+joRV-^X!)}xwDK%XK%u;>SA}($d>+cEoG9s?9RY8tPV-X^qR9~kQ zS5x%>7lAW}O-psPZvHbcUh-FEYA1iMSg(j-g|%6oaRWP$4Sf&zo)uc}NLt~D6BHFT zKlWOWGDEvg-;6;85pgyXF-60b5y!PT+oUWR4oB6sW{Hbk3C$x=tqJ2*UQdx;9daQ4 z{1RUuGG9s0*yyt$?sL`_l3)u~bGlSvrz#rHkYX2<4fCODIq+&rAXq1s_bxWNGFD?> zkWS&qPz6yPv$ZzowChT69A>av6ERTNG5qRm{2nzP&2OLa&1ZiW zBI>m~4JC0SQdI|nRby2#Pi^J44k4i&Le`BK^==(8Z=KUd`L^)> zwt3GgaK(u`4EJykqEuhCNo}na-}B@S5OV+ZXbI3FF;XK3u~n;K8+zd!tb_hk3Dg&c zVRH?(GCxd?Y7GBwztal)6VrjoVSF{3VO?9dPP+ste0^sa&ZH**HX`W zR~1$x_W*Sf*V^F^2;vv4jUQA_O26UOP!)bHqH}$9e%nbBG??2SHfyhliEqt`u?S+X zNZay(iV3)YyDE4<6X0awwmNvmJ{W``b<6n7 zg!TBKP?$Va*vO1{dXQL&2|1a@mWvUYjf&TUj~9gR`22>3X!dxLz5c0>$K#I!S&$Dl zdkVRewJ3HIIqMdgjvLvI^;U$Jmw739m2JtAy#tdoIeG@!lW94=4mp&$c$6!wjtMD* zWfuL2kd=iQiCj6BjakVyc~_ITmID-&ahcL|8NYb>l}`DWBYBvyd6A0wn7O%E<(HWY z*_odi&Z0THraADQa~{z(o7p*qwz->)d6vOBoNsxYp|zZK>zsj5@FG=G+xef@=bhm> zljV7yl~|nZ`Ni;gv-Ei^gRq~28K5OPtsuZpCeAwBb)Yx5pbh$S5jvqGY@zw8p?w*m z`*xyHx_K%ZauzQiGg_kymZLjbVLuwA=}V-$iliSII-@hC{(YKp1RAC{I+?{}rVqNF zZMqt9nyYlWnoU}je>$oaC#Z!writ2Mje34-I;p8^sr#ywdwHkTnS`aftfzXVm#C%L zGH0tAeq}nVEpw~6+P1u!v%s2~lXq_=(Vxw_uZxDN+qysB8m^B~uIHMz>e{24Ig@ZQUhDCulgfAm#}@#un*g^5?i~-RjfyttRwrhLuM`E&$2IjB?p_c zUC*;W8?Qn;zwR307(1IB`=n93xAR4{dz7tPdrMy%wwX<~XIsKzRI_HZx3bLq#(GYC zd%AynvIWgLS$nt_u(*vI(vUm3ud23lMl7FOmZDq!lBqkr&C9wcZna-pyK@eS!8@19 zpu3M7sb#FWIW4!Jnr7Aezn2BLvm3sTO}^)wZ2ic-BW=pZv}tS<3hP(F^{h&;2|MH+;}Ru+RyDS~i20uoIA6N;YXA)z}wQYCq1X-!P&m;R=k z-s$HG>PK4Y0|>8=z25UY>-qjFIDYXw{@H^bBX+hUhMwd-f!*=}9Ll~Ej@}_Mq}O&> zB+}kPJQCP)xK<%D-gKCU6N2p#!g>wj@*{%u1ws-gv>I@+FU=E%6yAP%{q3L0jKMCA z*@#y8fq{|I9&A?;4Z0F0v>#}piV>4*tw#zYf!Arunj@UA{RqVm(@3I_w`cJo5+ zA0^e79|lut0m7a%2m}in43)2$!G)px^;rlJ!UuW-32w^AFW4`8`H&TC_%Nc#kt9o+ zJc%-8$}3k?x_r5i<&Bv%YudbtGpEj-JbU{52{fqCnv?AD)21z6K4vsQEj@&g>C6%1 zsO9NNhD?dAT)TSx3O20Rv1H4d727G_zHZ+*7VGLXUADQ|f++%9$=<%X&9FJ-YPi)T>*+jy=2f?b8XS z##}mpXwU~d+lD#P0wP!J5ut}5sgr#9eZhS)mk-o@{qrl8oIwsX6BMLLJ{6txi$ew_ z7!m{*DfC{143-p*g785|5JDJAGR%MkNn($HB7t}yf)+|dkx3PXG?9fZvY29oGR{aN zdMwq5V?ibKYUCz4nKk1K$SE!g=5uBoG9s2R%cy_WtLiQDcE0I zby-*mpmC|q>@fbX{DB4ifN{rZpta8-k}CwY2$%r9tSx>pdNd!xcAZy^UW7e zJoAAA&aAI?(gR5Vib&9|9{xwpi2$DX;HfAL+h9Z!VF(e4B!$BdAR`Kt60!$HOVY9h z75h;~A7N{3xZ>K_(zp@sC}g_ouFEcuoaAFnP46;QRJ>9ec>|GBVWriU{{9OvmT9@k zl~ZqR6%LtM=7nciU6!LTSB&*j4xNjQWAViqgGHHTetw)8prMUc8lk8e+FGKEGU_O9 zoxTin%rehRbIms2j5BqgE)Xhdqm~E9d8ek@-b*383JN*-+!Jd)@swji+9V*7h1~gWQ@M(bgh`0X~Lef?~`Ly!~LE)$mzclZ|Zy??0$NL7xBnQRx~YX%m5r5Dd4Y)HNW^31WNle$O0!){vrr& zkXL^zp}72J!jlB9a4c-03w1)3DA6Q_dC=FBtnw~ofWloC8Qd%_k z6~R=45uz*N#s0!NB61}!1Z$n1d;+`JeP(2XvR$EacPN$h?svdTo*B=G#x$yNjcoK3 z1io{b@cayV(PM?G)}WGG$;W$o1jjw{Q4UYchZ9!gRU<<5tBLUA8ou~OJ`^O1Z5ZVm z+h|54Cs|4RZObUz=*2l6nXGN)BN+5xBz}m+Nl$_j0+(E5CLxlyh0H(`)EWthNVpIX zO@kcO(1=oaRjgK05<_wmNh~1{l?lv16m`4S+)@Zl8lf+#=DhK*TIj-VFlpbD&QP0#vS@s9E-KAW}K< zNMcy6Y)ozD0U^XKu~}rOxoj##5CXrT(#@&VEGtZ=Y1WurA)9P%E4vhTlf%s<6dZ9! zF>U|~d;!Ir>Fldt;iSGQE=Ck|feaG8k{9*$gBE1jC&PjmnSlN>27%XbVpv><#f184 zp(Jal7f%Mplu2}D6s;&nPm9{rs&=)k9gas6AjgmbO=zbw>8eng(p#Noos{Vu%w*rUug1bj@bm9}hmFf7P zOAttqgQ~Ca#yQ-fJ_zk}y_y6N0^zsRtuo75Wd)vqCwtAFONp+&Oa{Q5V*jBa#I20X)Y=#{`YG|(Yv=_H*v7{Z(e80HE#UUi1L zEcYxZS48}2Q26u28Iwd~=y}!YnsnKRCi(|Ek%C}>|hIf*u;)bkcA9e zA{Y4$w55^sk_?mTz3QbaomD(Qfxnn`LVO}wpq(KEiN5fo9oyK5n90msg#d^j#BF!G z!z*YuZ`s}M9uS9X__)?N|u#8lz(D6(!VRAjNNcS37E zy}{O^>8wL*yt^B-jEu!Dy3vo0bRQp^XG8A!^O#N28f`&Utbz$7UPa|vL9G+zh{q>l zMGpSRCj^DupS;WV=P?tjZue%ORqZ^Gwg;Td(am>!ovI;}u+66QNN+Q-dtX4$E#c2S zQQ#lm@I>Qx(G+idHVZrxNGEO{OtGPqsMO%ejePTG5%KCY%$1arg><2_n8A)XM44~w zu~zh0&NZ|1Kr!^^p|!EleMj`9>wfqCyzjjkm)$a2_0KIVGIOh_D2aD1x!-NNch$Z623NsLVqW&va^Tq|fBBrMRl;x8{fJ+D zxfsrP$Lqg^PSN2Fau`?mVtN0Ec_62GoQHs7@p2({a$vD?XYqigrx;2!4rIb=P9%C? z(PFdqda%cHv!`o7mne#YW54EmCy0V6sDjFKJHay04yXF zZrCD!W`=#srG3o=BK{CS1kngbXa=IRX0=p=M+gB)s9YlvOT7Sv>4!{dR$gwgXW+tq z&SXsVz$|&!En{eR^_NzPmxlfkw|{MTP1_VXR558Y!8jF{X?Qh8j=d0~hp;CW&aSgT_(B_|2xKw`1xdL4Kfu{Sb47lO4HbgwZ{xwnF& zNQ$Lsip&9gP4|M$#$T>7E9wI^v;uw62Q2JHT=;__@6$`(fKLlIXw~2g!;m3}5saEN zjEm$8yy%4qC7Es7GW6EC|#NQe|D>KtRP%XfxnQ38a+jGZ2E- z2nx17f*?v2(ToNWmGILJRB2sH32@&sH|PUZ{D4#9QfCwsb*d2lz1bC zBvDM(^$SXY5oIZt;aHDmrG|dVhWjX(gOgzDvz0gTO#w+0w1g1{iI55jnL{KBc)1UD zAu;Kr7M2NW1jAuaRhb~hfEyDIpd(PJCzOnpCzptcC)sngqmrP-lC}qmz9xz^X`8o+ zn?+}nAeEC*{>N}vH;bKsgYr=|eHjr;SVHH=aCJE?d^t8}Xq?gXmt~cYgK3@mw}+9b zo!iMn8;ElynTa2mk~HRtBN&Rmlbh+Op6l6KyQyqXr;~=plfgM3KpCBBB|;5neH5aF zVThLZDV_IdXw`Y01uAjb$(;$RpjqObBnh4gz?vZVn!6TJE(w$DiJ=*)p=sovI0>J= z*>F1$AHi7((g&bvwVw@FUDN}U4AUj%BPH40z|x}Z6#qXwm#9T=hGxstrr zYqW8p8)~FSiljBup~6=lFo=db5CSyF36%f|xdNm31z!x8r6#eZBhjT-8lVqHqc%#W z*@UD1JBp?{+Mqe{pb#pau1TJ;`H3V*q$Zf8cZ#QZS}9AqiXaN6e+sC9DyVxiozyg@ zWs0aRbf#&_sNA`xIMJp*3a3F@p|e?nwW+6>s;Qd_9emoGg9@slDypLjI5MheftjeO z+E$C&sI97yk9rf4`lg;Wp&~e>Lx-N6s;j%otFG08s`#m-Dy+jwtba6Q3a?n~6 z(z=P0TCJ5zr?}cO+lsIGdZ*nweDNu+{|c}Ht2gADLgtFD2Rjt%%B~CRSMEv^@QVJD zuKAj_daEy4r22}n8H=0z+NAy}upbMuA$wM)YJUi8vVx*0p zwO8AFJKM8C%e7q#vIJ{F25YoqtB1_0v}b!xOzX5M3ANUGd!=PsSSz=4tDC=ilT6C9 z9_zJx%eSNowk0ICWGlExi?)S(C2ISik{Yv=+LCX3v2+W$k-KABtG9h?xt9y3fBQFq zE4X7zxP}Y5HrJ!Cr?|QHSrqHIRV%rx%eovzxqgbdu`9dxskwZ^xt&|IpZ*)VyXzH* z3!bH$8H_8NmTIr}+PcS!ychMlv&+2A+n2RVsHlp&)0=s`YrX#ByCn&{CWE@fi+eVk zyx}Xp#k0K5Yrf|@qeBar)XTn_X13Q0zpeK=zdNg@+qU#NwQxJW`^&$=Q@-d6zyTb# z>Kmi&Yrth2zX@Cx*}Izc8@%({xZX>(;M>0yY{8oHzXGhm8yqgsJFwDwz|^a|3S77h z?4u6My)#>}`g_4G?829l!5l2ZGyEPN3^unL!m2vLBz(3eOu8t1x+StogG5*w#(JGB#RyphbxkUYsh zQ^}Yt%QCFV9n8s{e6pVm%FQau2}R0Jd&=~Bo~zu-#Vp3JEL*WW%gY?VwQMYcjLQY8 z%e&mFy_`kA%(lTC!Ncq*#_Y{ujLhVr%*;&A&g;yl0?pBEozqOsjB3rWgUzPA$X)Ek zx%$ob?84!^#O2J-vU|=slFsTZnC#rnX!_0|6VHn~&lRiw%H5354{gEv+^?40&lSzJ z|BNF6EztT%&;_lgBgv+TYip&f&=5Sl+}tP-t;xn*?$jsVw@9odSYWOi-YD1p~ALeqQQcsK3W+o{uj z!qX32*z{byDXrM4jn+x*q5F&@GB_iTE!ngE){Fj7*`dmump!bReb;);*=^j{pS`l7 z-6x|>dt6M`L9N=$ow1C4)G%RuRfirH0NJ!{-HTun6M;bPpqInwoFGTFG)-Aqn`i4}-WBn&97+MHZEyV2hfAXpbw%?YieTL%UJ7MU5{lGr_`?rl z_;zI#-V2eU4#E-N=niW0qUgPb>doG6RTTcH6#KGH;k8s;C-l9>+5#R0N&`DH=7a~x|cmIjw<$BeOzT<2~Bzi>^ zR5Fl|b9sts-@$#hm7tj=W)BtvCR|QWX5xnqGY@1E>Y>9XA-NTB;@}x$Ckrl;qnpJQ zp3P$|!3~YtYtHMt%G#}c00!^|YAqvg{t{>q+2)`R>T?gx{zpqw4scxxJiww~sYrO1 zUoXyg%#xp9Md*vZxs6`1>;35b2ru%o6gN=cj&mdf$P@RCrV)sGp_e9jVGpvt6{1Ia zNp$KEGv!ZIF{zU=B`4vTMZX3x{;l$A=09DtY2ND(pQpdhq{2?@#g1ez@d%N<>~6;F zk&WF{_~&oAoY2Xf%K0{P3GRTYusHUhL+pM7mcB!89Dzb~YV&~ajL7pS zSMRMpYWzMrLr?Fg^Xf%J@UuSQ4UF*dN~=C?*l6z15O4K(D)B!<@r?}=#-0*#P73(L z@#|0A&sEo=YyGLL*DD-mM9`YMrlY2Rt_5YF@TT*fIk86J1Rs3zx4TT^bAOvI#2XWv@tKIdPP)oqTBQ*{PYnU^|+qO8GiMr z&z@N?TU-C!?_mLU#2$G5loFBs>`YVp=J4$CAnj;xjS9jo7m*Pab|9NDCs zkT=i6ig*`|_(W4~Pxv$z>(owwD1i}3b8T{g0S*xMswpZ_(BQ!mXU^PU*wEp_1Q8`p zq*#&S8#o3IY!uKjz(zYC@7`W=dGC#?OG++;5A>v|ok7lD9|)WBHG|OjvDpbFCE4@$ zC+%ixnM*d#hpc2`e(gMKwinv0WPX6wZZ>T;oIi8?u5Bxq@AB)?hlLL(UflR`#)QYOUp9IB%_SYw89B4&e+h} zOik2ev#rjv!r?P5$!e=CFxN^7B_B0e6VysZ8+G(iNF!D2IZ36XE<8*#)pS!%JGE}S z@*XJSf2hOOWK7Y_f?bpAz$%u%BLj z>CHm?FeIqM0ZY)Zgbz&waGzj>&1aum^+T~c7Q?+LBe1;UDx{HWv=PS~b%d$MnV6J! zUV7`b_g;MS)puW~oQ#O8C^wq2tVgkQ1+L^usmmM+%^_!4e9ReV*u3_ls}wX9Q!6po z{@gS)AAX7vZO}r`g7YknGfUa5lg$d{Pqa4qle9$>`wfE4D64d5o_qEgQc8bD?ov;S zHu`9!!vpo95ypwnx^Sq;gA+s#(ZrrmuXA-)uDka7z6J$6C|864RPer01Tqn!PV!;4 zpb3j8&s||4+5DStdz-aONmOF6^Pr$`;V+;UYk<>+rU3cGwwk3e+uAFc>Ut#K&GSqSW#0HtLrZ!H8| zh6@+sU?hNZ%_v46>Qat- zc*z{`fJYDC5s!G_1s)b7g(7ID7CF@>cV<~cZ$cxy;oa;s$U}_ASVp|$LEvT1iy6$e zh!*IXg*MzHV;Rlp9O#@eE#4Df8{PQE?2M`*OMA$8PG!f2s4o!Mkzf7%_{W1x=xzTy zn*nuYpSam)f&42ZLKYdfw#kiw*6QCurj?(;ZHIytB-aHqm;f4a@NxbgbQcIImqJvg zQkAP@Wh?cyLMVyOg;aW!9caj$GAN8L;4sHM;!zm7#N!?1C`>7MaKxD9qfkriQ=R<8 z#XUjuc2%q$1fDs(<%!WAi()1e1EofAhEtr|8|M|^cusVlb3(>&2-Vmrs;A+RA$sIv zeE@k+KQ?HP2uY+tBAFimmMww38esm$cEA!~XrOy*U?u(Owg{$ZlPj{|0n8;MP;L+c zHnITZN@+@0hE${@C22`b`V&}oMV4WCA*8ktogU~Cm@}p6BDAy?zKLFBCR38+ zT~ji^V@=5#!>61Ar*|#`88m}O51oz1F{{zyoRsHOab{JkKmH?UIN6v^u!hxB<0;<_ zn)Wn@lyn%2~vkll% ztQtM_>6^$=jcxSe9Ef77ZhYa5a@6KfzV*g>it*HHl7=7KP?kTwkxi)rZ!@~#4R8BI z)U9S$yFg20R=+A%@P_w0RO5#>v|*3+F>M@Ky8+dhVKq~=%ARqhZ>+ABj%;PCTP0{4 zwz6T5#g;%$?Fd$H8tGRAZYx;p;i~}vY(SI0^Vgt8?(bUJV*XfR1=mxoh$nl72!{U1k z4R5%U7VR))KfKWnV)mmTTydv8{b^8pw#6$Q7!0#&0UOR3m^J1yq^M^cDYshIvmQ=Y z!TDV==UUg|>tmdK{cB(YGLw*w^tfI`X$)dCl$ai+{-#H)*-%GY+S8^s=SE%HQfC*{ zGF@#cSWW9jg^@T(1$Vj4tvxS$)ttL#ce}sW>tM%Q-t*?qu(MNaV<#@zlg(&lnSEK7 zY|eB!fk$YoaY=V3ZEs6w`u_%EJ72yECnMJam6^k? zdeWV)-HxB}<07Ye)gJ=ylV@G)^iBD7RxXj2>-&?-=BP($&Lf?tUF~bnInQ5g>ZiwD z?sKR6S)y*nsasv|BFFmH{r>m)b=^8&Z_yk6TwdvZU%Kofe)hoG{&>ho-qUW+cHJ$1 zdCb%L?q$sT-aXImz5`zLqxX;Ct3&w18D8wl*68A$-FSFOUiP!6y-6wG(#+>x_q+Fa zx^KPi&j+9HBqx3Gjn7z#em(4-WWB##AMmr&r1sONe)UawdxrB~``hQfq&82+&I@1s z;0^up%};vMLxk|lNA}oTpK0jBzUJ1afBo&BFYNog`}^mA|BLf|?g_u~8$fg_zw_ z0V!NP8GOHHi@yovv@Xm;J>0=B978|+!;LG$>p8=Hqru3LoY=cWS)9e$ z%S2ARMO-W=5(GX`?8Tx%#8M2#uVKVgoI>|=K3B{v$D>7NY(|~4#axU=X*5IM>pfq* zMl~cpVcbSxJ4KZ%Mmc=M=l-j~J6uL*JV$h_HfWqic5KH=@x zMy~@$M|?mlWV~{W#dI7LJO07hppd?DKM9GKb zDx_3Ovb+JNY)XrKN_>mTeVa;ut4ayHN`c%;x~xlUJIEjGIfeX6zGTR-^qGh(%QQSo zw8TfXEH<{}3b(v8{47puI!%uK&DO3oWg!F)-=EKF`Z%t%X2 zoTN&f#6q5&OxA48dFe{cjLlp8%bp3$&rHJ56is0yO${?m8Og~yBuBXnN!Kh+<0KN; zluhOQL)zpS+q_K^%uU@aMc#ZY-(1YINKKHu!Q<>s@2raCTu$*M!sgtW=Y-Ayl+Ni? z#Oj==>-0y<`pDtr&hM;G`&^3f98diO!SZ}Z&qU9O)W-Fk&i34-_e{L(49-`C%=>Im z2L+1!+)oMJzy9>T{{&E9RL=or!vdwC0|ic*TTn`TP!cWCoQTi~O;O&f&`3E?3=KXF z-OwiNP{aBDP}EdVWt>YB-O&d{Q5F4B%wtjRdQs36P#Hx_8Z8_feM{|}&n)CoC~Z(5 z4JRxxhG%F3Ak9*TQv_B(g5^QP*p-v9o6D1Rf9XpijBgesE;^l1n-bF+p}tL<1;z$=h=%?rK?0Z`zp zUr92(LZo+JyDkjcsrTJ;6BID%f~D zSZY+*?7H zFNWC%NxF{-!LMxTv$=T?f^wvJz#mHTFKr313rjwzq}gLk)ks`bo#k266-l3!C7{hd z={TJk0@vlB0A)DZqjiQUPy|%yhHemsXHeH?a0VuDEh>_fLs=9^5x1%$me$B3(7@Lv zGh2iGRJA>t@j$DlQM0&(TR~z7wql5=K_7bRTN&k*zRHVqP#a5&1*)Rk4%ZC%t+jtT&T*{$8*Ed>aUU}5mx zL12K4=~qUHwMW6Svj~N2_yZ_HUws@req6==oz}RlR#qKgD`v(5 z=GLIK64xbKuc!Im?$FrdBj370*T?yj3sfKt4(3v!u0dP;0kwW=b2Wbal(58~H+BLzVjTv6tDPh~d;5_E8J?7(0;oFA((B|x5;Tw>r8~9#t z<_<(Iz8nrLgaRl?&g4jDgmgwA1-WF0dZ2w`V$WSm{++`!g+I~_;8FhPJuKzb4MHwv zg&A6d*?<=|%qp7UrjV#y*ouI3g+;ZIChY!2jkC@b!D8u+n}5x5%mO0#0f+k7yF?mc9` zl}SZjWJ0qf_7x}!*@qo|-+}mHdQP;yxf(_`h)uqTe70Fg{9gtIXtUlzfj(s`L7kf- z4nAPz*^OmjDg{%ZVpy5ru3S7RD7~ z0=lGvfR;p~vtn_ydq&K#rY!%RVgP>9vmS0OOzSOP>(^~-w}$Ih_62T(;JSuoyv`V@ zom!poYcGU>L`^{xig8qVco*wod z;U;bl$3WvgVCi7%u;?ArWoRaij{OZNYnjB}lX#%! z=DB0@wyG+c9($ly_Wo0wKHK-!l=wcYpT3T(;b~Ek8mf^7_+qc6Txxt|=Yo3buo-au zm}JYX8^989!zy!M0i1}!$j`mWD85?&6RD=2nJTIE53B z;8Q?_qiyk5UWOOf>wfj?+BvGJee`V*4JgCq?H+9O!m8IO;Sfe%5$-ARE^;Gx?t#*THW4m<+q@P+m1By-v3t3QjCTu0}=fuwwp zq+W+={G~|>S3jGSLt>X=V^`B;&v@FyOVW}OwPucQZH@?d>pm|AR5*E6fNR=ahCLA8 zMdvY#OQMVW6YpjX@Scp6o{eqt@#N_yXr}CWw-P^f6nmfEeb1w#?haKq4;r@Ef4_3w z)bcHd>Uw?^tS&SYQK&*{_=l=`ua5WyEXKpDS@;}BQ1)kyPkYGY_{;qGW|s~=?{m3l z7d_IQ6F{gAS?7? za_jhoGrQQ<(C-_NVOO8;tBdt*q-|R7D+RX?PB?H|S8c%}theEMUr{VCFNm*ZIl~+K zV{AnnRm~7md*6>dwkI{WCnJ)d`?+sRSy5I zV$G^`E7z`Gzk&@bb}ZSlX3wHct9C8hwr=0TjVpI9-MV(~x+NMDXiot<59GWl)hOY@ zh7Ti7ta!1}2z-=5jx2eyvOSEAexOHf0^&{inqj6V4RIreB-;rp9Eu+x!;MCs{zKUF zXu{$0Axpfv_2JB$4?}{@ubAP?pf4j&u6#N3=FXo(kDmO>73tO$Q+KI-JNNG1zk?4i zemwc{noOf^DUjJpNZ;&{bSEs2c2N8Rxzq%oAA9d)$ea|QfCCa(pn(S-2+BUI6gZJb zAB{tjgc43u(EfTKy+_hM!B{k)gB=zWPK6tF)FDR`=F<)>2BtJ#O)tU-(@i=3)e}%b z!9-M1MRbRiu$eBAKL;OETG{lTSh!C6ao<#8*#$1@^{Z*Kujs506n6 zCLa-WS*DprNn+1&T<&(Jn{UDyr<{mUH|KNNm6xZUd-B<*pML_{(tijNTBxCiBATe8 zi!zFmO5(*BsZBWP#FI}z2}KlPJ^J`#kU|bgm6W5BTB@n1qME9ztFrnQl?hns*G^e( zX{U1)@S#eWk*T7`j^h){nQu00&A>T13xIygwsqYQ9;tddX}4XRZpF@ z*1$SDHOC=?9k$pYXN$7gXQQ3A%HXjqX}K@oDD$tJ+WaZbQU#s2-h1=ix8JS$TlAH) z2CU`4TO*#h;)^rRb;e#_F}CEBQ~qb!X=9$b=8LZVUE7hqZE4)<&djb-p4xr)->b9! z-n#3r!wy#90T@j<(v9PuyY9R5PFUATe_gro!xPWa<(ng)yz(Y>?%n4xhJG&0I3}PY z&F!KdXt5v?F^y{EjuHNo=*Bk+ zXo=csB2Au{t|*pniUVw6>Tt%zKLRq4f^?D>Z3jj&A~KPROqLldhQ>8Qa*b_-BPHP| z$CuDiCUyiM9tDU!K5FlUgB&F(OKHlp6cUH%TO=!6=}PG|l46gHBrSzF$x7n#h?i_h zCN=3Y(cRH{rt1_a3nOmuvua=pTpB8H~Wb^Z>|KKGWwQL6bGlKM-C`H9+PlDl7pBj}MKmF-ZwLNNO0u`qUhyGbNbjs_YDqSf{ zeHPI}Ry3wEo!~{EmC=pjG-Mt9C{IrY&>ILe0VECJ3W<46W2UpEN?j^bQ}xnS&NQl0 z&0S5Ib<><;^;$daDObJq)1VHulSMr#Qd8R0v!XSvN_uKMr|QWbLX)c2!y-1Z4IEmP1b0Jc!Zosz&EVsJXHC6gwqtnBENA_+ zS&@P>tOwmAVL@eB#iBN~s@)1(C+phR&b6|X?JRBY%GcWBc08YDn_p=JOiqs0obT$R zSyyY^<0iJXuw5>5;UrgO(KWZyUCC~zYh6Lz7PP$-tzbzz{#=xX3c2DPZ&Q`q-1DLr zma+xnWv}aAHfHy|*R8JedTTDgmb9EKEN#3_OWywic%9}=FM$h;oaZvKz4Be~4d~0@ z+B&#|_Jvz8yDMB5`ZvHD-Y_#63oFNd5vm3rF^M67;9y1f!Fr9biZjdNIZpVufz9J! zzgyPuayZ922IPQC?BfET*l{gh@Qa6R*CO*W#s#e~jlGNE;_f)gQifrVe{ALE2H93A zHZoR`%;lVVIiO1J3zI#$UmF(|%2Qr5n``Lde;HE5SDy1^vuvj=e|e)}&a*!E4A#H? zFTXW@GLGA9=tH-z%5+{dTW=_`{*V3N$_}&cSIJb3cLXd(O(vSx+NZ|*(9=Dd)dqz|f`^d&lcc0fSVPxMI z(_+PXoeB-X(=6oZ%4H^TSu3&6Z;l-Y;AByqitdG)J4`I^X$R zJnoz=aH#`|5cw&JE^<`l!2-NX6S9`Ybd&y5wwf+i_te|nSD9Oi=D|HPq3_M}uY{T!Dz|3|-*bSjRiy0S|YqqZ=X519KLUp?vV89mL=a1VZr{#rTHrg_!|4euJE+ z1D+lza>p|qS>tU9+Nh|uY` zv-*6r{yVRay>>t_k9SG_i(TwAbLU_Yp2J(o>3_rGEf8nSf zI`R)=#17+`${R%}Obq6knG6X$XoLBU-g+E@-;Lht@gC~I+@*;2p;MwVz__UvY?r zYrseTImZ_g#uXNe1Px0X4jws>gwb>CV<=#q!Lke=j3tHfp z{ay&Fpaz0RA$EuDxr057o=XTsKBOQ8_TCL>0`9@!)lFQokr{9upR;ux4({M6?qCo4 zAP`btbEF+AVBa}-!#S|S{yMPTIdp?N+=CLL0?9GPZNMRN5FQq4;p7!w7bb=o5=Q?O z2K`mxa~R_WuvpDCW=^fkv1 z030fC13cV=+#MY%oWni9!!HD!B3!^?&<1lj<1w<|77k-_7-MKO-E90_bTlJ5VBz|- z2^dO)-}PcNvQp-qi8gK{cMOXOvV`sBUO2MEIGW%eR$?X^8BhvD2r8vJF5)~$!%{va zHHd;!4rM+R!#?)@9wo8_S9S+LHjzMjVhti6cqt!3qNUC$T_ikEX#;hcpNtGA83l8inWK9b*>8Ymfv# z90%m3i9h_oUrGqFxCeZs2r(1}Vk+ij5+h+qCO=Rn1f&W4rJrgFM{6Pm7aqnM(xhSh zVQPjEPMV2M?&LjcWlKlF_}zl~f;WsIVN~daX6S~dW{B1wiIQL%=4Kok zo{x@bi9X|Fk|EX%DPc$`BKc;S0B3OiWOg3qcAB7l6hj2U9v_lN>UCCfI_FiM-k5HO zm`0}vT4^{4;!1?4S9+y>_~Sn==bv$+yy20>)f>j;TzmQ{uDvImsZzFa$q!DS(kaIn z1l%vQojUkuzy+wl4e0zqrbn)1NQMTApa@~^rD0l4nyjQz+{STqsQZ1WYuW>CrU__Z zD*goU-P0+fhhpJt3LfQs>W$h)sFr4`3f`)Q#&57GZ!lf2s!1{0Lodc*Z8WK;-edvF z(g9Mbo&cqG^yEr}0(`gw=z)SgiU*ix*0kP$nS!gCy2QAqX_fL`>Gh!>-UpmU2w)y1 zd}$)_Q5+}bDM3CPpPuEP@++tX>a`83n;5FuA*yodXTUY;qcUpu37o?u#)Eq1O7^9x z0wX=tpZ#I1{n-PjE+d6*tmA26sX{Z6UvSF|q28({|W5S=4zGQ*+ zrLP8H&6cG9RpZE>YTxxNsv;{HMd`^wYqXXJxVA*KYDailqG?D&yt;(9>J^r*{=}GC zZMdGR3fd#Ns%ZtXDSq65x_)OKt{?+8Al`xAInHZ9)+_bgtIb`ULH29idfLCn=VQUs znG7r<6s&T9!S%hJMpk4uxLr0ZVO~<|%p&MEjKpzFtj|{L%$h347KX>Bq-~09;EA86 zPRxuJgX86Br&4ShqAZbe#{LzkhiWQGU?H2vgW+{9ioE1(kZzMME2@&=7!@s-Olh<# zt=V$x((+ygO2Z-O$GXyKi;ZdXI;GcM?elJJbz12SeB;&bp?7-a4M4&Qimkkg3)U&y z9mVaSsb|jEZTcD--j>gNa)|}>?cXW~6Fg*H!UN(~q&m2rH*BQA5$MnU8b;(sZmT|M zPF>XSq zMs5HGEzT-Z?_S66Qt9@VtxE)AAb9E34)4@1XP6Fzdbs2DvIO)3ar9EBbnhWpDz~m7 zCb8BULvkvyce-h+vTgWoV!Y8@`OcbIQn3{ibBtvs;+3vrtAen06ItV zXEdojAKtOL-!G6bL$t#-RN>_%k_%f03{$C@+Vawp<0ubhn~vuWXVwUa0@|W2Kx;!F zRJ28F14e(Z?`^b2d-Qh9vUQGwJ-Vwu4)OBxGQHmEFGum*E>tno^nV?5h!LuE0G)LF z02l|{I&i}+gxoKfs?UaMtBSJ+3oCpO2U{b?W{$N{G{RVO?$64#SU)U1?5>jr?UNF% zCSw#Qcd~fQa@LZb>6z`iZmUnS^p`;|5sOD;Q!hV8;sk0hE<-{&Ky*a6ZCJjoOvLn_ z(rrzfws_q%wrNciJR~Y)gFE2jEx3a^%w;MpL2^uR-jSbZ%JG``T{ZZ^FrY3;%B~w? z=zDC#VJfISw8JpiXsFU3#+qL~R6~-^=rz=+g0=?XRl||uUIo_%<@q*s2e%5-=ySg{ zs`3MKJ2$QZ?RcNJc8ls>Lf&;}_d8EDZ|3f9{x&Ne7B-+{APXw!N2{Rnek1Za;x0q> z^g6G2O7;m>Z!UAIyRx7*z=nfk*Jqb!Xv>VA7UWEyc8I4|Y6q;=j6rMP0^u%d$f<%9 zEXNFJsDv<{;HB^sI`VJ}BmCJobprzCZZ=6&18Iunge+)kkcMfbh>=6UFNh{TG#+>l zIaGhcjng%3q{v*u^N&-vkgKrzm4<|%hG90HK7aXXD7iG^w_n#JUt=TW{I|56hnd$$ zXXiGC8;?Xw7iBj%cTn~$`=Ro>D~hy(EDT~xyX{LuFZzsa-Xn%NyJ$kI46^T=N)=0s> zWqK;;dMYS_5}2H)Kg=2?hsch4HWD_f3(u(|d$o`!|Cpy}E4mcx>oCiDwU<|<6HVUY zwBlI6tt)~m=(;K>f(P&bnf&@$YYnj7KnGMn!FRw0K;1ke4nZdd!?&=zTNS+1yV%V8#9NN4_wvjoI(kYwzx(^g zHx$4pbHeKmu#-HUKzwXjJO@?$%8QJ>KhLvwIKGBrql5g-GnBOfY^|Ss&-ai)tC!2q zPs6{Zw$EGr&!;?eNqo_#I@fd5(I0x!49nIS;A4Iu34Rujyy1Jk?jZi1Y`xBee4^*7R~;)-~RG9 zPVP6y?)$!HN58c|e%nZXNs;}HQTy?8{{kg{)iZzimr>Ry*!0s+$P7&7FPqPEg z>r9}EEW(Jr(cXhEzSR1gk;WQryb;G7b&T!50H0#WH{c>1lE@;BJQ7K@AT)Bq4xM}w z${P|Zfyyeayb{YSwcL`+F1`E`%rM0qlT0zsID;|~LnP5W&LB!}#n3Eh@5K#b9BIcq z_1u%sKK=aDwH_nl4M+liGcd_S6?0bk$`k*QS1qDo8|$otNHv z?Oo2;A(35{-+l>ecG`di9+==Qs|D}c%d%|~)dW=icFtBy8+YA`Exs7zjB#CHsX^aW zs8@OK9hu~kO$IC92>11u<(BmVxZs#&p1IS5|4LZl%(OifMTga^s>N_8epTb5jXoOb zq<3m}S9n7{8S1E|9yw(PS9TfemSLuu>#n_~7ENn$9#3b6dwzJ;h=n$dXrUaf{ zUmku7n}?qM`ni;TFX{;lw3R2Xg6shSd9(BS`pWFMDI}&m$}sCYAoq1BW)6xp%8^A(hy2xrf-ywD&;AeDVbER5}Jc+ zWnErrz1aQFakNC^?I5{JZ+;V;J?W*$*s=w-027^}xCJf>A-oxU{v#j!0K{-YA(}f4g;E{5P+f@ zinx*_;EB_Atl~ZK5jBOk@sQY7Y)k7;m8u5~TJUFZ5%FAcPyJM$l$W~op| zJ`yz%mF#50Inkyu(4ysZ#bz~nmP~Tgj-UtyE@<(JR*01Tr2goGR&Hw4mLdtLE)B~_ z`LPY#+IAQ#)k;r|Gg6aQWd^_Cs!<^@18>~+wpRUZC{*iI3FVVX%bY6Uz{(G8Xd@o^ z@M>M;%8Wyxbh|eg!8oXqhq3;%tX&F$D7Y$EDpkTB`$$JNthx`qR!Oe&&BlI%q1G;S z0;l)Q5?}Mt4^?Q1z=FN&KK7f9?Ct}u_X``sJSfJ+cFS9htkW$i+hGs0(Xw@W;#w?# zh|Om7EOqn*Cs@p4PXzO$rfug|XloDIVg;os)vcmX+SH5uqPeW4$8W*H+v0>H$Pmc! zHS9rLtsr@|5b&*YuL4!%NOiiC0>M1|!H2qxmmmIt5brpoVV7`}w=SFrGhoP?-V(?) zAL+1%drMG>{#FUT?gfQ`$3)n??sXpfum>}=1ZM@0!@Z;MYnKrFLkr7pb{ZyNLqA+; zOD8eJnu{ZeP0ZP{Xd)b+=tL(xQEF3j;>C6pg)LrT+SAgQ9@QvEl7UMOSvxsNMlLQn zXnmC_heg-I8R?Cce2qVh6xUaggpI8dZ0B0}I9SdylsJ(OvD&5DUIpv5Z@`Hz-(bt( z^$vR7oF!0PV-Vg;zhAV;!~ zq-&V=+A6;;vOS68?4#0y?I6Zg8e!FV5*zex9sNass#LrtmB>7gJyse~4!Qy&*tNfXu&atwen{i-LzR41 zkR5!hEZgT0IJ5DO32oy@d*~b*{x6#CGW|S++sx&yHn-0kbug(r?OMt@mC!DxtczXh z)nLTb!{2XJtX=Kyg)gDmF1CVOvws%`V1~81P==o7?gCH%;U@1eYw!4u6;5mo#6sf$ zkJL)760D+*8le$dE%8Q<_#7`BXzn7A52lQY@>q|nt|1n@!5oCjx55FZb_%6r$``zW zt8NUa_#qg6p&W>;1+U=+W3U6a!S-fq7=B?J>_MisA^D_i$apHAw!s(7fgjF+16z;@ zoe&Cr3IaBP2)CgZ&LJOQ?&gjV33E>QV9w^659p3X=%SBbwv76|Y#hD~6!@VSzRTLi ztIPzW&7uzcxFpZc?)CEiVIR=#zy1vU28{iz&PwL5{Nm5QwuHkb(05_2nGo}DtC^$MTqbz^{9dP3&fds5V6Yj_YFL3c3Z`opR0|DU!CodmlYuWsv zrhJVa_@Nzk5dxNtxM1q!UM|WYK(~Z($B5C#T#na{5i5`?shUa|t6~Oysv21@^E%KT zfUhc$Pb-$q$9OU4WX>v>ipnm+`HBPj)bK)(E-#9%E<%B;u<8at;oI;K>bwu^*l$Y~ z?CRF5!5-}Etc2^Rq!90o{ow1b-VMSQ(a&<~8p023+KzhO4x!?%{~l}M=&ln#5+uvz z6GyBqL=h24Q7ryUanv?J5>l}$THzBY(A5Z`6=sa&R%#Zx(WGio8)Zuc$FVAC%L^Z?3kG%cqo5=V*>9lal6`3mSP6t%IWqZ56f*2%?huEflIb(-}r4D;w>Tjv91uY&g|i@AaWcS zY`-2%FYAxOBoY5kBqJkjBR5QqLJ~7G(@#cn)7HWyQ8Fb}QW7LV1SGH#9Kiw$p%7Xj z3tn-jLXfw(lJdBc9GCGKYg5VMsTgdt*NTs&IM5hjZT2oAIGfF$inA$?lN{zMr@U|z zijwD8j{Y{65)4CW9f_kI(UL;cvijc8=+;vEO6m}{>JI60ANjFL?($0D%iX#pFcI?4 z;Ikmp(;oqh{^kv?5YxRRAu+EmOCs?iClS*4&#^3%;WQIL6BKheMmKcjvOtm3EDkh7 z(*ZeQG$o-b%D@p&)74aS4p3{SjL|n`^A^L9`OMKbt%57JDxSPCMQhEqfb%wmY&cEy zDtPNfe{-H-Dk_o7wwUiZhcY^u4;-_iNU7{Pha)?+lRK>ME}RrE)GQF}&@S-tJM*G0 z-Ap~JMA07cO6+s&w987~lRoRp{q|5l!*Bi^^JW}PK;e!u3v|*VOF`?@PWyv1Cr&N4 z{=nkSViQb}B`0ALAfYPIfJ1At5b_8_b*snFao0ewL~}GKld#r$)A6ig5o}MTkn`qZ z)CxJ37i)Anl}tHtEjDNLD}wYUv!V=x(H?;Eo|05JmXt}igDvZVJCAN2ybAl$Y|YFQ zJ-cK}-%L!w1Wf&sIg@HW@6zi4?7q@85e<_~5$FC4D*p!55(j8b0q{<{)m!N!PY)0+ zFzVvU0ulgK5(IS;O7kpI6xn8!M12xEZ*KOk(p76TC+#&Blk-ziH5w@uE3T49cQmGk za$u9vE5AZ4ztZ?d)fyA_=a7U}Yc)IMiu<-N9>1+uyX{wB<~)OSOV>0^2(wE51hT>Q z%l6tK8~n3O{Y%~cQtP0#N{+Q6?GG}oRWcEdglefH>GWHF7HD51T*+xI%qcBQ(L&XA zPcB}<`3aGr1rMA&k zbAH(Jqv3%*xYB`65fxYfJY`>#~Fs8k0)8 zlp+f)J`GXNaEksIk^JDV1SFvx+OuXKGe9Hr;4my(6%Ix`GH6p*b%$bTk3P<(x=V8BlS#ywpE91EXgu&@0VZT(yas`FXFI&?Se)5LEJpHfB_BQ{{C>T8Zrbf52yCw&hV>P zv4l(~*dO1mAv5>T3X2vFi-W24W=vOZ67mWeuaO)VBsRTe>2P1V>PE6NME)$b?nU_yOlaU050dEp!_>)6f zl*xi_#bW2y!fGQ{pY*nsPwACoxsGQ!acY@#Ll~Dite3kPg?|}IUKj9Wc$jNA296ml zBms$uQw6INESlLYv{IB+c`l$ingeN?sX17!d2FzG|1432DY=BbnV?M=oRb6+{&Xcb zp%OO1CDB=7iEyTd(DTv)e*F|;(~+Ky$DZ#Qi}G2Y{`rxgamJr3QJZ;|gt@h#S6X!s z8lt0Sh?jWvUfL|r*rTTkq(eIDMmk|iS|j^UpjDcshx%Jxnx>B$sh_GWRi>kF+J%GF!gs8^SA#AUr0&#g)G=9DV%zEy_Ejc%b=(yH5}b?{9J^cFwIiIxy~(~QT+{R$!)Kg$G`uVTyu+F2V?lhUMSOZl+*(bX zAl^H>Gm*Gk9LaO(#aTGUEu6-mT!t9CZ#X>1%X-IoT&jIMe}KG1gnWn?e1vnEu#=q3 z+i1!0yUB?b%GW$^Y@94`yvjA?L*oA2!xh73LpR7rSCrNw;3%N)>|=*%g~0M(q$ z4?Sw!d@SIc&MRcj8{Nt+l9oZp%lG`2`y7b^UDE}9!kJv+oE*_Z{azIPIj9`cE9KEo zJ#g$CbSJ&U^&G`79kY9OyEom|6KK#Mlq5x+*YU}wRh@KF9oSKw)jRl+p`y}bUAW!) zt#94galO;g{L>A+*Q%5C)X>S+O6H) z9R=G_#?-xC$LW2qi`|j&yvxbms*Bvgk38K2es|VA&EMVNuU*PTXWs2y&hee$zun<~ z+=Itm|CAl5nH^6AUgHNo+WrY0LJuC~7bV`mLfaqSnM|J8CH+P&$=zKWh+>LLE@orLOL$?C6Z=v`jx{rud$p6)NE8}1$$ z@;>iR7jgj?aKRRAp%!QX)X5(4uPot_XW`SnI@aFtAOGh&=!a;b76w1?b3qq& zp%;8X@ALldL%$oif%I+by0qbBvjH1cA01jB9nt~zV;}a_f%a?P_HQ5ebHDC)e@{aH z^MQfy{T}cIpYRP|{_GPU`LT2H-KX&*UpgS)`JaFCeW>y;-xe}|^E?0dMgQ(epBqg7 zx>A4jvBC9UU-n}^_tRhfZJ+nsUq^iZ^Mn8I1Ap)f|L_lF3;MqAcY*WyU;lRjAPhBu zKoCL)KNKPqT*$DY!-o(fN}NcsqQ#3CGiuz(v7^V29j{ygNs^(+8z@t%T*8LuHC!;^6K5ox3Ay7fCCF2Ot`S&!-x|rUd*_$ zE~s8g$6&C1#9*RW&D zp3RmP8{4*U-`<^1pKj*+`19-E&%eL_{{RLk;DC{B#+hfJiG~YlrlE$MMXTwf4?Yu8 zh>wN(=;978P(Z+iFSWE`!Gk20XyS<|rU=q;Dng{(buh*#<8;~0Xyc7I!c=2S-Sy}c zR8mo86;_-9V_sKaaU&L4+N{T(T5QE9Uwu^CMc|cKW~t?tTz2W@mtY2F;8qBRHkvJ^ zo#y`A79Onzk8E(l3D2CmaI?-Xa13ILD@(M9VkrCo;%7;c*dxuLhz`nPq6NK}GE zk1;Z38gQipmuoOgnh<<$9x#D0Pd?JX1WG>CaD2lEq6HT1@=xKOElK!{V zk=>A*UX$yg8l|eOwtDN(L>F!J(MTuF*qEJtX6AxuHkjHLu2e1TMr!;c;nrMtE#WlI zAmhYD(wf`tLf2-yZ$#XZDDAw3@*`F``Cwa6+}CV#j=A|dBrn_cJ`{@GYZva~ZTkK@ z@!~K#%nw=ddKYYC8aowr6v^wXSKOQv7CBo)B)0SF+#0oWg4!1iyv z;VVfNAX0U(Sg(^TFxtF>tg-Gm;|#oH)5DLU4W)h2FNCMq_Jj6AAW5|a{;3xL{Wpws z5u{MmFknOeW)b|U4FYd7oCF)vFGeZOa~O1v$54k7l+jLeAwx+xV8@9Mb}oaF+F(8sU<{)e$4JJ*L=P!Tv|jeK$35>ks3hSV-_6UPIY}dIOrXfy!T~OZ^p7GlAV>cG6sQMDYk&)+A4I~@NWV!Ek&1jE1ok(< z305#s7et{bgTje?KrAJtWSGNFc>_*x&|^1ziNr<;qf)Z6m7Lrx@-i#!o0iL+3K zL~xRojO4s9xyVO$vXh@gR48f5(VJYWbtv&z$X1C;4vz4cLF}lFKB^Lt&cvlI@fbBk zVM>;ivKX7&VNO$GOdZ`$Ce7SV5sfHKB~q`N3xJ{&wYg1hYSEiqET>ebO4X`bRWj#H z=Nj4R#^1y-o)@X3JKE6>EZkEa*w{up(n{87xUUWsiJ<-f(YDBSDa>8OC0vP_?2H2d@3_8R$pb$u8L=Raneq6&B-cT3-MX?Qg zICvWX+=PX<(Tlwiu29n;M>T@+i^ypfg7SMXyZ-Xm;BENA9Q-&(L_a&(iC7k(kX*r9&w3DX28-yfWj8e+W;fWS_>l1U$E`1lw%^(tPyu&vXBYRWMD_@KYIYMP=O-|Ap!V-0tOJ)11-q6W*pedTGH5-?3-lE<&V5# zmK?;Uajpv*I3ve8p`2~<+Fa|Wjfz>yFjWalZ~hPpg2_q}gS zO{EcWX-uzU8_<9T748}Gl84-V&Tt1@QLR^4_m7g7WgtQyI5BS#x9;VaZAbeNf*$gv2;Z z=jVvIYrs!w>DS4ZmP(D8_S}6j6{6 z3qrVq!ytsQpjZ$PghOZ#MJR;+NT__wr&lxfLq2FpJ$7x`Qhf_iew$ zcQ%!8pH{k$1hsIc7#?_=i$vhkil?fC9*81ZaTXrErbsR16q_ zhIojGh-eddaR!iiQzJ(lQAfBy43t=jmUs;AQw+60f-HA?&;|(h1AGJld)6n4S$Bn1 zr(kEpg|X&?OjdMK7kvw{e6qMnux5*0_z<=?iu9maTBu32wsl_EZQ2J)U)P4c6?gN; zek*ZXw}lcV z8MqFzV2Kn-3?YaN#Lx=vFb5^5d?533#3pmrM{U9wSUmSP4@Fvm^K+gUbg)=iHD+U4 zClM^kiWQM_l9g(KV~R&Nj9-|2)hK1!s1m~^Zm%>CnG=oV7?eRVl&Dlw*2sU&*p16b z4ekeA#S~o7m`nY)hlGcY2B(e%$X$V$O$zvqTPxt46%mTviv1R0kDiI8+zmt>@n z71)Sf)f;RwEbGt;6={jg;0(r)ksH~OhQw@YgOjRAgZWb^{(yvy06(}Ebu`#WDfns` z1~LlNV9558y8alG5@AsV(F;hJb2VoXmD!Tr@{0_?WIl-^+}0xA#*`RDX5jaJBn3h# zk%miYn?8Y?X4VqF&@yG$YVwDhF;p&@6OJfhgHkz-Y{*RJ2$p|HmVx$NXGw?+_m@lUZu;hT1cRhWI-M(Fj^{XV*X4(PHkOO0 zo$kn;@ED$M`lfIS1mroM=vk+BS~Tj(kow}DtZgTJ2!8qo_nCSQQ7?-$F75Iz z)5k6#vsjJgE`l&?Hdrpz;A~F^4&|a{Hkn{MST0Qmo4>(Hh-EImMuW)rs8(31j)kcZ zU~LKJsPjUaIZBLRxTGDW35~@vERkhHnlK9^c(|Gqy1FvP>5Y?9s_q~R@)uH93U^hUWhiQa(SobdakjOrxvI!#PSA#`mXRAuTZ+HM<|o8L1sc$?9{aH%Tc{Fruh{2VjFOW4`ma0sS_Ip&Yv-~83#QXmo!NSLVTn}U z%CKwdu#X3^5j&R^8?-|E9~bM0?5YmifHO+l4cowp6GXCHhqBs|nkh@0D@%+p3$p{8 zwY_DqGz(2Od!1>jv*60JhBmH0TaZJ$wrrajMa!Ovq6Skjw*jdOc54;8khi;l3#d1; zGdPSrnJ9rFxGLqf*b24-n6TK1fZw`+J&RsxtF~>sxt#v{7;l@g zgv%&U8@i-hx)ou#I?A{KySS=LOOE@MH5<9ys<4zxww8OgKAX9@(7C+ZyNL0*4QaZ< zJG{h;QCDlVtsAq+tGF_o5(gW*+bWi{+m2=1O_zIKx?7&UyS?1&7mG*(QV|ulKnt<} zy2X3G=$pQUd%P;Uygtgh?u$XM8*m6ayOT@3w=1r>o4MWFzy0fI)pI>GKntWXzU3Rd z>YKm{yuhh}y6YRiwh6xwyg2iVXZ0(+fL6O^*|1o|fDMSb+3UX|?7IMbc?M7ev_QV* z%fKw$!Y&*U4s0TbJHb*W!88mo6--?hjBsViRMjh9xQo3ZJi}JJs3@KUMOk0emUF^eXslQ^(zhxZA6x$725e%|G0gr~nC!E4++{TXl$i(}` z4>HAdJW6z2$vASyLzKsptHFF6u6}G@*}J=fT*~H3$Xg){dl0~A%*ZPY$*>&DTqnuM zLCKh$L6>~XGos14!^s&;y+2%NVJyl+Y|6%bo_de~Wk3sBQ9ve~#;+{P(mc&xcdNQQ zWx0IKFv80*<7S`i4(?8;0`{>|_l&p(+sajeZ9mCg2C z9o)<*-n_@*Y`xc8UZZ@@1bvX_Bm-G74DGzc^4!o4J=(kea4?0dNNT+t|m&oJ#A7wsb%y|7*!%pSbIX&cf$ zErHUb&b=@JiVV%~ywXUW)Eq&}#UT4v<__zfA7rk-~&VvZh<9yfUtkV9cJlLwe+7waP!*SS@9ow=!+mQX(w0+ySo!gat25xP^aDB5}tkIp#(Vy+ncs<(4 zt%ym1(7-?p3k}$;9o^Cm0j@0^u&vwJo!#190=B)~-u>N-ZP|kdyO68d!9CX-4a9bB z+@YP^?tNbA3=F3E+|fMU_WjV+9URvU-u&I)h~3@(9pD14)#43QUz^!+ecqhS!RifF zJpHrp9pUCR0m{tG&24cDY1H?<;ewstz_H&09^xWy)c`)?CNAIweyxPp2ET1^I4j%? zF3cTmRUa+kHa=CT+{_eUagYEtQIW#+&Eft+F3TSN8z6q-NIu{tp5#of-6;+eV#?y> zon7`jwmIF$4i3WYedAmnPN*ylf{@79)8pbhzEU&fXztKOZX8$8fZXMRUPi#1=7t{6Yu+12KIe>1+i~9LkiOV;{(pDg;*x9S zbnV&eP2c$@4WPR+)Ue>NoodAgEWlH53jOpnus)gFKItRC{t+wOVp;_%MrF}~A) zj_WOd^y$j$0j$XD8uLyc$^I_GHLvp@pYv3I>O7AUuvbk)58qffsXWK|0OT~ z5q-%Kv#|DT-}Y|*_H4h>Gr%rU`1Il)^-?_bS5NR(zxR!v^#JGd(f;mUFZ3r*^tTS- zWxx1ca`qkZkR34#sXFg?IYxe{(^B=MCejnB$01DNh2vVIf<+2agp!-@K0x44rQ9TL@vk$`{)sg+A8fO56oEp z=ZSCcj9>p*;`kduHDIL?l27^mZ}|WLLEu1w;PT~bx6NEWe|-o(gcwocM2Zj_ZNqrZ z9zTp20aYA0gWSP{=i=q#_Yp#Qt&#tzN~NRqIx+UA-vbQf=wsQIUsp8t{U@@tn z@(p8TmzmTM@;@)Gvqwh1jY?6LoD- zM@N{ejWlS~QRA!oMCK^_qb8bC$*=MJ{cH3_@8tDRg!*#)?orVxlKomD@W029 zdV)lfKcX8)6eyhf*XFL5Ow30Z;y=fl)@|yy?5;y}^P&14> zAO;i0C$1ncV%1=T2EX(c$~mTlB~VyuGN-xMbZ%sy+f8p$7Jy0(=TgW)oy=yoI#AsX zRj(_R4}~~HA{NnzKFl3(Y{k2!`7TKoU`4OiFg)W`@puyv30c$^kxh){8nN((IeG%5 zXywC4UF1kFc7mhtZDbp2WXOnM5)67=!xsx-H#|-bRmZ~~ z9#KC)B$YL_xlL|%)0_24;((II#N03~Nx}1#1*j;j3lYyk$HJmPwD^#l_=9{8nF&AI zanBst!+ST$)=mCtk8Ht2S_6sJwDc&yM}}l1W85Plxfm0HL^2{bQRqWNay6J_^pYR_ zs3k9%NmrH>N}WWZ^ZG#xtsKsj`9K&b#P(K4$_z=OPGTyYot2WWP)y)R(+=FaHuIA zcJ-|92`hTOJ6`gZ*SxAq>p0h1PA9sxS8$D*7413{NdAn(M}%dh{IaN_hU_;(KzZLl z1d30|4wf8wj4X;63jtAJWFeI;+hrfJiL2RUBki+r*+9Et|A}^zq}6SRgIe6GfYO#P z%~x!x5<%870+g$iN^V6gxUe|y8X=TdFGqZ0smM((eG;xOdwN1iFn73ydMZ?>%P6W| zx0%_^>gl*UO&*?CJmFQ3m9@NOE_c~G>D}FW6V%=kJuRI_ai@IWS(IqGWWkH2$^6K{ zk&e`P0voNfo#Ch90TaZ0Zyuyb5G;@Y2bfzJeo2KjVMd8&n8T0mpNAz0;u%+ZsJ9i9 zE~oNiEy46EWkM>L>T=T<1I*GDOyOBL*cG8>{_roamD_UPm1-nMH>yjvO?6{f)2OVSfb&?Lf9u2PIUX$?MQog6w>$pmZSqn=~G*})tyF|35^%yKkZ47M%=TW{DeU32|eyUo0~`W(C?gO1QUL6mLP?;EWGuo;lNg8 z>RU(tkh&h}uhSjuo%}`HV>$Mys5qsKQRS!=H+WM!KVTt(7Ow!VSk4<9Kf(~xwF7kT4J{`g@>KINAOzyK6L{>Z%EnK=&oJfkS1k{Ao2>!Uv^ z2Z&0&l|YFnucZiI!5JCx}iY+m} zT7np~D469Ujq4G@_p>$mi;a%!HT%0N`~$ZA>y-XGImsKqHgv-`WRC)5tKUIDp6faK z`i7H8AB(sigdiVodx%D;Erbv~)*HljD8xOZx}>wcK1Vtga!L`Z3C3K}uN-gKvhhXR!Dr6W>bGWuE0Z_^Zn!+hlOcP0XL|Lpp z_j@TJ%sU5qmvAVQ<^IBuc3>$LfCR7as0MYJhJT!crrQMh=d$8;e)7Gg%vaYm10CNhMwGn_^$ zTOF3WMr}06g9O0Live4(1#l#@b%aQKyC0zd#E7&=wgI5fYQB2pNWq!Mjs(djxkt^( zM=|`k`wKZKb3FbVNdGf7goMeMWI2UoNQXSYi^NGvsz~JVww%n#c08MR49TG^jE^MB zqnx0O!$)Q`$$o@J#zURd5y(#=$p4ectHeq!qsfL0N1yacNy@qoA-b>pN}x0wp+w5G zWF@s^%QI0*{*q+MeH_E5%)hAAp&g=`s(i_;T1c*Z$lV0b@DxuQtW3%r&hsoa^vulS+?>x;rqEQpmTA1^ zcuwvpg8RhJ{KQWr;LrZ_&;JC_02R;yCC~yj&;vD4T~N>kWzYs?(Ct9b2$j$YrO*ns z&&RsWIi=G&wbMJr(>&GFJ>}Cr z_0vBER6J#ZB~XGSK!PHO!`S!$zzhTyt;w#O(MXll@T}2rLCYQONFBx0dhF2_0>h>h z&El|t4M2h=c!DWF)hbZcrC?Poa8)eGf>@Q+EZBltwbfh2)m+upUFFqY_0?Ym)?ohC zRbL?1Vl~!dHCA>|)@5Y}VRhDLh1O`5)@h~IYPHsD#nx=q)@|k1ZuQo0&DAS_0w+*{ zLtPJ}k%3zPhV2Zq7KPMFh1Yl`%Sz?C8{Jg3)YN;0$4+gHAAQdtEyGbw0w~ymHlPDL zK-h$}14LlhhIQD7h1iIF*h8S$inZ8_#n_D1*p21bj`i4&rC8S#*^wn#U~q?%MOk+M z*_CD4mUY>eh1r;u*_ox;nzh-R#o3(I*`4LtnPpfzc!Mo?f^uCCkqrjzbX4zrOnGJ6 zrY%Q$%{P11*Q3nWsa-;Tl`i+RF8K7v;<$h!fC4qJ143X0R%nG@LEE%-h5lGz+qQMv zw}sodmD{$A#R; zmE6gt+{(4ww{-@z8bv~@U zHTeToUxR=RP=YP6gBS4K-vwS55Z>V>UKTLk<2~LLP~PQbUglMS=Y`(rmEP&4-s-j9 z>&4#e)!yyp-tP6@?*-rR72okC-|{uz^F`nERp0ex-}ZIi@g;;efC41|-SF5-7ggQ- z)!%z#U1o7z+4a8I1z@nF-T2emT?1Gf;(#Vt1401a2YvzKm0%Y@{@x01-V0vd_toGH z=HL$Y;134j5EkJPCgBn`;qGMxJGg=+s9*5dNZNA!7ZqH9ePN#fjI+kTxu4O&OYxs4juz^oHtM5B>Kh>H=<;C%2I&P5=~>3( zl1^t9K8#f3t>)^k{@|EKX8R2g!ffU_%<2BK&S`^A5`<3bwsz~czUZZf>$#@u zx?T;rET8m=<*E+s)^_gahVJM#;nx;xS|Mv^lkM8pZZp1Z zBFXLG2Ji4rl;IZd^44tf_R&`6+Db|8sa|ftMs4Yq@A;;04$g%8#_#;r@BQZQ{>}vJ z_3r=|@c!mr>UQD9=4Z3s?gf|O?pD5@HvaDj4{!9A@CtWp3h!6-2IBTE?e{+Ib*}Fa z7x57v-vKxA0SE9CS8)R0UIXu91jl3rXYd(MT?ZFM2)FPY-)s!m@gDza9>lGT7jzi?a#23>Lq}>L zNAyLvHAQdgIA-r6S8jBMZxFBZOULxq*7FsY@=Z7KDz|4Ww{FG;^wS;mQy0%d{~tzY zb)Q!BR)=-haP&1l?vR#r_onm@{@3M9=k;DEY)?P&P6ze?2lXqj?xVTxm}H4e z-F)_@2y<(Hx7~0SO%8waBUj=iANPVc_;&VhO&A4D7TmxFL^pZiir$S9z9q`E*c+ zz3+w*_;zr2;+q$G^reM0U3wJ&`oTZnMozeS$h04n zWKWv*5B~J>!7rbW+64Cc_w(=X|382M3OJyE0ugv%K@YLCAcGCA1c^E4xl;^AkbHw) zJAzE4i9Px7!^}jJ*kg=FE;)E2iV=a5-g(sIA(1BWoL5aC8O1nbjTeD14}BP|=psZT zjKgAvC6>fdO-U*V(@oAXryO!Z5oHuoOfBUUR8mzn)e7CHlMXFic_kK^Uu|}oTYPC& z*Ijw-6_;j!33jGoktxOwV|22`W@38!`6r-(3OXoTr2TT}q3mdb=r6P}`sgq0eDj)X zxoKkBY`NXW4sE#+#+z@z5jU!E#=(S~a?CjgopcCp;R>wT`Ny4jwT4HYLXB**>pAxD z{dv?4Qym^bbXLIRnQiQL+Y(u(GStBo)(LIh4e?tt5&x)lK|ur>ti$fG}eShVAP z{tEdmxH9sS<3;sqv?Rwi;iS`(KLrKTP(>Y;l$A|A71fqh-J*^!9;X(PpKYP19?o3Fn@6mX+pUa;Dae z3O+~m%UgI-?KISOOigdjDB4#MPV@*O>~k1J z2zWmO&O?9{*^xW!0k4UyC}QrL*9|mLz>FPfBOUu-0-6M}o`@^}QZiYUQidg#waf)C zi&_h$G9@CfAm?aBcoAm9yGg!nVWH z^l&fP2pZ||R+b@_&WK1%8*1qGCcCjii#{YB5a)6jz>(z_Q(PLJj;MlKsH1f2xS?Fm zn3^qtilWuSKye zGxgy*y3rU$c!P?0Ln#kc%2F+=Ku&`pOWn?Lx2&ykZ6htB64SEAKG7mD=zzrtR*JJY z{-uuTxP=H*(1_ctKLhkDcy zMLyPZkWJ*H7~~kOGGi;-*>*3Pvt?#DbGxl^uJZ;v{#u|$u34jOMr4}~%O5`J)j{1l zleg}i2L^pR58y^*N74Q5!=Q^=X|l7m^`xggzl#xlVuYU@^XE=T7|@X=pk!1+nUz+k zr7bZ69a&)nS8kCrT8KrzW!0$H%C;A>nMJ?oaGVPCE1I*wqK<+jOib@Y*SOV`t$p(0 zgMF5bsww!vMRo9B0%O*snq{d1=HXckjNr4{=?r_ps99AVR?pVHL#E9+HNlvq2p0Lp$*4u|qXYaJx6@3O zMWoP}{h`JDtsEJBU--2jk$K$2#T*1iV3N&Tm379=c}C9Z+>>!i1?om$fJ$NoozR7u zV;NnUMHaN25_VXCesqJ=iGw(Rf;*T4XL$!GP@Q+oSwlcisttppna6rC+TU@{^uV3k z8Cs$R8U&=B+i}ka_+UW*A>y5fYAs=E5yTVz;1vp*EqNWO5sRX+9TrxPq*b07Qr@h^ zR_3uD8*&78iPPsz#Kd6C4TM66OvnucP;d258`{eVh{C>DOu?*(G|-a;Q4oC?V(>AL zi--ty3778;NqQ6_{vUc!@zuof9RQTDm-3YxQ(%enp+odZpX6MhS1dv!+`{765ci=) zBY=_6cmr0IMaMzeX-wE$pr2X<;QE=>O^s3f7gbz2Y9pBK)b5oh+Oj zkwsO}nD^PDny7^`qJ}y!V}bb*$t4ajN}xE7;~?prmZ8oCdLUYKU}tPfrgY%XiC}OH zotTA^2|fo3I*SS-0t>d_cYp#6M%@j5$0vNkJA4N)SlvR1p%5Yju^1sk@Zb_2-t;t~ zLWp7A6-(XynL}O=L8RS5fF$5?-J&@f1VH2&rX=QF-m9%)AHL*sQ5Qrw*G0GiE-6kLRm46SX@>dQ7H~xniY!y4m6_0Pw85|ve;I}%m}#-lvaV+oED(jmw`_M<=AAPffNC&Uswu)__4gD4y%Jp6(} z8pJDj!#TLadHh-66@#J)+BA^E;VpzjQW`;sny^@8K@{h4Cg&7#q@Zb}b|Pm!U{6CD zgmwNxz%Q`~di0V+s-%0;8cWiaOa3H%zTvcuLmWbcx6oll02_TA0*A=tw)rG|Zp(@k z%pcyFG(?+#28k#rD1&AfkPy(gj9!gIA_hUi`|#(0zC>1fjFTWACz2ajUdg#7lquF% z4WR=!{K8diA6#A|T8uy=`~nu)g%mj;X6z+e@FFABQD(9ciIv4;%88Ms1^x{wVn!8> z+9+z2m0WC`3Owdnyuw9EW{y!tlinzlCYWY2CSZc5n2srDkOm`-CL~E&V4Y?r&CbrD z>6(6Em&xM@o(j>~BW#w^fS}n5_D46sQg;C4IE+I;dICGZLuN%CIDEpP3MZXC+Wx2U zLpyB4FL)$DaLB00<}!*m{o zCYQA46MW$`W%;Wl03=;D3RF-#^!*$N}BZtF!W|-iNl}{syKi{EPX>b+-5j@{sJgC>JBDa zNk%6|7Q`ZaTC)&Kp{L^nwnycFwImTihSt3|-=M%XP=`pbc~)3x$m+Cs##N<_EH z#8!r@P<$o1o@fhQ-z(-64uyq`x$9vzLN=YXT4oE#YePRAJ;l~$FG5=QI3uKR@*kbUC=R;=(2Z_Z(C#-@&% z;vAc5N|t@b$F>e@iXh3}smbCa$_~hNR91id0@U3g%*HICh661Ag#ru`syIL$&qk!r zp5)^hgwz@YND|8oM4opd;oH^H)|OXLlMz5w>stk|%T?Vbxk;6?QGyE^zpW ztuc|U+-}~1N<^^np0-hhbG0oy@sIFrYXq}|Qy%3aRz$E$MCUOZej-rc7T4Ow?Zyl) zlYGoSiD*}n4B|2$LM^VCG;TMrKv?L-TPmqCVjL8WU+8v2Gn&-kcu`?^Zdq8Vj`~oL zURY;R=@BQf(JV3IKrBkp807>8-gF!h(-i%wg_MHakTqD2&EJiMSj?=27@wTKdTC)^ zuEY{A9#`zea^Uf9?DBSO^ODB%Zke2ltn`xLm^p{_>M8z#Y(aqh!fk#pIZQG+5US38 zFZhZ>`by{ewr6_&S#!oO)sln%o}Dde4@X+0CzGGDI zGv)f!7g?OvyhS#YB|?)Wg3aF@!Icc5hFL|fAiXP<_Va1{vkK7YM)6q3A+fl?uJy^0RB=NqZAu?pGjx*SOMUd+Ht|=u~38N z9>ZyF_;FgaPR|MQl@an>fFRI)+4R<9^_m%N{Q^0ZgH~@fSC_+}W_4GSgD(uH6;?wq zc!ND$!_@-Q;-Smfl~$*^@2yQJ{=HN|TO<7`80k#6F%F{`Ni3C?4R@D!#?9Yp zY#4iYQKXm=cBh7Rr}SpB^c>X@>7c6@C)gYDO%UNU6%$c@({W-zY?uzUgA=ux@^Qu@ z^*ZK8Y)Cj?VG8O*Z_rJ(V=1y#&sNyU1BsWoiJ$n1m%~_d>Y@QmRbphNo(Dfb;dd6q zvDEJv3R5^}BzCfzj2A=H$~7+e_={UAdd7G@T*CyMXF+%xh6sX<3-Du4d9}pnZSg8< zzoaJYWRa-I+Pa>4ZcrYIa|U(DhbUK;o5Tow!=1T<{6vJQ;aTi?`MAV+mv3`&?f9=6 zVtTZLEL7qPm$Pw)8+)bmxZ*JW3$?Q;3eL?)jZSrm)G&f|&uGmk&Cm=PS&Tp}w2jbc zLth&70+O*cu3Y9sO*S-w&oJgIV9|zAbe3lHrdztFyW&RC*a#pE-%w3m5Y?@7`lZL; zeygA2)RENCf|Uk%*(}a2zRkl0Sg%`pHw@YDZf1i&xV4L8Q6Dezu1-=@l2Kb3oN~BS zBXTH#cs|P3EHH{MtUJ5=f-dNSyTkjt&pRwox%h~rz3034MD{REcAEdYNdzvy4?Ljn z6LFifxEcEL8I)2alnbckn3RcFTsy^Ayv1MqA!U0XCocy6v9^P3A%|dxlY3R4yS|@1 zw74qDue`JHd-?b~!N>l5!OJ|&qd8UzdWa%-!Y?<&H@vw*yu_0U#t%Kw7roJ2#vY5e zHFCTued9ghbMBLvb@#%ha}KAdeZOJcm064y!gO;&5wOV2t3)#yxHFXaTj;a zbER^tGs8PP#A9F3kHyj7J>KX2-M_{!e1qTrJ>Unv;Mb1FKmCS>tjLeMol^BZF0$7@ zK6RAcHS9` zJQlv}bNf@z>By3Nzuyf~|HXJxW5IU4-QKLtZCRMtWX;Y_9 zp+=QDm1({Yo z*S`I#SME^7{uMu-e0lS61D{vFo_%|^>D?ZdFF*0(#*ZUUu6#Lj=gy%4EKNWbR4WiQ z-4IMr!37y?(7^{Gj8LKADBS3`3M)J*rInEDP&u1$(rGd1g8I(H6H!c2#T8lP&bt8um07w43b$36M%^9CRN3{=qm z@c>mT$U_lRjL4kut4Tj4`(siwCqsjBG${+@QqxU2?bOpxwG1=33q|Ek!{W?5GffZ$ zXlz6`?Tl5{S!u1+#johpbI@IR6|c}^byZzh;|*ElkxBk;-Z<;! zS7l-SUD;(FTP_RW`2<$>$b+4YR8ncDwbbDQEe=}fp@}ZqXpA#%Y2$M}ZZrP6lA(@T z>Z!rQHP0(v&KlU5weI>xedC+?u$l>8R62C$0u@z0W?3)un_*rOqcA@Q`>+an1&p{9U)H3m2 zH2~)Jeh%coS#RBSI|qlc@Wp9AukqS(hpX|&4I|sJg3rb|ZG|)6++op?PhR=ug}yuE zyiZ^A)u&&t-umlJwwhk7bMM}~+r1C}tlfDRGV+0cH~Z0qiD%nqx0#P${`u+O()n?r zN1aX8smI>`{{eU>?V*f&;xpi0z;{6Lk*|C+@m-^WSGk<2t$6R_T>kwqm_ZG0a5nc# zRsN*+vHk^+ge5fLQDWDk*(s2PJpx+`VQ3ZxHZW24nVi8SI6Ta`4@z!(8wY_HL?I5* zARaUm2+_5_b)ArjO(bCoS+v3!PVrAKq#_Jw*uVz@Z+(~B84m~KLn4lmjAe|U5j%v$ zrtz`UU20rVHry=bb*$& zwB;>vnM+;nl9#>ozunI<2{NgR4Il%gypDN~6`R<=@>^>igQ@tIG3?vtPW^yfbT z8c=}_l%U46CQKHo%@KN&p$)AQI8h`{bLOs`6IB^H#iq^(vNM$Lgl9Ze$x3_Lv!Eq4 z=}A$VQkAZhr7d--Ef4yV4@EDD(`%zcahlUP4v=sKw5T1e_*2|rbY>du;wL-mQB%fq zo+GX2OQ9N7sZN!uRki9>4Z0z5Wo)MUv#CzO8rBm*bgVuVswIPZ*2NJOU`F*LX4tPZ88y23*&a7%BXIdR=IJO$gt-|9^ zT;&SVy4v-XfA#EVK^t1pj+UB%ZAn){$hX9>lfUHd|-TFxy+E{#Lx{HSmEE zoL~jha=n91EgRz-;rPBbd-FXqjyZio5S9Aj#=s<@yZlQ*dhIgcP@C7>7u?}@` zgB7`4gDtYL4tB6Z9o?uhFS)=CcHjcR-Czec4xwT-ubIurWHHBF%t#o^n9gCP@pfXH zV;$pI&s*a&S!n3M9z*b`0Uo6-ifrU`EV>(r*sLrKk>w~ynaj4gB_Xu2Wle8+9c13+ zF1GAx1DhGmZ8r6(QH{$tGfmD5#mW{Wyor1?qt4j7vv%^_XFuzDWjm(Npt<-~qy~AE zvB(BCsO$wp0Ata>=mLRbNe6C785nj@LoL$5j&!)9mT(X=JE+`+JK#bcT&6`Xxxfo8 zkGafePIIc^9d8w{I-6hRiXB{m2>v>SA|L(s_rH;$9e&dqE3zhdQe++QqRfCC`A~Sm zYfY!=3esMPfQBWffY8k;e@?r9`fM6c~ z{x{3fLi2n`V=bV_2hMNsa+|k95GVihSOP7R?E=}IQcwV=Kv=&6k+)%p?}ot(%tl8n zpbg7fsACBeoIwbJ&9)k&iqe1U~Dm7+fhIpocV$B5Q{a zB^3VXL&Rk@aqLvw;&353KeVBZc>d%=|;NBegxt@M|WJ(mky}_yW-fmm@6T&kq%&F-IZZp z2Q~-+%Ps&z+uWW%m+fy$GpFOrUEqQ(vW*>}jNJ~5?(psa5%9S5j<8f~D=YvJ059LH z!UDR%$Se>Tf*}KgVHYA0@C*SeJdYYCAY?c%DZ;_@jDq3%P2nKG^FR;vU}wIfsJ>c{ zFKABs#^U<8@8zEF2Eqa8IAQzT0_7CP=kfs?>|yxILg-=+E>3XzpwAubVfW0!2(7R8 zT5c>fVduI}Fu)Jk`pB~2{))G90UNTx73Rtdx*;93!O=(zmIwjLy5X*9f$Kc28`J?C z3;~zSOda}<7PKrKYyl7n@RwYH8_JCx)*%~gVGVG}5Y}+Z)L|Q7!OE~~-LL@{9MP7z zpcb-h%hI76_Ry9xtsB;W7Xq-$Mv)U|;S;+I5e$%)?tmB2LDNE!5E3vKbrGu;@WI?G zD;_Wc1&=Ch0T_(Y7;C}sXkiuzp&6TT7@HylM=)MW@F+a*;D{m=_~9HzkM#Hf^I$Mn zWN@cyusn+I_->&1M2_T+j}vf^=BV)Z#t9UzK@ez83CRK!wy_D_g5=_{ENHG8$^i$F zZyW^j3VrY8@X;>*yf5i$XiHXfB_q};SlC3444fYSb@o6DHgcS>*S9WvaK6> zDa^F(53@lNyMPeoj+b;{-8PLKw&4zJ$rciECV>I%XbID1a?9GVmJneZe$w1XksZ1r z(`ItpZ0Qc*Zqv{~%u1~b(61=f;oNpHE48wvdXc#rkSl^Q@T$TN5TPv1vMd=dE$=`L zK#(3pkOVakDYOwBiNXc>jRjkf9>kvyIdAm@SS*pV#Uar%BR3ytol?olxX zQyP2@9oHf-sc#;rK@|A0EQ+rfurLQZ(=!*6EPM@eY$zf>Y$Ai~>5vT(G7=XSZ5BLI z>+JBZ4gvlfXtI~ojvd%emt4{i%k2!ujun)$7iy^vwG9{UfD6cP%XXob?m#KSjS#-= z?8J>Ib<-8Nz{$$(Dr-q8X|l=)0q%B_mV9B$fHOQbZ7R)d9jZ;-$V~uoaVzC>J_)KT zU(D68A}l3vD(V0c2*DN%!7S5~@$R4w*zzf)u_!RE-}pfqrZF$2VFtkA=O#cB?4cPT zq2co38b(kO%AwylbSO&D;1)C=s^Jfa0usLA$P*fyv2_v%~r*JLqQ4uUNNXNk+RN*s$lq~$Q3*W*a zHU27ixXYdFfE%!(8$Rlk05Bb3^9^4K7o?09?g|mI;Wl^a4y^MQcBwag2^a9smIwhG zx{Q|WU{0CRIf;`0Xo*jek|({bPj6w%OwpE%QyXlu3zU*NX$cN84N<#*B-tSw;?w`= z&)vG9Hj(m{dSM;VA^+&JRb5rRv?^&%%fY-7!luIlSRn$}fIktz7T!S{4q-qSuR!a7 z4i3~Q5>!MfZyS1n8&MEK!=c|q&_aX39IoLPK9m}^@EUv}<7jk5^C1}Mfm<`~Sv`** zxb++I;aOv}F7?tVAPz^f@f&xPfc(-&{X$8};^lBqAB!RPVvYyV14$J~Up2D{{+qNd zD6=wIE*ykVOQ$ePc@OA3E;L26A-}LRAqY&FZj{EfOwTk7(sWJh$xW{^PUmzR>J;w8 zE>E@WC3T5U*P#}8sTQ=1IB$s%b;17*wf|^o>(YT1xS(hGkjrL)mNHEpV&Rs`a~+Ph z3m&x)d$JZw%~WghRk1c}_sKq6t?#e`0t3$irh*R2k|?0oUg4_V#vK`qol zhr&V$?p$4TZajRYdu=UT5%L@zn+g z^DHPc6h3a_ZU7Vr@-2vvb_{kbXzuwE7D_AEbXkt%de8^APhy$S-=x9*G1Fo+dj||7 zgJV%sOv%(tGje2OvrXR=W$6@`oDwJzftU2OmNxnUM6^_J*QX>lnI!Hp_wQDt|D zdbfcmi&M*X)>7f~miY7^u(A(*mX-_ z!a@}na>HpHCy53pH!eokayz#ywp0^7bmwGOh6wh6LYH5muyoZzAGr^8Th3v3Sal~h z3$Jhaw2$NDF>C_uON9-yK9+Z<4ozS4cU{S3;Z*+Qba-tE5tRNiD3SMNe~Am8a?8*G z7~1#Sic-_Gp;OI{msnwqajA_@6?~_%mc|z=Gi{D*sXV6=>^5!6YGD)MH;@I{m*m&p zxT1a$;eMwA4j7LXvVj|jwOHw34gmNKvY;(#R0VCW-%v1FKiD27n1L^pD8QBAVl-}v z;uXB%9NeMbOu2%KViV|<^!V0;MLB~-xU3}ig!3YWm#|8q&@75{=MKT+R(E`6*nmQ} zba5ChBvvhyR2^+k2wnFxZvYa;;bCVNW0Tl+ZzfDliO9}2BX42Ru#Qb#sSZ1hHfOi{gUu z78^?$gNXu_ApjCSlpoq*8-8JwApmh znHh6R4U_iDqM6TPOW8t6Z5XVv)S7R=tGC$;yIEs_2X}Xi*edcOGjbz45}myOB)jge zJawRJX%@0=9U_&Uy;ztC0T;9(C$nLmiI$DsIG`8%oeSEb5n7?;_@HS?7a+R})*u!t zaMSSAqCI<%G5RaB;_t-rD%t?wfMFL(nhs{+{vF&w5!GQ9)_@JL0F$SYgHI1BVEU$k z`jcrof?pXMQF*25Ql^DEsApM|H+cmUH>r1OshN5%7WM{wSujOzNXH@wcNi@`cX9Of zb(dQ*w_2N_8LKxp=8W{I)q5;}IA743hLl(ghpp*u!37=5|ye7hhPa|sbf z6~aIJ#IrWEZFMW~4H~P04er1WVqvxCfEBvo#=C)x)j$oZz_y3NZRtxpt~FZQNf z8@9V3EtV|w^&Wv4G=-R~rP;l^G-DxhW0#n>$PXKC;r!BX{r21a^icljuTWdE+=5n^ z3OtwG01wBLj3I0M*iL z$yBqU4p4m7u~x-@akRB!4eo#r+5iqH84lQB$JJm9wm{f>9Hn*CLjB=Ig`yE&RLO6d z$VnNvkNlI9Jf&5T$&KO~mBNE_v zjd1s>+4po>%-J1@;oF-H2Auv!$tf+85T>r`(&6gZ&y_H|>$u>R__$@Q*C-i1uzP7e zY1WpacWJ3N9V*e5Y<9vCdQlBE)T8#VX~{SbTf-^a)TtN#YzfpzH8-!emOPakX#M6} z)z;?>PMV+!s$dF$KIoy~35dSvogfK(oR-nm7rcS;z!BP!I@%qV$xj)Sg(6z3AsCwe z8i4w^5%@uk!j^v!?7{t3vV7d%qWG|n^46U9R#zR1`AO}3qTIa-GxPQiR=lCl_eidD zs~P*6uiyT0-`m1V{hh7Hkl3Wa*entjl#SWc@7Y#~70^K)vH=lZN!p^U(XK7q5FPHe zVHZSy7kHucc|jL8z5aWpc9(Kf9du!y4*?joY#Z9{!nI5td|{pmLH6rU7B3YSS>fA! zK^Co38?aM5C4RCSTCz`F0A(8%F)_`+c+0i{J2QJuM;+(2e=Bt!KLf{;oBf4bR1k&& z>U&%2kG!Ul{D3DEd=-yq-0Ya0#eEgW*IEXOe z4KidDI(!H*qQr?5D_VpIVji_T5<%rNhR~zIko*Ew%(yXOIB5w-j7xdLWxkm++sUHH z@M40UJbU{5>9frn14IoRI4U4%fTaO=F0kwz}9Ql#ZR=y?oiNqh&X6U|Q?g;S!7(v97{>*=1uT7#HKd z>ShThq^&W#ZfgP~+NPPV;LO+#A;!h-A7Hy&fKArBj&9FJ-YE&hqg39@-Msg?c94ZO)B8%fuaW9wBf)3g8KFB+q-`c zKfe6=^y}Ndk3YYD_mb>2!ygJifb2(Lfd(FkV1f$jcf}P8J_tdB7fncEg%)0jVTKxN znA3(Heh6ZSB7)dqML?a1;!Z-5CmwiAHMP@IQB7slRas%>N;h1gqs=X9gh5tWXQjo~ zT6XyUf(~5ja0A(3>S)H-U%U}!*l?_L^Q2zr@N!3DgmjaaUg-dXNMdW?f(>lh)S{bU zT-5TGm}DX*+i9t-78onr6t+$_v7lC3U}s{(*pjYDhiIaTF3M=5jy?)$q>>6popso8 zhpBenEd`!<#cIAX54?#k<~CH4wz zu)+%a>qIFY8`MxmwWt(RPC+FVRaV_dZ5Y;G8)T8%ZtKOQ-hK;ixZ;jWZn@^3i*9k1 zUYBXRn+DM7QJ4_x>{c-spboCzyjau;K1+UI&8uUFFazg3_lEU#0ma6 z91*e>C$QqONHx3EvolIt6}2~Bi!E8)p4@G^DzD6P%PzkRbIdY#vF@eqcE{6qNqJfn zsP!5QbkGZKk`FTU5pA^4N-u3|txO{vO!3rKUrk~|7F~>N#zZkIfU_P)TcgNX zk!)?YC~rG++it%NcieK%EpE*>WBP8q$OoEhu!hmG)`-_6leo!^4i+cO?v63pN@L!G24Cjc6skCFW;dKPJ8XP-;Voz zg)4pd;A20_j-7- z6XkR6=AVy#`h*v3_!Y#z|Gx3?&%dzz2O*E5@|QE8fQ)2wZZ_$Kj(Th1o&gVtzyvCA zW#0Q<_;^OXzNv456s({H6|}qc(Qku|vmXaPs4EZR??n1LfQvHMypNSFdT5&-0T&3v z7|L*lG(=7VTlc{6l}CaX?4b{T2*eBqt#=?SBEvjr#3XV^YbF}uPfB<~7^U!k&>~GWc()wxErPQHq8ZPK#@h)IXhc+^8+nDqH_Fi>B6MQ1ShPPB_Ro1B zvyl}^=0fUuagc;8q#;*V9d>;Wd^zJ3?8dmmGNy5ol&s{y)@ZOc{?2ie9*QF;KdF#9 z+L0$vSnGf~;c&UucSV6f&jxe3sK3bc^k%oHwVM^1DqbfF7XXTaDQ&xj%f zo)S&sJndLd{^4_ljOeIGJ?e;%I-(IIEh$L_Inb1<^f{SmsY_o9)0oP1rZlaoO>c_R zoa%I^Jnbn?6H`#Ufm3heWT;V(T26-o45Af{CqFse0X@R7XhFd-9Q^ zSOuv_x!P6Hg>|uv^^IB|3)#p@cCs>MtECpn$erj+e2^?(T|W!j3f>i8dF?AG`D$AD z{S|+KJ>_7pTG)QAu63`A-Rx?2yWH)rcfSi>@1EfdI#H&Im}xl^no@K5ltOG}dsy0f6}R*S zt8ed%-~6T(xNdD-H@X3g00-C?z1W2=a)Aq6*kb;{w4jA9kqhAn^NxKJZf;Yb8{Q0S zc*7j-u!lcP-SL*!ybWHkEfSmyUF@P4z7TML{|jSoY(pD_jjdL<%GLSScgF+OuaAEW z#la|67w6H`m4B{+ndCOexvUNqgHS;E*#0y5T zidlSQ82?wsG={B>XNy=J^LWnN46>c??BgM0_I2XvEDxm&=s?Fxx%OhNmEDMCFDrV{ zjBfOG!Q4diwwAp$F6@ovYg;;NTAO(8w5N5eXW_!N&qWoqsZT8`LN`sAhjwS89S!SP z%i6<`rihrAiAVL?)3wor-g_Bw={RS4)BePk<)@F0Y_x{@t(tWtspX35XiK|5s-Bgh zTW!Qw&wAV3?)I0-8)iwPcX?HPt*_r3>>Llf*z7K3vfmBwoh}=PqlRE4pFHh+>)Som zmesYf9aS=Td*B53cCC#i=1EU6m00<8x=kwQc1wJV@vgYVD~p(*;;h->d^U0S4f2q) zr{9BSHNc0d?SiX(Y>74t99|{FXuY^Mi|y_CO!~RY_O+ z{8Ik(xXWF;QHKc3sjh2{nw#cX{*Uj?QRel)$1v=KKla$a$?->;9p7nhe1z9-sFtpsbp_`-_>6G{2w^?6|#F8lXvCT zYkc>4!Y6Fzr*m*%8&Gl>d6F6IkPf!cCW7G#>W~gif_~+KY?|;5=a3~5=na}sc(!p4 zBzR}-=Q^tgZS?1Yb7g=2zf^tsr$qbLe>XU5|93pzCxE?2X>Mj|T33F67kGF9B~@Y< ztdJM$kR`i-7+k;&?BEL+lVPXM!kbXDX;EaK%}y7c|J=3}=Xj&hQ5> z$cEN7eQY#?G?;DJhl6##4 z2VJlW5~zV)Kp25Sg&gQ<-k=xi;0>eDQkvimjNuJo*M+E;acxCp!zF(ZvIPf{hOfAW z=Mx|U;zLC9A8oiGF_>y`D2D-Ohrf7-;1+3{hj&pVMSge{fQVzEM}%I78tM=WzJUm~ zp$m3#2x;$cQBivhzbG(i*8FaZc+i@2DJZ>Rc zCXBZBl<5_f;a4Nc7<|h(goEgH49E`K@EcwEm0b{)c3}r^Q5R>4mUyO#?0}9lr3u-P z4kP$dqwozOs1D!Yi7urH=fDo%0E$_{iEZgpqYx(&h@s^8p&JTQa~Wh{m|1ukPI~!q z{tIFOh~Ss>NFdWd4b(6VH+rLr37I>(qw&Ein5iB!Kn^ppj}RcFKzbmanJ@b?DyW&7 z2eO(E(wcIZ5&pmj2jLPWVG*cur7p3XHxLdm!3kQ56U14Z;B}os30*)*oy|E6(j^kw zg_J${lk>0-_P`9*~}R-qEep*K~ajiC+)nhB%o4Pn9;aruc6*ca$9p{shT ze4!4tnh7SVe0AAhK-YXMx{59eqkp*{)4-UF$)n2(new5T?9m_Y;E&L150shyAWDia zOe!i)`lQrGk->D48Nvx4kr3lbn-Ou6BXN=`c>|nar8kff=Ndd_dZyjAlWiJZ*O{Hu z<(!0iU7)ZJ8o962#ir$euhMm|<EC4_JmAPcJEf@f;!7(De0;y9rmDvl^Ps(Qho35v5XRiNkKiJ+(# z*?@vQ`?FU#7q!Z(KZc_Jpo;ORATJuDfQcWA$*fh|qmntT>(P(HKo8am0oYuIU4NThf9nwg z8@TgO4TVcx*EtM-YLpHeU65O-5qqc;`yx{Lhw)jJ^x1W&F&DtFl~*Drhhi6vm<^9e zmKoRujo1wpxU%4aXK%?4qo`9ln+|QMv$^_-7J8vCr3vO3m!nV^Ld&z~m#;8uObtaBr4t#h7ZRL!i={7N!u}AEt_TsY2ywUL%C2R) zw;2YMeOtp1D_#1UUEx5Tifdgp%m|2!!}qERjvJmv+?;sIlrgpbmIq7m>&g+|VYqF&E~@4o;|qs>=!yIDxMFx{ZQo;W)cHRiT_1Q<}IA6FRE5 z3sd2!4nyk~x_Z1=yoH*myD%ll6Y9MBwX{u3y)McMF}eo$k-ga~A3`d=Oxll0^P{RV zzPCs;!9Wk!;0qcFr2QD0q0A5GAif7o5TNW01Hs8=yO95gG~>$;!SD;^Adu}b!0mC# z>cJ|M*&owD4%J}GFKMk#O3JM4${gG(mU+Psxe4|V{+hjT4wtFP`{K+WOmrcPK^8f} z5`hva>=N$^x8!^fpui8s;F}-er4ypJGfZ7XEM3mow?{b&_HYf^rNch#okbZA<~h%J zD!Gy?5cM2lO#E`|Np5|(s8Wovfyj)UdwzFd8>)L3+)x-3*acjGm13!cbJ2ur3@Nd@ zvuG8L>u{i>3ac$u$g66hD-BaBU8*r_pe=RC><7K>7_9KP$O=-d^k@N)9LZKYAHBTE z5Wv6ck<{vennY7H_WRUGU9AsH5VTmp>mj61{mZ7g3H%Tb0*NYpaHN_H0S2tg^Z=4k zz10w)zfx_sY)!sdd(}ZYq?k+({Ll{R%fANx+#k0Hnt7de+^m}3{LLQuwg(ZnhV2lc zFc2Kco93Li^a{_}>W~BF!kVTNt!ER+{h&-oU#ky}K_<$Vcna z&W)h1dW2iJtLy;NN}JQ7w$sylb_nv*h!E65J=DxPA4{#jYi-m=J-)e&nr&^r;tStO zZ4dm?)?q3N|H7nWO&_2+nxcunw%FJEJJl3SneUy-^vy4ziN6Poq(VxW4BmKxjUZ}k zeQxUziTx1hY!VW&!kWOo(vZRq@y`B}jj%iko#tQ<{h+W$DGA>|p825K)g{j*0NMmA z#3fMLNi3A7J)YT6o^Og>O?d-)$eyt6o@GOo3AnMw=egOK7*HsMU0?`l(v2l+<-*Oz zcZR$@<)K)(7t9^q*)Ye@J*s3*Q!aaidSTr+jbDi@z0U_B;XU5uUEVyZFZ7Tq5N?|K z3*Sxs)=ACZ?2(Xz&ddj{)%4H|vpnFcoX%$L9=q%w;TsQLyVO`s4v79AhVIK<`;co* z*J(Wy`t9ix{;lgo*oEy77~T@&0NDyr!V~er1bGMoaoC|G*(QEnAs`C!dksMhxY2db z25sYX3SBpTxZru6d1~VTeg4{jDhcBN(33limHXNh8`};&+Zo#k5!Y^9KnPoz7^txh z0lFKNXd0Os7?}YKT0Y!&cE_dqQV*&P6Y9pWkq+AM3n!h@7K-M@tGj1jQ=0H3|6WsW zeqV6j-E#i4biN;VZr<~8zm2}hpw8ahn$#Ar9to-OMw;oLPPSbQ2(0oSN;;Aa4C&0A z%lskD4Swl#{Vx&O@q7*eyG+Ud{of$J^4oms50&bw-s-{`6DW+Xcsdbd8VK!t&aXZ( zxvuNm<($l3T{}Kq%MPc;-p@Hn#5e4x3yZ`_EcMkzG6+3gX{ZS7$pHh6isX$7jPF{QK2?Xs!bmUP_j((O_$Ez>a#g4(e7HihuM zrSK|BRC|daeQB%&vZK$CkFWR)%{m{pxZeCr@fRQH_3iOqyYXVn=`~;KV;!as8T+x{ z9*ZEIs;~0$(T@a4tt-FQ5!w1{ZS&tt){#!Ork=Jx5A-e!*{lu`91hO&U=S^Q5J*3- zPrqTEFzwZK<8vzNSfA`hS-3jf^_ShZqfPDV>Do|<ucQ)UBJ<#h^BJzzi;A*wEoah!G`Dq*&47MT{9WZq%5`<42GoMUEs{ zGUOPC4CIus;IcHT05W4F$z$!suL znxtCQsz-;h4sB_IHLcK%iUK?p?fjA=q(+Nbldf z&;&z!Cd$)c#D_aA?xe}tGr`XQ)BQki+BkoG>dqkN?^`}(b~oi~Mt5}Sx{~ZkqZ^JN zAiJDjx1McRHEX(|_^G0YdeiRSdR@cDTN!uW)1g48wnuG(?bW79(S7 z#&Ys$CmR<#jAWh^Gu*M7ar#ju!xMWfp-2@q>?9v%LOkP){mPPZN-C>Npp7@&GGMI( z(h}gTv&ve)f`6WoDwW?b)Ni_R|H;>k?3=^!`_I^0H+=DFPRsZBNKHY2At2vobq9^zEn zhF^NA%d5NM=y8s-b^Em^pJMc_?OliSrAs#A5T;8tfBvwm5sx9z7+aD{Hu+@0&_fyJ z_WE=AWtd}@Ipzlubk9Hr>ziaX`*sfS1_Pz>FK7BLEb(ZhlU91^7qu%!!(VdDuo8QW z6!E{OKm0Mt68>XSLnMhrk!wlHY0*h2^|NyAwXxKaOE1Bca?CQ%RCCQY^Okc?JL%l> zZ!bU!%#g`I8SU`SEOyV!-DbXY0;bI?N<{+*&^ORq{3 zglzT3s8MF3NhyzDO^0>YWA$j(pN6&dDc7?ZN)y*%@0F(6aYbC%OpN8#bmp;YNGq}`&WsDQ@A0yX0<=SN~pW~$SO?`)Px8#|Y3_+gKB48wowqZkDA$G;5% zP-OIIU%mF%KYP?>WZh$73tgxemAz0sEt^>lZFoZ*=4U|s(1tcrSRwcPCqfb;5PgCs zASN9`6ZRNl(J;g`C`M6=BdUZuX7sQoX-GRa%0`WZq#+@G2x}nz+M0%__C>K7=|uaO zkva15HMB*EZF7{8+uQ=Tw8%|NWHJ+)?#8CP!D(-O^BdswG&)2k5>Tu_98Daljm15L z73ok%K^Vdcbl57B?AV1OJ^4vc`l)%Ntd%28X}gbTqLHRlhc{mGjobAkcOW6w?NWD2 z?2IF8C>@edK&2KZa4TyHw_l`^-mXCyhEcxaeIkcL#GFw;aq+aU<} z2r;D;st+hw3ZEs~tBFpWVohy2MM<#JMpDa=B)(D3eFTGRU4vtX#;7$O4K*Co*ihJx zG!A~+h!!Jyk{szsM?1C!k6#MY9_!{uH32e^jM$qa2ze(%<|&kGWh+D0u!~KuBOA6@ zLqveV4nsMF72BW*IwI9pzy>yyz$ENWyn&9F^z|Fd^T;TPb)2KK$@^ttODD``5pyiYv>x`fcdd?o=b7OXUni5glOTUW_Kw?5u23Stdp zSt%0y-OE!SkHUr zbD!JlV?YO5(98pJkiW9u{$}sLu+?&-{vExZD?eJ&kLL1%y)0%-XIj%YATydh{b^8F zH*ITXbKA75RTFbH0CSTwSn<~47xyj3f%9{%ZGCH83u@52=5?<{QfNaXy2y$?GJq$2 zY-H;t(#dAFr8x@WOK)1*(_U_;Lw#**pIOcLDYdEJmTEYsxYgn%uiow~>pbUL-Rov| zySw0Pc*h&izz(voUAt&zHe28O=6Am}T4@DGo7w{>_zkU{ZGhdCbCZy@#CW*XFzBTjzS$ z_xG3C%b%Xo^!OPT|_&tPtU3J^X>{g&R-?B#gAU6j5l5Hd*^$nqW*WlTV>>` zExD23Vr;J`Uh#{^GT4PH_OeHQ>}OYdHUE~56xUfamJ>e@zUir&+59Kfa ze4J-~KAV@)?|W~H-RD9VyXb{4Xg~Ydho2kV&_>;jE~oRBKK1Ko|LI%*{=mO}da?gL zFl>)|-Sgh}z}I^5{r~=d09+5p3ogiGJ_FP==Yu{4%r@zh59%um>+8Mj+rI9rzwnE_ z@hiX3E3dmNB=l-O5DY=RgFh04I{7OmvN)!DJGuS~Ko@*L7`%%C1g-)+KpO${6mvFyx?O+X`IGmbH&(#MOn`8fq-#fbtVoLlm3hoak(;_IP_D~nW^hmQrMQCjP z!Sd`+LL|@e^i2N*NC6$tr7Y0808Qh>%k@mozI4yjgwOh%PztS3j%-Y;!%oN~w*53v z4;@4RWf=th&%@hd`=6UQ5u!b`*chVwarvKQ63Gz5EV`n z?NJ~V(ick6&0A4(bTt?COBjt%8Ld$$jnc!s(F~GArOg~&!44HuJ8i`Nb zH6_d^eN#nU)H{q*!mCX>l}taK)MoQi6zx+=oeWDQQX_RcB%QkkP17b_(?tGdR8u`w z_H$HXGRsKa&P;t(N83~Z#8g-X(^@T$PVKo*6*uJEOFQ5OYzS6#K!aQUN{6& z^#VlrEN(EQT$>baa5rfcoV}t2RLxfPQq}2URiot3TMgHMqgCD{S8;^^S?$qWb+}!{ zO1=EmV8w=EEmnF}hjgeE=VVrAg;rdv)^_t(PqBq{SO;v?R)dXAsiapSu-LjzF(~B*&jO|q^fLCrn1pX%dOEu^PN=k=W zVAGrBl$j;itKHhs$ysNKg;;O}u@&1^Xa!a{+p{GEwLRO09a^^q&!P>`w;j{D#fzh5 zv$S1Xv}J{|9a~obTfm(KTEK;1C{(6(S}AZ(T_{;@XoFJa+CRzKnuT1-1r@Iq3$XQD zS18-PWd*e*1hxg&x*c6?Nmq&`-IR%2JH1;G%UjUh+rAxJzy({uC0xS=)~0>hz_bHx zPzQ8y1w2XFmBkZ6=!SH7iFLq+U5K29Km=ewtftroSa66nz=cO49$>J8g_wnuP>67u!a7$6>e~a%57o$OjwW1T)*Yqz5U$KMO_^3Qq>*O9JbpX{!-S(F4yhc*cIE^ zjfL7R+)G?q+(ldnU0ij*h2Y&+JfVew7+6!v2L0XM3_c}b=wQZKB}e*QgRq0B5Z{Jy zh3;JlTS$phN(e9p;8nr}`NgYUA|4h-l)E~mb#UJRmIwlNoKvbKNpV?I;)X+Eq&HTH zJnjO3?Sfe7VpHk{=3NL}NGw*Wlo6ifF1Q0he&bI5a$!-fh|3KN86I02Mq3+Zg|_Ws zSJu=YE*aAW;#khoAik<0hTT^1+apfm+r@_5P247(1xo6MDOOoLxs-K4hgndAE-(c5 z#jAx-V_WeBJK%y@$RtQH2tq)dZt$GqeP0146hdZ*$x(+`FbFH=99*~qE^r0J3FR)> zWNt8oJD>$SsN=^0XGLKLZLl1J*c^7ihFIW&;&r4y9$mfVFP6uerTHK2tCZsbv(X`wu2vNhWp z*4tKoWuErowyb5N1!^I^Wje}bv@PPlon8K4UgE>mUFHM>Oj3uH72YZ?*;@IBu; z=mIWq9Ceu7N%CjQ*<)V-W6dd)L!sspUI;jdihu3`Gv*wbz5~AM9CdyPbcm#f&gj$u z=`H|Y&Jp0S&IY|cYg-Xuh?rShNoPwgl)Y|>zgh^gHfw>-D}U{3TbbNMu@y^-Ym{b) zbzWDKS3rG0qdr@t z?&ZN%;)i5nV0Pjrjq0hUVk=&UU0}_I2x~-ch;C2^EuIuKW(dHxYs|)mLs*DdNQquJ z?UyL;^nD3Nndg^S>q7SDg+K^&ZvKeLAqa!WT3cv{xK8NArU~z5YlO&aj8=)l*6#5I z@W3AMmsM-My5F@P;r}*>tmcNT9_=nb2y7^9*52?7olVt(?NrX?oxbg!-ffTSZ80@* z110J?3U0pLW!Y8g;{N4ehEV1{=9QhKf!&5$IBkZ^)MH1n+{o zn(u}ngiPXwyJm;=e(#sPZ~||L(N>gn&~PR{Y(Q=bOETxhR&cW>@`f;St@YPipovQP z-ZR$T`X2NC)>?zu<8%N9RxoQ0-*DId3J{lV5wC3$=V=wETiZT#|73Btaq;1naoc6; zCU$DUbOm&fY8=lKT^LwS{zr#zW(WeFT!$E8As_W1=Vk{l%?}BbNrFH1oO73%- z{_}qT+!^j%&!z1`|8~1j^x;BrTFzlcUmF+aTV95A<9^7d7G}T{Oqf;&V94}5;a@DK ziR4Y`%$5jQH+5q-2t^Ta?#&d^PIg$Ia$Ct zhX{^m`1l^^hi_~ zX+a-!f3tafdcmCEdG;W8-FAH5HuvAAKB8auz@70oe0TRe9Nz_AeMM%LWgMIka*g zeshVadpf`KcZfUSg_Ot!LfN&)+7D0luXyFPLW#K|8QtWWU z#to6fFcvL>(WOpZw=Q11Aj-Cm+ecsNuo3#$WhE_j?0|J)m5yDmT2XOL<;hN)O`_NiO~u7-9j%qR#@d<+CmTC; zMyc8q%dVGNuVA%u4XX8L-J)Iau5{&+8yC1it+Mmg_iGoiWLL7vrcUuxqUZ=2&a8Pe z=gyu#gAOfvH0jc&Poqw)dUfbnhqg39@^3cn+O`V{6xfOt@7{!d^X9+-0`cO;k0VdM zDgGbx=FRy5N-ljm^-%e!O`xuQJNNG1zf+$(Y#Cvge$+zdy&t z&u3n(k8$_tuUx^NfXM+kpn(S>n4p5|6}X^-4?-B>cMWovfQ1)gn4yLl^7b1cz4g{g zZmtw$5JCzu6oo?&Nkowp7lollFX^a*jw>I5Boawp@UqT2yQs9%QtPC}1vhP#Ws@s2 z5!MA#i4|tkF6^+=q>}2a!xmpQ5rR%muuN48Q!sUb7*=}qlvfvag*8@^GWmp=lvKK< znOv6zHKkO4rAgJ3zC^i_o=pPQ#ZY6_GS!mmaI;1icCeL>D?y35r(;QW$qq_E{z2*! zP^^I(s;HxqTB@n1qME8ruE8doZLiXXTW-67$cl%-4QJqT{1AhPud$fJ9Ci*`H>`xm z3W#5M$THjPf|A(d4}ZihmrphJK@eX)(i#^|KKvAuof)DCn;mf<(31}`=TYdacI~vV&e9U38O z6I4mnvc?^_xP)gHw@?Y_O1@B;&DC76awI#tR27w)UEsvdnMk{-s^gDC9=YU`Q$7`| zvB8?Tth&`|tH8n?xNCI%F}Lo5#hRNhzRIfJdcNK+3jwm`n1|y6jLn}sv4L0bYlaBb}*H{Y}8Gp3# zj$X9nV^mb;6iZOE%mhE3iP{vI{qUzFKUKZZ31(q=-~O6XIK>%lD_zl)$>P$um2lxn z_EQI2>XaGB%*=l1m|E9@qQCvc&n6w5g-bxVj>WA67X;*=08#!%rEPTK4uS(=H|}u2 z!zB)dM0rf*dg#L+0x^h{yPT^scN>C?h*luF6)Qlet8b02IJk>lf>75yXR+>zT1*hM zxJ4}}BFBov>4ojil`bmc$8-~Vp7E5o#Wyz3jc}YJz2sON>EST}0jnN}2sV%sWlv$; z^WOKuCq8U!0~dBUANq2{F&r5J80m=0I?w?OL{P;L-KZZ&re>2h;G!o~LI*Ew2p2eM z0}h64hm*(!rpBQj|$4C7Ki% z6sWZ_9cepdH%chYkR7Ie*}x>@Z0}Tqir*>CSg*hKNRd z)#hBGMBjWaR|68=ab`zF1c{N34$7iH3+f%%kuG?|ffjVMgP-@14x(#Bo*fNpQD;^3 zq8d$5M)N4WJ$BBIBm(4#1nH2Io)ku5VC4C5~VAs^;!6**^h>Ubmy0o2U^9B&2JbfBtLvySJV$*~T%G?CSBT?1R) zqFuJ+!&bLym8;Xa>S4($S>yN>u9r2=41VE`{^q!Ys+{#KXhnOR%vv@%o&79xLR-~- z(xaip@s>hmm#(I&Hn7L(;g_^Mg*qFec8-Zo+$R`|GXvV%4if3g zk3#dBAI1_VptuX(2g>o^V(50Zw5yg^o%)UcT1&AInCpb=n$Sh;*ExbM@PQLtoo(@9 zJozccanj0QW6j{f|Gk!6!SP?a;)lPs!`*zmc)Pbc$Ho=@Z}4cGKlWu7yg>ul##wb#A6DJu0mWC&b^uD%dhgn@N@<7yBiJNISIKfRTY#1h90 znqWp(jfK1Y7-x10ijl#uR=i>8eqVY6yZjjgXIQ>H00x zcDgx&4db@V0WMC{I*MqumZ(WBVpBuF45;1~kca(fY)P8Zw*K{mmo3rRv3SCb(8jc| zjjgA0+rHzWc4y^t?Q~@u+|A~-UGFOB;#6zbq^osTlU+#}JA1V7AzWNx%G}Fth%2%-Fp%X*#tIU;t%pF44(m+&ro}aN%u)qd3V+Zt|07 zCeK2}0)VP8g_lnO3Qw516PnNjCNRMcc9?HcA&hL}Kw`5y-d*oVJRK{}&d}DO_l|R? zU;vZOce^#WxSh^f3wO1_QlxrUnI2<%XPxP@+nuA^?QW?rmFod!j?twKUMiWS$+kV z!(8Sxw>i#r&U5xKIQ~D`)(&C2oi4K<2X!1aw2_e`cm<37jBaPPtp&^KtS5Oq#;X3* z0l$6ouf5jZ%0Bwn?#0}RZv{v+wIvnjdo*=ySqam!QBZG+=IJIaJS&@uE8CG26uOYd+?y48UEjQ&djN) zGc`4{>UXj4_rBQcd7pPJ$tT^t4@NsY+i(Kgd!k#RGNjllxd+Ci6Ltniz6Qs!1}CbJ zUmTxLD{?Qa!boJW-ny_XJoU=)`zMTo-|~&n*S680L6-yxmoUG_fxodAHYN`?rYLZ4 ze4_!B{Y=bRP`fZR6Btn6l`an8$+Ec{OtPb4G{+Iio~ zRq^`Q@i-SD9QwF~gighaVju7}>^7lpD?5^h+(4Vb`M@C@jLcnzLKDVHN}r#I zhi%KYu3MLXw=o4oCvnNZh?&cZ#*LG`On3df=>x`Is<#|@%`w5aSX8gZ6bo)ClvBUI zd;NxV=-Nf9a&Ade@a}Zz8=p^500j2z0(ZhiwOnM>FXJ_;uL<=EOc!FQ7BWl)tM?KH zQ|pYE-urgAoKvG`F(_#Zd09<}B#o#AD5+73MHEdC|y z;;VNhP0XaMsl88(4u6^8PCyF}77IayhTt0Mx8{Oi(G~XR%_k1&e+UbUEJdq>W~EkS z+>Ax~i~HP}<4U_`92XQ%Zl+=sCV!vImYR$74>Hx8^_`dxTDeO;d@uU!O{i{<)X`M{ zvlhHUfM08g9G&edI)m?6-T*zcHX6lCDtMyD~C8|Lz+ z;JPs5$=u;-$>X!860$evryb@}qOE1fchy_eUDUKq9bfxt?mS~IkGJ~Kd)WDS1;!pp z>lqI&_dpxV%*kF=2a2(w(?TO|T`2Buf*e$Ml0Yu0xo>D<;ck88o+%~Wk7A6NCqrs3 zdr0}ozUZY-pHqlJ_5S{u&Q{^7rD4x&xo{7|~LbF7g(I;r-t)8=gQ+Dc(_k;;5 z@TT_dQ_VSd!^L*K`+Y82VmTp9HD6FHCw#vLnW&U7hP0w@<*{v{G-sR|7S2tJ^c$hf zmsRs0x8fQR<7r_H<@dF) z??c3KTP7xzNKl&1rg93%+RF2jMM*|>i z0%K-Pj{VSjR*lt3_6{dr`L}KgYBcf8DT_r}oH9zJIuxetnw$om#oJZ0+J^PS0|qI@ zs$9af937i(MJ5`lToNO4-9k&+AhY}iONpRW{lYCb&eM(to6g+qq9w%Qxn0j^df)4) zTJnBMX5;gwvckb(i`Dc}imV1%B7a^ITn*Ir!SE^`s|2sLURK?>*-SH0u@6_`nyOYB z2cBw#A3D)ylL225rvt{O1~Q`?KBWFZJ|BaM_3ciTN@g0Q?D2@0PcD6- z-##Df(E2f1ZIux?d80Ia%G@+pCKlPxPTpV9T#fe}Oul`#@EldoVf<5_snN)$1&eOE z@Sw%H3cg85)~ zdYLB4w$=DIb@2$E>VfC%p+h8L_#p1E_s_V-g_xBWW2q${_B#(!>CUOO=E1jr*&4pA zAMQ8(ubDz}YEDw~PNUAhg;d*d91ARB-DucEExM$q_GNjX+Zoa0X2FKW?fW=PeD9UPXbrf>f3(~#7xVPsMtbojW1WIcOssj&ou zjYR!V3^tqy~J8x9f;;#$Ks#DZIdPuf(_|P?*MOU{lHNjjSE=&rl0?AAG5c zBIuM9Xt$!dyAoux`rQUi-0Vhff9>!9BiIQ)+R5tf3KNdvr*$oS={_8x6OR8d6iZMB zOTG%&dEE@PCuzk%-Ah1?K3lcFMq^@=Dn3JxbD|)+p+J%(_~Kxk>vWG&506z5bfZhO z$Kio|6x4g|81h>N}cp8&lZVh86BL^vFcE;qznt+b8T)*M`H6AZ$Q=;QP} zw=TkT)&#A3hm%!Q4!8XF$JBc_g8nybWTfIuOchrp-i)y-3{eUhFXP7}P7!)*@j zNRNQl(#s|Khc1js+OkZ4Kb!8$J{T37-^!icsZYBq+Hh)c#c7!Gz<+j?d~sd1-jc#} zTO;I=5pR^?a?`1DLl#$~(G$u&inQG%7 z9in^VS_9qT8<{C*1Hl%eb+?{R?xaU|X3E@mp3SW$?P1eD{&JZI_ImaRXfORl`v>GSM~<(P_>xFTBRL53zzzNl8xOn6%DC zyrxwx@unYgp`NKPoM~A|2_8)D!GA;cJRC6ZJ*fWv5`BVZHhNj?x5*K;rH!|@*gs_> z=|z$8r<+D3*l;Hj!K(I@Lrguhu)PZ!A(Tx~PA}{!d95jBtvTY)UEFQA65eTFyxo@X z-5lKAAH4LY0x8;HEl~wxiM%Vs+nLA(uyFzl{XJ8d9!drTnmM=8XS{!`KmXYCt~q;@;PPn{d}$OGY(VO?yM6Kv-V!E4CmHQ!k$@AGrdr~B-s`{DWLn?SR! zlf8`xT4NvyNNlYVC$sDc=;t%wz)#TygF`Rc?gM>n4{qxi_Ug3hij1b|@%c9#+|~W! zGm`XeH0xt++_ze|f2}B8Qni+Jl&};L5uy`flgl4jw!clyi?LjNdk+p}0r<|KzRqC# z&Jw-OQu)p?z0Ps@&O?0py2KacUj^|M7Ij}2O?{VaUYA^amwjHBgMC+`UssZRSF>JM zi+tCrUe_9Z*T4K^T9G5M4aBB~8C3qj+$nJV<7Md9H{RplD4gFms^5>Yf7?XRonfDy z%jdDAABKYaNHwA)x z@2nGgHsE(Y4n3du`?C)Hv*&kl2EDlTyM(?#FX8;JP~Wbwg|A+sNV@v)J_ceTA8s1D z6d~=TJiOjf=#7j zi9WcSc_Kt%)5t{qT`*F2Cv&Qjb*EO!KR=w$HDvuAIoldjOYKz+op1l^Q+3r%a z55&RXr}t5V;uXZvs4p1d(ky767CK3%Vlq_ijDVWTtc_S%-xa2q#h0Zzb*+HpYB}R3 zlh*A*=w`j>;ojo@O6YF8+Gw@h;!E^kqj%={U=WV&>9{ix3E}f2_HsTL&*1Zb5_`Lz z%vXGA^&|0d|Fe?8teO~7EO$+>-4Vi|RX;Pt%!OzQXT>Gou~)t~Hb;m1>k_vQ;( zF93nK?ngKBM^GO;uEe-VGqMk;zXwfx0yv0ob6!6}OEuDf!KMo*!OLkAEHTOJLq#*K zuBR$FtM?5&g#R@=VTjPK3oI>Q3&xBj_5BAPArB=^9HET;h&4)`qL(;IoAV88jJ_m0 zag6at7uGmq^h!hVb(dZRv?Pr%tD-c^d98vDx}cXd$-DUtTM2p}tw#Tb*M&X(5z|&> zTIluPEwj*URQyc;Ie&HJFUyV@juGmjYI01PR}dGNg(cw^HqYkWxYDOrocHVYBqyDiORL z-kK%Mx20;aABsl(5=?qc^$eWf7V>3j5b8h6OEWvoyQ(&&Y`SmyLbf~)a?-ZE|NMmf zR&x5}fWn!layfAyMUwuWG9bj?V;ZQaxfVtOjav(+$z7?A80~18vBlM|UU%S&QQyEA z<@q9^ps4=v>zjrFG~*yu-;dxh{cG-OvG1_Lw8H(IMEX&#FOZYC!y#HW_5R!VSQH%OXw-Y_ZjqMqgU%6DWC>_>FbcA)8E zDG+T==n$1NmE|D(fPs37T+&i!T17D^aF!s;yLwhT>qmSuLX($$GbXLkX_)PW>v=Kt z>5cfV^z{4fMYp2E{pGyIZ#63Lg@tFZ=6aVHl7hj04hzHcOt+o5FL`V+4R zS{8=lhPh9Nd!!^&b6@g=rWY!DgxJm;JW1}w8K}RxJBliO{58mN@Y7>=(J=4ze)D0| za}sWA_38N!w5Lbw_;)ht3lwQ#%OA!p`o2v%eMR+$Y7^@6A7_t>+v^KoaPl@hgI1rn z&1?l|250#vyNd*Mn^!V@>)XR>q11osbh=4PcY@W;O<7;G{)ms|NhCGT2-^6U}5> zfC}RxLf~EP-h!$PC!Z=_3j_Y{l)OhAOef(-Qfrqz@SmW?hzb#Ky!?C2KH`TFZDvWV z`)wrhYOE;6q3|e8Vtndua$esKbQ@Tpjg6b`hw`{Wels4%Sx_UWo9A{yS~7oXyXv_%pyt>JGGsqlws zDpoN}Im_LwC`^qeA}F|*;=dg@lXsBINW0`>=bU`YAmJHlnVg+w)O8&E_==yReGHfP zv~VQ!R1qi6NQ3jQ4vC?RQ%*)GQH$$wh~}w2*6!Cp2KF{4KkMpuySh0t-}pGu9E&lY z0_QZ0Mw<6XMf8Zd8>UIKAqwKiIm_>R8SNA1GMgsy9?4C_Pgh7}Q~f}BlcM4a~ z?P`Sr*qL+GRDzU4LanH0&2dA1TrtP3w z^#IDlRcW7l?3&kqbf3*dFswp?39;P9*f_oOWN4F##}>|%$#v_YaWDce-w9)FspJ4bT^D<9LoPH@L zn6I@I%UHP^SFhJt#P?1L)4_!hwYxX)CE~V^zIT~xm}pXVBn9hf+vuL1B>TV?L3(?S z=swQsU%EeFKmMw5Kk`nNpftsfc9qkAiP8!|VIsbCQ{!KFS$UMuR7%2Snd48u)C(%< zX=*y~cjyHcQDV2qu3zfgwre+p>@`@4n)8f-jq7BR`dfama2r~$H^ew)Z9-iYG>7^0 zYFZMq4ZmJQX>aU)5P-y8p66?n%1@VVxa9p_tfza_HYf_AEF#NC5>4qh7+yN6?UyU& zK9(?)T7w8ZDyI8E6gZG?ahON+4g+9p7pD9;DmBcbQ^!rl;j<7j7C@o?!*jn)dbukc zyX&%XyYRN|@xs&uO&#SwGVER`4YK0h#Mx!$&xZ(Io>-Yq+2MUIH$_ z6p0Q)VKE0mwYxMNXW4()+Bm)I?N}noI(d{@Sc=+^Vw)cxHG0uR}uC$H-L)=YORd>*z3+25KD!2riQX0HiIL;VHo>~n-4bh;8QZ_KXGXa0{ee;FmqWid0PtC6_ zq97HYmc37b**?6!wxsp(?MbD0@UFrT^~~_?xn%}=-~OJt?e8y51bKTLRc7mj2fV_7 zdY>_8{NTEN0~{>j#_Ibuy>)sI_6Ex)o_k<4Fi=OBpnh1yYgm+75FY@H%>nia0uv>G$1$;}RI$Ds{+m{0 zh=W%5L!Xh~^z8GVl@Gnq7&uv$dD-fNC`ThyPITg<^i;cpf`Ca1%U5zZ&to`|LBQIJ zQ9sy`t(qDg(2CZ~TA0{!ay;x{4TNGFvh$rd#EG8%BvEJbnzt4?PqomKgPx!9h&mFF z>}su=13#K0I=hazT}7uf9({V|!Qc!L$_=x$TQ@b6z)applpeL{9M@7hI*=)QKf_+? zsl0<R9Evgv>z+fScH&R7138y*!K%6+(^MFFyPE|Yt2jo#0Tp|@Z-}wA7bXbEvqNzR- z)=?rb%6UjNLGO2iVa4$ccU?aiQS`IH{_YA5RLFAbCh2`Jx;QmZM^Xk+30jeO$|%cr+9c%Y7t?B93!HC;+qe+!7ABd>nOQ*d32Ljrz2H z%Y+JoT|5(fvxbXS6>YO3qJfbbs|>1i~-etxR_TwvM=quqQKUHb6n+4wgkIcRG2$BEsu<5+N~ozz z3gbf6=~AiK@Laf-2RYqMt&%i?X*BobTx~AC^tjJ2*vJx1Csg)9!bHC&Vaw4lystRo zpI(?-z5mL5t_9R0ShTwT*>Uf5r9Z?tK2=(Ey-s32C1$QTjaY`9vXaFw*@Q!qqP`@g zax61i6QzF1XsP$kd+-kRpbwcKsZP-9Stc5TIm%x4tmm^kYp{bU=}DDKI8G6Tspf#0 zC!ynE+p8jRWV~X%YeGy!Yo;iJg2_Kjq*6|xW6q^bDX`*vVdk9w%*SOckK@e8!|iXv zP4@s|@-X4~5+aS?&hNpycj*#H<0=WMk%8DYHfw9NxDGfMbS!^$;iRuhE)AtsRCa2TW0}C0gk;?EQe?%%q zQ+A)L(GyWbh1Ny&;75N@wu=n2+k+@?*B5G@shsenvIB$q`VBlHS2slQr5pm#m(%J% zlXxkOTGQyY4J5rP6r!$K+_xBPD_jJ4l7fqB!s(JMX(42JrBU438Q?T8d2ebUG_f~5#R#~R zA!ci0iet)=FOqxEuG@7&b3u@I?UnwJkrz&v(^DkfVwREhlu@KDT}4oU?d?^gE!5DS zMJAO>_N*K=9oqi^ZioPRi~uH(h$piscC|?KIY&CPSn;`7O(0J< zv$87F)<7UXMZ45$E#Gaes^{4b|GE2{PWd%$`S`O^M5a$n2i-_J@&rLnN@h;;U``og zu53r~nRcbxTII`HtubO%l2^V(N4{Mq+yz=awr)KntDb1Ro{R|EK&9J2m({?u-oQrG z$knNW63{5P-Y87eB(B>eoz*12-lR;_tft%ir4w**&bX2Zw?SAV_&%)bsDL2U7I@dH zKG*uJw_eiJnP%qObkK3Hx5W{)C+W7QWwmFmx91Uc6uoyBWp%(EHJ^!OuL~6Y_Ac7% zNKebG5!Wf+d#X_MZY_Imo!9-jPSe)x-G<)Lv8UU8l+}H<-hD~bbF16);L}kn*lFt1 zX`x#qEYRhU)pexZI{lKnoYhA}thwe>*S=Qwl-19)(a%Oaz@<09mp$-dqlZnWGhwZB zvAxC4rwj9At)Nt&##*25#-JiXe``lwbmxH0#*hQ?unSag*du%R>17};voq%qCsy4=IiO1iEf#M%Wq=~!i)@yPI`zCz`tMW&u zi6@nJM}b*wn1bWKiKq7TrjD|w&OX++68B1Gw*ZMJVn4Qy>W$9p&7^(InO>EK&jjZX zbpOeoCEA=NBblT6G;sZ~7vbB;)5fpYZxeqzCXhDgb-QK~wCk`x!QuHo0!E zS=8NJG$dIv)nBs6S+dz&av)iD(O>q+S@zjn_9s~h)?W$FS&80Ui6dD}(qDD^iASB& z&7fb@=`)=nFfm9x`bWD@Sbu$4Z~;?4Lw0ka6}SjZ%h?#;+?XcWoY&u6&e>ew-26?l zwWq(BwYhpgwAQY>hLpXgOgxDF@qLGX`>kWWQKu9rxG`$EaiG5g$=xB^+94y|r83y1 z+gdsKxmESDFFefQne>QW$I*6w|`lnXer|qPdw+5FF zxtA}{)1T0@Ji&7>zjM^CH7B3>q>t;1xzKB`2=Er^4TbQ925lX}I@0OZE?r8|mk9T)XZ~ZkUdtOAsHp{!WBEw~eF*G17P5JPUlYwzc4&=;x z2+jL9{`=oF+3RG^W3+Jlk07|y0E~v0yT92jfu>KAYv(zJ`$c(g;o;9!WaOWL#QdPe zo?v8bM!k``f`Je@N-2dzcwi!>WWeKgFNHWFpIfe@j7UTAXcE2h(&=DB$#@#O=~%XG zW9eiTzsu>yXk*!Qo=7kXiCk0pEVM`_iBW&7$!c1Mp-3)AuDNotN~_U&b1a21q}J$t zu0oV5OTtI`;TaG#OPNTGMa8N;S6q|S>5+H5Sp|tQ>`{Y7#n3CM+Zl);V>Fm(tKS=r zr;^WAXm2U)e+5T13mXgV1=7w}U}a^gAIqnwC4E z_~zw1VZ`po#_IE-{7bfKP_tfD_jRY%H4pblX#=mrg7*>P>5j!-EdOEo-uI99$3>?9 z5WLp>oe=2BL3HK;5+rW?*E>lnQVa*l>Y7#uDO%6`;iV4>$;#WSSpN5@$1 zkK@v+i;nXapBZXs+i4|6t*Da8@7iA4N=sV;{yyr4IYj2GUU-P@RUfjr42$*>FT-hu zWu+yf=eEGLiDA{4)kXV-`}y@SdH8v*pJ*Z0ao63w$7R8Dzh-`*LQSAVKlifj?IizE zwMzxtE;5OqVca_o?)xWzj zd>41PEa!E2TD^UEt|6??$Hi$%&&1_rHP5HjwXDNub;GPL=S|D@ zFMnDF3SOWWT@M#8m%T`A|E>mljQ?Ga(AECCnc%zpcRM3~Idr%1#o_huibd_~{f5Wo z>%(?98}xBM%>nv!TvqFQci#GbPBMhe_V({?+2QS??Wpz*`qFyw_Eyf713<#>U~$ZM z!9>meMY}}Xg@575DYvmlE7OOfbM+}D(lyH|@jlj*cpM z-z4RumC#Ew$ib!GB$q3cFn$>w)9koOsf#ILwvZjyS-VMXnvjCotcPMrK}>o_{CvR-PXmG2whUJYE5##xAi1Jan>s zDs%0wl+5Nx&87zblviYax?%st_ljkwFw&sb1y{h}QXAsWn;o z9@8mT>HW7V`&*?}-q=C|r(33sqK#~i^Jgw=R1-Xg%vq(uA>Qv*+1!H_1`lJ)LMPmD zA4{fZA3dpky3yh#Lj!amomwTCf9v0ftIX(tOJh2C$$FF3=6vI;1_t+y1=-b>X~5Mv zF_+>PMHboGRn3M9$rA9bxxBv4a(ai8lGmRqdyjElBK<$gf(LP;-ly}CGf5%glGQ?^ zg=>eEe`QN!FQ}yD^%a8dJ60quEm{R<&%GZy@qg5KGB9l3u-?c{DPCHSLW3r4JC+pi zBk?7*yt(`PlG!+OD&T#_e?y-k+&yikjt^?|&)lN9AwQ1l6jru!(LetLvF@i%$nOAR z9{LmDYs2^^b})P%2Z)BQLYZt0SS9iMG0d5GC$&nOUDax~8ZLc}UDurt?tA#B>c5jD zp~JwX3g1^w2S$%)f-kB<#uS~(l&TF_6WY2czc)mPDjYECK8+10H>3(b?;mHTk4|ZD zrfXJD+I?qiVbA>$Ghn6b-0jpO_`Nav=wIA#sf*#4_UZUY+hT88t8!Vq#(Z4V!$X1g z@d&B?R0xX>v*7dW*4L)u!OUYh|Mr;*lBWDoy~E}1^peIBn;lY5=$Edo^r>>CzxJ}U z#V}c=y@;eY)=}rFj~&eIPqq#wJd-vGWi9e4818CxisvRa1f4@lEe&)G=jP!!&E1Gx zwPolq`Yz8uuV@I%^`Ac@B?>4JavgopP`q&7TbO!ra~RCOKKX_vQki0`|S zJpeLY66jX_HOFYbJEjjq*=r0UbR5Fv^&2tnLl2VDZKjL%A^+P^ub!Vts)NpfNEzR+ z--L#J==PJgrS)0A(WJi%zMkN0Z0E2^XYQP~Z%UZQ>Y^~IuZtWB92+5ZOb;tr=8Ah7 zeNgUPTb{aaq4Pd6m*!a2CcW>dA};ZBaf&jlGB5V`IcfXEvw)=RSzge|eTo;cSlfN1 z{h;0F&r2Z`Y5g#Uz0HrK-Bc=kx-;?HNmce8qZ9VBJ=0%rtYPD4 zx%Y59gG_}^|Gd}?jU4z5#!YVnd&*!i=l8!zw3+|BNt^yRS_OT&6MFqAf4MQsMt`?r z*!dS%;`LB2Z*2xsxGYNqOPo}q5N4>MNLaZ zO-DstPg%oQLDNcF%S%E#P)sLOR3}12H(EqDR``GN{`~*OcM;wHLhrlC|DHGzz5j2B z>c{=>_%5pdKM>Q8kyUf#Z5KL5en$L}2b}K>xttpy1Gu zu!ykmsEEkusOZ?3*tpp5@$Y<(ONfh4j88~PNKAg85G5w1B&VdMXJlpP6%~~f zmz0&3mj8#c^0Kmu^76{^ipq+Ls>;gh>K`>VwRLrM_4V})4GoQrjm=F>&CM;XEiJ9B zZS8Gs?d|Oy9UYzj7oA<5on2jBKi~QJv-_Ry?w+2W-rl~xfq`GY1_uX+{#(OC!^6WP zBV%J@;}ieU z{{KrG{}1AvLe4A>Zmz-D^) z4NenWzo5Q^Dk>O_PN|R2G@hfIZQ}kU(WHv+zG0s063{s`Vw7pN$7zM}dO5}ITY@zs z_20f>2LoTJJ^zn?2BuVb2_`}IWM7edp3=`}+1){;T@nwwOHuLd4XEmk%}U49?eTox zkipe-lT#}#ad!MTNj=xh;@R)%p105UaEq!F{8KBc2BP61Uw~dvp8psJ1L+MBuU_6* zicTQBDDwqQuwfWDjD9!bAB>g^_qJa8ZxQE@drAyUiS&Ch+=$^Mut}D1-?@U=wLml% zmh*doJa|_739(>EApK?lc8tCd27DjO8-NNnLFPZcK@lAi$gmw?8jaitw(2Ds?TVmD zvu!z{Re<{jRN^Zf`En@Y8_1`m;&6X*lt&{wx6h!PqMd7)+Qt=262NJgutoGc%L9*5ECE9$QYR%0>n_-i`g3!_S4QE7lw9dT`@!yEm_<6SEO5?3Tu^A zGFJIo)r||+Ovs)682Mj}1Jj?T1x=ej%`4_re_A%&&;GP-hcR8W?WfvYwEqv|aCXso zHDp7A{@yI`>*wQE)vxYr<`iltS&zCn zrX_BV8v9xHm|cHK^5tyJiZK1W8&LXUN3uYP^ogfW(}RU%NtUmRXVD<-577#$%_sL> z^VV3xwWrFT_dWK@ii8{Z(VzIB>+TPe_*>6%Kl#S|AQ+HszOzsKJ7Ij?c)QM*e;)Va zmb06;gDrsjv`BvsVCcsmxhLuEh~>Sq;!Rnf5(4##Fpm%kR7MmL6mN$!%Q`bUcB9D{ zM(k?I7CMB6LA$-0tt4>L7XcR+SG)Q+Cn6PueM&R%ZD_Peq9O4bz*~QT9=5xfI8SMI z0+J%dD+J)&B!2{`B9Lu68w>pC5M{`D$KA3MBeWb3PYkvA85kl)*2|9y6)O?Gk#vx< zTN$L@-xIz^4-tB153P4>?PcMK|0Yvu1oP$;W_CP)h2bf|K6D*t710kzd`_MyG}1#A zSw{|i8K$-`0LSuEVL~~QjT0i+$bzgE$p3luR{KGJMn{cm?&Jf<%n)-jES9M$&1xrdUFxsbvs6jA4Qul?d&M z_Y%(Act4t7lTp)$37IDVg86sJ)~F+uq7_ei;dM+_W2zIs&Bi<3-2gLfPBPhq=hkIIE73mL)0kBxH# z`jOEppR1Pp2<1LpxEh`IKX$QtouK;!XEDWvn4JEGvnD#2F_X=boQdwcDh?Ky`L#Nq zk6mIaVVpWEYp-rWg1ayM0q=8yCbx41GXt))0C!5wUGd7V68X@P&!v;g3y9yj2!4jZaqB62m z1)v{6aI8lYGz%w>J(l8}BTtB0X%2th#+EfHz*HUj1y?EqpKEfBX=q7KixDruu)ql` z4}c>kD3D?$r^HdoG57QQQ&4CPj*#Lk4GKX38lp4BOCD1tzOGVAcM~G<AE@Os1bsHyNhM9xI03t~t2 zm)f;X{)lwI;?+ikGS4#uour=<|K5bw75f6sN3(E1=VD|R07Ob|BLLC_1@3rPSgA>a z{+1DMKm2R}6_jscFo2i(kmZjRO~uyVANM}(MhhalSJ7W1RC_QZ5O`3W;_KnlYsi5y z_bLrW>HJ#c9I16|ccME*^aNZFR1p+ln#!5O+}~ax{Q6i9p#=K&o_`AnOYPLuLBg8SE#4dv|x-v*9v>2u;0!OvrC`l5PBcZyq zgBOn=&6u0CV%=#rN}apWj zIEny@iLc+XsHp%XQc}Z4col+F=k5<8>3?8U9bX`XUy69MDZ-U42S`ROe~CQX-3DOl z{TclM&n5*9)a-n&g1ZXgrRFH`C*Q{29vMVn1*dRVkFbqDg}dBP*$U&!a}9rg2uys8 z^Gyn0eRFJ?EqcW?(c`CDN}=5UB)Ulooniat_DVmx32{lQVf!9n>-Kk6645v6mhj_@ z`)E>tY&J@**1ddRQRK4OOrToD@D;tQX}}XjIR1#g#Kkp~FvffO^=<=mU-*#_g_PIu zACgzQsK^gY>*GfTi-8=$qqPE39ii5Uo0Rj$rr7s3T9tLGRmb<*x z6bZ;@!C#h*km2fmGjI*w0<v|a#;Ej!2(0k&iNTc`!H&5>rBh~;-_qJ0?B-5shSMA_6buL5IR-$l2~VMt}O zt=iBBUvOxhh5j}T5)c5JU8m3pfbmTLWQu?llL6oWRWRjhsM&9po7>O&*rQFEwQFHb6Gq7@C&<&4CYN(B)%Box(yq?q6D@9)O64 z5q>%k#tB0^zy46sS1pA#0DBy7D0zjKjg^Z-;`ez^7k8 zfptQS+#r!%jB*tR3=yQ&BFv&Ia0R^yEEuLDz_>9#RApaaxi?@h4LqfS3M5?nuH!;ur}w3BUB>7uY^PD z-le!CkvO$Oj3h_$lz8yLNUDox^c#SBj~tkCj~Nt^q>>8utDtC{NowQ&N>2*{IwB@- z3#_pt!@>rb!(mW%?OK5e{R=o&jzr#^P zl&ygAe`UfZAk`#6N*9ykfGMB70@X?}3*x^L0)lK8;(!t$-PII$m{j*`%t{*A_crdf zZPY3eB-ATFa4+fukF_O~2e{A+T%n+=6v3qgh9HQN0(UXW+C;Sy?WB(rrDT#~!szn( zQb*sTLAL!GcaS+DQg7_pnGl!pE5vH&WdDrh=GNrO3iLoD{HrkAMSfc?FS?j*f{3e- ziy}M>pY{sBJd!Jt0kf%mbExlmi`%K4GP%y4EFt<@Y29d<)qyGXS z{o+WJ(X>UZqkxj^`l`t?2|3$dKAFJ@gt8OlRf}mka}$+Gk-gOw?i&~Gkq36I7R!w4 z$!Y6(IHJd^qj-Q|2GYnr0t@`FbN!t}U@AjM-nZa;Wz0HK;lVCPh=p%;Kx_`k9GyTM@-59p_;lh*lVP-TbadU z+0v5=<%i-w4}RTkHKY_p3!b1NZ=F(|AFk~vh_gQk7UK4;MV>)b2pm<>3o?^W*&P8$ zeip!S0Gd;;&U+#~wFt3$9opIq@(N73IaWAp!~0shc4Sok6>n+|U1*2u1L)k=REQqYibULwFzLMLXeO3{=2!+w=b zL`{FDvlMCtJVnjl6HCri0|V=HQ(o9oa)p-oMp7`0g$i5YIbP;=Q~` zugRi$!59Xz6fMovO2wb9n)L;36t$5Y*6$1Q zxFcG?l?JadN)s=@1_7h=3h;JS7W>dxjYC~m+?WGLf;yD{MA49Y1i1y~{UxXvm#pAS z6Zc$f_$!;gnBLG*MiP?mO1Puc2xw6)%zNGr2UmuO%G-*{m-f5;kdqg=;q_~BYDo!=AusH-FVDMJg^<@F*NapVB=~z!g4{*W z3HE)m5&#tdv{XmD2>GT)pQf3r?s-(ZEV|}S)ZWj;HP;nCUq*kzW@mIsXPBh-EU*Xr zZv%aFGa#igN8Z&A<3i5kv6nWjE1CITx}d*ISnp@vgna|~d~FcK>M6l$C~S7y^0;Mk zzO@CYeOv?$IXbu>goLfv2Z`zHZs_X`qGc;=%$Dk}$f}g~5vQ%v>tb>V@u_g{x8h`O z^i>^Jwgdq42@977-U3AL@Cux@vg;W05oUih%hkn5kt%L<*KrxofP2F=s!xi=%l`VS z>4Da>{B&$Uj*e)2d~wLws%w$S|Zqc51fz$qhCqqcs& z@C5WzH!%@9P#QryhaT2p+@V@QuJz$!%h`o0OSy0D2l{Vi%-E2epBq8qLc zd7L^+NC17+?Gw3{p5eyeI*zrG07&LNaO+#<388W60mhHM#pk+0q{6SC;RJEKw_Oj4*=HJDcj%#Qo)a&X1S*Rp}!jHykN^e@tOFmXGI!3MT8Z>qKh7= z9T~r1$mjj1>6|%YkS1bV9+XponI{Vx7#J9@mbSDDu+9Mw|J-~(zPp79I_iv8&0I(5 zTaO9Sw$I3h@TN&uZ6McRPO(%20+8AP@2>(GbGyAK9Ve9wv#M#chM6)83be}-D5XEHsUYY>jmbd$5nh@6F%R1fSYT|GVpZLpGpQe_cA|Huecrlj4r9Xpp%L%2rqUGig&0~rInEl&~7-{gaf$}j-=EK@HhDV3Pn>ykpB}=S8KqAUtqBj zpEZaa<$6mjrOv(80)T_x^>xQ zw$(K=Mkv4@RHgLOgY$s9*6b0Tpik6yt_*0j3*uQ?Rx9#B89W$Rweh2&nz1RUSQ)6v z0Wg+s$g_^qE}EWSg#insAq*|37j=C!nqF%Lv9OpI`8w`R!R|mu*K1m&pN@-=5WaZCf?OgZ1J~JalfzY|f1PxP%8S1}L0tCe{C3aO>N|(7A?$zer6V3(8yG?5E zpH#BO*GHhokjAme6r=C7oGuf*VayR9x4%k8G)OPHJye8df`@j$OEgJzb)J8Px*UTE z-$OYE3vkw4noe8|ixuC!_CN*xemWS=poKq^ioYMxA^s4*@b#sVUjJm$aE24v&yRYo z;$&Z>xY!nQiXFtTPBb^AgYgJx1QVuEGT{XDk3y-mx8$SAc`f=NPhM% zuky|r&y$`og4N`VSt23-O(pXSO4$G4j#6BDTzi~C4DR@UT)aHI_j!2vc<%H6Z#?AR zOAHwKf6Cvq1cOTcaFT}-4>71j^pWTvS|TkWDI@tv_K}pFl(f8ztb(kZqMW?4yn>2? zlB%Mzx{9i%nufN9rmmK@p0=)mp1!exp{bFHg^?-3*v!hkhCk5btrl4T&m($rtMj#|Ej{o zx7@g?j?=KkV^r?;24uaB?4uU`Nre*Ulh z`~&|Wi@@NZ;IPoJh=|CTsOUE_v2n3){^Au0NqhA068R+U6>g*lq>K*Cs8}98N>KhpB|2Km}14F|@ z!y`i@<0E5}qvKQK6H}8@(|_@fnd#|2xMO+-!#d_>X6I+;{$y@`;V;y&xUle7{@{+K zzp}izwDND3mR6RQSC;=X{|kNm*Zu!D4D!EWkN?CS-T(HaB4Dg4nMyTz{V`Mm_G?2m zf8maocmM85=|=w#?)a-GMX7tZ_MGHDdQ$nIS6up0^`*1LT7PO%^IJ3JY~`4mR73e< zHG<8mpQf>5xekLnoJ4;et~9xBk7SuPe${F9K0RC?eOP2(=#L9wP-}MW?vfz*gFE<^ z3axgAh&?EuLN#!@*#yXOab=)6qkZYWTr&A2n5BIgsPZO|FRo_@%1L`_zOFW3aS7#@ zHn9r?K1h*yhBVHczm@)oZR<(_ox-&oN*}Bi>w0}{KRz_x(dJbr@f3aWi=MTnpSBMz zlyOSbM{9kMo@V^Ua=iXk=YTiT4gc3YqViX8e5up+BwV0yyDU97gWqQi?htDr1qZ|~ zW-u~+v7W|_xfU3w1w_@1NflKX^zfX*p7u&J1oFoVJ%bkX@?Q_R2ir3sdnN_>6!y2{ zrDy7AX(=v$g@==OPmM~|CrE4EX(;fBf#9UMJz@N?n*fz6f+mLxUoYj-*ty1%K1;AG zD&14Mx2(0}Exd0%4Xx(MSC-*kW7);WQRj~rlw^+x0@WR#jzVz!hlv=TTIH0`JN&6h z5fsXQ%ILHl(o_6ZsGBEUQD77z{WQEsQ$Q44VDp9peAs;tEe=#UsHj&+PohhW;}|TW z**zW>)EU{NPCmuL#VsxS)EzJU92%-9hQ}Zha&Ibl22r{6?21*zYR8`0hQo<0LU=p& z?F4t$D-Z%C93AFODp&+@`c_Se1fTvcr9m3Z~1+ z)~}sM#_eMYUeRe6MZM9`+m~PXo^mA0Aj7QbGKrzwFPMNldmHXNecyyHiTY0`jv-Rp zvHZ9|0Un$pJ~2O@pHqHWFM5Zz*AeatM1o&sI1gg;2YbH^RHRD_Lagn@yxZHtg|6XB zKbNe#!bqsSV`D+CsxC_}W~m}`)x^G$n0)atyv?sb3)x7;GaqzF&MizC{f*Q&LrOPp{UUs6&X!EK}qurB~1w0f%}4a?`>dZ1zw{>rr2u^($6~w;tkEp z{lIEWrW1>Aqa~OKCaDzpcMv$R)FAim{XXok0`XRvmQpvL244fM1TxdMqVli%SpmIg1}kO z#?++zlvLDQfi79OZ}%aXnp7HDaU5?H!fmF)SD>F5vE}!l;GH%sZu7d7f7X zqgFU1Y;NFZbUM$+o-v%>ZI-8DN@9 ziOv5WSBUb++?5{@omMXOT+z+=il&yE_=v_bYF|s1YlbngK7;0QX_Foo zSxTdz?1Qr+<@I50ZxVsrsg~yj?ycjgzmh*l720Wqm9gh-c@$qt9Ll`KpDE-gSJxOX z(pI0*P6zfE8J=kvWFhC1Uc4*gZm>5pPoJ+%+NltzC^A`$o^6zE$kBPnY2qMe*!sw> z!kG=rtPY19d3h!r*ugD-nm*GJ&`|Bo7a|xMG%$&f1{NCuJqx;{``+9ER={TkevwN6 zsByJ`%XDm{qlx#ZWGT--p(8{ybMbjataJGJ08;Ii;ApaUEF3mp)aW5(y=8@=$-H2@ zEhYk114WwWRHP7R?Q~nca+#+yeG&?G#zVlQ1{%IlflLQ_kCI?~eCFqBFGfv2KJsMg z-YwJIw%7PRPzdZS(Qpq@L|LPl0hW%={4a9SMGJbVF0ayW_3}fkp-W|D=9T8X4sq*c zRuJ8b2=YEtdh?ufCTiYN)uq+dsB4N&iFXfl4!AY1I(MPxTY~}m0_(4l2~4h7ASq$& zETdyqvYeAZo{R1%zBDU_^eL-Qwl8yUs95N(MFuFKR(R&Hl0M+{J(>D75|TE(rV_{(jDu?#yG`Cu>XEAVw9L5V85A=(i7?sknRxIb zi=hZmDu-`3#1We&qRvUCxqX+ku5Xk*pjv)Qe2@ISan(?+YVOQ5J~df%?VDhIzQ+8u z@&js}%+u2x*)!00Wwmz^RgugkZ}G!QaA?YhaAbu2V)4HlP=-h1$W&C|FS6&;-{|&} zw^E1k?)T7M+bQxxwZoh(J}u7Ggx@b}S0{PvIm1E`S;*RR(3G_N=GjX(6N_o%piCN< zoHXYp*{>b*?LJKY!14EMbaQM1X(iNA!S5=k_ahv0TNe4O#C38VgW#(p6P^PUjmlyA zT7xYEQ?f1S${>2y^pLHUFT5_@*F-@E>AM*eb#0OaE?SVi4S+E@hio9|X~l1{9vWR9 zH1>`RLCX+FWD?!w_zN@5B^D#CdcGg{xcH@`92bUYZ0puJ*7$=5&8a(-kJg8W9+iuzn_{0)Cg-Qaq6PUBl`EOuMA@^kcDXIBCCzd#=?S|(_%2?f_y_d0 z-8j^`N2U^fQhfXN$wQo({M7D7stgHfcQGs1L)Hq&qlr9-HfF?xuH|4-OX-X6Kl;4# z%R`}Gd@$YT2t!!q+G}h+by#}EuuvvYcc0cIAXZo?8=K?TZR$}J70zmFWF%LSHk4b! z6M~p^pjeb5c(49t-p;X!V6fQPbQ3x?WvVGmRCVsN!4!n^$kJP3TmDb#0*={20FMhge-DzJbs-;Xf=!J&M{L2MfM`pHY@ z;z6RaV^8gHJiJdfO@l=JQ%;?RdZp5Vk9PsugG9d<{eld=X)g5WmS7A@9x;?IrxBE_ zC7hE}vYPymTLd(J#yrOox0syO7f#d*=fbC8&7%xf{~1E89a{SSxgip-T8LoYEfkGw z2Q@&31~qv;E`V5E=uvsePlVAMM?U8*wnzhed|~&9;s|G2@^;}1?(*OqA;-T>2rn(9 zSvg~DpJi4UB#Ox~$sbe<023Q($?H-Q8z$gS8n`QjM%oS%MGr-C+u{wlzDxu^drRe} zU>!x-9Cla~^<)TUDWcD_r@Wf&i>W|IBHK`^!8e&awEPh<%uXAcB-zobw?`_;a~pDohI z+K-Rge@$)VWom@iz8R`j;@rpKd6zrr+9wr`nG;hohRyT zFE~Lw>bc`X0?3lPDI!v_`F$xeNHZ)b!`t~_J{k5qIg8@m!lIRvC?)F!k<~Hu_83yZ z4x0?NhJ|CZ!62td5D&j~od{=GZ93k0oa)b%a*)jc{QYepUO$s58%3x{sk&i8hTn4= zEYUZqjlM=Do;WoxZ*u~zi|t|?Q#TLy_r7m_{`PLRv!Y zU^sB(oo8EVKO(S28=v54NAw~Eo`jhAMkd+c%^)DgE7h{xaJ8fk$9t*BRDNt3Md7{P zXu0hfxsv?4H!W(SIMeE(%|~{xdaod@MuN3HKu4t0l0-d{MH6+6 z6ZK2Y7?5|6*zN%K*R$^kRTXWUrlhKCLT(IV8ZTZ@5#wR2SO}z9;?}&Mm?tbth%J4u z-qRAT=*DPEZ)J!FaC<#rM?d50hhv;Yc%a2{n966E_rW_acR$MwJ3E&d5^kjM zdP?$#Eh5Jj26x5(6afMOG~R}OAgZzK#}cl62QAGBMFTCJmV}9>v`jTnFGmLp`t}PB zi;|^VA>_{p2QkA%4Pi!D&Ozz;V$TELL^@NS6_UHX@p<<~I;Nts?* zYgt@(G5u*-FL}AXP>$)@)Xw|;b_UPHXW0lQ(2t3fZLVUyWRRlL^Z zs=?l}VLiG5VcKZI+_t5%qsaJL?R6{M}P4aUjLprp&t;M>;e0OL%=s+Nb_Bw!U? zwGBbqIc0F{HhJx&acYy>XT*uc5^-$MaQOBokWB(kwqVBwH-$Jet_>X2!3VNo!cF|y zaX6~rRNwi{^xoI2&gj!{YXPMnzFh#zu8Wwi%Qnn-)GqWJyE_roD$7k?LGdh zJ@@^Z;B>uizQWJt;0_+`g6)k8v)U@NE#lWb?9BYz@@?F-eN2udIHYO;2)J}?pZh3p zH{iY|wBON}n{~Fey#O=-zjNmVr)laDt{e3*7GZifHHa9;%@wi}1fE)$PrUO$rLZV4n7C#zLV^ehOJQUla+Mh>C3z5` zW)W3E95dD}_KCfPgrnUZ*olB9XTp4P2nv~C`+S5)+A`mX8H03i@MY~w-Elmy#1@c1 z0C9R<0+(1I%c+(F$%%Mx0_d<}A{Guo@DpV*ku+XYG+z^mAt#QYBE!d^i%d{$FmYFA zw_NZ&#U3#R1gIAQ9WomR^5N9M2|ipC#lQ&}NmxcV@8Mdqog(nJz;>HPI5>Q`EuzIZ zG650Wi9{!8aYs9t6_PEIl;pIX;>-`mmqm>2)J?iIM480w&H}8Fh7KSgy$NHWL|lA& zLAchS`j5NX{A@VgcbfCV0odFRZis-wgsxh!X9$AgR}(pPGeAqOU8*7OXi9-~IvWC# zhmzf&wC}c;lL|>gdN&~+uDDIobHHx1>M877IBq3^!#j_o3B_@X!k@%~(i+2xbcVvl ziH2Np@lGDvAFyFIMc~{S@F!5Oob78ZDAiMf0O-(luJJX>n6uKKtxpJ$i(7*wtYZcI z@Ko%{4AcsNzXB&3b_L-wxCj<&| zjrM>bV2+%{L5>VS8-&<0ThPkCJ@yuuf?)p~r+P|1a|*4kB$#x~pJ%qk={DODBC3F; z^r_pfdaP03!!I}6#*u&UdTMKa8j9>$viq8iBO@=%HCmOqCA%_?TQgJ&r9G;I<_V!|kIsp4{RE z6iPgZ)?wmz#d!`F0o*045q*3Lva$H2%IbK6NeYcipA^->VEwmyol6QJ>vMPw$jp zq$fHzL~c1xhc#fVVB1|Ym}|<90};#)fM9^>N4Oc^WM0Zf91K{LkE4x)+zhbFv3(>3 z^TqlpJK6KSa}Or~_8Lx*69~IAI}CmL9r422(u21P_ZSPb@3ZzPqJr<`eOU1^v z7QrS@v7ey@icF?3%Ewjr{7V8@CtBk;Iu7xKtjUlQg5Cm2ou`aHW#FYh|pn5vzE zIt9Ww^Z9vL*(#)|rNBS9BaU7&06?v?qm;y^o{hmBtk@~M z=AEI`y18#mhuCGvo;p$u#4*Sg(iU^D#u}eqj0Y#e6$Juv`NOvsc?O3H6$QenY?9wa z#0n052|9~?G8>{*_%c(-ppq{eJg%Xis*uqr2-^Komw)V}prc*9F`fYnhu4C>9_N=M z%VuBulJ`)12|qQlR2J%ic|_>*=hwla(aJ?B9|Vn@WbaDw(9mVZ$A|}0sISzktTZ@% z9LO>~{}#{ZfBRCjZcjbTqoCpNSUa}%MJ>}FO!xsk4+Z{HXdQly3x6|nxzB`1K2?{E z7;I!elqbusA(q}nZS=u<#aVtciyF6R?poh1*3sEfDb_7%EPMbhS|Jr`=D>q$uAkOq z9^sLT40{x99N+PUFiD2#S3&7^=iJ2!TfOD8<4Bn}F*?ph*sBme1!~)Znt`~$UhSe# zyV^T>x<$jdcd7i82PyGyWuB(J8aUVy3^QsDV>DF>w397M#d*ML04qOYTpCcZO*2MI zhuk}-3)Orish5CPBTV8$#Efpedp^Z0NP2iwAx6|%1qZa~jg8fQtB3S_ySr0d8~W_x zapjBb8k$G-l!?FmwyM-0cYplFtcH_ygTCRDFrj=pTPNja z2FkO3Dn1gQ-c;MIKu#cHro{#?bRqQ_gTogl{aoD(z9Qfe(szG^fO& z|I_pyicf>-0!$`->6We+gCl%>m%FR4uQ|`n!giF3yCgs3>E)6*ezHxax~Ans;^Cd? zb%#*(<$nyNiGwq96a7GpzR(c;3AC;X0|PY{%7wdIHA)KCgv4f+m?NE!_1}&@G7vRL zvn^_QmTXrj#PmPVs|5EaP5=%ab}^7P1V|eSqzwboMuF&JL3D{=y2Ly5Nf5?lB9?b# z>?t%nsf>IXY+@N)vYEV!S-dJAc-3>b_3}6k3fPQFn2jpvjH{_lkrd`Nq!zU>t9pWG z_4v;lz&17DCzbd{#Snvhs7^M4MmhoJRM_J1ej z!k8?{m@H@*O&J)B+2{?q84Ls%^u-zUq!@H%7Gcfg^-US{5e)h^3H=3_unuY z_+r9r;KOS8iqpuO$LJ-Wv6qOk=Ofb>a;6>%W*$mr?#gEFs^;$M<{larFSIN?wJct0 zn|o`U`|6kn=$Z%VnTP9}#Tc5#8Ji@Tn!JBvoMC13;h9m6opJ7SlRO8L0%wy#HXG z3#Z$PC)!HJ+DZnRE4mviI_oQ2YpWWNRpk{`dBs(4vn!+Cm%olH_Kzv>i_Z6nE_fAP z=oM4)GPca~O@&81(k-#xC8_b*`_8ACebzZcjs+v`C8Pe;6G8P;Va+pfUGs1I7E=b6 z(uS5ZhL^KOmvhEf@+VhHXIHD|SL+s5n-*7F7gstKSGt#029{RFS5{|NR_0e$7FJi5 zS65g5%71{Wzn@rISzW}uWo2beDh)-dVA8|KlJS+T6Wu*tLQ_4F zU$LF7kA(!u^d)7L?yeby+=}y2zoY$m z2jd1XPV^+SEMAwQD*3D>7$AA6s424ECusg(G(DJjb-)6$}J1d zSj#7BM3W{e6xG_wEJ*X0C8IHN0B&bJVe3(;wJ$O-oWNF(2WY z$&$Y|u4C+_IRJV}5_?3Vs+Q4Ar=e=YqRI{nC~7za2)&#zq>!PxTQpHU27Ib69I1Dx z(>=$YfqWjRUlPa2kCc|-zdy`(GzuS-Fs{UVgJmaa4D0I_-X61b5d2Jkr73d%{dxS| z#%Hr}G-7hIhvnqA+e0d!Exc^=DsE=KDJ{UQU7BrWAE+o@v=u4t=BU)G>QX031Nl($HN4@D`iTSxh^F^jQi!R25jyMjy!mP&A2%ZH?2phx8u?7mNMQ!k$>^-|Xou^e$e zhOt=T+^OFpLw~r8xMs4>o`c;5M6)P8ls`cR%WK|yQ>ug=ahIZ^=15~?6k(jrNlaPx z^$C?<3JM)0AHq`;#ml0j%KnnVPK}3>jL%AL#3(_aComdb!$h@f)cfdC+rXoA)cp8I zn4wcK#RyiqTzIP3qb)mq0P`Tj&}>emo^~|Vr+jR$2fi(b@{ie(|C7pr&Tmrh(sy-b{Qj-)%K@&SXho3W%Bsqv~zl} zPe^I*8#7_+71$|yUqpcJp1)V?eCCCZSSBau95k|jn?W}Hl%hX%Bv@-U-DyNY_y{@nFh8&)0X+9 zS(J+6Jalug6tq>~&YRFB+3|*zmZXj;YNqal>d2)VsRF3T-dT|4_|TQec#Y_e(Va3g zBGT?chl9SuYa4Y?c+NrLrBAFFf*#UcBJqPU$>69^-mnr$rm@~m3pcd1- zBg1snm7=3*`gMx7{{l#j1KVc&DlI3+l|s-$18A(h0XeZL)jr5;s1AHn^}?TJDIAKD z*j54{oAcSCNQgstQF!P_%;A(;q%{W0(Lxg17WU|0jEQzhnb6QgpNg%{i~jFa;H}m8 zLPwmz60L=jB!b7@!v$7fR;3qKE$*~G>;$~By357g^BZ~2$c_q|738#VNLXwqk#;dL zVbP+LJh9?e!fpolD1`f0++(MraP=(bEf4iFC7|Hb$f8|2xV#ulmno6u(24mjc$X&k zqLO`RRw*L&fEka092>m{bI{xJJuTEFVg8XbB-BTfOLfN`p$a>#oXxy0{DFR7ZI*y0 zx$6ki@sQb(iQ!AZ*8^HuL{$$2G1YRBjU%?DtiQlKk=;x}8lzdXB)jyGGc-XWb?qoiIX_r>un~YmLasF#*d_o>m5$bmJ!2= zA1Q6uyYTpyFiV-ZQR`HM#?L(3n|&qCR*XFEXAwpYpcUUb zSFCYXW_ojIG}*e)G;vntdvk;!YFirA_*I*6^TqBTH$dCXSJ(Kqwa*&ot*bZRyeHc> z&L_@0uWr5v618uFG%tE+(Z`XR?OT+S7X#wxlZ5#89S+UkBc|vdsgvz{4<~>B2G|q7{XG@m`LkH_=Fs%^a%r;jR}*^j=9};B)h1Eb#UMrwka2sxui16EIEnt% zc6)Oi-*x?2^Y(J}7JV_)}ObzC04(3@3zJC!6rwZX02@y03 z5%vxdNevNe4v|<2d2|sXO%*CD5-M*Ls^A@}lp3ni9ICbys&NsjMHQwa5~gPqX5bxW zlp1Ez9A>r@W^oaQpbEDV3AZ*1f94%-ml|&09PYRj?tBsMN)_QQ67j+);-z4baQ0vQe@mkWCB%Gl1NmtQB;a|RBCEedUI6f zQdIUuR1Q^io=9|oQFM`abV+J-S#xy7QgqctG?FT&RwSn0D5lXnra3jHwK=AJDW>xx z21OOyBNE$Z6g%J@JCqtb(i}Us6gzPdo6dnN0Q--|Avx9%&IR5jRxty&)c+PnZW(4S z1(thiteo0+IgRdeTC#CCvva&)=kWYr!8~?j=Wt|aw_;~EVrQ3OXXj^U=VJfwb^pIF z85tQVDJjXxDX6KbX=!OOmuzfo_wL=};^N}|cl}d;OK zxaqlf(<^Y(D|y|gbk(naIcWWR$m3!x;@8Bx^O?-E+58`~m^XFdMA3wdM8o<&PhiHa8cywib4F=0AU)J3O2{KAt{5pSrr5y1JgZL@!*RSI*Jv zXXuZo=&cjH zG235)1&o+Y=$(DK0Ofy*+4$HTa3FsK3njYc7UQj+ded*Y+y35sHG3QlKz)C1uKy!u zJJ}ZY9khu4BWC-v`N}qFaXDP7bND#X(RNn9ZBa@rB)1z6(3xo^^uQAHjkWyJ(V~`%P+I(%)h>G%K}@ z%By465COe|-S>!aJ4`%nk_5Ep5MF)F-#B8=NRP?1`ST8OW zwzESi?Duoe2)MNF7{W{Ra3cQ_vpw1?mI>A`J1EM0xw4p_9nN)FQjlVQSXxq4c34&% zwTYRg@{gI#{;0Bfuk5I*{nz19H44c61=&Y|8P(CHK#W&A#6^q3nA!dhf(3=PK9W!W z2o|bZx7|k%+qC((zqkKfaQNPFu~+`RvzKf1LG?rx_g`W**QT!w6~{f$hp|pQD?Qw9 zy0-?7C;e2m6(<9?m!mZm*y21thVF7h-G(`fD}FR^JQY6~Rq*FI9s5hnHsE9CF~oiT z<#ZCe9{O`io`|Qu0nWioHlg(5!O({h1v2}-B4c^t+!XA5SgUZ<&yVN@-Os;-}zUseuvRD;q_22C$CSD#eUxPuO2$j zeoRoj|9htch(6hjvL*bvmG0$SyGAU2-$yO^z4PTkg6Ra`UUriP|L3Z~?E7D^W1ZVn zOFma!eN!**AK-*8|KB)SgEosKI|5%Ivd5saX zy>|Rbt@+{R_o_vFz^_%W@12TUgBUSeQ&N1*@1xI}m6w;aAJJD>W8fR0lJxK8?^YK_ zA8>vbqc(3I1i}iGusM`u_UK_g+IBg>?M4}bNAO@KKP5axCD{>km@D;{9Q+UcD02I6 zA4Dj!{H|OVv!@c)}FPsHqZ|6P`_dGC>>E8t!918rgF+__$nOClQFsqwzOT&BdFw zm#L+`Q<=iF{hY`FD4l-4gG0Fb-DDm~sPQ$~F6nEV5mTp{Tojj`w6-Oo=?E7##&E93 zI5KbiSkIoc(5_p>WFm=0*Ho{9mGMR-{GIHNicGpgpgzqk7Q(%7ish*Oo4sa-4kT&T z8)T6mHjMf)S3G}Rq_u9Nmp{T?ivFUn>vX2aN1~U4&DJkq^Vq=Gv7tQ2bKdY=NWLaK zrfNFaTI=5PnT9>j!kc6Cflz$pidU;#V_5^Q^LmX*`o^!c*~2fE z`&?CR8wdD(9Z3EVQ2_tP0PB#>6LKYC&fE>&a29L?^y|1ndG$>Cf@y!@Gfi?;<)&8L zs+!8+Cz@P~Kn3rtrb75#o2waE@j_oKJzv;wu}`Xv7sh^}M^;T?Yk4!Oc#c~31YWyl zChrUZreon;Sj>tiDaq7<;84+8&Ut$D;vmjh;Om37UKNCAjtql)qKmPPa`Mw5M>3a` zD6`Qc9X{G5EC8Cnb~=)y%^q5z=D|Ahg$oywM21h1_h6Y~0aUKqAKEa8sO(pCcqEX1 z0KL~ERw4b0P@d%5&Jlx@ie(%AN_JS)&pN%#1!Y5)9^y{csD{D)w)u;EVG%=N=fY}J}ddE>%J3G>PR09If|ue_NwQ?s(Ul#Vvp$K=l?AL+lV#kKZ@ z?mX3+#XnRdDafxYJSlyjYG3FaG+)`M^lYA++kUb2lf;~mP5$+f-6;Q3eO@D2<*@$^ zqrmnZ&-rBZQ=uPEVixtO-itJzRX915j;&6Mom&W$YCP}1DEVj?+IkT zTu(jjIU6KOQEyitUM}`JfBCjWQ&*KFz9fZqHF`r=4z4+jH=OvK(q@K$d!6Js#SOL& zWG1j>$qRN*o4UOd%h2kwW-1Yn>LY!5Dt6xP!u#C7HNF1hBRn~F`pKSA0p~+KsRj4y zI8Q@y&!eOD>ICYVS8a^$sFd|wX)!_@^97n#*W2K4`rTIvzH8q$$Mb$Pjb3lyQlC3V zuo;-54^#|QWMhHs5~F8+-a-DU2k8MRg5T*YldNQ>H_h5HW5_P8_w-C3N{J~wAh4U$ z6}gpo&x@q=9UxIj?AL32=!V9532YSIpv-pz1 z+wJ*cAT!8o=-12OMh7HGz}C5HxM9GdyK|nc5C1b=N&_p`-2ggklQTtLu@YXX64Q^N zL1~{~zcqL@6|9LnB&ptKc3a?D-RQ|<1*<^3@nBgYfvEOyU%gQLKqPoG2cIof-+ke+*Zao>N>Kz2avUJ9 zk5qBn`+iKRm^s>UTS{^3c-~4tus%81-s_nhdz>?SOr6mqS8q{wyO<3fozpq*iAc2{ z_3CSL;N71w*sxb`-$$H&mStnpc$44}!Uh~eImar6zzvf2`x5hujr;_SZuZbGR{E2a zz28hGy&Uqqt#Mabd z{hCh^r^Ip)RHS+Q*!Jwblir&P1_QRAu21!*q@Ow2Pj!oM9pF<#bNg^!#O!lIH@JTFLsN?;7sNH-Ix9 z{7mZ<6|5D_@UFwK59_f(u=h{n0nq?kvdrw$^r-`QuX3j4Y^K0lb6j*TzCmbK>GKp9 zk*uzJ*{-@-3u%HIY1u@D>E}J^JHG{HerJQ8W`F+8fB5Qybzk6w4(G&H0&^LwK1(ke*9`n@ilvMMjf{Yn^)< zoJ+ToOY4*O!NZL4P=w_&??f)|hgBX|Yn~APhY!nn`MCKKmy-M=Jc2&?c&8s^@$WN~ z8t zy_a6JK#Dmnmt{j!T<;!~QMUYg!onz>S%eOa1AQrKiVeaf5D%UfH^+gHjvFUwIh6_}q2l3H9>B)Aa{?cBrAcfv#0GDB!h8Eju@(D-)y_0oH({VRCTrZ6L&z3FevuxrKw};4s-KU}Fw6 zW~%l!0W^>R4P*j{`GQb6P`Gcc+G_ny4Q}u;QT1kx7%iw30r_!B6qEq1m#zgc14569 zYNQ(?bD&ky4Y;2G9(!Pu&3fmn#-(n&I5<@MszKJZN#Tkp6ahIjfyu%e>H{lHP~cW1 zSoEqP=9tJI(iFSeJa_`E--LK?HhGuVy;FtBA;4Cu4c@*@Vybv?IZ(%=<^t2!wnPvL z0dYg(h2+$Z9)cbxG-YKp;da;E9@nLqws^(Vt2nfFUbWRFf_h<)S1?E~9ExiRjYU>v znZndv!6OLhE9tg6-zIl-Ig}scQE%%gA_k8{L)wok0S@5aKqT*KJMJ_fBmp|21(uWU zsB6QE$$<{Tz-zu;7v<@R&~195A>71zBsihqVsFy5Bo=^Q`swGPn04y6|#qZc$)O zcpJwTWP~){xOkf@3^L6Pu4(JJZ`P;qg~EFi(u)EC`2f*~CRrG$HUav=6acMg^DYN< z=0JNlL87WCMY;hiGYUGjCZJ4jG@{;%8`PQrZO;KcS?l#$1r6jt>jP_Wum_&D5BkND z>meJ_M<#9LzH-p9fng?yw_iUS58#Dkqeb};WNk1>VpzKdHvkJ6mbi>K*BNb+38iC;3O-L9DPdo=06W9)51`j7dBd0)}YoGwwSO5yd za5XZm3hv1q3&;UYtc*-tk4Z6i0r{Yo+%U6a{I=^VyjO zV+y)HMR+p>qn{>`oF+4$rtqJp%9^I>n5J8wX1JMVqMu=roVja0!|p%BnT4L=>X_kK zpSgcC1E-(mmz)(epB46>70H?v>zI{TpM7*QD@{KqD>)}`KBwS6r<66P(lMvDKBsXr zr$s-nBRQ{UK5yVZZ@x2}o$U)|a)mOgseXUK_bto8-fFL8D+UQ*2ZI>l4_x z+6mQQVvsf#?h^gRAT};s8qWo_3OE6|NaOABZhVuZ+fm=p0IYc*%byTze9!vW>h|$^ z{o_UDM=T3kwB+V3{U&gN2Jr18sB^PCar0(;6Ba;2IPsC#;?oDdPv=gbXgaB>7(Qag zyuP3Q^p#-i?gSOfqb;`Vtw^^mu8pnm?ydU_+y2{&h9 zv$oiK7O-cRy=ULK=eV)wjNWr)`0W1Z^9zg5F9SY%XMgtT{EYV7_#A-#9B9E}#sscL zK~Oo6xCGGS<1Tdhh%2h;u35(|6L^HF_f`wwvxz@|sENe_kxIZE5#VOjc>5;!JG9>= z2mHkmS~UfdyFOsZ9W-SgoHsoxizTjQ*aw-nw{Jo^v5+V@^v>A+`|_IMoT^5`)(swx z)0isHquL;?L3AcGYzmOF3Tjq^-BIhSnfO{4*WYMyM3;EfsxjpTgR~ywznZEw(*nd(h7e3NL3#x|K4{G$hgn+-Q z)_sYs19XFLbG|duwn{vJsiQDom=KF2K-AUgz3&6r*(XfjznaK=V~#)4c<=+8ex#KN ze0xQNHXTU04=~;QHXseDft@11^$nx?-ah&n&jS;jg#4zN9FZOZxPf{TpvDl;7oPJ4 zXkQ5YjGFjNANwre_B=%MZ0Z^qCk^pQI75%(4P1SZJ?=wkftl5Q0lV>#Ob{%3a1Fc_ zfcc)zfqcjWHNrJ#6tYat>=!D{yTa*Be>whX9EP{l-|G=+3>V6qd7;?<+UP4gS#AHc#n5dt zN{51;f^Li9ib~hOZb)i(ghF!e)Wv0|*XyCxqmM>EO!_kt^EEO5pr`{T)LSWyOC%4M!K1WB%77R{;j(v(X9;p2T2L!ch=kHsv1~W8KncywKIMrD zIY!+VGu&W;=Sp~M@4X{w@#qsj?%Q^d{(Z^nDmZ>PI}JyddAJOX_{0)*QDoqf4Bhhk zs1d7E}>RUdQ#W{V3`#W)F#0&DQ%%R<}s<%Y4ei^})XInjwR(tdp0 zit#^D0u&;!!*AjdKc`|I{Fc}{(PE3r)Kp~8FpICFj}p*PQaB4CLtRj<$Leyvk0qOf zE3!4{>1sX}($_b%IqT-j>ItDh*lBxAZ`Iz4vvB#_3CicF6P2q-<&y3YQF&T;@ znLKrp5=%1sII2%jn~nG^-bAHAz1&2z@as>dvmX7Qv+iz1VlPTF=$wv8-1Sr?028{J7@3n_czA`7BGhYsP}+5 zulc)hV`2iaF||_4=Dc>6&2+_O-)YCNC@ToyZH%e_z9u^weM345m8AJQA!a}$`Da15>cuX zQR)*>8WT}l5>q>nP`i>qJ&9?&Noc&u=-nPL*-^8a(z0nYuq!fiO0aN>u{;!IeJH~E zP?+_hAR8y&U5*I{7Y7F?kZW=mZNkRE%fc?qz$Q)y5D{#$RIKupjEa2#sAMzpl%OtjW)H1=Fj7hXyaL2@5)k{|_w2sONTecV)2+%!|%bQ4Ir31NmYai$@8 zmeGS86RH9W>S7zZ3P;A5t}JzMj%IJ34u8Sk5V6rH>B%^`=_G}BDN65BAI+qwzD-hl zlc+J3pgA6|Js79g9c$DOWmyqvpBw5HALJ9@AM)5QPTwO<8J;cYnk(f}AnyEB*r|xe zzJ%4fjM1Wu!Mc*x?j_Wr7V6YM?bbpCZ-aVt(s{jR@atm^8e)%_;Ea9ClQhepGB1?2 zD355_bigCp!>zWP6rd^lzL-+1u@4n-pkslG0KNH@a zq|TjXe!R?Iy)M~8RPG~czabibA==Im9hZo%Yee5QV)Pm@d4-rfzaBfe960*fyK~sH zw$;6~+Vx?f^X>bN@ptXR)9nLeojpD6oj|mDQ)g@K>!!-y#^Qm7+>yqNsiuSv&7sS! zzS|ux-(Opw^w?bX*&_y=5q<86L2txp0AeBxF&%?=mx!26MJ#3^mU0kFxrpUF#Bx4j zr4X_54DqQ1v09E;dx6-fL2TAvZ?|6UbzUC4zWUm8{k<1)+Kag8LtOPEt_Kk}BM8I< z0x^ZSev7z#e{(T=b2fi{ws3v6bal4!|Fo3@azJcH@HqdSFNuf+);IH)F6plv5Y`rE zmFnNRq~AFpg9&Ix&3lV?IUs+wa&VSxA~^p)TRHP6xw<^=tG55x%2}^D=~4WxOL~db zKH^{hZmL-3PwaVgs<48@o6eTQg?j5m)lYf#UzUNb-0GVvdY8GPz~8#0?<>7dghIb{ zNi#Q$Agb=plf%U(nWwcTU1#6c1`&x5$DaZlxV;ZA&CQ?jlHHqJxbr0;j!$=vesAS$ zufO*1e!knvS(qU0`2O)FX|KFtunfZc?Ms@-S|am?`>5VSriX6C(b_p|#4}gqzO%OV z_EY6YBQ4%Y;sdsFQsMrLefO!r^Zm&%be641&wkkg7a7K?t&AT}h^Uc~*Vbt=03pKm zlQ~Vy=UKD&y^*plVp#0lkcsL0NbQj7mvVvF^BpJK@$;QRulYQ(EXk!iUD93bc^EqD zUh(g(TpVNdUTM-@?D@awlJ2&02m6)9|GJfX)q3!M-OByH#Ge1lR_^-r@UPhOKe{BQ z-&?saKb~PEwKWCtCe==w2`(|a{B#@&OZV@Yf`mz0qi@=g| zSH4OZ9BH|d{gFkasoL;bc;PDF87U|P>CG8VtU@WUo$#=AM>{_sco`WRGZ-!piAoc z#(Ax+!hWYqqL#e=p^Ur!`sc0K!yCwyzGN27A_c9+>57xv&6&g}sD#u;j=9A7-XULz z)J{76dg%V-UNad3)}K#G0HI*t*VDgk>7 z$q@6zMsQfQv(F5SI8cC)1D;0-{PwNv5rb>z1;s)5Nk7HGF%1B2Q zM|kqTCn?*|lB1o=a&`haAVZ}jn~HZiAW@#OG^7h-qY{@u4hRlC+T8i5!0PuqT@u!h z7l1B_Cn1S%oeJ$QU6L3r&5gsD0-#IMNTO#}P*NsL$cW0ED*vNP^2iMSV#8vu^ho=C zeRg~KHj6^8vi@&fk{zk#xPsx%kKE@g41g|4!8WEoXCSG9uTn{s$rX||VpAbNv_It% zpqi69QMER)DUM2hxrUsCv(2Cqm~Db%z?Rz_Jfk=3z`S+z=; zWbqwONLD!)!@8oih(;!(<8z@mj%vorBRTJXRr20cNxF#8KP5kTLAt$98qBJbi{4Uo zL|>hj2E?8})2_0zVbzhkoUIAau9iaHAYe4WNW3o{pSC9_@M>cIk(GC@>T$IR3E6Z< z%>7re4JbaC8x_;4JgihB?g3TqdMP!Ae_#7QE% z4^TB*LBAqJV(`Ah4u=awIX;)c>biW}N4)hw2LoZr7(@f{slON9RCDB_x)?d+u^AN} zeFSpnN{oo|Y4M)hl;dcRk`ZdFgIu%SBP>ZepeiFlym0kifEl!~LK<#!6-Y5K%tqx; zU*i`#lW#sY6s$O*9#=$nInfw68#yCI);t2CP{ct|vwH@gM#H;uS8C7&dN8u(oh927 zLeJ@Xp3gnR1QSWM4x+6-Na5tdp4nD?Cs!RR z_LZsWc^Qen#VeRi(kfNcul#5mx4@P~V_Z<~5PeisgjBBHI>A{RwasuCceu@#k=}iI zMw%xjuOevO{GyD}OLByrH_edzqH1sI5n&{+B2=y;CmDtglZ9Sb5zDlNzZZvE`Qu2D z59U&~L+X&6xUgYAKaR$676*{9ZqZn$PY~$cd-66(S`RAR0v(D<4}9b(Moe1$YOE0> zp6#*HE#3Qjoc!hEID1+k(itH72`i4xDKDfm3O(84Y0+Vy7zO-o>eB{a%LibcYwP-Z zuZODa-S=cgDZ&!vt!ycA2Q@-3BDFkr>uKfFMIi+U~A{Ah#eHQ8||dC{`%^ER=cS z3m+_H(RsGGf8DPYT2?bIuWg)g3ATK%?ck~wsj>2s*s<5K(+j^*G)jL|Lhf zXCg%HZ-T_xgZC305IqZso&l3b@Zq=HeJdQ&&d&&ux56o%N7>xMEk2Nb6QqXLv$)(n1YUXtw)+|a;#gJ- zS0+>|h6?0T4WokX@LG9S&uEm2Fbg_H%kW`bY;>#X-Eg=0h~bk6(^hXsH2W2w;9)t) zhx*_ZCN-B)skKr44Z#p1%@DNNutO$TG+JnHjNeI{A74x;>TFncn?W{{yGooj!aDTc zR&?>1KQSy?jWnE4D4a-0?kll0xq&p)$LPe?j}p{dR0U z5ZazAa?!Ukrg_W|0)>PmL1#o+LcUN;6EvpS-Y+T!5@F|S=MV@$nVQWplO(aacG4R5 zu~IN2Qf8T9dyAg}CKbi-4@f?fLQe0PAs_t0Z5T~5Tg??KA{*yXhUda1bEQ`oVD|)3 zGZo_rE#qmJJP|YCx#8#rj0n+P$#2gMyg|{2_V5?yD96mH6R_0UxYR-PG%#bD$yj2W zUqbNYQh{UraM7NmIw$P9f4|$5Mh+T4w}(u+5wfL;4lJ<|oqF$CVk&q{i01 z-fKb#SI5}cPiJm~vnH>1thU-xdE^}`?W3!hJ$G~svITGh(4&ieohM?Pb@np9+ef1r zx;t%W)#X~h7z=GTNc@uHUaOx@;FnH{Dd%DkId^W(vgM_A<}z%MB9onA)SAt7KZ9dG z*$d*$Jsvc7F6CiI7r+1)@sASA3pF+LxGj!G+KP_WMaj0yHNo`fu6TlwiHY0~jaJHw zxd_S3i*6=O&@l`}XAaHVe{!G`*dQBjX($s;{RWAj z6^~mxp7_5oC?Ux&$;O0**p;Hhmp1QNytTjzkHM-W3CIvkOKf}gML7TK#WNvUTN*th z2D@x%jD`F`(YfQ}_i0HU4pyFWwnU7crRbOgVHVHj9PQ$Lbg?W4J{ns3#+6pYVPqSc zDrcq|=!DRh&|rB;RvLO)L@(@Fgs+9vW0=kP`zn5nHi%1bIk0e3PFrzIiSRF;V@X_OnPRP2{=$;KkPn?PmDMI9h;VuLM3qhyB)vuKo>VmPAS z#!9~8wz#Ums3I55Xu`gDa|8=s5r?`CjITJEfM z->PA?stwigThcXp!&pa5X7hDI?WnWP6}65fqAuhYJUPJ`*|;WCBp-39JJneqhg#3< zQBQE_yeA@ia8Qr8Tu-`OGZj!sc-0`H+aT@LKrz|CP@qETlnL!>RAlIBl#*>^x~e6o zXmUesU>ax?GS=ms)O@1c^lY|Hf2xb0xiX5 zDe=SR_}OLyCm8`JTJ5VA3f&fx@@8Xf4PN6`?b#MG(pwXw1CosL|;lxZhSlA(L<1+2r3QL+}T!M!$2{1>T!N%0N9uuEgfB`rQ`T9A?-Y zrq~=N|GwExu>ZAjSS`WKu6T^zcntn{j6o3k00LSc0vdNh8b<!R?IftMVmmr)|5Y8&( zOb@iMGrfp2gSZnT%!ygXkxkK#Q^kf$#gs=)pI<{$P)9{rPhQwSLEKPD+T@X(vDPCK zJ#`~vEfafPQ!9OQYeREeBMW;oYey@47YAp!3*5s4Fx&aTy#gKKAr{WzI(9KCmhp0C z$GC2e}vnMx8XV>fJS4US@7dKbeh^s5a#s6uDqiL0vNc!;PuF*72*l%eHWMvQLrVI%`jhQ8AE)CGpX;qJeAgyf1}l&(F=9Dvu{!SndlyA2)TdC6pWmwApHxi2HbU; z_2V1Yt}9E&2chKV2;(9gz3V?ioVPvQYp+|15h!YKVA=O|`*CwoZ!hpGG&*x}*y|@T z8j$D{ZEPuBRelR2|959=e@U+!b*adtWEE%RO1^LFOQPGon0-V8D5c{8w0a|vYs4Wf z$jI9vH4@pDJ{$6R{DpQT#ffL~WARIeJG8oL%cUm$d^VX9*9#v_5WORvH;BWZFilFN zOg`NxhGi$$CcEl>2+6p<1_YP!Lm}~3ljl$JI2^w#KGA&tXNbcjv)(U|7W8Xee*;#+ ze`YVMhE|duk@y>}?!h1~N0nP#WWdD7vU{#IKets<{2Q%S7EFEe%9WnT0&#n6MdKnaCFeE(t^V!2_F8Z` z`{cJ<0}OEhwEFCG7>M(HEsDhTd_9h-_WZZ>dh<70eRtQoooiovu~X>#^SkMkM`bNv_RwZg-j|D*F7arxVMeSC*j-#M>u&hLge*Jt1U z8$%q@sbX}&v3_s>V2AtnL!6`%9DBw87~=Sj4N_em$NuXOr<5RP?6>s#uOSXAAie%Q z#2Fjr4EUZ11O@&*#Bl(^To=Yh1n!17zoplAL!1=9DIm=C?;%b(6a<91lK;3H;{0)5 z|42_u0>WJX8sbcqGYbAE=e5#=R{np_dCe7j=e+)zJ9g*1?ij(gDJ63k8oO7B`3B_y z5=}OAUb1++6yM82_mq4Lt+}DefQvA68V6GlJ7YRT=Vv}>oKbkb0UX{;n@@@$50`jI zG#x5SOO1eFy!qj!c46B@y)`x}0`i!N;^cew&HzQMtLm+rD}5nZJ%|tWFu9H5NfvPRGF_(Ng{v-(Z0Hux}Ql@BQ21pym+z;1~RLc^{sTZy_DWIVAA}BsniR zp&l>psh%xpM|}B3ttvN$wqvP9%!;yo`1@ z&{DDWBGZMA2|hW{Jr6&jwmPcf$JgKF}sxO6@aZe)+ToL1JaxY4|?- zv?1*i+hepYqsh}vq6l1wLFs+tnrW0;4{=u$m&u+k3GcQn4mO4mij`XfF9VWfB2zSJ zot@UV9i0qLk9Cdp{LWGE=1$Z>JS8coooDh38VVLTSE+ec6I}-=b^MxvX-Y^W&z`_5 z)gS7Zd|g86SS=j&`JUL*wc*`sBRA&tQtB;*?Yt~n?L!0PYH%29LO{T|&m(NG;oY%fnn^aflqcCt|TCB*9@@0B?Rg zXjf$UV%l%IDSKPYetrMqZ5X(@xMONp0>y16POZ80$izYB%Jp3uaM#+k;-K);^?mO2 zuW~jQ$4`!zABu_jDn*mKGzuwL=#$P)giCxqJ-1dK3L!flX1W$tY@mWglKA zV)EUU?e+utQSyX*(}QpE=EAF|Uta_|qUUmWc6~0t@-0B{K6cOWY^^8$>_I>FNz3zF z#Kvj8yo6bZt>-P>=7b9i!`6{|NaV^Qt+}VAgV|yzX;1?T=%?gvuzR48Oc@j2kzi4Z zXCTw!fj)5jDMR8_@^*Jkp2X#Sub44gFF&DWork4W`p=hwD@SdsB40XdcN)!GN?q_g zEmKy1*}gtG!iSMcR8C|Ezd5m^Ooq}uEiOj5S9f4DM3`k&YNl#lm-cCtm@aeYN zRrbTc%WR|1*PKV^r#~fhzeJi}zh~^t39M5;G$%ut?D!kl1sBMLMdkQ@6!dhD4PC4V zHQfpITL`+M_cyU~-P;WT&BKY?ef{*k!zu#}EBtW$gu#op1w=*=16$-pTQ&zDvc*tP zg$0vfr~xSKg})sc)o^gNR6+ zf5JU?N*_;LeNsJUcg@jA#S^^m&%v7OIGVc=F*$fFf}w~tv%?ra;0TsRFxt4)OvD-& zN5Pn>mDhLCBg5XxyFC`=JfgJ4|7Wb*XWvl7-SKOCoE~FDJgIOJX?)3cTL*mu9tT{vMmHsR0N1TTLiIw?z;$c5cA^My-FhzA zX%GQiw+8=A1OwNt?SexuLV@d6|IDPVwxlUP!D+>y8Pa5L-sD&M$@4;ji;I3s?a6DT zDH}p5TLvjRekpsoDF^K-Ulvooo~Im>rv4C0{bi7P>X&++n|j%vdcBy6I8Q|)OG6e; zLp21vG-()lX;>Wq&zuInNQ02269}i@H%uq?PbbYwC+|pq@G+h0A{|PWK`Wd=Z6=szxYQ~ z|2!mKMSn`&R{w(byn@b-g4Z7ldM*n3$O;F93x^B~NBj%N@(L$93a366PG1zxkUf1b z{B+jv>Ae5bJZscN1dE7JG0HNgh)@{H(#6xKgwH-HJu9?+wh{jGZ&RK*n4T}yx7N!3zy4rt=d?|#ARSZff7J}jcEcI0f3igB$=0Wkg za7m(e2^g!0AfY6-tb{lLh3c{d7psJk6~`(Jg;Jz60;Lo$poD#?lp&y$F~5|JyexRL z6oOSIlwZdCxb%RmTyUw(udJvAj*ZueA~b`dvQ)03TplP>v=d)GaEvY5hoV6)^cAy6 zBn(C8xR^y5)$mgApz5huhVaT%pqZbi_C_>PRg#QUzz2k@aDnUSDt-8)gpn>&e6RSYW^Y^p98hp$@{P@+V2>*EXt4S>WHwUlYF7dq+snI2@X?R?t6|qvohjE{BkgK1U3m3G>LRIi7hutTs6Tcnx#dX zWsRHV1Dh2Knw7hn0km4}s#$}gMN70r$GAl=u*IOD#i*;rWVyxcs>On$)k?J0#<%f(F+wtd+=0H78o*S2?a5b{nAwQbw_c+p@9W6;!GP-ICudlnokqh1K!I zEc%ct3vL$Q)s8~YUetlV&t;LeOf6-Lhu~5tW^B(nq}FDz5PhOLcHB|i#kzA}kKWs| zVwo!ZP^WIW^XqplUkbejwyrPSrg3a)v@u-=+`8}JZJ;#Os>80sk~XB_jvI~6kx8n@ z*w%CPU2jCYXN|k(5rN%{1>FEzy|UcBdeyx~(X%1ivt`_~6WFs?&~wn$^JTf`>s8M& zMeh&M-e1POr-8jhHnv#Y$eTK9q$9oleq20^YKL~X!)&@}L46#FwixMQ4~Pjem1ua0 z2=<{686L>(eT`c#4b1d@WPa+06h;YiS|H0Ow=au4}_SE*?k#h3LLR39CZl7k^3?<_5(`XlIMapZX4^Bc|E3A zF~%4;qAdpb#Nh2KMngQO&X_aqA!L^T1;c%$fIG_TFtunEin(T6( zlrb5W3xfDEO$1#V@v)CD@sBH+JWvdpVyBoKP=Q!0X_GV#Mk<-ZoFPljZ?K&Q8=a>L zIwmS!S)i;uL65Q6Dx7xTo}dY`4S1~{K%-&eOao>gyFnUHXtB)Qx5S-#ODRA2nSGLe zMQa^BCP%^I`jJ|Re;+5h^+h%WkAnz5x%YpLR=ZI86l1OT;eLXGt1UoU77%?X#vWi# zg@cPAA-7O8VM_2a9QSiQI0*g$^E;-fDP#?bAteqmDaKmSfGih-y)+ce=zR`Uo)abtl=&|!A13GCR|wd9N^&k zdEg%6z+#~o2@S;(w0n%V--m|W0NM!4%jbaT7h^3TfkW!&Ov1pxiWQWOmBIlDfq-x8 z!N%f{qBY#r;`v)Bme>s@+IP&AdfbxwxuO}|6(lS)DbP+I?qNMzjp_0yixsr~k1L2` zEM$DFEiQ22%<@VfZV_Zw3%ayr0Yaxi+Y(>ap~Uh@UPhGydB0h}>_;%O#R0DVw4`A%zXAo9_MvI5f%f}8NUA}MEkG&~ zSnSidrBH|hm3hAD>LAB@P4}i27uIV1Cy!O!>b?bZiPh~R&;}eAv3`T6ptkhLbT#eG z?#9s~(lqFBZGJTk90o@VssUfseBR<%YP-Q>3&Gu)LCZjV`oXb{e@Qm`rKwQ2)O~g3|krrK|7q;zlCEhgdL7dqdg1(7j@5TK|T(teY6XiFXx2x zP%ca8FMl6ixm^RT9pmk2?DZg)D`$3YE#`AgmsAnBXy94oezcSFmB7B)D)_p_*H2n7 zEDJ?2aIWK3f1Im!T=R5c)dI3L1M=fQ^MZUtrvZl@Bi6Qp(Xiisr&8b4!Nu5z?5@JV zG<#U9xDpazUh~y(wbjsKuzm2RsN0uovtRO|zZ8ppDfj+T`TR@m_Ls(Ixdg70 z1jq@y)QPU!32XR?QSXTko^3kOsg>lZjrplv=&3`|>Eqs0=g+6EMW;r^Xx)P+>ZhkZ zp=W+YX92xuLDZ-2l4s`TXTg%^QRe3{q35=@XRl?>)MCz4ZqL)GFW?W)5~5u@>iX` zS21o^ZIM?>BUb~G*M8rwT2ZbQ<*z4tuQTz^wGnuyQ`9%_AL@;mi;jibd?>nkXMWS{ zc_UwOv!;H%A}P8WN-;*c$qkO-<~$6$kNDbqwfRtV+l^uuZxj9A=9gQAZ@ssT)VB@1 zw|~3qsAO|B)}>=`+k(i6G&f#^R=1mKk3L`j-@;t~pw(i2uz!bE=NmQm$>!_qYgMQ| zjnKKT`%b%>`ngHB$PBo{Y3GX$8in2$gGSpo&*Zu?_Kfb_bv2m#rjp_F$6ums)Gb={ z`PsIwcIzIhDqUE8=gZgoZZ(qpRQc&aE~_33O52OBQw|Ni@u%XU2y{xLUwgT50Id%0 zte5mSoIm;LOS=1b;o=fk!eak3n{21MdF}!`c%!U5nOZ@O$m2(L7ARt)_2|Cm!CZ~` zsD#Lg&(}|Z%8&U?>@3#>A1)@g$}_@4eZ%PrFzc@GDIWzgPCqlhMQmTmh>$qEtlc}V z`-4_Ty|xC>YR8CCi2~+*1%W)~FE6>US(Lto{e&-LN}?&yzk7vHR*Bs~LW5Q2 zcbF^wE0Eg|ehbF8M$Bhmdl5VdT>A|T@rxn4T6u;X+5I5~-7G6ScZ5_d_H^!Vv>IT6 z9`@2tD4aY-cI`QdNZcGek1E@u#?IX0Q4>bIO%BidA=H|)>4;5wRQl^}anBQojqoUk*?}D#2A9e!i z>j%FM6gmk+H@Xet`6jsxhg#L~FHliW3DR1=R6Xo+eB4A7_;k+Een^sO?;Al`q1Mv@ zDFyM9YGV7~O6#i#Y3#46g-5`b@|6N01 zOg=0gO69Woa#Z5V==pAs<3Wr1Wx(+$ljQW*x8~#v;s;+O>QW;jm)j&m zZ%zt&Z>0`Dn|Bta4_z*H{IS3>Nm?dsnI9^n-6@gGc1qW9|i^m!oe|vwW#!Mtm zBNW8;L<&E9CTj4~0!x!{fbd6r6i1XLj(Djwd45bZ&&qpj_jVa7pQ;#1n@QZjc6v(i zyEraXD}q?sA-d@oajH=p=ud=(i@3NG7y>o`-xG}0hg;TUnKq}9RGw$)ZKC}w8R=x) zbMD%A$(u6P5A3am1%D{8dJmOhY%?o}?BI*K{IUjq(omE{&Pa=uwV_RRP?Qt+L9fb8 zCPTZgsI2!sgR8Jyn#W&B&F6jQ)iS-b^o5dE_WP_i6wjr!{FU`u-#<|n9cD!%nAD$t zpWP;F$gW@Y$mH~WPA_UUrz64;VmU#OJ1T3(W3Mx1$@3w1BFc{Mc^;*`-p{-bLv{i! z`(#cco&}##?S&{msM;lbDBP80(j7CL@@oC?^qb1KNHnH;!2E}28Cknr-#XMo-t!h+ zezAw4kxz%3c@~4@UT{2zB?M*Amf%G*b4jJEYsk))l6Y@Z|F{4p`OKC*ZI+Sf{h^tW zeLr1mhFSO)i7vBs_PO_pG_;c}F1&lTLJ*gZ1kpERm9c?G-tVXpy(BAoZCP50G)yfo zqEjI-SEU~PSjX``YBhQ|^68=+q`XtN_Mom>=P9a1WA$8Z_S~zbmj`rkP*+37$t$;L zwu1;b=5pVNfJ?HI*~tW=4Q~p?XJjwJ{ClVV0CBcGH5_Dd`)(lwXTCl)nthb?aB)m; zzHu?%S@&U=;q($~lg^Q|gWO@|+m!j{$~i4Z%`T()kr#EhV~?F|MU7E3y&Ic{U0iFl z=avuV+j?=|=m%n(Y!C}_nBxw>leNh-@{m9cZeruG#XPKq`+Bq1TZ(8K3KAy0#&b{GBt*;Oy5C+8rnMFtMCm|g z?d->8b=#!o&_YX0mDwQl?HJlb(oa-C-;B5pXEWpE7Hpid7C8F?_?Z-hbu2-QVnYw) zz(cTnu62gMG76Gs$1quLTaOu?k^R2LxO5pSesy}<>T~({H&W1s_S`8H%;B;2k`#4^ zEvx`$xgT7m+X6XD79p@$VdZzIj9ev{s(UiR0}UzR-9`gJim^qvU$&S$?@_KmV=0*j z(Y&4M9$2pam`SjMh+<63S%q**nc$?@l0<=X*GHbKcDr~c4?NgklX+=+^H?`(@PTb0 zKZ({oup1(%>_Hd!mn8CcT-P*Y<)T~VBA`DPV34NnW6s<5lBe`_i!V^v$ll!}*hR>$) z6Y{Z8d8-!(m`B{x-KH*}KFntVJZ0b%W#cvE@RT3-lOeiE)^BbhAKP@+lU?FA-^1#@ z&%j=Ly`T<;dO-?VQIBdQf+8M>o%zeuLNL4?0v@n&j>XW4H+u$^?qH90JsNrw6`DkW zwJmW5Q)@^m^?Wcxz^K??kNnjBo9H&kutV4gkt$KxF}XZ826KG|ewc{z5&2?hMSUt+ zhaK_hJ#vS1+w1h*6xo{xjIKd@-LI3q>(76o-s}1?0#5N>TpXIU8_S4Z-S#-Pgq9uO z#Pb&U?hM+jG(0=`glXkxR;h?JByhT`6#3&Z2|a{PI~IoV6}R2<-u>~-k#v`5OjBp; z)Ue(-k;h-H+`}TUdE^xmnQ7COu^rx1xpOZyp>RS_li>|+q|sMbk=KK9`JLT$*j){5 z-0*ryPH1#GKIrUGoM2as3oKT$9a*G4PV)*RsrU@?R<5w!uO$uXi1s9>HR%ev z;da7UcrgZlkQhvMEMwyt)taw69||hva7mlRVB7jHibAa7H3XhXJ)V$C}u?aO0MUgmS~VBm$CPfkR4>7}3O4Qci@0*-6|YQQ{9ia7XGW z$JC>EThv!tD`J-QM8U@PNMoN=gXOi+6bPe>L@=<$MES19(#rYVOa!Kcl+<5~tJ!o! z)T3zT#^EO^xxB>4Z6Qy6SPzXq1D%B1){6P&AA=wvT=?0y=*3av(Ljy_>BsNlYisBWql^ z`BA~pqdM%gcR?~@uaqLr$A8ISxNOC>Ig1j$1Wx0RA+;1Z2xPyaK>pW%V#5#?=M!y1T*R4ta<~N}R9V@?x zkFG%Qp|S8l@z5^=Zb(9r?Z~jTggMWuFr?qn`gnH;k{T)zGA)uQQYF&wx_9s1AI1k2 z6%`E)4Fm!Kmt{Z!$7NVpSU5O15D0{TfB-lyBPJ&Pb6iGFP7WN4{c|t&*V))VAE^E( z1%y2U1%*OsXlUr@0Cb3fnVA^~e&hfSz&JU%xw(0HdHMPIg@lBFXhtzHF>!Hm2?+^F zNl6$CCM6{$EiEl0BO@y-D<>x>FE6j4prELzsHCK%tgQU#(IXWV6;)MLH8nMLb#-k` zWqoaVBOPf|JxL3FQELMsTSI<(BVI>iE+-RCXA=$=Q+8KVHa9a?IMC*-?&fUn7VPd8 z9PXA6-7R_Ct@z!oh1{*h;5IP0tsLC`5!^x3&C$Tk$=uDw-p$Po4u`t~%4rV|Pft%T zKs@d3?c?L)>+9?1=jZS59}o}_7#J876cijB91;=|8X6iF78V{J9uW}{85tQB6%`#F z9TO813ka#>;^O1u6A}^<6BCn?l9H2?Qvi@CH8m|QEj>LwBO?Pyhs?^#0s$LnpT8%^e$)mK_& zH`+yZJGc)!S&qA?f4(L??It+y24D7IUG;!2UZb9MqMWqd`_X#udo$8;6VkUPq_2&4 zef0Z1@B;V>@U5S%NGI(`=N(9wT}ap6NQhpb?*V<&i*nP8e%*_C)r))CM{vC>mx)z#0RKd-H= zt*@_dY;0_9Zf=_>>({T}zI{7BKK}mw z`;Q+#e*XOV>({T7latfa)3dX)^YinIi;K(4%d4xa>+9>An;QfI@ehKORvZ(7LCC5? zy4E)k3qeE2fOC}&M-Wn&t(-rklS?6HBF8Sn-;zlmVbtRr=L&1cp{Hz=jr;L@B99c% zq!<#|D?Am|Mn7i3chJbd4w}bd)v3~~P_*Z?UCP?lsWwBVNArJjAe(90@OYba{%|JQ zQoQ;Td4nCPnJ5`*7_5!+QzA3(0DpF(6iOkjHF|pk;Zzuw7B7{G1s_uQkoBz;M*YHK zc#{P;b|FsAf-OkzBN&GZEeUy)Egra6x9BsUL!*8WxY~3G(Oh0X#T>2L?6{ zE*K9&KuAPP0-%AE4=92E)AV%o%=AF~D-#)h)c>!z+@$1axf`*DQN{6StU97NAe0P3W}VQB%asQX!J|r|EG(0jQ5_qV@#l|H7IATKLAIp7eQp%m^J~b^PEj{y(=pL}# z=j7(+9gWzMJ2_>r6r~1<>eL6pI25?zIgGX`bAZB)gLeY%bHg; zwKX+$wYBwibq#g(4fPF;jg3uBP0dZsEr6rGrKPR4wXLnaqobpxmGAy zi+(gF;zBxBzuw1loBLdwM2(c57HsV>%PhYrp#_%tCm;4-jPz5OXe@gyr|Rp{nW@df zHkE8RgURHfVb`RC6@MA&@A6@}nAXZ?m`HhSB|`JP<`psH`I=`NUT)h!-;*ZK9$7El zfBET8J}gNcYK;`|Yx^lb`}l(fgz(G3V}2ozu<-u(Xty1JGq)Rq^F;4MxHXo!y@oDCFKCDSy6i-(YT3{Aq?!lZD9Zs__OavWazDp-C8U(hMD#e#$$d+*C6fkHxNV2lsI}=%0V6#$Tc|(&Yt^2GB1AqemgkE`W~|*U>42(Gtiw=A zEX=NIJG&oKiQYhdfW$l_SZFXsAldm>D(O%??*yJ60>qHxHSf5qYsP7?mB21NHpYKj z96yU!KSh{CigJWu5$1b$iOPwo6#mTOhY|s%u#HuU$SgEsRxQaEkaDhz91 ze?4HUA0U2t)M`le$T6WoL>9T}pnOxA$o1)E6|7=<{HW`g*zZgEcnk$_aX(io+v(Xe zTwC~c1jvV7Z!yy7w&Fnr@f-*>DKS9wt;UD4Noi~Hj|hN#*g+RLsX*~6gZGTn)x7sb zzpM>>lh@~&_&&*X_C&jp@uOB_)2&b<&jf4TtIbgEe{+fY|3i%b1!8pF!G5k7BRmz3 zqZuYe@8lN^n+;D=pTdwW&z)2ZYDrbHV8BQ0FDh`Rq@^dn2q(Kjk|$zpNVVv;HC1;X zpbx`O>6n4vhqz%%$=V`cwQZkabk)hX`+M2_>QFu{~M}%v?Na ztY56C#jVF_XYpUX@Eg!?IlreOZ>Stz@18cegu>hIo~&j;1M)+P5vkS0h}jA!zlF&| z5$mXrkg&)c;d%Z)U=8uMrDRuYEXNg9vfVg+U6>}GPjh&p!@M3jQjo@_TDL~qONC}t> zlOEJ`9?M6{3z5r>q|9Nq_fMl$4=__HQzx?~c;|gTIWCLnW4M))IzuM)tQGZ_nJ88= zt+;Q$w4s!^+sX(`B51V?;o>5Q`I>CpZ~PwF3S17HkrfAr%kbQWq3|La5@OQ&Nq^R( zDUJ@l^FPpeuH(KhF;EgK_INAHuG~g(7K@PQfi?AOXsJwn2c9|(edP)Jfwn;do^5kU z!3a#p?Av&aoCb=jQU)$BA4{6>mk9DyhcU7=?o7tOhfNkWUrwj(bx=|L+de22kw*Q!w@7|_i1uUviXXXXED@+s}floBgx9Slzpa)lY;9vv@3OD zY12GV&B8onK3B>0SwTQfQ7A;nnq+uYK$gvrCDD{ctY}$7f&k9elLez$$saSuxyXVz z&bZ_FXX(n$jf41fEHaJ{%aZkT1&ec0$Js#nFZ2yIo2y(fC^`-eKNDNy^9GNFoRxsB z4N5tfJ|Z)x(X7Jhb7?O5Iifj|ET8a6Q%vun1n)GVnXZ=7FZb`+4rYF=JMf_%^E<2? ztHzf8^iSc*J)3w*QARy z)RYC!Xt2urXvnW-><|(+2RzJ=^_0W2#wl(xUzX!S zr+njR;$lC@vpZX8Ls-SoQLs2OUDvB3R+52J%*zov<~v# z8x~u%j9*#Y&~MU^!KqG*XU!mIDQ32&Eq#EZ`yd0XJO5J4Yc5gbx(_o2X2rWxoUZaE zl0yAGhI=T{LNZ?j zSKrY<>YwOrGKlt$)INmFD;w`I+K5GGCP+X2XZMi@s8-we@P-IBY)5EKzQ(ro5PtYj zfzDuJhC!dN300AAq~@YU*NxLBVyKeQ7)+06y)MRc;|Eb?h9o_&8{fYQ>s0;{rgMF5 zEfKpGBNEYo7VA}-{!=5i0Yw06X`Zww6QxBIbk8GTVHmSDF0S>qUr`;;5ITtfF(b>y z7FQ!HbHmw!W0Tyw5BddLnZHX;3ty1(NxUIqU=S_67aKliRj#_vD~jMIaapq>un)7s zIc9}qP}3#0d}H+0e!M;Tjqa!7dJwDO0YqF!^ULkI?;=IUTYugyywS=IvwLD13$naM zDEng)^$4kV`W{6zF#0Ao!RK-5yV4YGX#u z4Cu9BFm0}4kygZWeF9-GbtQX`Tt*$-e$^!?_JO`<#wlJFm&^GaWZmAljvia@MDHQ7 z2I(+?y?{S%3D!y8Zy%1q61a~D2CliJy3gj zj-b+Mls$^O^7)8X22;!xBlaNy%4v)nPQT)pG)ClgEwvpq%u(%jemXZP;JO`OxE#m+ z81D@~Ue>YgV!!;x?0pIv^vp19NjtgfY)Vl-Zk%*?!FlDfTsXO9LbN=AQl%`8rR&)+ zSRm3&CYlE6Gulb>ZS@Fh{e zZBW7|=Dr9g3(y`7)HWy+FkGcf2EnT}uic(XpwTGQkjl5^ z>HiQpD5w^lt=gq|?1{Xg?XDBu7R5qIy6p3$+$f)(e!5{ajhEdqa<*f}3M?jW8K^Bt z0~akoiF9JA6bw@?w;LZ%g|02SaTz-rf)kGyU8woyva{pr7bH#_$7uLXkKF#c9A$Wa zBX4nL)^WC=>z6Mze|5U5cH{d_pnz8JToKgN$-8Mi3GPMJic2`_bo+*Sc9fP++FaZz ze)pa1LOt^`;REnm^b*3inkwkq2#81cYrl#GZV?UDFPBN&bqlWBLwsjUEiyAX*@1A= zN@Vf5;gz8}^yXsTY~W}MJ)xKOAqX@(+#p+d#CH_wy@m9OU1u9oofAA`>$%TFT;CL!Ku z%C8whmEU9?a7C)UEn6~#yCL;KU(;vWBYEN6K^^!c_V^2m?~z`3*eBm)o~`R^Z;?qz z{7tT7Nk1xnM+Hz)*hq>BK;*%o^8e|3{Qu%V@b9s~zk~$9Z-I~ihzCdsfwa7|%$d`& zibo-V{23($Mf91!LxS@v=af{Hl+~40HC5CwY8u+=nmU>o-J?7}N6$!C-&oJ!0+0k4 z0AYafMPncgFf}(ZH8(vB11_0co0(e!k$}0S?NKUVX=P6e2CN;dZ5*v_ovdt~t?b+{ z*?O4RcpKUTYFlG9tfSSe<5jGalz~yj|FnP+Ms?dnZTolw#~5?haEGfQ?w&V1yaT;_ z1AYC2`~raR07wo00AzoUYq zFaA?Z@Si^e(t^LD0uBrTuN+}wL47ucmN|osD!-&E^Al%>RTv!&y?Sl_{e&FkAZ+dlug$hUX2|4}7Vt&f@}`i;{Pqd|QG1WI0!3uxPJC3FEY@9sB15Vg+XMx9~WfneF z($MB=*7^5V?Tc=Yootn)Y%=_kW!`oqtvYGIkRa|+Nh3=Jxfh2v{?=J(&zXy7xpLr1 zd7@&>R&r&PQixO~6PU-l+&sOY)bf%-mtiMNW0GxQe`Qp;Zf|;m4dVZH35W{z(pc;G zSQD9$%97*f+BT6|D5g{&9d@dR$Clvj!KY(m&yu2o6+L79Gw+%m$5fGeVdLlO$9c?* z^fMlep!L9C5YiVW10J3xrZ+)xfV65Y+bT%KDRq73SQOgDlfqJQ8p)$}EXUU|i2gCDNlMSs7o3(M5gBkL9qwA{H`4u;>P=Y+va@PZfl$z6zxMEFaZ2yhmOsGtYnGiApCqhT?F6COUDT!zZM@ijXcrGu?1~)RgU>e!@yVC|j@>Z{< zUsymIBf0&V`AR2KvOI27*Ll#7$*#vn!MNBFzJp>5>7z-aPuNVN#IUbdXvJM{AwM?% zugp7MCvt2)ULx*)7&@i&Ywtc#5WAmpJ@f#y|LTAogZ@ZMz(Q+YkueOT--;8$kXElK zcrnT=dW3M+(+iZ+!^+Lq2oYQy^Hi#s{>UUkq>$5d>I=gvmum@8DBY(pN6Z7236yRT zJ-Hy>zRDjR!9Y}rwWj3_R7Hhp&~(UaD+hZ~Vrf%jf9gDg2X4}YzI?#!xR)RfZjo6! zmx@&fGqATWrC1R(xXxBYIZ17+3-w<&PgrCb3}%Y+-KkFU=(cTKev2rzbGHo`aHMzu zEs>mgnAo!%RyWY6p)7y{HiS`j1o;TjUKLcN7as-pcV152Vu`*VF-pD4G?lK~sYWK5 zj868N<>2ZQEyD}Ku;CHTxFpMZ*JUQdzEkd#u9T}h3~ z{T^}LmFT&y__$KUbnk99yH1(gPMlI;_}fguF$V_iRGB{dX8gX1DSIogw!Qg~52CbC zS#`C|Eilrm3TL7r!#G+LMe`^UK_;)YnRz&i|3l zb?({oK}-h0)iD$`ruE!A)KMa+h@ zpEc%wt#Jjcqt8d5wRV23^-KaPMzo)I&NHdip&`Zg1exN#~;6bfPvf-fGWImNmhEUs`Iq()mUUKWs}(Tf%k74z1OVAQu8mxMhj^!)|9 zfJ`Ow4rDJOtYckU!0!-`w>vLIKr;!^`5T!1zS-Q(jTexy&Qv^c zzVa*rMU;A8Imc_<;S!SVZ&IS=cjm9>i{Q4KuK{W^r#U@R|y_Kk1%zHdnH@u%*HMI)hf^GIH^8uAEJWfOYStGK>0>MR*Ns_0sWYj&#g!lwf*c=4BAOwQ)wP4fpW22K&$c< zFVTAr7t;)Fq=-VcDt%ur!;n);(x0r8jML4!&+_glMWbL>z`TX=&sgsgDbv8ldaXXq zb<5{=&qna=EbB`f))Q1d)`!%}cj1LQDj~}VcPj=Rd>n5}(zy?8Tt;zcKWp$ZTP1x2 zU*QPvZH$6MSx)+XJXwKn5jo3K6NbG@KUE-Gh?RP1+$@!TV5N?Xut~liyO-g#)f8_p zy5nA**E$W#RR7$-ZhVEh!%RwWV11_zv>xyT_*nC2?+#u)?uS z{4zb39%8pT22(aa2=#6_rk1l!y9Q633n7DYPF6~U!zRQXrz?&39p4l!nI(Q`sx6}W zt`W9Pg|bkpGR`mfDEpjQK`|rJ(#(s+eX&oa$v;juE{}^k8elxA~$ss&cZvuW7s8Nd&i)) zm+~wKdchy@j{ADik~cJ4-3lL4zbV*hOjiox)*?`2Rb@w6#A2EZ_rqzKFL*deQlG^^ z2tGREx7F`DXbQx7UDyl);lb`ZFiSgU7v~%9fNzK)w1%EN_ab`~8T-f#Op73OfOZI) zlI#SbV)(DQ3W~9ivq!I<%zDC6#wCPyxys7xUale}jShM3q>agz(Kd4;5`?c@M83*m zNhO^427;9vfx9*lGrg334X_ncKWUuqLql1INruN<_QW1))zC)nzTkh(2c>4~`I z9f>Ck^^bKZ_!g9c3n;;ReQC1bEf+1Sa9|5J2wG-ub*0f;GBjwv`D|S~)+MUPfx1+M zIlGa6h$=d0`P9c%j%TTQ*~OxUL(#2NVN+#h<4@@tJv9z`DIapt)on^v;CWNcA}99{ z))c4ZQ?Y_l92_jL=pjHONDGH_0hn_(8C zU}Fz_i%4em>3Sk+Aa6imN~3#cQ^*1)7}DPFB~lhXj{rSzHC;yZEpi?hYko8|i<@N( zCo?=w5vA;9M!RcA)*3HusBXc`-Y}Uo?PvdlA31NNF$QMGu4-;H`@XNRe(8spAd*A`)&Twj48MHBD#u!d z3zCedxo@Y**?MwfNU(S_7ENV&b}{BG@j?JZ66?>F(RnF_GSz0ICC{2#JWoJu(G!+z zr>)NHe$YtWYG%gwJ>uQ&DQu)#cSXz6X!x#IRgoMI zIBb#T#Flo}WR`+AhLo46QCzolkJCGMr>oWG|XCcH3$@ zk^c;@?&jnoQf|6Rdw)mVbf(NFQZmvwqr)>p+EDWr;~ghgmmqeIHZJYh5-DJWWj8L-#2c#CRyvbu-1Z1LkFp^IXf9xslcB!b{ngCF|`FTzT@#D5}y^w}_jvW|1B{ zmzuD5>f3C#Hha#{TB$T4J8L9i%G5Eb7e38JeGw?Q8RcjeMye zcgZxCA|f{GIb*XXZYH|oGz|(9FS)(i1oqOoxmT3ej;EJzdR_#%-;r9B8s(lIe{)Yf zZ52xhk7!t!<>-9knF8`+1W)t2#&7@2h-o04iH3%-Z}1GRg@rntU?zw zcZMhmeoF3Vt*j48__T_Qg7J5bW**)5Eo` zDCW)RoYd-N>wl<*H;R3>rGuC39OXmS@0BY`ML|TwGA#UE)*0UsDz3`;;={W8pOk85 z1udd&iL_^HUzIo)eJH(K)NVH&9DXctagruzg}Px-FquXB<5Ldjm_QUf1(2dkJ@;d# z^vw$n*vcv>N~bHelarK-9tYkLG)D{@{G%@=mA#C6kw(`~7_MWaeK;Rvu5vOvCUABV z)2++jilimrAO31;yJvN>eAhKp1b&;~U$|$`lvEb`__datR$wakOf9akn&OB?w0(-iX>LZ5ejcYo_P?YEb?LY`KjnZVn>9_{Jnj2zI_CQ{+8V85-Rvje zCs%2sIf2%?Wi8>wOTo<&hGwtdoS|iW$`)-cC5|lr>04O(6gu!!=Y*n4Z_hVFTE?G< z-(e#yDQqkP!p3Xl0GA~A*Y$VHH1GjH6#|XYM;Cw>{(b$`FD)keyI}f1{Q|h?#Zhwd zXEXrRN8ixQ+``G}va73`yZe=^SFc^W26Q`L2gpBw^#jO0fZzjgJ%H3Z|L)5D|e@SnoN!{G4m+iw!-uQu%8UD!uF5)dc;l_>tB5&I}q{5wTF zf{Ffy9*?-kzoAEfcm!}qfOP~wM}Tq!5Jv!R{69-J67YQyV0Au=%m|w6jyz74 z#%7Ti_oXzP;$aHcf5j!~<%o2$MG8&vQJE~$Bs)G`Dx3P#kbnM-o$4Z-*{rEkT{946I@)fT|GVFXGG$~PJ?J{o)Nv@VA z<%JwmqEAh?RA^)z3As`Hr9=_V0h8g-u2cgk5^`mWQ0mAxSzJUPP%|$VzlU|_SN6L)j-(T`r%X8=HUN3hWtOcBqj9- zjHS!RukM5>#@**mdCuV&m#o@d$CD;sQ)yq+ihpxpF40S+W*)DVBRVkq65gu``QpC4 zitM_q{90hq4oN2fJs-G)EBD)5I+=|pr#)R^*H3j@iSzrqfgd1OD~RyuG%hK(`SGsi zb;%jPknb_`;qI7+qF!@C$j?uxH?I^v_cpEmT`u0i*5wbU$Vi2;mR)`4x@&5Cpke{vh5uqE~k00OowVRh5N-X^R zSZS5`^W+k_5c(cH0qd>EMgFv`molw3jBbY=%p2Q6Z9M7D+|Bh=szSNaix6S>lM9+J z&`&Q>8}vweXr721VL-&U>^cr60S_BKCiyufWY+fPqPcG33@(di?_q=uj z7Y4}kar~pb=9)Ve(98Z=%g=usc^vZNOX0^zLAkgf?Dc0~3P!;dDlDUu(PwswU`!RLt`V(> zXojN7ahRIi=v4BJox4IauA2NJkK@^=DMWE$)M;^3#uxP|uf$gBx`<4lp5G~xpQzLi z7@aQou~UwwtulqYUoC~IIhWNDc1*~>A(5Y0ec46l z#r*tkYx_j4fnINzw|izh|E#F;`L2mc?jtx_B6;q`3cVoHx$YesKpssyhRd1V|df0oqCv&0jJ*yh)Qnou*ELr%`^E2PvoP|?~~CtE%ts;uMHo{S!QZ78$6V& z)m&u%!cxwKvHt2RheN~!4nUb3Z)S`v?llI|>XPJYx@&nhdn2-$+r;#z-7CwZO}$D2 zUg2$t+Iu3qV|Efv1>eTkSwDZv{dKQ6dhU)RN1H+c~np$0J)l=-s?{n zr6-;CKSv9yxFWjds)jR~G7Sd;zpZonGPYZoC6GTPYIr~#skY$s*l9vOJ z{@+Uo0QO0=zPN~}xTvVuKb9D2t1K!e4lFS-2{Ca%@%vvg`$tg!pZ7lx`v3hD9{A+X zgZLv(A2@#p2>sJCXJq6Q<>b%GE1Xj}bN&pl6qOXu0t!JB{{zOy9>Mrw;lPj&@NxhQ_WUOClSvqU>fyOLFwm2ko{^c6k(H5|m6@5HnFS#E zz%lyo!5(0$=b!h-g}{i<;Uax}xHmq!9qo@vdt=hZ7}yn;lHh${UtCsJ0U-RqDhF0Y zWd*Pf_sPIPd~IzVX|LP>?3IDdavK2clg{A*Z2#~e{^%^8bP^BX`-l8Kuwi~cLihgx z?*segLwcWd-VPkMlQzwyBlmyWHj^0s-@E1`cAs?a{+ruB+9*GL_HX1q=^*~!uET@* z!yAC`|9Ks4s{g+K=kxgg`qQIhdNOJb407^*1TYh1HB2aa5QF5^zJqBfewe^2?f!DO z;qK5MJ7t3)MEiyQTit5(C{*U2R7@XZ`N>t(D>1qP9of zQg?L<^^dxxuDm|lIUf=I-QN$pr2sAQ&u^P6M?2@AdtXT1Qb$^1(lNd3Vi;7Q;;35+ z*f|R={nipYS1d(y939gOEyo`2oQ29Nmg9eGiG@}UyQPv2cg}~$^rUVnoEo#+k(M}3 zSN7fNZ9@&=H|Zv%ZYeVo(QoDd?oHO=F}+i!+ggrmS>;+Tsaq<~b5M94=$3L@&ktPt z-`!GwbW8oQbN>IMmiV+CWiBDkF>&SOV^2ypLv(*ccR#0)?vm1ep9=GPZf+rLzi_5K zB2MQ-xdd^@|g|Fp+pHom2O~f~;4v<0^`~+)h(Uf^ArwGm>G~E{3^HD8`Gh zLPukya_Uh-Jo{`?+DNveidvDDKI9m;bL?Fa2OQF5pMupTa!LH7b4=*V2J+z=G;`fs zO*G9DswOjDR@Pz~gEQXQz90HTisjW=63JMMt}ZK`VZ$iidBB-LaArx{Lg>xl5y8#e zB6#dXhp8PjhZsAku-jo^n_d*TszyfNs|A;UN^wV5sKYF0;ioxFJccK_95J5 z!&WFGDctpMS{2`>a*L27O48n(b%0BR z&E93T=2}-$>+HX{$Hk4?j}fk6ljB=eDYM65;Agy&#ULi|2||p>9X7S%GpcZ!sW34j zJzQ+&8tsp(11jz4#L#9Qd@LbG&PM8yrGF9I!R$kN=3_L-@C=UtdCk+$2sqY(<&&Kl z6+u5k*iF!b8b9$R=J+jy`KB>DnKkI_SzRYm~gcOD#=#lWF&lZktDqS>-&W>4Q)lW8)a&<&B!T@Z7TQ0;i+Smu-eRm|o5 z{kg|iA-;Jli7tvtb(8i2zD1PhT+~-`raV7M6;IT(Yh5_wl^N|@aN?ee{3I1 z{hX^7uf=qn?AKzg1y@t0+^4BMUn=eIxm^mFe^xl?SK)WgeYgmXjAb5J-N3rO*YJSH zW>&1`dcF%a>~BfE0s;>s>7~$kvMCQV-IGn+=~X=0Y&1vvaS&LF(SbXPivl?)-r*&; zNbQ8LJ2AWo4!H1WVQ(uw-<-Udft^EA(%%!$eI9GHSjrt3vf?^rc7JnO*yDP=`C`FS#%F*W@2}JPJ74 zIinGslQH@`#Y5e~j8xc%l670jH#t^$1v^GA6nNjY{Po`Kap$wPM_=o1{`z2t=z5lF zvz6cyyrNGPG<^3}SlWeq?;TRQUasqZ>wNL+Q{dyS=OcB#O>*Zx8oG47cpc(>?>KQY z)}VWtHR)47 zo^=tw5>oDMc+myjzkA|qSjvw@>H6)tpTuvyh@Q=_HaE*&6W^U|+y7*)w7;f!@O?5R zn^q}B< zq#s|fQ2=BJMLUh9eYHrtf{WZwH~SJpZsQ3bK$?)5Qg$sOih3^$w-~}osa6>&d^b&q zy>$0+RP3cbcAhjty>vuR>n0S{WmjKGL#jGFSiPLeq9SS?1;2wfuw$ViPQrZm!ovfB zzny|^&zTs7rjS<-m$id-Z^HUe@CRu4kRi+(<*kB=)QFALZa2_1!}_D>?lBokF2-DB zHN5Q?qdudB@l>&JMSP0#Igh1ruZX{o#c0IP?1EzbD&hl%)o$&@gvrMan1#@$QhICH zC%8sX8d7yG!YV(+x}4iXeEe4X9kg z=wCK8uGm!H-lGg#rKm+lSKugxK#)eP${kN1Nf3?909`8$%C`dJpBGTn8 zlCQ;*U)qE{MyagsP(CzNEyw5w+99Sl4J2HsmMLk_YATV<8paqOXS_zwWICT3xYAHn z$JCd$GF8&g|fcGahPX5UPng9I>!m6$;MJP^}?biy#)6tdkFB1#kAp7 z%05rJW}vJ+hWsjuHcnmtd@s!|7UngRoUcYhG`uJwc#(*MsiF06_R@__LS!|eL{BJ%K+%mELWDF`VteTdkcPKB=?1x|CN^(}l~~k#_jcHX?{a0Lh%WJ!Bif zxi*G_b&5*6G@&4nU^|tV7FD1y)fCrl({hUDMOq)UzT+f(9Z$tjmCctPUj(8#?SvQu z(F9{uG!)V$hw@Lkq;s|uh_g`C_olB#QuZw(F3sVH6?j97Kn!0=q1ZqnUnFEIC}yLV zTFacWXAv=rgM^)iJl?eBV=NMD%YDj-seOAJ#$=z*NRefjU;$11YDQBvs?tZGaf&0q zdn2Zd9YgB|b01Ji>+m+zt`cX=(00ql%~N4+)J#*+J7TH)Cqu8!1?Xx*+CWK9_9$+l z;6qrNGmB{|DA>v-%*xQup%?xDdzbt&Y!^o(=~=ew3praAPs@bKwZm9%QdZ+N957Tj zXe=dmyv>mn8(c8w&1kUzstr%=Rj2esnnHV5L@iL9Vn|trk8Z?Mw4bTI`UWxKNu^i{ z7QL)`CXU=~714&u(Fv*yTdgE}LvbsfNYD;S*&xs;%YdWs8qOyA?tw5NCJGw@jf@ja z6^V&5R6TQ?!W2bArIWeK8ZDJTe)>w2sb>SbC6y!yvZfVZPKXv{qQGFAiJLTvl+dEn zG)9&b9-eUGrs;5J>*-6uE`pGnMOdnQTrU=iew*fR7a5E86T(xiqvCnzsW(9IAH#L| z0~xbesL=~bh8Mu zVyVt>P^8PB({gx`!7GB>HG~QoQVXT)3%{seJq-p%>b`NKnNZRXY{iQdEt^opL z6m1j=EQx}&5uzX7^fAQJq`gqtAi!8P^gnjMcLIA|6T0C#<@qH!^PZ4u#l-SWc$ZzS z&}K3bPo1w8b)}ig9o!o8A>pc$)ItX`F&NvI8>{@U3IuCIf#7^==*SmY#`FdLZ-4mLJPGn*YQ za0#%;!ksq#z3l8&P{pP>FpKd~2~De4i;&Wr8TlsKL^SlgTxu~MH!W(|v4~(wAP?4_ zT+bVo9UuEuIVl!E=?H?>EW$Tf4e^Z8MY{STmK6Tj)>$0Y&-e!_8;A-Hj7%@(bvq(; z>!K~pGMB70r(5WW%F8EBo!(VyMW==yh^yf_bSBRKGAxk`qeIhlBVlH}dGu)L7z&8C z{W{;!)?z8HuTziaG_Ip)v)M7*FTLsC$LwOM$YhEtkiKe*H1=~^6E&?bAKsI!nc`cR zlsJJg?4|x%8E=qC?%8Xc#$hO;qvC*r+q>4}H|O#ujXL3QRha3jmu+-fv(gKNUK8GO z)&*=@zV7?JpN$cihbbyUqyEW?h_FQ!+ZT}b- zENZdhiIz$_d(D;c*~Tl~?#<7`R_hcvd=TR*^C)8Y#5f>K?~a1wwK-=%^H4_9X+(Kg?h6edG;r~!=30^70-HoF9CLWz%KtZ zxXn{lY@H&+uF3BF;?*(wKjke~fCf5BiY4-Lpwe`PO-5`9^StS3d7xlS>1 zNilFqGjN^$y|_;^aLX`r$+B_Do#2+^;g%ETQ$PtS$_Sr3BdUZJQ&y8u)0EWEmcr;t zY8jl;F_zG~ByMCbW@0U3Vl8HFBW7tSVSVA0jrJ*<(_%LK!q)5pR*ZaB418Afe1O>8 zicZK1F7mHsc`z|+xTqamt#>%$6+#qvK*<9&7K#GAX!8&!zy z2KZhZ^k*04uX_+;53p#6_vwlExrq0ri9Hx1uqo=hLhK79_T3`(V~GzUi4S9mBT2;3 zRN_QBaWaeeB$xOc5BQ>q%MHZ!*8O*#-#2>pw|a@Y1H`Yx#GOaPFHecvFNix!#GO^* z*LC9V2jbq=ub;a_;y$2c`j-o^H0=?I8~en?AH>;j#AkcNnQz3YUE=sx;_wdf!49$K z3$c5L*ttvW_)2WsCboUrZ+-W(b^UwG`p?F-{kk{A>Q!RdDiOazyt72iStRBx5p$P` zd8@>N^*{7aBuL_4qFx8pa|=@LjPl~?ePAwShmEz-;{QC6^*&euvoaWZ0u~MaUb3K+ zrg&S#dbGLnFL}%RiGpq?*98&Px09i~2OZjWe>TunoYSGBe3#*2l;rsO{lZvV{bAI5 zF;?Z|lMW~9kdJPaC$u^vcy$VNI~w1NrNfjoYUEdyC5P9q6h+<}tG# z+g*54=W`hKUauy+3;B2l^x^)CrqJI}FXS`lMEg|+r-%6bbMhX|d^?{PNl`C?b-dkU zT1Ma}b-S`x_NL<@Ilhqoq75awo@&s{;!XsUca17ET?9WprOITvp6#& z2mYZ&Qq*gI<-t^$c@()l<05+4ZEuMb_3~J9KiRdDBMaX(xC$=aTTUiLy~d5SZw8g- z-7*Udj#GYJAw|7>>dMhz`_$+YaeOzl&y%8FS+>jMydG5GOIAtGCipG?p73U6L(;D6xF6K!vkaMAr;Y1X+g zr~MyK~cwk*dwWy zA4GH)9j`<$v+*;kkLemkOY06FuXTN3A3Pj`W?V*o!Dvu$My60yzNUKNn!{069}kr* zLDW=W5NyaqiPOr!yZ3<9F{d;EMyLR_c@Bqr347`!nab6`VYW3?^ojnJV==R8NxCbn z`2;7f7peDoWxW#b+|gwO_o4Moc^RlG9hu&I)1doqhzr?|;iK+T*4N`r!Z1RmQiL?l ztu;z*M?8=>G{>De7McChYLfoT=77`a_Q~t4Ln72tdQ#-ux#>Ae-?4KO{>8C+`Z&UQWRp!4vDg8_G z&cSAx{E+!0UXk0ySN3@&O6QVop}u#+a+bLK193sefJsmjocLEGo!bRINQ0VpO2*1K z=`#AVFfR%LFwcE?-<2W=_Zx~Y@3Qt!2%%A@Iv{YoJUD@tnFDniLjC?olSpibo^Z6UtAFY+|fJMXx?Rg5y( z&LRx8+i`MyyC=stKiJBR%{{uY3%p0yx@zjoKgr!~uF$J>zce=gtaG=8kVLG#`VUCL zBVg>ss~@{(zN@jlEnu^Q~htsm`}tXW=hMqHS#9(~WOki?sED zLpravbH8=J)vLepeC!p_KzDC5sXlo9HzYApAM$PNHSx!{`ye_3mP&V#{P57gi0S>QQ9mwW z^@fup?_#l;I`zf3*3p(XaE`4z!J?cjNcHNeP{yFTr(h}d`!ZTn&+4l+o>AGXi(KNr z-)w2%FO>o-Ub#)<9ZGgjs;!5^LW-eeEG@l}$XR<gi(PM{S?&DwKZrAFTS1n zJXTFMp?XANQ1p&v5PuR@-b$5O9G9TIt|N6j;<%cqG*{7_Xa4m8+ovVDH?L~(XH`Fx zs1xP;K{JU;Zkm#lsJ$$mW*&YgC8_-UPLvDKK=#?o$8s)=_FL1&5~LELpK*Pt8n~7(BtT;77>l1XOxjc4@D&MUvnK$sj5D@ zaGlH!)Z5jTAw}*H$6#IJ+OgLP0%0qEdStx(N!u-2|$ zZ)@1jy^}=v&(v#tEs?wT!Ia|XQ3=01o+>0*UIas{)^?>O8>#afP&s*=#@3tU9?r{}4~VkI|h;jP@W&%Kbg&pf4~=xS2O)%z8na=T3TC~)NP}2rqqmV4%$QAuqAr;+ znY%_=3Ncw%MA<@_?B7N?&N7+?Mmqz;2d+$-LJ`-7qokoRUh+&z@CH7-q_)IFCO7?(}zo{PIPOX{A(v&I(# z-E(H~Wr6WP_gqzbd=1b&w---fO#r&*n#~egf$q8NgwFN^pnI-oFQFIco|8`;FiQlw z=Z3QrN81y}XA>XoB?8@ZPvnzk%#xl3Ce3Ci0o`*iXOmv-{Xft^XKwJ#htXUP>E;P# zZ!n{O&a*w8NJMa>=WGp21uVGcZfC{rPH zI|yC{y5sM7(BIJqNM&_4+fWu|>t>`Be~_MokFkPn==0kK>p@250XixfRwLwPsz0Oy=tHqmj*&=w2|6E--oQs=`>U;hoTfwqI!K!(|T2R5;oPzfq z1sih(pS~AtvK4MC6z-T8?gkZB_9?M(BMl)`t6aztL$^yig$GD{F{{dPK4iKKHw7PZ z1!dwrgFo2BHx9-H5%ej&G$bAxUl2gDzgOWai?_dwWI9t!X;hSBrbo5qlv9EfbC1^? zG=`9QZa4)tf#V}((S%hM0THAS__CM4MWy-TTp@5ut38FUiO(*~?lLR7vqW#679Afq zvs(0?PtEP(C65gFm(7ye5*5q&QZ?<;b*IZ?r_Ju8*pIubx#ZHj%^N#7$E^>z2*@CD zCP=^ccULA=3gpX~WiF}vIRwTV6T?U2luY%pRc;q@D~wtzva?M`222HpSE-=>;-y|2n<(%CbwZoN_6o?G47 zS=~Kf-SeZmm%XO{OwE8r&ESoi;oO?h&YJQ0nnyosCfRGBoT;6$sC{;$b~d+mzO(k_ zeC?|rwTtYe`ngq$y0sg1Z*%M3ch+sp*M0g?x5-|=eWrfLqJH;A{a$YUkIwr2`Fi4y zdeCtKxgr5O_bC%KQ~rWJ^sTOPC@ft9|=R`?l)r&g(jYCB{e((e{#A20biHDG*%f4yPS;(tHaFO@bKGr^hSsE;@lz6(9Trm*x2xMQ zd2I!K@j{#Jl&SO&K;3?p?Bj~@YGKd_8QNRnNUxuq?~cd+&Ws==JTQc!mh25E091Zx z`z86pf$K0nBHa$f;UsrB1ki^=AV=ICRyIHjeEj(Ted6#F z+*~L4csPXk*u{j{q{UbiP>jkl^xBGahDz{Ds?-+hP)iLeD-B9(O<;j-G%0K}$$@37 zNp`fHbUn+hQnfFc2FpsEro2jTYQS zo6bgu-bRPXMwiV-pVP*G*TzW1=7OY+=^0xyRXa<4dmB>+J1a*=M<-xJ=<;P}XJ;1| z7gu0b$PJhla=&r~7#KR57y?Fy{@W?TkA`c0(}PC?HGr=NAO-6 z>s~{0e^b;@bMSbp?{u58DoI%|y6Eoj%;;FLvYi&tm52jpKgg8#dH-^xX?X~Ox@=KGT|+iffB`b28(aJY zJkOQ$_ePol;jcpI`6yw#elW!D0Z>hmSp%w6PjRpwYrUpkZVA-J0(hWxr)&9n-?6q+ zmbI27JW!r6l@`Jvs_~-%y)=YtV>aw+Z+w$M4O-2(+2*q_!F?)$bD_cOWu5KAc=0RD zA6IEg9LIXH&E3Z<3~omj0C=Fvbeqew;E!GHTcIrx2)$yGSJ<5y>dj9+2fyn_XSz`H{{Mo{B3IaI-IY9!s$16Jo@>n~*3*2EEQ4q{OHWwsV z0DIRVSP1_9T@Zf&)pk`2j}NL)iKB~mxf?Gbf-FgH)N(6{v9S=&&UF}dDbMqut}6FT zW*5oCX`exsRxwwVRkL}w{t&7082wRJP?e@#om0Cza-|;mtJ4sDC`Uguo`q19kZq80 zl9xju!1It2csK%;3N$p-z@reTQ2;s=fal=h1w0JdfF=dtamdMel8c*%mrsCSKv+OX z^e^uEw0 zq=r5;ovWx~RMi35xwZyIS5r$*OZzX!`JZyLLvY&I#0)T-0pK*?G$Yx}tVxb@lHlBi zBsd2kYQS-B@96B{uZm zNmCXa`dfA$8Ww^DN)(Pv=OjT{LSk}aQc6-Xut;{YfANy#{N*M4OK=WM5dtHGrFTop z0Mj{XmHu7;I1NzKz(nC8FI@##%YeB;z+6@hxX%G;=hk5 z9?8=G#;yOxtd9`uzp-lIi~owDJ{o5H!+5qIVE6C&`ahx6N;FX9KO4_jXpn}evWdK- zXJz^0FlkL9$8VJS23-5X?|j|DTR>DwrP6(2w59q|@kR5A)vcp^-2#5o6iwFRxiXrs zlTm9%26;=$*H7toUDJ})#o2|uCJiAnL-*=b`(f}?K)$~HeDE3-Dw1Qa5s;&&(CiJx zpRS%Rckz(m$Wea#oZ#4{wt2nTZKk}zU4J-;jN*ACFoc*)Pe%T<&Fl5K-k1M_y)%!7 z^6~rrFk=>GBSo|f*-4h{DrDapLP(74QubXL``Cx<#Mp_7B5O7FC54JCEtG6+Lt=>W zTPr3pXaaVJm_ zOqBb<%3D5$<`ckw-qnFBwe4sCh35`M8)OU3aJ_81yA3-OC-D$I=336OpI`hAR*kB$ z+X9RbOAy!`kPPLa*7TjDDiija|0tpeniDyE$7fX`% z;OOMN5n{$(zMkWJd#R!zV0o#M5-YY`RrWvm`o}b-THlG??X}mQyF2uSd%KM7 zjqkg=AS49@)1@-=(1>tD3Nu$f6{<{&z$Q^3!nz%-*0f0OAqw_q}F1lSjQ?yvcp<;Akf7g*MS{y?SSpqB%yZL!mNV?-F2A-@KxvZ&Ps!&0wi_qnKd$S&RbZ z5Xb2>q>Gt1&u*Re$#oi5GGPYROowszDPs2v@Numw!cY5{K(txspqZpHb=nF7r+W>S ztp=4jDb0dfQ^WN1$I4EPV9#r=YU2~|-nZm#6$IHOr(jx{35&TE!=tf2xbk(TV>=*`EEV-^@%LHkOaEtuQx z6Q)U{<+wFjPSdr{1kHjY*3^%DAL&wmML>sfcIGBs=|16Q49$85 ze!Lhdh#TzZ2Z4`vs%aeSBgNk!oGsebb(BLZlZ9}lM_b4RED~N3Y};ok{B%wA+&nD1 z1V5KEw%^!gvsaK4e6*E&nHxNs>et_ad$PEw9x#e=km&GX?x~P(iN~K!Ak=;=6Xb}F zz}WSVC5sU?&(LP$!gV`Ge@42!qWBN-AMWw{dM4+y%}m9CeY<4IPYE=H z+714;qE983Z7O6@2soQghn?P%PSz-RQ2!|g`8+UPc_ErC?#l8eh_qicjqO0ODcI6RJOp_v(%D-Ns!06-KT0x!IE`@i{ zb!^!0Cx%a$`?z9zWm4*4?3TX0{8iq8w{k!7E|wha5Yccyvx0Haoy7@0XYu3;j3o$s zACKUA5#$o+UURU0{1ir}l(>nms$nqxlLsoQ1F!um;Mx2rcRBT8w` z9_}-Bv(JH>v>&v|cKr2^!Of%szLbb0qc0H{%D1yew`X9d)r#|PXf*_OTuC|0ISX~7 zYXu>^vDR$C$N?Ln(|L#%;l;?81D3r>~+B8agp`<#;01m$I9TzRBh?5;zU^yffQfP{=?Nf-67Mz-qD{oJ>Gcs zXM~7proxPAk-Xb8@N>-2T8l{AYw1y8RJ{X#uL##;fVSM~E$h z|E(%D@6Mv`xz-oi&(|uR-exvqsfyjt_c6kY2%g>_tyCKk!)j-Wp(-w@q|CzZ!{>Un z8hzb`#i1VC$FSeVz=tpXN*#Z=-VYUJK32h(dLyUwEo<7>WHxDnq-=EAj;^Doj|5h! z?Chg`_Mb_^l0o}9C+~jq*ERY2d~;m+6*lVz{NpVzHs6NvgC{eeawLt8t4KuOMUD3_ z|6;Q1F#|1|n|Dbw)cw(xhd;+6&z@wS^yguNAX;X;q`gHkHbFl3)e5&ABgo@TZ5P=6 z6#CzOXDDM&T9*FU3F^ajTLyRA&i;C;_)~*t6caF~&Y!d!_mS@e`@oaT)yOB?9Q<44 zXHidnyu?AVX$}Tz$bz^)Z|Tq-B63;Bv0;q;!G+Lx?@+TwXeaIJqlM62FaOw+kVjPX z7pi~n24-CV^M!^uPs7;Nv901T|oK+Ac!gj_TB}3jbia>K^w5l7iMB<(N4v}A=|>?sTWPpQdxL3Y$zuGjJl2 zu?KAG9T8W}&dr#k`lBsXDuM`$(27bMSOf%0V(UCrN;{pt70`-e!dj$nB3fjSB zn=BIc&IBe-ihU)HeSIO?*ZjgSome*eSi2ys7RBV-LTtla5MK`$>qH2mJ`UR-!V$#X zBn)jC(Ro5dzQmK@E6_ZnL0cor-HM{0s>B5(#iL`#cUOeDnuuZCP~h~fIg;s?Cq z(lzk4aDmx7tHKr@OmUV%^@W) z)=xTgk`RJi1Poy8HxwhzkFXKPVHQ~A>nf%TaR40~IS)b<_b~jS($Gm7TDa%peRGyE zGOCItN&#=xT?eC0==!*zJw~u9>!{{&>`-~)?xMDe5av2Lcp=*?xQtm13-2Juf5#%j z2?5pSjyY85b0X$Dnax}(+-pHwfedY-p}<0zmw3dEA~szC7D7h$WT3L~*VHbtUR2MwjjM#GV-p1 zc20F}!BTdH+XXi%omm(%G8St_F$W(&7g6KD#erc9f$4782YqbWQiPzK#G}Y%xmZWfK%VEMI&13qEV*O7!5$29ZcO|w*?6|unc$8(7-5NHzZ6T;3{0Jd zF(al=Oz7s4(Mz0&ZWk<2?|$zE%@q#vQE-$Z*%(%3am8F8r@`)Sq8}+?S#q7i$uUPnQE+ z(C#B;c_*=1J^I(ytozA`wC>7Ofrn>z_0 zue+dIh*jt*8;54B0-mhDWLPtXS=w-TLc=V1S*Gz#Z|%PF`TO5!g6I_wq>j9YIVU9-@bXod(r2ue0sDSpPl_ zbej) zgcyC5QcNdYC0pv`fmrHk#mD>* zFf3HYfT8%BF@Q%PGhG4;VG3raI2WTv5rMpD2f%;RCt{SdoSb;-h) z7Z@T~H*6tQz)+Kvz?@cgXiRsK&3v+g`K?N>-ZIjRXc^sS$;?h}5y$3CU~I;3|cF781~%(dMpa zY(Yd)L&_XZR?gyFjg-*zI(;y`+|Fk9U!wHhQO0iQrv1?A*sZgkC9-LZ^ud|>(Gm^ySBPJv zVwfb-Oc99#^oRjkE)2CIqLmded>GU}sn@ZF|;O$wdgs?&Msm`ECG zfW~6e&_of#mK;R;j_AIR!Mwq`IW#!LHa%F@t~fKKdpjr~R85CAma#*G`!ks;{^kRJ3hs%bQq(S#zyf504HuT8u2$ zHE_OUY!lfcuD5>8Q2F{~EnkNTnPd0VI)DW*L5(#sgr{1Q(;g2zK}EdbZ9~SZu}G^k zb$Ku`+gBg#XVM*EdpHS>og0GMBXDDu^h%aVs$Mlqzs3&cpa-gRs#&Uk1XdpcKNYGI zgZ23N0#%&wbdbW)Q>%Ru5?hBnmsd)D+xAOgaz-pCka{Z?c+bG8YNzL|kFxHWPhEq&-L;ABx%y_}D)pC@z=E%Y~IQ#p1vp+7FXeG>Fm_bb-PEbH$PkSYi(v>%>mq_26@&DEiaafkDh4EgPC%N;p~@}KatnAF-M)+ z7cRIo7$Et@Fz;z>2^46**D&Xi-X(lV|D{0XZG>+fqCqS72t&K__y?~E%n8!sbC$H5 znGGTa#tBXtih9OTVc{2uD0~byDR5eh{JHHLc3r_rP4W$^^k}5_R_NVW#cr3h)9KSOXYjfnC-HmGd)ANo;N=P~Lvz+F;WZ0tIjg`aw z*;3jzcQ*Rcr%bU#3rIq@1<|CN3zsFvl`j@NtEd&OGUUum6sg*IH>&ra^f zk0B4Cn`qbE$jBRg(7(6W_k%7lMS$Hwm8`66a0DwLD`tVhfH#j&7~mge-P4a^**Q3X zB0J~){riEi{ZHQh=e;9f85ZQ@6X)lb77$Pp6g(p&bXG`6M@Yy>Na(z@KHlp zSWZ}2Qdn5@9|*xepM`{l|LqBgNFEVC{ntsHJ}hzOKe;2~YDdMj4ojHxNV@SzUgMSY zK6KpYu!PSM3E!jQemHSIJ~4lOG2jdDBND*(Ug45*L{S+4 zr>H0?|9*f^|2P$8mD7r<8uDs-C(jznY5`}YsEa?PZ=q#uZFt@Wf8o-3YdcfIB}+G3 zo2wQ!{wB89bsZ85xm_ix-G%YJdBnb({=KQ5eW_RbQrtS?9NLJNTCQ6@3_0Hr zWK!>szvpXQ>#1MupnpfgZ_xI@r1G7 z!Pw|xZ1gfV2N~PLjO~|b^SjkAldIoe z{`@iWYjg0|R^Rrop6%_f?d^{3?I$}sk9Kz2f!p3`{k7Awweyg^Q~zV9=G#ui(hlY0 zPT}lM{yRp_TSmqtgFMDae#wX%VZ@L8)n3EV z>x8t=-kZqE;Ucvt)_;IXjvSWlU3^lBFWm!`xSNqJAN)?&_dq4KYa$0q`t$xm{9U}M zkO`#gzd&Wpe;aiFGmx%7sBLd~_;tEDDnN**Rbl4UZ}q6^m*p3CoPhTF_VKT8MoJC(+CrP404JrwY?9*cidm008A}19qYwU(^xcV1Qd`x5*1Bkz0@n;H;gg<@~zB=3pr0Xvq zab<)}%vSD!O1MpeN>?`CM{^n`^VqoS$K;Mo(nP!%&|Wu?cq}qU{wDWnGO2jBYA)T7wc?|_DnsN`hJ3lsT&5+1 zv-F&<(BvEdDyh!9QCqG4Dc7~r$tlajxy9++rAVQ9094X4ax+#dcfODlIyqm&^LXHV zLD8h!VzJ)`tDM3x`H;dQ0P#nmsIYInc7yW+>3U##d_itXYyy8-dX_aMt=(#ht76rA zuf5JJs?S|oGS0(WT``})TdrK)DyHj2$PlgV<`?@+XqdWP>(~rXBV((q7p|D&-j3=V z;X-{Tvwztx9Z=uVd=R1b#yAEEOI(W?RDV-=1&^UOU;NVU5G;12>S+mF>)24geLDa7 zpEahq71d8D;oZC+sR~&+0wg7P>Bg5!n$73UWqju{?wWCfwYpW#d3WjI_wULY;+Fyr zo#mkGY9$}hT9x~1cBo^t@7aV!+10b3uK6aY&!(s_H%)6^ZWzt-!uF4*<(yv|J;VD- z6862^--O+H ze&@7igHk8xxMa(hvb!U%*g9;n?W?wP{mWLoZH@7lLa!g8?j|{)-+9?Rh%>-9J8bI) zgq}^{4B$Fzdge0khjxRI@5yFo$e$Z@H_nBsJHn@T2 zU-)*R_@m+IbELPp;h9}aF7?P><=29m0We3MuTYJ)8Y_rx^V3_!DWA&TZQfN)AVH3% z>!^yZIRqbd&FU7M1Em1s- z@1Xa_meB6?N2yNVU$X6>9iIT3ZoiVJR+@CKwsFC05s*XHpKmv-1&EGBARBnJaUv%X zQ}K}zdgCniUFr=+m}rU3nU&>v^inZdKuq<>&o?5{-1FtJDok^DNbb!9#PhfTS50(i zBjz30(Au+yg{6;hvg%oV4eLd3-EL>(*= z(Zx-zr(O+XBbrE44)#R%Zr6HiT$PA_t4vC_UmeYnD6oB^sjI|0xp_uKIg9m>l7zeck4jzY4^sCS7%=~Db*BwV6rIp!S$+&rS#_@ z4y8^bdv|llq52KOn?gNgRlQED6HU5DkEF+HycsauxA8h}zQM`lptfOXNSVQNn1K4T zE`0nJU#Zysnq!vBFDVw-su1r7;j(eFv{hZ?;%A?a~)9$1!NI@0u@^z^Ar;idaa=Z+kh&}jX5Pe~n+rSL@My?b>?Sf%z8 ze@8R>^Wn<%E`5L~XvJf-UQM^TEqTsOzk2q3<2U`|A#Zzz&k;=?-(h)qrGwvM@^tJ& zVJ1siU-47+0e&fMmnys#oKu)9yPNx-A><>{B@a9QXbJAo@x3)IeFQD(8+ZLEyLH8z zLJvu3%5_#oiSE1Ab!ef^ez=J2#bIuppN|llHQ@{GxepZ1^eCO94t}C-s(3?mF9vc4_$453wO*MD1mhLeU(49+kv9)oF!3SA<)Mw zr845STQy#N8&w-`Hm%uwRqh@9;*mKus;s8>d_1La`r>Dm6JA+(``FuuX9uqe98Wrz z*7#Bj;(u57`m&s;IOqDTzGuNzk89!xuOgY0BnI0TQ#{1x*^PC#3x`@J*7Z1akIHm? z75Jvi4tZ~PzMIRJD?@r#Hf zBBD4&*<2Q%nJF(_SzZK?6W?MdZ)M>hyOf$Q%WmK3?l%fb11O$398u@ZH z%D7onT~SC=H(Wa?T2CDWp+t>zL_c1QwgoUF4@FKY#!R?`S_JW0<^a|dJ((BR?dY*u zLg9`<*MUB}c3P}e4zEp>nAb#{9Y@ST>1bbFL4Vgc&4?IA8->+9h&R+#^ahWn>5LLr_z&9aaGvKA zi4syNi#aLF%_(0dQohksXxyo*im5A>DZ{#{^qkbK=G5(pR0cg2bdbF4nmR8+h6a=2 zxn$NBGIElPb`ymJr(%@SIIYqS1gCN5rtusUX15~qZl>W5rt>SM3s|MUpGa$?!1P?x zB_`7)H`ApKGH&w6rymi$DIW|J;chCo++;pYf zi~+KnW#;Y-2m)fetOSDKb14V&N|f@xl44>uIr9c`AI#*ks^#6?%&R+?pAE?{Q3vr- zSfPZx`z`tHllhM~xhk#lErYV3SQYdJ7xc7%AlQQb$%5yb1tSMRK%Iem5@U4m5 zTmRkmy5bUOEx3rDTXcRFv|e4r*ev=!P_%=fK&&Zqq7<+@g|(G38BakBQm{P5&zC3| zvEle+G~LVerpk=-$Ocm&6s^q6x}3pXe%`&@ zy0v_TRF1+I+wfFeo=Uc5t#Amba8*ur8Z2^~s<;-Scg4NJQ@PTQ=cuN2Wl&z_rTb+e zQIGwAm*fmt9hRwx@g z0>h2u#Gwz0a2%E4z{zspPX4*Q9sAyh{Uj%!+1ve3B=mrA~-TpAeQgAt-a=nCuCD*%N%g$w?oR zml0Bs6;+g%R8o{tR+3XuR#Z_@QB^&ydP?n2U+<5D^iNGs4>b@5oUb^!csRRyxVT*f?uxs!+ZE3%SG_#0d0+MPx#s!1 z)8`xD>lgS3l^PJVM@t1dePK6<;lxP5G8#)t09t#0FY9IJlmMl?J+l8_ zHDsWL2h@;%SMUIE>D@hvD8MfLL;C;CF8vKI1xWvUsDFU;zjyz5+Mhgb>3H1G|F~%M zarFDg7e7B%1X{|QkJ+~$!*?DtGafTBfR9g@cb)5zOXkN%dA0(HE9mYM(b zng5Va|1|IZ`SIUY@ctB@|H(T2FS~gEEaLsUU;ODy|G}NgZu9;pDZ>B8o#H|8bdmG7 zZ2;Wq)9l~4Q`r&_6T|&)DS|Ss0tD9l=LTMsXFpB~=rjLL5yobXtb9@e{=%JV-N^KR z;6Bx~*U=00KW&2{nOhrex7^m7> zek{l){jk%j1o}2L4s*@S+ch=yQ|lZ0 zWVoiLV}h=Qo1j_HegP`l2Lv>-OpV<>W;$kxzDkDyxVjjw1f_~xuinjl%z_qkLYY4E z)xu_hA6kHp9&~IWAL!_b7+pI8boAuj4gej!yN<^a(twVhjuzwWQh7mu`$7cE)#atC zGBL<)^@CZ!1|IB25{qQi_KIDps(k)G8~Fd}=>65vTZzXfm2g(-_J~=pBv=lW9BAtA zkqlW$Bp^$<`*eF{@>Y^u4NG}m_xH-Tt|WUUl^$Bq?NgpwNeLP%J+jf?cY13jm540E z!Swny{;eoLSZ_ezdNn;~s7y#H-z2N3@Rf9XIEXpI4VZqB!jwD8q#3i93KvkQ==566Go9TeBAStXsr`@ zqmgqRJl}Pr)kkPa;rNmY84~1l#>!~sL(Zs2oG?CTvB=U@U-n%}tUlWZ<`n2L1UO#k zw4yyWYkVzoDoLA9kq_k?6vZ7KBy>i0bhPBa9Q!UwTiU74I85~e`)E*~O34absE#u# zX=eV!qiVG2Nxqsgx{ef(rk&mH;ti+AA=fFWE7k{&j?P4#7w?a^<2i=a#A+PT z&K@;@_nuK+F~4zn-~IF+hS2GTdQw+O1jjNJcJj^06hf$Y-zdD-e%IcF-$Uc@2X2Ua z)Czk1p#}6_axL-zAIcpBn1e-Jg|Jf{iO>0XmS>{bOs8$`-EY9siFYnwOryKC!6k36 zF0>j?P3Hw>#9&A71d-z*#YPG#}C$aO@*>!x1B9 z)Ly!)(7V~uD608gz{j<(U}QR+@bXXus77%p0v>6zRvz=#g@2tVF3NI$jVrPDjIOt} zgZ77`qK^nCo^{0YSvFS_0l5RWG&%ovX%EY6^*Q!Lj9YsL&PWY;6F&WB_SqHCQc-Oia8EeX` zc{mj$zqWoS`xSa_p9eQw{XNs`C3e*lJ`C8!_giT946_hSQKChW$xx(X#JdcyAb=KX zdckpC%3&3zr>ta6%``BJctUe|4BH5kuQv;8(iNuxTx9`eIk=}}s; zZSO)SN#|H6i|sAx7vV>~w}-vS&sbCxh*t71pDvJ;$pOnswmE6F=XTh_LToJ)Alh?{ zLnLgZgL=XG?O~@!u=?&Z2_2BzzgWJrSTRd8isQphcrJOTMF=#g`$a)C4lU!NXEWpI z&72<&f52+0_a)7C<@nQ*hRqN; z+6vl@z>K<6x&7HYD3s?wcx+#`{i;KA7`Oax%&^@$&69iQfJITvYdiaOb4K$HXTZ^z z_h;Q)=c6Vs0Pqr8S;7;koPZ%4+yNq8zQ<|H|tVo1d693>% zS(}N-2_l+K#JWmK(qOrG*1OZS$mz6u5)B>zphz3A!TS@EH^xbS^T`7#$Jq zX>ZF~AH{7Sb3YxDfk*aIkX&@kFcCRuj*SALre;v@aOh8t=pwRvU@x2;h|MAImxM=2 zD@MUhqRvj3E77r*&2T#L@^-hWe+)+58O!j-p_CLzdW+@;6Vc$6=tDhNJ;fL^QdE#D zyJf$a`V7274Vf|nIV=T4`|4nTgv6KP zygLJzSmX?v!N-x|BScJ(T2dStn(K-U>9@?`4ueI+q)xz-M8FXQ^fCcW2bp8CTpUO- zDgDvLmeDtxv1TI4R(vrpC*rv3<7+-Z%dp5q8q;B~)WajtZY(O7W+>x@xMS%cJI0(& z04h|Mc5!~oWP8B_s0#u6KMTh9&ZPvqMvY9cThhJhR0q@n--|*VOg=ACqqsg9oGj-Q{v%2*x9q^B=)$4FR- zC8@FI0;GiC)I=<*hw2=NMV51A@Kevv&%nVZu`kGeEGw`n8alczMdD}1VNtM#8oY;^ z>{J2Qt+O5OH!Y|{$IX~u?L)SdqdMv$KZ;zqQisSaNB7|1_&(EEDSwGf(y|nsb$`BX zCh0BQG`J4&f`(4*MW&1dZbzp(1{>Rs8PvQ^GsGi;ok$zwIg46IH!quIFJx_Yv_2JH zIBC4W=(RJZ6!~ZbHT}<^wN?Qqmmcn7UBzCmX0WHV(22wH|uT! zf=qrQ%tD5rFvPjObEvhn2IGwlIZ66IVR4CeTbT7Bfr;X|HllNHAIa=}IO-^l30nVze)X zloA4wtb^TNK-C8N4N_qm*y83G%o(l1%VI@VtY#`rQFg2q_<{0|t#{42?^-96ANEN- zi$@I8ka-K2Wu5H9@fMs;_Ij@Hc}j5ye1C{?yhP9Ka}V>tX_x3;_*nNetvW<%0Q|!o zbM8ouM2w4pSeCgw%=TvxoscXcm#!IO!jqc;{1ax`i=>BVxW{Z@baYrh>S1+s{2E!~ zWpHT)3#H+i&aFKcA?)>p3Gcow#54W7;h&h*`yU+7gmSqz7>JN0v>BU?$#iWC6Ih4*anigyCOV2@ z_!JaoZBiFSkGAQxGh?fz#`(xELO5!2d)J@|+&-T(p^~r*hiVYX)oH~ECSv)fjms@E zYAqtl*mycxMg;6nK~8zK+QzhW`#qS*crf4mU~JMfbpuTT`5L&kg1u`+3?72{TJtD% zV0FZ}8mnPl^tr6Yi@Xn)+zWL+H9E7kyDzodGZM>bteInp6=E`wlse=v5phWy>vzQj zTn~Fr!@Q7+WenOyd*uuhVNy$++=6NMs!1pp>>Y#^CJ~uW&3`9iEXJEZB4E@3s!q)* ziJT^shqe-3AIMP5ZxQig;wW$IBVD?Eym-O=UumfoHuEebiVBG*zC|e3Z#yP%l9cm} zyPE4Zz#@i|LwrQvWQ|OlzBG8GfV}r2Kc1HJXt*tF(;Jdihupeg<$8qQp5Pbggn-d z9(;3;LoUI<^|D)ubYIiDa=5lrqoK}Yw{$fuAYw}u++69!(j6`n2_nB_@!Y8~L! zfR#~@{n+xuPtz4sj7ZV8waw?8A-Bl3a8axA zDiji0;ga+enrJd9GKX^WGX4I^oTmluhPM#yjpF|qIZi}o(qQS7zC*li=c-T|gC+QY$a$j3s= z8@eM$)gb#85XRJOhO+ZCsrzPo%Kqz5PQ(S;3_MA=@?f~tsY?(ntVJd877Td20P0Hh zO6g@=7u5R^VplRD#rNf_VAKQAlW$&5Cs87CXga|SG766sdE)rXJi+GCF6F+&7qch| zYKQ_mF#vrLoio%n_G5bNW5V!P?xF`fW1rlnTArEyy)D(q90_{HtOl<9j~2uKN8kSU zdGX&9%RgVAkdiwg{ntrJ%Sp?~OUug3$jZx}+`E&&$^AKnlX41jz{xAh$t%gpE6XdW z00(HD6ckSZ<6}jo(@M%`fC;j)>hBfuDUDO7&jP{b8FekSJ+qVUSxr67J*|_W?w->L zZ)9wWH?;sZ$9twGYg=G*Y;9wA(FT|u6KrhvmdCbsmu(5a^4P)79vB}35+|p81?B)VYlU=X4x?KU*$!=GGf%3I0S3R$KdIJMxA0W*1 z{~cxmNhTnD3JD7iy$)Q+KQ44{pnN0jdiag-h<`avP6a~FwDdjQ6QFp?$pu2r{Ji{v z{DNBrw+e3ox2JWY6crUyic5+CiPN6cbT9e*$M_hCJ?{c{=gz%9$!A^NeZboUn4194 zX+tCMJOmh8zn|uRJS~58PJ2qHzn<2XJ-O3fO!`Oh^d~9(yWa^I9|Lx$-rnBd9@IZt zr@!XKf5Ob)apv$pp1qmzZ@1Il#`urc>E8=B|H?K042%D{D*i9W#6Vp6=Xv+;9YA>a z`0?ZX{QT0=(&x{g|2R=sS62Zo>e|}c`uh6T*4Fm+_RbD~5B=-;lXLDO4$;4xGzK#` z9{OfRQ~qc4W%#+ujn zY%fwvl}&1&+$Oxd4R9OoOanQmwMX1{WRI-O&Z*3Qus*-lEPZ)f9X9jqih4%slYkSK zHhtv)Zo^*AnKi+DbS^&VGsCx5)S>fbrMfa>D7egVFyG;~)@e*9MEzW&c->pom#NbT zuDe?+n)VEva}S^G<(wl*M_wHd!F{`RU|*iiDd|d|iP7I$r_-`V@x{RyRR?;>dioo| z5U$PE_8ma$6mA2M32Z*LYph8Nu7Gds?R@@|iZ(Ies$<)3On-uauwXj0NW%g*2j(er4XP z2-ml^%!j#4&P>=}c%N;(Cq(_k{`$i;4kc}uq$)v3VIIV2(n*~G-zQK29z2-l7;4Wt zdL@i`Z;RafF!2m8<7M^P(yRp6g1BA<_k0FKOR=<^&7D8V6Y=#^&Y3aQNPyNVXX#W0 zus$X1zH|hLso&B|NK4|Fm&b=elm)Id+nVHKE^geix9>wpWZnsJ=wP)>75ZGGxq>viBj zJ$2)<3fZxaRr7?V&WEV_SQc@Q)d7*p=!;LVE3>7ynT#dAyXfJokJuhm$=DZg0CTdu z;dn;KoF`S%#llTg_|Do3?pf%$N7wYBm?5Tg(LVt|kNeBf z!?w@G$)P3-Ns9RcYj6BypTRVoR>zqcM^8mQH7Tk5n%VeBjU$pzHQMGgo~^$lSUax0 za8&YWC$7x1k3UcB<{SUOZ%UmeR)tkk`0%|g@`isbS$;*`fBFBrE%N`9IVT`QwcT3H zrXnk(;`D}o`%VojWU>c_{Ie! z`cX*#n-CR*s#1gLk3{mUQQ$`Z6ry62t2Bl6M-!~qO1Pg@Y5yfe#i6Qob@X4P=dG2A z7**?E7<`e{x>hcg3-_&X>r;i^@kfX{%X*RC$^E=8R$*us9ZK)Qq3cOHh95Zc>Hh~>r_KJ~ zLe!x-A(hPme9HZdO2bcL7dHnjpWn}F8u}y|y7`pwM~Etuzd7V;{D6`7dT3t0ZS$E| z%7cOh!v*E(&F4YSe+yAh|JocTq8lhMqeTtgtr3!OLkZV2V3N2sO8zZGUDCg}^&;na zLxsY#CF9VomlSkkm5$M}Y5vx$Jt69aXUi6CTVr)8jkW)`tj}j(uZ8}aokRE9&ZVC5gx}l1p2A%pRa!>&GA0eo9Q`2 z@h0&F;m}WLz4FX_w4^T}Y)pR;AG{OcNjbLv4DlDErv^sf@7a{8n<4Ad4=o;K-%?|qP4@PB z-WWmG8Q`M+WRc+eAOR?#WO2TE$Lt@T;_m6>{T3l7a)>9$YjfhLG};s2{-N#?6)VJ) ze2xD0`{N++P^sjahyeI-E3WhDkHKX1U}r3Z+~?u6k0adhXq zo#tX-e=H5Au`~99iHAi=Nj-;_7~UQUnaO5KC8A*)n8F3?vt+hiDP*$(wzV(Rs*?T0 z2J0doX-FXc?6VHQVY}4eXX`-cu&mQFsEQfz z?gl-M$W4k=Bt`!htj`HsT^s^Di!2*~ZY^LnV6fp4HeG6@TYaP)7XA>2VxC2H;SuMF z2_>#KnAyY6an4-;6gfjGv3k`G2C9zMn%tw!7m(7HMjj!r|R&M-lw0}vaS3dNwS(gEQV zB>OC?*b8z%{d%({0$ZQ>$Q5x$Bw*e0#zD2DDc7Xk8C0PfW(G`OX_z4bT!Y5&dOU)f1i_0%{0!>YfEClv9J2e0 zj{q5d5GKFHBY3jC^G4Wq37)u( zR8F@^CrM zG#_s%qFevV_Td-o~N>}Sh2V1X+IK0b*izT>qEQUay|=t7n33P>k7W)9>`lj#gHS` zV$sT6o-1)hm&mNI>w+KCVDEC7n3S;7OQ=|^m$M!ujgqtIg=!mt3FR@l5(>*`CE#L& zK?{T}K4qmjC@&68!lhvu;AkJ)T%?v#TfPKcT_enY;?I^QM7wi z7qJRr0wxkdAJKtVx7YVW;KQICNIgW>Du-E`wGiaTHg$7oV*ft(h=U@;T`6=lp?Goz znM$ZwU$4mo5j$IRrzcVD2~oQ=XxxP)W@&U04ZP}Hw4c@2sS?puRl3#`c^VS6|%}cjg%yVyrs(F`=?qgsrzVd0<&~CZxD0@2;>4 z0~>>_=$k+ck5r>a>yKVZ;uFW7A+RchCh_X1tI~kjJYBjP+B$*)qP}7}wrMJ-WpMvT zp86AmAuB>KULIB`cewuoGMWaKBf{dEP&a5ke5`d4MfmE&NEd427_sUgmZcQ$KfvP| zIfE*2xnY*=`Tlm(teB@BsQ#yzR~SBjgaFr6WA-4kjk&STT?i<~dp}MJZjG z#EMY)ySlKYYDivP3kR>~&TaCE1xS}yQ6$z!mk3{lq26i=Ka$zHLm^o+-uJOSlZ-`Vj2c8v3MMQ3 zP~;-fS|#|>uSWaNu$QL!12a*Y)Yf(F2k6E25d-EI29Nk$;QlTMd7Z~2mAChugrre{ zekN*K&F2vfY9q{U^t8ZzptwRjd5z zPE?^Zzo^SSNQ1s01TyoLFH#UfTNo8W*BN22(oo{MO1Fc{lSPpDL2SPAP!}t6Hz%tf zaf;l9gF(D|6t;RB@s;l{rhDP@9h9&cQs{SyiNjPV!&@x;Cccm7S0BW_gIfaYguGR6 zn*U848@TOF6~Tsnd1R`5BTfP}NO;WI0By#hm{h6Lv~*c1cEomrjduzPS-2u!Tp`kt z%GTnv!OHWdjEOg^Noqj$Q0aM(L`y32tca)lAkvcN6B~z4!+A=F!N>+_rU_lmIYaYY zrMpt4yX2;!0wx17RN+Y3Ts9L49|63yGZjNc!hA_I%*WqLU!H6ul%OgeWP3h!zq=OB?$V_nr4wp0f8|@7jB>wV!L9Yh22oGhZ{uah#t6 zje!sTL>#7&wb}%H!qQ2se@(d6J=>CsO^qD!IavpMHLG=+4+70---rLh34plARE09E$EQe>w867S-Ka=!=J}$PJ$Edp)Z8) z3(^$7SkE4o%IMZYD$B>15|fKB5k?>(UC4-wV+F-J3t{dHhl$zQua|E9TAIli2))$n zxw%ApgrH|1V{D6u^gbBK~ZRk%uv6(^G zK6~ajL5Ej#ih)@Q1;fG`#&_PHV#B70D_&q;2z884en+^t&XR7vdtmla3N~?SAENwY$ijiCy1qruJUqC`wAPO;f@Ml8AoKXRcyU=$_k+`juU^1Hg z8x>bC`7Xm6=x@B5cAaV4p59Zv?pXV5_0dG5^bOtZ)g!HOJ==GKG-E3|>2G$@-`)PG zd%5dL`rRe3;*woNA;Zu$HS#Zy7$2TwkL!~r+qZkk4O^P!P;%Xe`P|0s^iY!(4TZw{ zcOfzMB&3Z?lyc|Xc1a%jHRB5?{(zYP36lhcgcy59`87m5>}u*a(SGTu z6EWdQQZ?~OsTzIF8-2kNV$8Xq!v}w{3%37863SUwMn*nWIw1QNo{c3GQhQ-gyK_-v zv2^Ei;Adn-=71k|ezX1=Xmp)OYAc8Tup1A42h|tEy}_;ZC1&yS^1}%P{_FJ5JvLw7 z+c6y>_dtpI#W|Odzd@kCp~=<+<9HPKSb}N*^GOQ~{Uy4K%=8TG7cX%$GV(Gr2{17U zUqXp8GK;Y?i*YfFbFfOXuuC&>$}(|XX5_xY$Srq?TaJPI>P0SjdQK%;4s~jF9V&Kx z3Jwz_rx_WS1)SRw&T9qZvnJ*LGd6GmJEVXkxqveTuNwuACpk|bIZrr}F9s=)fDlO| z6T^^6=8{S0Bcuxu5_uHjIg}z9G(xHLf{6_Lu_(SsR{k5D0--zt*98T9MFl)01g^;l zILZmw$_dz<&s71NzsFWV*h*2tOi9XAS;|aV%vxE%QH9S%mG7D+pQ{ePtG2o zkgJW5i=&XEi=e%mpq+<+g%`hxH@~3|pPmn&why1y*(1N6w}7Fykg1o5ji-c*r?k7* z6>o0^A3rtUKwZBO6W>T%?-&>Fcn{AcACJ^Px6Dx2tWZ}>m}_>JYf6}ROn6{ecz8f~ zv}bs{Lqw)=M3H7h`PGO9@rVb45uH2{Jsc5FSR(paq6V4KBW$rxIpUu2#XlEGcp;WF zDVgy~1~Y%<<{SC^cM64ziiPi$3Kx|N7gY-0s^-5|&z;lCnbOCMn`R8!rS)7(Zt_d0 zh=|Eaz7d@j8kiU8Rvchk=4(>rtzGM(T;r-(?V?cSEMMh#^{%~Kh20fkDjj6%uE{ic zN;BW^x+_%4l@qhXX=;hyj;r4(0 zS~>bPyZ3YC>(8F!pFIaZx<7yK+WgkFa?-i*wR3j2V|u6K#mDx^jn=8nmg&vLnXQ^v z+hucmC36P_v&Xr!CpoXarA~ZH82c7I^gV9m``_X_p?s4)TTBZciFN35PM0q-D~6@B z>7PKLN~sKE%~*xx7WFz~cM5svbrLE87-2KVV063ly}wqKMcc1KzFIxSs-L!{8-Lvx z_ifK7iH{ZhExz9qkwJ3bdAKBjg5jBm*T+7RMWYJ!!Z6?cus(pjiaQl_pbVhueY6V7|yr@D$_MYlumVOQ;TTW1wWoF!P3tP)*v-TFsym-WS+}xmr)io*}PTiyvf=n;S0Y4 z@hNxN+}6wZ{135y(nlSb2*s_Gjk}Een>D@}0W>H%go1MhpVpGbW=$46h`YAt|G!0B z`nOOW5Z=|VFL*iJoE34fZ(_$8VjkMOeM`bktop)%Fo8aJl+8hgkiN5XigXf9*v4B9 z7yV3({r2SwcEso znZhwny8Is|(W9Lzse&_l`?OQ7q@PYvi1M&!H^e$v=P18xuK&_j8deN6(wgQY)xaB* z>?WQ0d3CWYIva8#?`!a5ZEB_mB7*&p#`^xm_TVY=)tFpg%d-lj-Q&mWHuqW5<4Uqh ztFLq=WWn$#u__`V8B^I`&{K{KJ2+t};_mxld(YI5P$V~hOzP26F$})b#wes0q9U%< z#J^APBkVHpjKn=a$3oDBazh%u@e&R1L62Db_LcQ-{Q8>k7LVkyduPRsU3tvO{*h8K zB_=-g!t#<(`D5R0mVm|zg9{a`idi!{5d>o>8s2?bMgc;!;kKi&L^gyl(w`aAIn2Fi zMh=<$a?zYmO?bXpb)&VJRXp7ZZ@m-q-hG$pSN-g_^v+)R3Me3+uN-1XoGn`J6h1HO zq9%5%B0cdXma2=Hq2f@HOH44q6DR9MkSf*xrvmo)RzeZGIXpxb8ok(BGb4q3NOF1 zNN^e3WR@l7_3zZE>(m(*{C`S(-qZt3XY5w0d{^r)H5BRL+l?b7dJFU9pyqls6;_Gn(5`qTJH%EmN#BK}*dyoE?}fg<$V)W2+J!k$^I2w({gSVcgyaU3*U9pJ-HL7BJiI4% zk3@zr=D54Lh2ILrw-j0{&-7k@_tKMPQrG}bFKAZ4=hLTqhzIvsigI6lGuO7Geo)`L z6!axz;78q>A@|VEN@)~PtP^98Ca3_RYrjh}qg zoWEdT%jQdnkmibIq;&t+SOwfR&L6Hjdi1|fe2*|G=y?Ba#8S-d8D|z4Ot{XDzQu%UTmekzSd1RJKfif@APEYD0E0d{T z>jRzmyL7aD%%6``zE|&jB9nclD)BmmyJYA|r4`D+dG~5vkJH_*(5EcDA3A?=`i8Hc zxCwj?XnKFicQ5MXy;^-oDAi-6&qZq{Be`3cp!D4^8tKy{m;gw(p)iUG5;h@_S;St8w2dG#m zdUVP6$MerEhJBJsN$T@jFKOP%g>*(E_HT*x{JfCa)#GboBbTdmK(OqXLJ8mQz40Q) zx2_6OxTN+f$d@!Yl-`7QYS@LYEGlZ6RC+h!WxwWy6G!|c|FZRf`y#d%Lqa~NM7&(_ zqVPVQL`b-j|E!FidKs`X6miRmT#|%0 zrWf)dh~%qT*nSnkjpe8b0{Q*G(0!)>)@up%ih){S^j9#5BSAL8A>suKI!iLT+LY|w zR|K6&WZk|)R3JRfEZn0Vshk(_T*NC+UOM@DQcXdU*IIl4ZODIKv~?2HY9d){%5=T; z+U!ySfq@kU4+cYu;a)L}$a|`+T$+>jJZuP+lbp6GSx0i(q=PN-2fNN7@*c3mBRAWzWTwGN!M%#~Q!L*8$27WT>r?p*n7+#z zv)#`eooZ}Gdl302_4IzK%neNX>-mfAM6jPMb{6_+NQYDc=1i(GhsPwDD<_#B6*7)b zU}j>vBsp|srY?Kz%v8TL0|K_yp{_p4i*XW_<2U*^|no?f$aWfB{r0LbSV}34bC8)TJ<$_ zfHvo&cn-r$!|yFA(ln{$wRpq?j4Ng26x;GBT^60wD_Q7PL1d7Vwp>xmy!}|I*{8Yj=B#@*hcK=M#NrnC)7#?Bn5Mc z&2h(ns3b_zCwtVJr1GGIW7HPO4EIqjRelh^IA*nN=A-=~;{G@PChF3z6tPzyOJ_Rb zzO~(!bF%rV5&4}h;`^9AsM`)V79yC0<*g9kN`vkA_Nl>kq`mv zzfc4ToDxb-4+l1YY1xq%dB`sbTwwa$Wc_>h_k08R_oFz_XAKOn4NS=*PQ@xg%_d31 zE=9{BO~)xi&vluB=L#^Fc;)_!Ib(T@&TwY#YJ`j~F0K#&>^S0>Lty{&##U&-c zX7KIO($YJ3fc;=>Sy|bC-C5Ld*4J^iEPVg|{ideB_k|xkXl*^q%$-N(fVdnGk2?#+ z{VC%3mqgqEkck@{8u}fJ`@QTtHg=wjd-i9|7YM|iN8$c42M6r+0?D`kcRP#zeaBY{ zLok#^E9&tU*zq04C%c@=0Fc5ovOr+-c=L~U&vtx8v>_CZOwl4hXAyT!)zhTgKZBMv zT5G0?KyM>z7le|g8PqB?`ER|M98U^6BLA*2f-KL|oJr1|@60UXC z-PW3Om~VGl9=>7)^jyb;ys4V$IljN#9kVAQ-g&&aJmPkNlo8$3>@-?fp=qj}kNx

I(YGC^vPyv(%r$>#P2{ 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୍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≫SGTl}zY2iTl5hbwKbS{?|ocFg>E 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⪼t=tQkinDvW4qUpI8w@;e!y*E zjM$#0kU<~d#qQUk^M>PIPk-n}2@SC;*6fT@Rx93_yC;QY$Y1fkL1+4T{IY|Ow#PIchR%He|Mq&if7$D`#6#%H@f`ut z4GIt3B+Bq)dKf#gCft5Q@0DQlO(`d@7lU5)gA!+;H?40z-Lq}JVRJbY^7op zYrTi3DZ5PLVUPFM>rzf%IsJ^C;5}40zU=}(ewFxc!~Y?=@(#Q){KfR9@5Qsq@DTO! zr59|wV&k{!BgONxJ4rRN;*QFE7Q9}Zd*z2Ds@n35pdD=~%1nq;`pUkG(A!S?F2xPE z=fy#|M{6y3AjYq2qZQ{~Ujn8T6(%4DWl@3Rw8epW$y}On zy?CEV*GiXjRk&_lY!{@QA7RoR|65p%&3Y zTM^KFAFUaN7#)E;}k60wR$=k=S94jy>itF!ue zb>Y#{K|{b~-HpR%3y+Tv9)?rZqsX)u2bjM%#_81CGK?=iz4*NebFbc>Py6LFi|@@j zll2aA<1eS~es3wEdf=p?z4ZM57K`qljbUPQ6V5E;#$+OZ49{!JYA9Orv}PCqx(QRx zY>ubS)MqvZdqqy57gtLanU@*4Ysz|-qXgA3`h(xm1CM!`BeJ-OPvN}#A)hALjN+nrN#T323zU7-F zp0Y9>A5P1+eFR9_PNek*Mm#Ar5V(>Izv#p>cjcm!#)d948KSs&EJyVOq3>i zvIYgmd>LB4M|AfI;I?>MzICeOPr$&-2HBP_9T>gXPxjfO^mdu&;Wtjo!Jx|K&iAeE z_x1-aU@>ImhuZG4FIc#^`!3{c6{Lqg{Pd22{K#6oJ~9kt`DSlww0H3J*VtLbRmRfc zE+O~rNPjEqLn66HoEogRFWM-rjCjPhUU+RB=RJh~=iHB3+xLu%JBp>4F+>m%ar^+D zgAmkB1W9)9Z%Ow5D<KO=RP1 z#eU(~s+TU~HQ4y*l>lG==CA(?f{o{|2^C}ioWJVE{tRRPwHuqzGKP0!n_HV(+#nQ< zS)=e`Y&@Ec7h~gNSo>Q}4vqvX_HAdkKg8IC4A#dJAHe={WB(?v{Q?Lv>~HuQ@5v^p zvhRlcY8E4a*o1Pi;IQD3a6FD35{4$EvXRk*ma*9Q*!aZ1PAu`l?BC98d_4QRTrA^P ztyq3Op2RNwZOi_Zz7nF>KjwD;d;d3=O>k!8xoms}i??OB{+Yr4A<6!g!Q#_b{NR~{wHpNhi>4E8Sw`x(A9>`y5+K8Pj6uz#elf8I*Y{Oi`R|H@$h z6}tXcEB61uU;jIX?EjRz{(VHb%}#GH`3$XEMV^R1y8f>}m;XGXq=WDXgC1a2GsNwl z{dGhcWu{@#<(i!{6c_1oK?Wh_{|9reU+%EqUt7?21w!h4|3J?Kb|3ZYh|+aYW*k?T zV1U){aE+e$gSiIM`T{yYWlXoW#8)m{Bb117Gi8>?klALGH9+xkYnRuGYYdyyylccn zlW$vw8Jo_d)=vcBvuWO^}*`cUW z3x!*lgdry`Z5z+`i!Clse!^oaT;C7iV#%t>=bvC-;hF0*A8%%3<(A0=)xn;+iqH6; z%VEtjL!tvGd*q=f=kY(6>3^6)+2_O4K@o(X%a^Suo>RGy#5X5P*k8l{T>d=VcvYc4 zI5iUyuD_SU4~)S7T<(xrFlLdUGa#2Kxjn;~r1ag)9GvX~NEN^Rd1EbAlb(J=c-dF= z8op~Jcm02NMESq@xm;6KyNQ=%Z{m+A8=nep)wdE##5zCJZZ-7$id#vAJ~s~0yL@gM z<*obNJn@UURu}rxI%neYrESrn?o0b?zpXDF%fI5*ESIlc8&!2*AAN4eOR~403VrL@ zpLh9&XRhnMJwExq_3a4}necWWK5pIa2l3T!4}j%9Zx2E>gm;GMOkH<|86EK@Vyymz zxHVRIca%HZb(g?g?>-am_`EwVJ|es~A-!Pro_W}QcJjt@IBk)n1K555t2SFQcCp9k z+zhsG+k5P?DnMdPd~3UfTGjlT^gip{NtrZKbygfC@_ySeStJ&VqPgtaF*(h}3Oh}E zeP*9}l?y2If-~=``1g&z{CiT;r~cmLpQLQBRY#h&X<7`s`6TG<@CW+m@MQ}B?jaF(r^=GpA6IF*#&m#8njA})Wfv6C zM(AL-pCpVXE3!`>=rX(JfOs}Ix|0?g{5pRYtNR_szWwrr{R!m_tz$&iA+^jQZ{QbKE2HaFYQY5bpxk*7X`%7pP@KhdiF^c;9_8yWcqd&zWe1%=99m31gpgzLD_4Fzf9bWN{E%tWNgl|Qt z7jA7Gk@r-QcK%KdP}&NKGSDTxDw?IH7;$`rPEyjf_kJ%wM8ncKd7Ash=RqRqbEwKh z%G|>&!3mIPho-*xKvWUx9D>eiCqXT%@g2Cn0j?CzYYY7mf`X z!CmA@<+)Q0Z;Q?VZRORa5?Z6o%mDPRU@n_jb*yg%CuLNxD_4R|l4On{Y|9K6%lUZ$ zk?!798`)j@+Q|cCnc=3I*=Mzg=!e|3k4VX=Vdlre6*~GOZl8^^g*wD5UuERVAH%=& zNf~;G9mE3M(;LVGuprdQJY)ZRE~KIXnXR<%d0R~(&NH-b@!fOIq0;A8zmu|gHGk=j zk5rQ?FzMc!S)=KiWDT5jk=bXX;dC{-vhl1bK`J~W#VhX0MnhG6eKgGdxy(n@*-Bd% zOk|MdDYIIIx=bC19UThJj8qJWDMj1RO~P#yVkF4@Zd8zGcZ%{_pNoxnEkEM0)|7J2 z19Y3U99HW@D&Opxc;$0nQ^Ai|kNHvxb|aH`)ktS`9@|Tnpv)Ro!)Tm9k`5A|xJDZ!@I z7@h>Y^Qr=0aQyimqYEZKFh?3{$%=gJPp>IJ!_Yr@LH7ynmSxyrw|pou=TsY1bY>Mr zb$gDZUu{bosa8FV#+K0B+7pw0`$?|s90%Rjw$HoIa5*SDc8E*Vld<@M+wGs{g8?ri za(|wrTubx2GpP&vxs>IUxLDfdZW+t7n8W$5?I(M7V~k8%M~~N#3S}S1D$g@yl0?q( z_(#iw*-=)9I}wJB_o>*SVB}+8&DCb#DM9x`W*O?d`6Lstbr~+6Hx4^V?2V}5D2>m$ zSr&M{xLv!8t^)y(n}}dDPPh5S`bD$s-n4V2_!>RJpgrcS!8vVt-l2y1~r}SOt}LYLXza)h}VFIoA2~L9}4e2Qa5Oe z)mz8rfJLd6@;i|yYrA(o_J2}1(?OT0yz7JyLHyvcn;EL-FUQ?Z5SNmUx@qEZ3Vt_z zUm|w<%1Q77SG6<^%%X8sq2u9X6|WP#BaOCmTeIMp5rXS6e!!9(*5tqfK8V%1d+l=R z!=C-Ahg5?!5VxeQ65v5RZ~WABamjuOkli4}98DbI4Xn^JAv5)A^CgYaJ<6ifKv7=2 zqNfH3+htHcIMi`&3GbzIj)?@lHS)I_gwzoMy;?}UD=6kVLd7)#c(G`9#t5z&*+CoTT8lVY5RSyT!A_2AGS`i57ZH#WyG62eB0O*fY<_Bt)P>jGS z&9TgvF%<8yRPl{WmQB=ed_81+&3j}6!3)5n4iD%@hmVmYX==Ko;h?*%o=roMC*pxV zk%pHToYo`3snClJL=nOx#>6C{!BU|BGzAWPOWn&5v@DJYAMySwcdhEFhEE(gK~vxF zysK`uGc7P&-V9l&8J@NWqFFaq31EYKhj?SCvH~L0auQSx;~R!u798b$%>2J)#EXtV z@(-X~zRLVLi5x~yofdOj8Tl~&fG4JY`LtoIsiXk)2oed3d2#%|L(;K73^zkc-b5jR zy-ntoq6$>|{^e=$r9 zi99!I446?V+X$i0ycDwH3-H8|pCBUS;!-d2q3cO~(H$CdbFLo^u0nX_^m#1b9vJtT z>CPKcR?@*#6)aWEtcDQeHjP|z0lJ@BsT)zC`%W-@9%DL#n`ZYj&#$mQGNA79Ac0^& z%N}&Vm7pd@%I5RRj(yr&i^*S|94%W(E7W499Ff=#wbn)16$Ue}baHN=6z+Ho@3xl( zPXLuqIx)#v6{lJ_&jh28-8anD~QjxASBxN{NQFI>sD`-#g2g&v8*f)g2Fivln;=ZY_p6~sFLJ8|H-LzXjf&H*e*0?g7X zPX`;NmM1RVDC2Ot04gw~hH1k3(9E z%imRYuopHdd-bG`qS+{w_)~5mF*&mG_IX7-Hs8dijurMJd-fV2VPpvV?UxSBCe~;>oRMnfQYN%9on>0G*k3yoeBBu4@9jxeW>#)?Zc$D_S#D8Pc2RA9XuG84 zY3=B3?|R(X{iM6MzxT<&lm4NB!KZ_S&h?Sur=w3t#zx1+$DU36;!me0CZ{K-{uun) zuxEHnXvX<(1hA&_BuA9Le>fTF%9Y~ zIxS;uW}0?lT{>o-#xi!Od8VAX87YCZ2k*yoeqpCAABzL;z7!dNrnQ768M!ZV;|s`@ z7I2joM-Ryw!Upod1!%#d&i*qsX07+`lJ6fDrxUQ#uDy>FawKacl`F{>XU<M`w<}2Kc}Lm3T`A#q7{%Z zNR+9UFd7p5`dMX(qTUlwfRI|>)f4*=Ee%rGSDGD-8~MbrOsEyZ*RBs3sfqMgH1`pM zCAQ;a##|S%qzHGczRlMOdRC#%PxDa0Gy6f5W~t6DEaAs}#_ndY7XzXC>nonoT$L|WUlE`ZRy z(_UO261N6Y*sNL874eE`jS@RsR>`;H`|`57IQ%$pgRn6XOu|L&(U+V}P6D56Ox%q8PQKG%FcxWJWmP?!BAyKqU_X~_}WJ-yN|0|cnOQ6?K>&g0tmcMy?61xdNv#g}@wMlWjqXaXCh^c^y}7h&lBt-YH1?$vsY$NT==K?bdnBf2vvC6I5IfA4 zaM!oxSh2^~bYHLPOXO{T#*!xWy~ZfioM2jvsEmD$r{3Br;czF1(^yE(;;=aGT#_*Y zeNOE5fMC51wXgjey>c^1U3vhP60XK=v|CInH`-5qcRLaeE(K|54$$OnNAX|7W2d77 z^pCcq#gj_Gj++1TfjZ}#&OS9!e*A&Dnl^1ABmO{Lg5R(QA28;m3wz-M#^87c0(L5E zpX6}Oj&Y{usjPGAJ@+Iox)uJBi)^XMeiP-;othEl@0gTOFgNu%fl-wy3?}AU1tskM zsCpG9H93i!oI?O_scVS8bp({`T&1=TE(7b>Yl?Q3!L;+dg0I;F#MW1!s8)15l_yyN zzVve26A5lDiBeJ)J z@WfRtSNXn2tmu+H%nKSR#CcDkZAm;S)y>j>5}{>p2yo3&PtB8wV7 z1LM7R^wIihHToe2ED1=6O$|q)?IOvgRv1}~l1wd%N}shLUPmk@f^CavWgvV#!3fQt$=2<(X_3n~ zIbM}AFSOnd2UqLhhGX3D;`)TG)ANu@4;mt7xv$LLF!%kOlm z3oq)YdJg!sKtuLAL#K`IBieudFcioh=X{D|1b@OHsfQMnpTXM)mz23p+Q#nhs3fc%p_5ak3q}m zt*j9Mu%NRSgg`)d8;fG>IU&fnoy3b4pUoz3g{$8$BhZMCM8n86+W1 zw?GQAFn}z11#G}?q;btgQLEnR_1h_}_8m9(`VGgW^g8k-#} zeg$nmAgUir&N&2!^y!l+u&ucBa}Qpa4IhHwd>XlI(-##;HQEOXFKs*3)hZH5$PEkn7?=cucjmgkVu?L_B+4x z=Dq!y;yk42j%(PPZ?+@F%Y%h}gZaHX7x{wN7IeWKXKQqx#odZdylG6M6S{`q4qF^` zx81m`-pfDfnm4|Dci6J~^XMmq$8D2Rw|*+_RE+d)>b-NDd4>D__Hp2rd2`T`HZEF^ z<2Wx53a&_3hv%an&9=aN8AV?2S6Bb&48%s%G@b2deT8a%A zVF(i+30d+(f3EgzbVQ%eK{xmZWODdzb%Zi+1dORf$c(s=9G;JMjM&SLz;vikA%G4l z)axkf4+!eVc<0*y^jaUq2l$;GC}a~usR!kvS`0no4Qe<1L}w0 z+4~L|!-8H6hP#4-EjpuJM(^UjWk)lc1qkNEq4~lR7-NJ$@yVkRnfx&yvLx(4ex{2N zI!@7G$C#oT)xc%&J17`S3mA@!tX~GGG@rY^LfwxcyI2CqRgKDr#s!VUo7P0Ho5p?5 zj!)H$-z<;Mtf6@t7Xu53-~dI8nI%nvM4*d_`87#x4EJ7i;+J~98`Y|sjg-{^Q2-dA z3KPkyp)?HTOWpyrqr6HNqF1s*dO->I&j49+#0(6CNccm#iVzT8E_Cdi)KU7lssAi!^36!#L$GPh8i+cJ} z*RXOO9C0y=A!VIuJX#phv5=$D6fUheo<%hOr)UwTtb>4%MaF~_|IF(z;{;ybvosG& zj8#E?0>fI*sow``-p`QP6DZwHH8RhPKa6&`&2xc2{fT_0ut1g>W9D*orqu0BRA4Zf zK$=8pmfL8$eP9-C4f3Ctu>T!NO+rFKN=iybMuxw%B_}7RprD|nq{QRZR8&;d)YK3N z1PX=H(9oPef1ZJXfr*Lf!UZ-C4o+?!Ja8?@FCfG(C@dg|*DDc#>tD3BxUh)CKPtBW zI3xH|g+$OF{rx!o{WAR(;p2_!GIENt@=9_FmlS?gTL1AZMX2H*q$+9}1a$g}7J;5t zzpAczO+!mZ6Fi?MH|4CBoYZHv>f0NX|G3x6^X83Mve14BttDBhpwyRs?BmBRL zt??wa&2N(0-pStKwu6%kKE-!+_rNpMg#6xz&~5GOANV`D#|QR=oc@KET`V*oq#uL=P@ac+* zs;WQeX#zKmm#P2ert9h-)Yt!NyMEY+&+hR~bwb-UKEB82_js>*2R^=k)b-1&PT;41 z<@bO5*@OQOO0EfUK0eSVh}M6%TmOQp|3s>P#rXuC`tKn))&In*e-&K+j`9ibPQv`j zQU9If{}Y}5lbil4zyD{k_22TNf4)TjD zI{orjR(_Mz3Vh7BUTo93e(r4kI9;NenB2q1A|<0Q%;a(;giV?%x5KwGb^GZluf*&K z(2KrC_%=8%vFY}7?yS+U%ec~uq|wn>A)*Z#1j%-{@X>y3ea{Lz4Ze95bIPDI^_|el z)UgzjLDh3B>Hc`@W5Ok@-YWINC@Rh3tdqt#^w%XU@f!mj`H=JL0|FqzCG4xreim-r zIZX;zI>IGv(GGO{at}xj!}RRL4itxfsM?~qfnIZ5!r%;5{xkl_`9%CBteuH`(ypFN zkq0t@vHIxy8vYXYM><^{Bi=HvOYkG{Pxg(7%wQO_Sw&I*jvwj&&(VJ5-4c*GgW+el zr}UonJMC0l;VAJobmKzJ8(_0>Gef&MjFo##N3;&2h>n$+g!M#_3U>jEra0a zWXP55Z_1aS1sK3+ySKT<5TV`B%U4eOANq6VbnWU);QGVHIL^PU<~-%buNYB zBWYx+g1u_+;VaPT(K(KL0Z68ALGMK2@-$?)6a$q$HL<%plpjv*7$0N7$dYA>NMQhk zdlBroisku+7K_4tQ+%g6)d&s+HH9GPZk~KFeFDaDh5ck1<=vD}$=K##=15X!ACQLP zHPu{(^_*JV{Eu%M*>L7C7Sl>K_ftEpM{02wGiuSO)39A7P3asKg?o}vFNRZhFg_Jq z6vwdmtg?^8hb}va$KE_CXLK;TX4g)Xba!qrh&4i+nYdp|m)e%`Wcdo8A`@wPPbu?F zR?VXUj(CGdlF;DobF^P#FQ4w{!D$M(v;sy`?w)Yc6bucCZT3TaK|2}u*EL1IfM_Il zxmbNLn&(4H)stI2xs;b9h2(Z7Op8&*pNw}ZurE^_n zZ!1wjLU$l`88+~Ob850tE0htERpKD)F%9D}eT;ktr^JPLrW}Lo@f8La7*0owG8J?k zLe(Ok9RV*-1VDAR?assP@9SDErPZ?~z#eV`q3%n%5XM!;-o=5-4ULIm_MEXmPgSYr zCbA02D)7K4DO_{KC=$n0%h(1Gp{PklfmO1IJ^Q)u{)meJs$4k98Dc_EWTH5(+L1ye+-W?; z!F8aUrnC-O79MX0-D9diL?XSQaW_j$E)4b!ov*p7yePTYKb*83C1x9?zAeX0E;<^` zUT?$eh5~Gzkm+in;tN&2f%^m0;ZPwcjgJlEN+0&JAtus9={;%2@VcG25R^-QKI931 zC8DY?F`>OQ(W-5ju2xZbA!dQ|M&p$qn=lIJi>VFE(QaAq4in3nv)P;a%5XWgepa7|oUfEIxr4#lTx+?(TJ0cq)SnJO1d>ysdC?$8+v!NkjjY&I0s^5CuPhyM7r+nUN za(Tax)9zG*Q<$8>c^dU*RdGG{Bcq$|weF>b4;t-F6qm)K^cW*9Q1auB(B$$LQz`qy z-?7yXMj=a@nJ6AVY?-!tr60G#ZrBHOHib<^xLUw_Sf4(7aUszUU<~+pG1t^&D@E1XvNI2ASk1WeKG! z;&#ni+_$H`z}VtC3Jrv`-HQr2>mUD^AV-tM8Z{u23yR=o?cq>jU*6(4LLU*)Grsw5|1(pdQvUy3=OXkSv|pUvta@brg0?M+Sr@g*-P zo#SHel6kG2<_5zfYBXdw^)c(!Y0tSkzEPRlZlm;5G(1RCJtJ5lTPY?_RSG4CC@C#Sl*c3e>sNmomjzj(^|`#Aa!%0jOrC^zBc zqJ92naC?0j?`X9U{aAyF@KE{cTZ7wVW@;4pmg*D+ja6@DXOd778)PdtG@t%D%a8+! zM96FZ5Sk%ysy+0W8je_m6UWG9Gr7!nf` zwAtq{!UxUi1Gl3zZf}E6^esMpRHxYoD@sBm^$nt;Le?FSRgTbVBS=USlGO|*Xm%o>r8HQMxggIgvkmGK2Nw_l0q6X2UK;+~i14AO#A(pz>sZF|??zE* zbNBC2BoZ+wO=wS)#hZ@Ev3*G0y3WHPt*hUGI^SK1C3N_X)V5_K{CLI{=!;7(=!bbcO|;5P6l#c%4c_(@8{UJT(FC zc)tp`71syJH-pwYIelBuesJ#6pzpAQ-+e%*tJCEdw96m4$KsImSXlG12Bc!Z`BfX$m}<{Y{|Ie(p84my*0)lUXy zfkh3`h1m{AlBEKyJ;+i~lr^`KPGUkSb8%|4TF@!R;6c;anG(`7{Zt^5#1Rg9nHgxU z8I{L?GOaT4oI~D1MLuDq@Dc}TJE66;lqZ)n^tE8GouGya%Emu3jJ-%o`;@X80W>pa zBrw-q2Jp%@h}8=N8AX=xr;G7Gy~3|@Gr5-@S$HeJlmbH;y8<^lQrVo+*cDQ$4@>}Q z9-?rv2g`};YiZ2!SG~qOwdbPrHpmVTlw_u<2HT*M_sUFax7RZ=`2%iE0oB~;Nb=#i zR$W){V)NRuyeAuZ>I&&3u>AM4;MN~pjzpACmMNo%0BrhDab7!8PrEZBa_(@Jvl8m5 zPX&NmT4zx5J3m}q!>?Ecz^>tBm3ut=B6G7%pJpe;7|b1JtMTWYVN(wc)(T4WxXL>XHxHGGN7Nu09RgVJA|_=^#= zY#yADYL@ukW#UHxmZ@;oybw4;GQ1qc$YF7Up~~?gD3*>F(j{;T_=R8|)Vt9uyWE z8kHQCkd=hVPD{_u%F52p&cXZ32v2XqC;#^c{|Nu{9Zq~Vi z6%QU)KkTh-?5%I=X=v$bZ0%`k?QUu7Zfz$_TSs?$XLmtR?#053dBWh+YP=$OeqnI|KYu3Hi;Mqp zJMb&ECWP02uLtQ8b)pT&5PoUvHpHCZc zB%WxwY;wPG;!)eyLZjU{b$lS4!stWMfxdaIwFG@7Wcv56VD!#BJxDFDOI^@((K-8S zz^8Tmt^n^+mUZY6a=@W~k}18Xa`?h{A09DbHFEuYH^HU+IHcg60;s9|3zcn#oYE{c zO$*f6NO2nO`!0guQjUE0K%Y{6?6pUs)@8HVWa&+88Gu3vUTR|l`9;k>{%-BPEKKuS zi;4QhGm0~Km6>8?#V=}B{)K;K_#PM{gNrSV!LGxhwt_>?sU>%Q@Dp6h@iY#?Z~(P% zU9Z{o@GmDu>o)gV(y_w3H~jEQFfkJb&j0JT?0W?r;yJ zWnaX1Uw>JAC)4DE6r7yU;LMhtjarTqaMZff+Cl~O%!1xfY{!~?x?fXumFb30MC8>P z+(2OlK-$J6iV^mqraZ2efB{$r91u~->z)jvv-y}-*d#C4^bK$>&mC{!F@XGx&{wWp zz#I8_Q3IS`VYlccUCjv?K!Y?;e&(dltzKw{C{g-LPCA&Ts_Op<2H^Sir{f-y*$TEz6*${|-VB|y`i6@P_8wF`BtCx>jFe+d$Nl)!axGGL zE1;N&fxFAmwanv-JedS{sXTfyobd}$43$SmE7NwF7g`8(JSP{)5v3Xi0Ivj#%6Em; ztI{|8?3Y~X?=Nqgpu2!BLRQEDSWZ@1v!JEa9qCW}>QxzWDm7>-UNjq4fEuJCL4rjw zQZdm-F?Z*qd8T$K7rtyKjGP;g=oDv9(2oFF4xN)lS zB)R8~^Wvac_dSxN#EUs+efd)}nr$!>b`TLh=)oI4O?WB%4!sU zX>$xB2R^xb2q9N)%rRk&`)qa_!vs9Xj0F)hBIC5Zb(S+gEB(NE^@Ol+J;#?nM})J! zCxi(P>Jf8P2|-iR8hBz%|;YNo20)*tJ17; zz2jTegnloSDw-?cYvUD1pZ^S}AdMfO-n~B^%Q1b;{-g}*G<+2<%@twd$`%pcr++K! z;jQ+Jnl}Ec2K1ldplc`m)^zM<`4-HF-1iuZTamXz<`srY$muL?)Q=p6N+RWu#Dn z9BcuRXp|c2`X$ry-Bsxx5)=K%7lO~hL1qXZ*}6oT8+QMPyY~!gGSJ#~LrF-50E#p< z6zR=Ivrt3Aks_d9YXIAdPjOkLXqA2n-B-ndO@M^F#gIFJ`MRk zH|E!AEV@(d4)tUApW3|%p4(72Yq9}^Tf=#-{pHv5;nplgERfX z$liP5GGX_ z^PcimqSC-|ByWWlXOivp2w0>s_b0i5Hw@PTOd8jIm}^~8!uf??jiNBdw$a)^cyN}}MP(31>AE|XSt>d*3*z;C=W z64N5~w$(o=H!rl+jm#K}mY3hzw2q2Lt$yCE%iqkl8+4Yb`LJp9>y-fY2IX+h`?obE z6b2T-N3$p2uSYi(n|abF&zvgTmi6mdx%0DjL%4U})0BL-=SW%tONh5mHCb6(yDqBt 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 N`CW@!&z^v;|39T`omv0@ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 4cc03ac73..7d0a94742 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,11 @@ ![Example GIF](./Images/Ide/Gifs/9.5.1BetterGif.gif) Gif length is 1 minute 35 seconds -![Example GIF](./Images/Ide/memoryToday.png) -Only 362 MB Memory usage after opening the source code in a published executable of itself and parsing the entire solution with its own - from scratch - C# parser (v0.9.7.4) +![Example GIF](./Images/Ide/Gifs/parseSolutionWideUpdated.gif) + +Only 287.1 MB Memory usage after opening the source code in a published executable of itself and parsing the entire solution with its own - from scratch - C# parser (v0.9.7.7) + +The gif is sped up by cutting the frames in half. ## Demo: https://luthetus.github.io/Luthetus.Ide/ From 60b034b810c17f6d561b40a54002b8af330a431c Mon Sep 17 00:00:00 2001 From: Luthetus <45454132+huntercfreeman@users.noreply.github.com> Date: Sat, 14 Dec 2024 21:44:19 -0500 Subject: [PATCH 6/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d0a94742..70a7a2cf6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Luthetus.Ide (In Development) ![Example GIF](./Images/Ide/Gifs/9.5.1BetterGif.gif) -Gif length is 1 minute 35 seconds +The above Gif length is 1 minute 35 seconds ![Example GIF](./Images/Ide/Gifs/parseSolutionWideUpdated.gif) From 9058ab56a4a3b41d360fbb9c2a168338395fa138 Mon Sep 17 00:00:00 2001 From: Luthetus <45454132+huntercfreeman@users.noreply.github.com> Date: Sat, 14 Dec 2024 21:58:41 -0500 Subject: [PATCH 7/7] Update IdeInfoDisplay.razor --- .../Shareds/Displays/Internals/IdeInfoDisplay.razor | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Lib/Ide/Ide.RazorLib/Shareds/Displays/Internals/IdeInfoDisplay.razor b/Source/Lib/Ide/Ide.RazorLib/Shareds/Displays/Internals/IdeInfoDisplay.razor index 1df68ec11..97edacd22 100644 --- a/Source/Lib/Ide/Ide.RazorLib/Shareds/Displays/Internals/IdeInfoDisplay.razor +++ b/Source/Lib/Ide/Ide.RazorLib/Shareds/Displays/Internals/IdeInfoDisplay.razor @@ -174,7 +174,9 @@